From: samhenri <samuel.guimaraes(a)eldorado.org.br>
Adding new-ui assets to source. Please note that some pages may stop working because the
new-ui is still unfinished.
Signed-off-by: samhenri <samuel.guimaraes(a)eldorado.org.br>
---
ui/Makefile.am | 2 +-
ui/css/theme-default/button.css | 72 +-
ui/js/src/wok.main.js | 42 +-
ui/js/src/wok.window.js | 31 +-
ui/js/widgets/samples/dialog.html | 4 +-
ui/js/widgets/samples/grid.html | 4 +-
ui/js/widgets/samples/line.html | 4 +-
ui/js/widgets/samples/list.html | 4 +-
.../menu-button-radio-checkbox-text-select.html | 4 +-
ui/js/widgets/samples/message.html | 4 +-
ui/js/widgets/samples/messagebar-flat.html | 4 +-
ui/js/widgets/samples/tabs.html | 4 +-
ui/libs/bootstrap.js | 2345 +++
ui/libs/jquery-ui.js | 16617 +++++++++++++++++++
ui/libs/modernizr.js | 1406 ++
ui/libs/themes/base/bootstrap-official.css | 6842 ++++++++
ui/libs/themes/base/bootstrap.custom.css | 8070 +++++++++
ui/libs/themes/base/jquery-ui.custom.css | 203 +
ui/libs/vendor.js | 5523 ++++++
ui/pages/browserconfig.xml | 12 +
ui/pages/login.html.tmpl | 155 +-
ui/pages/manifest.json | 41 +
ui/pages/wok-ui.html.tmpl | 137 +-
ui/src/README.md | 87 +
ui/src/app/android-chrome-144x144.png | Bin 0 -> 9965 bytes
ui/src/app/android-chrome-192x192.png | Bin 0 -> 15190 bytes
ui/src/app/android-chrome-36x36.png | Bin 0 -> 1663 bytes
ui/src/app/android-chrome-48x48.png | Bin 0 -> 2322 bytes
ui/src/app/android-chrome-72x72.png | Bin 0 -> 3915 bytes
ui/src/app/android-chrome-96x96.png | Bin 0 -> 5684 bytes
ui/src/app/apple-touch-icon-114x114.png | Bin 0 -> 9159 bytes
ui/src/app/apple-touch-icon-120x120.png | Bin 0 -> 9860 bytes
ui/src/app/apple-touch-icon-144x144.png | Bin 0 -> 12771 bytes
ui/src/app/apple-touch-icon-152x152.png | Bin 0 -> 13861 bytes
ui/src/app/apple-touch-icon-180x180.png | Bin 0 -> 15806 bytes
ui/src/app/apple-touch-icon-57x57.png | Bin 0 -> 3613 bytes
ui/src/app/apple-touch-icon-60x60.png | Bin 0 -> 3839 bytes
ui/src/app/apple-touch-icon-72x72.png | Bin 0 -> 4862 bytes
ui/src/app/apple-touch-icon-76x76.png | Bin 0 -> 5193 bytes
ui/src/app/apple-touch-icon-precomposed.png | Bin 0 -> 16413 bytes
ui/src/app/apple-touch-icon.png | Bin 0 -> 15806 bytes
ui/src/app/browserconfig.xml | 12 +
ui/src/app/css/bootstrap.custom.scss | 86 +
ui/src/app/css/fontawesome.scss | 17 +
ui/src/app/css/theme-default/button-flat.css | 135 +
ui/src/app/css/theme-default/checkbox-flat.css | 25 +
ui/src/app/css/theme-default/gauge-flat.css | 52 +
ui/src/app/css/theme-default/list-flat.css | 83 +
ui/src/app/css/theme-default/menu-flat.css | 89 +
ui/src/app/css/theme-default/message-flat.css | 87 +
ui/src/app/css/theme-default/messagebar-flat.css | 64 +
.../app/css/theme-default/modules/_animation.scss | 15 +
ui/src/app/css/theme-default/modules/_base.scss | 15 +
.../theme-default/modules/_bootstrap-official.scss | 56 +
.../theme-default/modules/_bootstrap-select.scss | 390 +
.../css/theme-default/modules/_bootstrap-wok.scss | 55 +
ui/src/app/css/theme-default/modules/_buttons.scss | 8 +
.../css/theme-default/modules/_dialog-flat.scss | 71 +
ui/src/app/css/theme-default/modules/_login.scss | 34 +
.../app/css/theme-default/modules/_menu-flat.scss | 337 +
ui/src/app/css/theme-default/modules/_mixins.scss | 13 +
.../app/css/theme-default/modules/_modal-flat.scss | 209 +
.../css/theme-default/modules/_navbar-flat.scss | 876 +
ui/src/app/css/theme-default/modules/_path.scss | 9 +
ui/src/app/css/theme-default/modules/_toolbar.scss | 40 +
.../app/css/theme-default/modules/_variables.scss | 606 +
.../css/theme-default/modules/_wok-variables.scss | 960 ++
ui/src/app/css/theme-default/radio-flat.css | 30 +
ui/src/app/css/theme-default/selectmenu-flat.css | 88 +
ui/src/app/css/theme-default/tabs.css | 46 +
ui/src/app/css/theme-default/textbox-flat.css | 22 +
ui/src/app/favicon-16x16.png | Bin 0 -> 1301 bytes
ui/src/app/favicon-194x194.png | Bin 0 -> 21106 bytes
ui/src/app/favicon-32x32.png | Bin 0 -> 2165 bytes
ui/src/app/favicon-96x96.png | Bin 0 -> 8147 bytes
.../app/fontawesome/font/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes
ui/src/app/images/theme-default/high.png | Bin 0 -> 812 bytes
ui/src/app/images/theme-default/icon-centos.png | Bin 0 -> 4734 bytes
ui/src/app/images/theme-default/icon-debian.png | Bin 0 -> 4239 bytes
ui/src/app/images/theme-default/icon-fedora.png | Bin 0 -> 4449 bytes
ui/src/app/images/theme-default/icon-gentoo.png | Bin 0 -> 15307 bytes
ui/src/app/images/theme-default/icon-opensuse.png | Bin 0 -> 3046 bytes
ui/src/app/images/theme-default/icon-ubuntu.png | Bin 0 -> 4818 bytes
ui/src/app/images/theme-default/icon-vm.png | Bin 0 -> 2976 bytes
ui/src/app/images/theme-default/logo-white.png | Bin 0 -> 7438 bytes
ui/src/app/images/theme-default/logo.png | Bin 0 -> 17195 bytes
ui/src/app/images/theme-default/logo.svg | 26 +
ui/src/app/images/theme-default/low.png | Bin 0 -> 813 bytes
ui/src/app/images/theme-default/med.png | Bin 0 -> 873 bytes
ui/src/app/index.html | 238 +
ui/src/app/js/main.js | 1 +
ui/src/app/js/widgets/button-dropDown.js | 35 +
ui/src/app/js/widgets/button-flat.js | 419 +
ui/src/app/js/widgets/checkbox-flat.js | 86 +
ui/src/app/js/widgets/combobox.js | 127 +
ui/src/app/js/widgets/dialog-flat.js | 120 +
ui/src/app/js/widgets/filter-select.js | 136 +
ui/src/app/js/widgets/gauge-flat.js | 126 +
ui/src/app/js/widgets/grid.js | 121 +
ui/src/app/js/widgets/line.js | 72 +
ui/src/app/js/widgets/list-flat.js | 76 +
ui/src/app/js/widgets/menu-flat.js | 98 +
ui/src/app/js/widgets/message-flat.js | 97 +
ui/src/app/js/widgets/messagebar-flat.js | 71 +
ui/src/app/js/widgets/radio-flat.js | 86 +
ui/src/app/js/widgets/samples/README.md | 1 +
ui/src/app/js/widgets/samples/action_button.html | 224 +
ui/src/app/js/widgets/samples/dialog.html | 111 +
.../app/js/widgets/samples/dialog_bootstrap.html | 140 +
ui/src/app/js/widgets/samples/gauge-flat.html | 53 +
ui/src/app/js/widgets/samples/grid.html | 80 +
ui/src/app/js/widgets/samples/line.html | 168 +
ui/src/app/js/widgets/samples/list.html | 46 +
.../menu-button-radio-checkbox-text-select.html | 226 +
ui/src/app/js/widgets/samples/message.html | 49 +
ui/src/app/js/widgets/samples/messagebar-flat.html | 49 +
ui/src/app/js/widgets/samples/tabs.html | 68 +
ui/src/app/js/widgets/select-menu.js | 84 +
ui/src/app/js/widgets/selectmenu-flat.js | 130 +
ui/src/app/js/widgets/textbox-flat.js | 39 +
ui/src/app/logo.ico | Bin 0 -> 15086 bytes
ui/src/app/manifest.json | 41 +
ui/src/app/mstile-144x144.png | Bin 0 -> 4103 bytes
ui/src/app/mstile-150x150.png | Bin 0 -> 3891 bytes
ui/src/app/mstile-310x150.png | Bin 0 -> 4172 bytes
ui/src/app/mstile-310x310.png | Bin 0 -> 5531 bytes
ui/src/app/mstile-70x70.png | Bin 0 -> 2602 bytes
ui/src/app/robots.txt | 4 +
ui/src/bower.json | 37 +
ui/src/dist/button-flat.css | 135 +
ui/src/dist/checkbox-flat.css | 25 +
ui/src/dist/fontawesome/css/fontawesome.css | 2355 +++
.../fontawesome/font/font/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes
ui/src/dist/gauge-flat.css | 52 +
ui/src/dist/images/theme-default/high.png | Bin 0 -> 812 bytes
ui/src/dist/images/theme-default/icon-centos.png | Bin 0 -> 4734 bytes
ui/src/dist/images/theme-default/icon-debian.png | Bin 0 -> 4239 bytes
ui/src/dist/images/theme-default/icon-fedora.png | Bin 0 -> 4449 bytes
ui/src/dist/images/theme-default/icon-gentoo.png | Bin 0 -> 15307 bytes
ui/src/dist/images/theme-default/icon-opensuse.png | Bin 0 -> 3046 bytes
ui/src/dist/images/theme-default/icon-ubuntu.png | Bin 0 -> 4818 bytes
ui/src/dist/images/theme-default/icon-vm.png | Bin 0 -> 2976 bytes
ui/src/dist/images/theme-default/logo-white.png | Bin 0 -> 7438 bytes
ui/src/dist/images/theme-default/logo.png | Bin 0 -> 17195 bytes
ui/src/dist/images/theme-default/logo.svg | 26 +
ui/src/dist/images/theme-default/low.png | Bin 0 -> 813 bytes
ui/src/dist/images/theme-default/med.png | Bin 0 -> 873 bytes
ui/src/dist/index.html | 187 +
ui/src/dist/js/main.js | 1 +
ui/src/dist/js/widgets/samples/action_button.html | 185 +
ui/src/dist/js/widgets/samples/dialog.html | 75 +
.../dist/js/widgets/samples/dialog_bootstrap.html | 101 +
ui/src/dist/js/widgets/samples/gauge-flat.html | 53 +
ui/src/dist/js/widgets/samples/grid.html | 80 +
ui/src/dist/js/widgets/samples/line.html | 168 +
ui/src/dist/js/widgets/samples/list.html | 46 +
.../menu-button-radio-checkbox-text-select.html | 165 +
ui/src/dist/js/widgets/samples/message.html | 49 +
.../dist/js/widgets/samples/messagebar-flat.html | 49 +
ui/src/dist/js/widgets/samples/tabs.html | 68 +
ui/src/dist/libs/bootstrap.js | 2345 +++
ui/src/dist/libs/jquery-ui.js | 16617 +++++++++++++++++++
ui/src/dist/libs/jquery.js | 9210 ++++++++++
ui/src/dist/libs/modernizr.js | 1406 ++
ui/src/dist/libs/themes/base/bootstrap.custom.css | 8059 +++++++++
ui/src/dist/libs/themes/base/jquery-ui.css | 1225 ++
ui/src/dist/libs/vendor.js | 5523 ++++++
ui/src/dist/list-flat.css | 83 +
ui/src/dist/menu-flat.css | 89 +
ui/src/dist/message-flat.css | 87 +
ui/src/dist/messagebar-flat.css | 64 +
ui/src/dist/radio-flat.css | 30 +
ui/src/dist/selectmenu-flat.css | 88 +
ui/src/dist/tabs.css | 46 +
ui/src/dist/textbox-flat.css | 22 +
ui/src/gulpfile.babel.js | 216 +
ui/src/package.json | 46 +
ui/src/test/index.html | 25 +
ui/src/test/spec/test.js | 11 +
179 files changed, 98446 insertions(+), 198 deletions(-)
create mode 100644 ui/libs/bootstrap.js
create mode 100644 ui/libs/jquery-ui.js
create mode 100644 ui/libs/modernizr.js
create mode 100644 ui/libs/themes/base/bootstrap-official.css
create mode 100755 ui/libs/themes/base/bootstrap.custom.css
create mode 100644 ui/libs/themes/base/jquery-ui.custom.css
create mode 100644 ui/libs/vendor.js
create mode 100644 ui/pages/browserconfig.xml
create mode 100644 ui/pages/manifest.json
create mode 100644 ui/src/README.md
create mode 100644 ui/src/app/android-chrome-144x144.png
create mode 100644 ui/src/app/android-chrome-192x192.png
create mode 100644 ui/src/app/android-chrome-36x36.png
create mode 100644 ui/src/app/android-chrome-48x48.png
create mode 100644 ui/src/app/android-chrome-72x72.png
create mode 100644 ui/src/app/android-chrome-96x96.png
create mode 100644 ui/src/app/apple-touch-icon-114x114.png
create mode 100644 ui/src/app/apple-touch-icon-120x120.png
create mode 100644 ui/src/app/apple-touch-icon-144x144.png
create mode 100644 ui/src/app/apple-touch-icon-152x152.png
create mode 100644 ui/src/app/apple-touch-icon-180x180.png
create mode 100644 ui/src/app/apple-touch-icon-57x57.png
create mode 100644 ui/src/app/apple-touch-icon-60x60.png
create mode 100644 ui/src/app/apple-touch-icon-72x72.png
create mode 100644 ui/src/app/apple-touch-icon-76x76.png
create mode 100644 ui/src/app/apple-touch-icon-precomposed.png
create mode 100644 ui/src/app/apple-touch-icon.png
create mode 100644 ui/src/app/browserconfig.xml
create mode 100755 ui/src/app/css/bootstrap.custom.scss
create mode 100644 ui/src/app/css/fontawesome.scss
create mode 100755 ui/src/app/css/theme-default/button-flat.css
create mode 100644 ui/src/app/css/theme-default/checkbox-flat.css
create mode 100755 ui/src/app/css/theme-default/gauge-flat.css
create mode 100644 ui/src/app/css/theme-default/list-flat.css
create mode 100644 ui/src/app/css/theme-default/menu-flat.css
create mode 100644 ui/src/app/css/theme-default/message-flat.css
create mode 100644 ui/src/app/css/theme-default/messagebar-flat.css
create mode 100644 ui/src/app/css/theme-default/modules/_animation.scss
create mode 100644 ui/src/app/css/theme-default/modules/_base.scss
create mode 100644 ui/src/app/css/theme-default/modules/_bootstrap-official.scss
create mode 100644 ui/src/app/css/theme-default/modules/_bootstrap-select.scss
create mode 100644 ui/src/app/css/theme-default/modules/_bootstrap-wok.scss
create mode 100644 ui/src/app/css/theme-default/modules/_buttons.scss
create mode 100644 ui/src/app/css/theme-default/modules/_dialog-flat.scss
create mode 100644 ui/src/app/css/theme-default/modules/_login.scss
create mode 100644 ui/src/app/css/theme-default/modules/_menu-flat.scss
create mode 100644 ui/src/app/css/theme-default/modules/_mixins.scss
create mode 100644 ui/src/app/css/theme-default/modules/_modal-flat.scss
create mode 100644 ui/src/app/css/theme-default/modules/_navbar-flat.scss
create mode 100644 ui/src/app/css/theme-default/modules/_path.scss
create mode 100644 ui/src/app/css/theme-default/modules/_toolbar.scss
create mode 100644 ui/src/app/css/theme-default/modules/_variables.scss
create mode 100644 ui/src/app/css/theme-default/modules/_wok-variables.scss
create mode 100644 ui/src/app/css/theme-default/radio-flat.css
create mode 100644 ui/src/app/css/theme-default/selectmenu-flat.css
create mode 100644 ui/src/app/css/theme-default/tabs.css
create mode 100644 ui/src/app/css/theme-default/textbox-flat.css
create mode 100644 ui/src/app/favicon-16x16.png
create mode 100644 ui/src/app/favicon-194x194.png
create mode 100644 ui/src/app/favicon-32x32.png
create mode 100644 ui/src/app/favicon-96x96.png
create mode 100644 ui/src/app/fontawesome/font/fontawesome-webfont.ttf
create mode 100644 ui/src/app/images/theme-default/high.png
create mode 100644 ui/src/app/images/theme-default/icon-centos.png
create mode 100644 ui/src/app/images/theme-default/icon-debian.png
create mode 100644 ui/src/app/images/theme-default/icon-fedora.png
create mode 100644 ui/src/app/images/theme-default/icon-gentoo.png
create mode 100644 ui/src/app/images/theme-default/icon-opensuse.png
create mode 100644 ui/src/app/images/theme-default/icon-ubuntu.png
create mode 100644 ui/src/app/images/theme-default/icon-vm.png
create mode 100644 ui/src/app/images/theme-default/logo-white.png
create mode 100644 ui/src/app/images/theme-default/logo.png
create mode 100644 ui/src/app/images/theme-default/logo.svg
create mode 100644 ui/src/app/images/theme-default/low.png
create mode 100644 ui/src/app/images/theme-default/med.png
create mode 100755 ui/src/app/index.html
create mode 100755 ui/src/app/js/main.js
create mode 100644 ui/src/app/js/widgets/button-dropDown.js
create mode 100755 ui/src/app/js/widgets/button-flat.js
create mode 100644 ui/src/app/js/widgets/checkbox-flat.js
create mode 100644 ui/src/app/js/widgets/combobox.js
create mode 100644 ui/src/app/js/widgets/dialog-flat.js
create mode 100644 ui/src/app/js/widgets/filter-select.js
create mode 100755 ui/src/app/js/widgets/gauge-flat.js
create mode 100644 ui/src/app/js/widgets/grid.js
create mode 100644 ui/src/app/js/widgets/line.js
create mode 100644 ui/src/app/js/widgets/list-flat.js
create mode 100644 ui/src/app/js/widgets/menu-flat.js
create mode 100644 ui/src/app/js/widgets/message-flat.js
create mode 100644 ui/src/app/js/widgets/messagebar-flat.js
create mode 100644 ui/src/app/js/widgets/radio-flat.js
create mode 100644 ui/src/app/js/widgets/samples/README.md
create mode 100644 ui/src/app/js/widgets/samples/action_button.html
create mode 100644 ui/src/app/js/widgets/samples/dialog.html
create mode 100644 ui/src/app/js/widgets/samples/dialog_bootstrap.html
create mode 100644 ui/src/app/js/widgets/samples/gauge-flat.html
create mode 100644 ui/src/app/js/widgets/samples/grid.html
create mode 100644 ui/src/app/js/widgets/samples/line.html
create mode 100644 ui/src/app/js/widgets/samples/list.html
create mode 100644
ui/src/app/js/widgets/samples/menu-button-radio-checkbox-text-select.html
create mode 100644 ui/src/app/js/widgets/samples/message.html
create mode 100644 ui/src/app/js/widgets/samples/messagebar-flat.html
create mode 100644 ui/src/app/js/widgets/samples/tabs.html
create mode 100644 ui/src/app/js/widgets/select-menu.js
create mode 100644 ui/src/app/js/widgets/selectmenu-flat.js
create mode 100644 ui/src/app/js/widgets/textbox-flat.js
create mode 100644 ui/src/app/logo.ico
create mode 100644 ui/src/app/manifest.json
create mode 100644 ui/src/app/mstile-144x144.png
create mode 100644 ui/src/app/mstile-150x150.png
create mode 100644 ui/src/app/mstile-310x150.png
create mode 100644 ui/src/app/mstile-310x310.png
create mode 100644 ui/src/app/mstile-70x70.png
create mode 100755 ui/src/app/robots.txt
create mode 100644 ui/src/bower.json
create mode 100755 ui/src/dist/button-flat.css
create mode 100644 ui/src/dist/checkbox-flat.css
create mode 100644 ui/src/dist/fontawesome/css/fontawesome.css
create mode 100644 ui/src/dist/fontawesome/font/font/fontawesome-webfont.ttf
create mode 100755 ui/src/dist/gauge-flat.css
create mode 100644 ui/src/dist/images/theme-default/high.png
create mode 100644 ui/src/dist/images/theme-default/icon-centos.png
create mode 100644 ui/src/dist/images/theme-default/icon-debian.png
create mode 100644 ui/src/dist/images/theme-default/icon-fedora.png
create mode 100644 ui/src/dist/images/theme-default/icon-gentoo.png
create mode 100644 ui/src/dist/images/theme-default/icon-opensuse.png
create mode 100644 ui/src/dist/images/theme-default/icon-ubuntu.png
create mode 100644 ui/src/dist/images/theme-default/icon-vm.png
create mode 100644 ui/src/dist/images/theme-default/logo-white.png
create mode 100644 ui/src/dist/images/theme-default/logo.png
create mode 100644 ui/src/dist/images/theme-default/logo.svg
create mode 100644 ui/src/dist/images/theme-default/low.png
create mode 100644 ui/src/dist/images/theme-default/med.png
create mode 100755 ui/src/dist/index.html
create mode 100755 ui/src/dist/js/main.js
create mode 100644 ui/src/dist/js/widgets/samples/action_button.html
create mode 100644 ui/src/dist/js/widgets/samples/dialog.html
create mode 100644 ui/src/dist/js/widgets/samples/dialog_bootstrap.html
create mode 100644 ui/src/dist/js/widgets/samples/gauge-flat.html
create mode 100644 ui/src/dist/js/widgets/samples/grid.html
create mode 100644 ui/src/dist/js/widgets/samples/line.html
create mode 100644 ui/src/dist/js/widgets/samples/list.html
create mode 100644
ui/src/dist/js/widgets/samples/menu-button-radio-checkbox-text-select.html
create mode 100644 ui/src/dist/js/widgets/samples/message.html
create mode 100644 ui/src/dist/js/widgets/samples/messagebar-flat.html
create mode 100644 ui/src/dist/js/widgets/samples/tabs.html
create mode 100644 ui/src/dist/libs/bootstrap.js
create mode 100644 ui/src/dist/libs/jquery-ui.js
create mode 100644 ui/src/dist/libs/jquery.js
create mode 100644 ui/src/dist/libs/modernizr.js
create mode 100755 ui/src/dist/libs/themes/base/bootstrap.custom.css
create mode 100644 ui/src/dist/libs/themes/base/jquery-ui.css
create mode 100644 ui/src/dist/libs/vendor.js
create mode 100644 ui/src/dist/list-flat.css
create mode 100644 ui/src/dist/menu-flat.css
create mode 100644 ui/src/dist/message-flat.css
create mode 100644 ui/src/dist/messagebar-flat.css
create mode 100644 ui/src/dist/radio-flat.css
create mode 100644 ui/src/dist/selectmenu-flat.css
create mode 100644 ui/src/dist/tabs.css
create mode 100644 ui/src/dist/textbox-flat.css
create mode 100755 ui/src/gulpfile.babel.js
create mode 100644 ui/src/package.json
create mode 100755 ui/src/test/index.html
create mode 100755 ui/src/test/spec/test.js
diff --git a/ui/Makefile.am b/ui/Makefile.am
index 6be27ed..b820b45 100644
--- a/ui/Makefile.am
+++ b/ui/Makefile.am
@@ -15,7 +15,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-SUBDIRS = css fontello images js libs pages
+SUBDIRS = css fontawesome images js libs pages
uidir = $(datadir)/wok/ui
diff --git a/ui/css/theme-default/button.css b/ui/css/theme-default/button.css
index e774128..9895572 100644
--- a/ui/css/theme-default/button.css
+++ b/ui/css/theme-default/button.css
@@ -17,7 +17,7 @@
*/
/* Generated at
http://colorzilla.com/gradient-editor/ */
-.btn {
+.kimchi.btn {
display: inline-block;
height: 42px;
margin: 3px;
@@ -50,11 +50,11 @@
cursor: pointer;
}
-.btn[disabled] {
+.kimchi.btn[disabled] {
opacity: 0.3;
}
-.btn:not([disabled]):hover {
+.kimchi.btn:not([disabled]):hover {
box-shadow: -2px -2px 2px #dadada, 2px 2px 2px #fff, 3px 3px 3px white
inset, -3px -3px 3px rgba(0, 0, 0, .25) inset;
background: #d5d5d5;
@@ -69,7 +69,7 @@
endColorstr='#eeeeee', GradientType=0);
}
-.btn:not([disabled]):active {
+.kimchi.btn:not([disabled]):active {
box-shadow: -2px -2px 2px #eaeaea, 2px 2px 2px #fff, 3px 3px 3px
rgba(0, 0, 0, .25) inset, -3px -3px 3px white inset;
background: #ffffff;
@@ -84,43 +84,43 @@
endColorstr='#ffffff', GradientType=0);
}
-.btn.loading {
+.kimchi.btn.loading {
box-shadow: none;
cursor: default;
}
-.btn.loading .icon {
+.kimchi.btn.loading .icon {
background: url(../images/theme-default/icon-load.png) center
center no-repeat;
}
-.btn.pause-gray .icon {
+.kimchi.btn.pause-gray .icon {
background: url(../images/theme-default/ac22_pause_grey.png) center
center no-repeat;
}
-.btn.resume-gray .icon {
+.kimchi.btn.resume-gray .icon {
background: url(../images/theme-default/ac24_resume_grey.png) center
center no-repeat;
}
-.btn .text {
+.kimchi.btn .text {
padding: 0 10px;
}
-.btn .icon {
+.kimchi.btn .icon {
display: block;
width: 42px;
height: 42px;
}
-.btn.dropdown {
+.kimchi.btn.dropdown {
text-align: left;
position: relative;
padding-right: 25px;
}
-.btn.dropdown .arrow {
+.kimchi.btn.dropdown .arrow {
position: absolute;
width: 15px;
height: 42px;
@@ -132,12 +132,12 @@
right: 10px;
}
-.btn .input {
+.kimchi.btn .input {
margin-left: 10px;
}
/* Generated at
http://colorzilla.com/gradient-editor/ */
-.btn-tool {
+.kimchi.btn-tool {
display: inline-block;
height: 38px;
margin: 6px 3px;
@@ -169,14 +169,14 @@
cursor: pointer;
}
-.btn-tool:hover {
+.kimchi.btn-tool:hover {
box-shadow: -1px -1px 1px #777, 1px 1px 1px #eee, 2px 2px 2px
rgba(0, 0, 0, .25) inset, -3px -3px 3px
rgba(0, 0, 0, .25) inset;
}
/* Generated at
http://colorzilla.com/gradient-editor/ */
-.btn-tool.left,.btn-tool.right {
+.kimchi.btn-tool.left,.kimchi.btn-tool.right {
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
@@ -192,12 +192,12 @@
endColorstr='#999999', GradientType=0);
}
-.btn-tool:active,.btn-tool.active {
+.kimchi.btn-tool:active,.kimchi.btn-tool.active {
box-shadow: -1px -1px 1px #777, 1px 1px 1px #eee, 3px 3px 3px
rgba(0, 0, 0, .35) inset;
}
-.btn-tool.left {
+.kimchi.btn-tool.left {
-webkit-border-top-left-radius: 5px;
-moz-border-top-left-radius: 5px;
border-top-left-radius: 5px;
@@ -206,7 +206,7 @@
border-bottom-left-radius: 5px;
}
-.btn-tool.right {
+.kimchi.btn-tool.right {
-webkit-border-top-right-radius: 5px;
-moz-border-top-right-radius: 5px;
border-top-right-radius: 5px;
@@ -215,7 +215,7 @@
border-bottom-right-radius: 5px;
}
-.btn-tool .icon {
+.kimchi.btn-tool .icon {
display: block;
width: 48px;
height: 38px;
@@ -287,7 +287,7 @@
}
/* Generated at
http://colorzilla.com/gradient-editor/ */
-.btn-tool.tree {
+.kimchi.btn-tool.tree {
width: 42px;
margin: 5px 10px;
background: #ffffff;
@@ -304,7 +304,7 @@
inset, -3px -3px 3px rgba(0, 0, 0, .25) inset;
}
-.btn-select {
+.kimchi.btn-select {
display: inline-block;
position: relative;
height: 30px;
@@ -321,7 +321,7 @@
cursor: pointer;
}
-.btn-select .input {
+.kimchi.btn-select .input {
border: 0 solid #CCCCCC;
margin-right: 10px;
font-size: 16px;
@@ -332,10 +332,10 @@
padding: 0 5px;
}
-.btn-select input.invalid-field {
+.kimchi.btn-select input.invalid-field {
border: 1px solid #FF4444;
}
-.btn-select .arrow {
+.kimchi.btn-select .arrow {
position: absolute;
width: 15px;
height: 30px;
@@ -447,7 +447,7 @@
display: none;
}
-.btn-normal {
+.kimchi.btn-normal {
display: inline-block;
height: 38px;
margin: 9px 3px;
@@ -460,25 +460,25 @@
cursor: pointer;
}
-.btn-normal span {
+.kimchi.btn-normal span {
font-family: 'Helvetica Neue', Helvetica, Arial;
font-weight: lighter;
}
-.btn-normal:not([disabled]):hover {
+.kimchi.btn-normal:not([disabled]):hover {
background: #EEEEEE;
}
-.btn-normal:not([disabled]):active {
+.kimchi.btn-normal:not([disabled]):active {
background: #999999;
}
-.btn-normal[disabled] {
+.kimchi.btn-normal[disabled] {
color: #CCCCCC;
cursor: default;
}
-.btn-normal-1 {
+.kimchi.btn-normal-1 {
display: inline-block;
height: 38px;
margin: 9px 3px;
@@ -491,26 +491,26 @@
cursor: pointer;
}
-.btn-normal-1 span {
+.kimchi.btn-normal-1 span {
font-family: 'Helvetica Neue', Helvetica, Arial;
font-weight: lighter;
}
-.btn-normal-1:not([disabled]):active {
+.kimchi.btn-normal-1:not([disabled]):active {
background: #999999;
}
-.btn-normal-1[disabled] {
+.kimchi.btn-normal-1[disabled] {
background: #999999;
cursor: default;
}
-.btn-group {
+.kimchi.btn-group {
float: left;
padding: 0 10px;
}
-.btn-small {
+.kimchi.btn-small {
display: inline-block;
height: 25px;
margin: 6px 3px;
diff --git a/ui/js/src/wok.main.js b/ui/js/src/wok.main.js
index f4c9940..bcbeae2 100644
--- a/ui/js/src/wok.main.js
+++ b/ui/js/src/wok.main.js
@@ -25,17 +25,18 @@ wok.main = function() {
var tabsHtml = [];
$(tabs).each(function(i, tab) {
var title = tab['title'];
+ var cssClass = tab['css'];
var path = tab['path'];
var mode = tab['mode'];
if (mode != 'none') {
var helpPath = wok.checkHelpFile(path);
- var disableHelp = (helpPath.length == 0 ? "disableHelp" :
helpPath);
+ var disableHelp = (helpPath.length == 0 ? "disableHelp " :
"");
tabsHtml.push(
'<li>',
- '<a class="item ', disableHelp,'"
href="', path, '">',
+ '<a class="item ',
disableHelp,cssClass,'" href="', path, '">',
title,
'</a>',
- '<input id="helpPathId"
name="helpPath" value="' + helpPath + '"
type="hidden"/>',
+ '<input id="helpPathId-'+i+'"
name="helpPath" class="sr-only" value="' + helpPath +
'" type="hidden"/>',
'</li>'
);
}
@@ -49,6 +50,7 @@ wok.main = function() {
var $tab = $(this);
var titleKey = $tab.find('title').text();
var title = i18n[titleKey] ? i18n[titleKey] : titleKey;
+ var css = $tab.find('css').text();
var path = $tab.find('path').text();
var roles = wok.cookie.get('roles');
if (roles) {
@@ -58,6 +60,7 @@ wok.main = function() {
tabs.push({
title: title,
path: path,
+ css: css,
mode: mode
});
} else {
@@ -106,7 +109,9 @@ wok.main = function() {
DEFAULT_HASH = defaultTabPath &&
defaultTabPath.substring(0, defaultTabPath.lastIndexOf('.'))
- $('#nav-menu').append(genTabs(tabs));
+ //$('#nav-menu ul.navbar-nav').append(genTabs(tabs));
+ $('#nav-menu ul.navbar-nav li.hostname').after(genTabs(tabs));
+ wok.getHostname();
callback && callback();
}, function(data) {
@@ -135,22 +140,22 @@ wok.main = function() {
* point to the tab. If nothing found, inform user the URL is invalid
* and clear location.hash to jump to home page.
*/
- var tab = $('#nav-menu a[href="' + url + '"]');
+ var tab = $('#nav-menu ul li a[href="' + url + '"]');
if (tab.length === 0) {
location.hash = '';
return;
}
// Animate arrow indicator.
- var left = $(tab).parent().position().left;
- var width = $(tab).parent().width();
- $('.menu-arrow').stop().animate({
- left : left + width / 2 - 10
- });
+ // var left = $(tab).parent().position().left;
+ // var width = $(tab).parent().width();
+ // $('.menu-arrow').stop().animate({
+ // left : left + width / 2 - 10
+ // });
// Update the visual style of tabs; focus the selected one.
- $('#nav-menu a').removeClass('current');
- $(tab).addClass('current');
+ $('#nav-menu ul li').removeClass('active');
+ $(tab).parent().addClass('active');
$(tab).focus();
// Disable Help button according to selected tab
if ($(tab).hasClass("disableHelp")) {
@@ -227,7 +232,7 @@ wok.main = function() {
* Register click listener of tabs. Replace the default reloading page
* behavior of <a> with Ajax loading.
*/
- $('#nav-menu').on('click', 'a.item', function(event) {
+ $('#nav-menu ul li').on('click', 'a.item',
function(event) {
var href = $(this).attr('href');
// Remove file extension from 'href'
location.hash = href.substring(0,href.lastIndexOf('.'))
@@ -266,7 +271,7 @@ wok.main = function() {
$('#peers').on('click', function() {
// Check if any request is in progress
- if ($('.popover', '#peers').is(':visible') ||
searchingPeers == true)
+ if ($('.dropdown', '#peers').is('.open') ||
searchingPeers == true)
return
$('#search-peers').show();
@@ -281,7 +286,7 @@ wok.main = function() {
$('#no-peers').removeClass('hide-content');
for(var i=0; i<data.length; i++){
- $('.dropdown', '#peers').append("<a
href='"+data[i]+"'
target='_blank'>"+data[i]+"</a>");
+ $('.dropdown-menu ',
'#peers').append("<li><a href='"+data[i]+"'
target='_blank'>"+data[i]+"</a></li>");
}
searchingPeers = false;
});
@@ -346,9 +351,14 @@ wok.checkHelpFile = function(path) {
return url;
};
+wok.getHostname = function(e) {
+ host = window.location.hostname;
+ $('span.host-location').text(host);
+ return host;
+}
wok.openHelp = function(e) {
- var tab = $('#nav-menu a.current');
+ var tab = $('#nav-menu ul li.active a');
var url = $(tab).parent().find("input[name='helpPath']").val();
window.open(url, "Wok Help");
e.preventDefault();
diff --git a/ui/js/src/wok.window.js b/ui/js/src/wok.window.js
index 5542270..e1a88a1 100644
--- a/ui/js/src/wok.window.js
+++ b/ui/js/src/wok.window.js
@@ -31,14 +31,15 @@ wok.window = (function() {
_windows.push(windowID);
_listeners[windowID] = settings['close'];
- var windowNode = $('<div></div>', {
- id: windowID,
- 'class': settings['class'] ? settings['class'] +
' bgmask remove-when-logged-off' : 'bgmask remove-when-logged-off'
- });
+ var windowNode = $('<div id="'+windowID+'"
class="modal-dialog"></div>');
+
+ $('#modalWindow').modal('show');
- $(windowNode).css(settings['style'] || '');
+ $('#modalWindow').on('hidden.bs.modal', function () {
+ wok.window.close();
+ });
- $(windowNode).appendTo('body').on('click', '.window
.close', function() {
+ $(windowNode).appendTo('#modalWindow').on('click', '.window
.close', function() {
wok.window.close();
});
@@ -51,16 +52,14 @@ wok.window = (function() {
};
var close = function() {
- var windowID = _windows.pop();
- if(_listeners[windowID]) {
- _listeners[windowID]();
- _listeners[windowID] = null;
- }
- delete _listeners[windowID];
-
- $('#' + windowID).fadeOut(100, function() {
- $(this).remove();
- });
+ $('#modalWindow').removeData('bs.modal');
+ var windowID = _windows.pop();
+ if(_listeners[windowID]) {
+ _listeners[windowID]();
+ _listeners[windowID] = null;
+ }
+ delete _listeners[windowID];
+ $('#' + windowID).remove();
};
return {
diff --git a/ui/js/widgets/samples/dialog.html b/ui/js/widgets/samples/dialog.html
index 40594d0..559927a 100644
--- a/ui/js/widgets/samples/dialog.html
+++ b/ui/js/widgets/samples/dialog.html
@@ -28,8 +28,8 @@
<script src="../dialog-flat.js"></script>
<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
<link rel="stylesheet"
href="../../../css/theme-default/dialog-flat.css">
- <link rel="stylesheet"
href="../../../css/fontello/css/animation.css">
- <link rel="stylesheet"
href="../../../css/fontello/css/fontello.css">
+ <link rel="stylesheet"
href="../../../css/fontawesome/css/animation.css">
+ <link rel="stylesheet"
href="../../../css/fontawesome/css/fontawesome.css">
</head>
<body>
<div class="dialog-demo"></div>
diff --git a/ui/js/widgets/samples/grid.html b/ui/js/widgets/samples/grid.html
index 9b92d62..107d81c 100644
--- a/ui/js/widgets/samples/grid.html
+++ b/ui/js/widgets/samples/grid.html
@@ -27,8 +27,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
-<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
-<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../fontawesome/css/fontawesome.css">
+<link rel="stylesheet"
href="../../../fontawesome/css/animation.css">
<link rel="stylesheet"
href="../../../css/theme-default.min.css">
<script src="../../../libs/jquery-1.10.0.min.js"></script>
diff --git a/ui/js/widgets/samples/line.html b/ui/js/widgets/samples/line.html
index cc0b738..521b2ed 100644
--- a/ui/js/widgets/samples/line.html
+++ b/ui/js/widgets/samples/line.html
@@ -27,8 +27,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
-<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
-<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../fontawesome/css/fontawesome.css">
+<link rel="stylesheet"
href="../../../fontawesome/css/animation.css">
<link rel="stylesheet"
href="../../../css/theme-default.min.css">
<script src="../../../libs/jquery-1.10.0.min.js"></script>
diff --git a/ui/js/widgets/samples/list.html b/ui/js/widgets/samples/list.html
index 850550c..41c0eb3 100644
--- a/ui/js/widgets/samples/list.html
+++ b/ui/js/widgets/samples/list.html
@@ -28,8 +28,8 @@
<script src="../list-flat.js"></script>
<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
<link rel="stylesheet"
href="../../../css/theme-default/list-flat.css">
- <link rel="stylesheet"
href="../../../fontello/css/animation.css">
- <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/fontawesome.css">
</head>
<body>
<div class="list-demo"></div>
diff --git a/ui/js/widgets/samples/menu-button-radio-checkbox-text-select.html
b/ui/js/widgets/samples/menu-button-radio-checkbox-text-select.html
index e435263..06e29f7 100644
--- a/ui/js/widgets/samples/menu-button-radio-checkbox-text-select.html
+++ b/ui/js/widgets/samples/menu-button-radio-checkbox-text-select.html
@@ -38,8 +38,8 @@
<link rel="stylesheet"
href="../../../css/theme-default/checkbox-flat.css">
<link rel="stylesheet"
href="../../../css/theme-default/textbox-flat.css">
<link rel="stylesheet"
href="../../../css/theme-default/selectmenu-flat.css">
- <link rel="stylesheet"
href="../../../fontello/css/animation.css">
- <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/fontawesome.css">
</head>
<body>
<div id="menu"></div>
diff --git a/ui/js/widgets/samples/message.html b/ui/js/widgets/samples/message.html
index b8a2cf4..59f3d60 100644
--- a/ui/js/widgets/samples/message.html
+++ b/ui/js/widgets/samples/message.html
@@ -28,8 +28,8 @@
<script src="../message-flat.js"></script>
<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
<link rel="stylesheet"
href="../../../css/theme-default/message-flat.css">
- <link rel="stylesheet"
href="../../../fontello/css/animation.css">
- <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/fontawesome.css">
</head>
<body>
<div class="message-demo"></div>
diff --git a/ui/js/widgets/samples/messagebar-flat.html
b/ui/js/widgets/samples/messagebar-flat.html
index fd1417a..a75943e 100644
--- a/ui/js/widgets/samples/messagebar-flat.html
+++ b/ui/js/widgets/samples/messagebar-flat.html
@@ -25,8 +25,8 @@
<title>Sample of messagebar</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width,
initial-scale=1.0, user-scalable=yes" />
- <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
- <link rel="stylesheet"
href="../../../fontello/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/fontawesome.css">
+ <link rel="stylesheet"
href="../../../fontawesome/css/animation.css">
<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
<link rel="stylesheet"
href="../../../css/theme-default/messagebar-flat.css">
<script src="../../../libs/jquery-1.10.0.min.js"></script>
diff --git a/ui/js/widgets/samples/tabs.html b/ui/js/widgets/samples/tabs.html
index a8c4b4d..547c258 100644
--- a/ui/js/widgets/samples/tabs.html
+++ b/ui/js/widgets/samples/tabs.html
@@ -27,8 +27,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
-<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
-<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../fontawesome/css/fontawesome.css">
+<link rel="stylesheet"
href="../../../fontawesome/css/animation.css">
<link rel="stylesheet"
href="../../../css/theme-default.min.css">
<script src="../../../libs/jquery-1.10.0.min.js"></script>
diff --git a/ui/libs/bootstrap.js b/ui/libs/bootstrap.js
new file mode 100644
index 0000000..c99fc77
--- /dev/null
+++ b/ui/libs/bootstrap.js
@@ -0,0 +1,2345 @@
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.5
+ *
http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+
+ this.$target = $(this.options.target)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop,
this))
+
+ this.$element = $(element)
+ this.affixed = null
+ this.unpin = null
+ this.pinnedOffset = null
+
+ this.checkPosition()
+ }
+
+ Affix.VERSION = '3.3.5'
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0,
+ target: window
+ }
+
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ var targetHeight = this.$target.height()
+
+ if (offsetTop != null && this.affixed == 'top') return scrollTop <
offsetTop ? 'top' : false
+
+ if (this.affixed == 'bottom') {
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false :
'bottom'
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false :
'bottom'
+ }
+
+ var initializing = this.affixed == null
+ var colliderTop = initializing ? scrollTop : position.top
+ var colliderHeight = initializing ? targetHeight : height
+
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight
- offsetBottom)) return 'bottom'
+
+ return false
+ }
+
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var height = this.$element.height()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+ var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop =
offset.top(this.$element)
+ if (typeof offsetBottom == 'function') offsetBottom =
offset.bottom(this.$element)
+
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+ if (this.affixed != affix) {
+ if (this.unpin != null) this.$element.css('top', '')
+
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger(affixType.replace('affix', 'affixed') +
'.bs.affix')
+ }
+
+ if (affix == 'bottom') {
+ this.$element.offset({
+ top: scrollHeight - height - offsetBottom
+ })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.affix
+
+ $.fn.affix = Plugin
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
+
+ Plugin.call($spy, data)
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.5
+ *
http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // ALERT CLASS DEFINITION
+ // ======================
+
+ var dismiss = '[data-dismiss="alert"]'
+ var Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
+
+ Alert.VERSION = '3.3.5'
+
+ Alert.TRANSITION_DURATION = 150
+
+ Alert.prototype.close = function (e) {
+ var $this = $(this)
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //
strip for ie7
+ }
+
+ var $parent = $(selector)
+
+ if (e) e.preventDefault()
+
+ if (!$parent.length) {
+ $parent = $this.closest('.alert')
+ }
+
+ $parent.trigger(e = $.Event('close.bs.alert'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ // detach from parent, fire event then clean up data
+ $parent.detach().trigger('closed.bs.alert').remove()
+ }
+
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent
+ .one('bsTransitionEnd', removeElement)
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+ removeElement()
+ }
+
+
+ // ALERT PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.alert')
+
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.alert
+
+ $.fn.alert = Plugin
+ $.fn.alert.Constructor = Alert
+
+
+ // ALERT NO CONFLICT
+ // =================
+
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
+
+
+ // ALERT DATA-API
+ // ==============
+
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.5
+ *
http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // DROPDOWN CLASS DEFINITION
+ // =========================
+
+ var backdrop = '.dropdown-backdrop'
+ var toggle = '[data-toggle="dropdown"]'
+ var Dropdown = function (element) {
+ $(element).on('click.bs.dropdown', this.toggle)
+ }
+
+ Dropdown.VERSION = '3.3.5'
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#[A-Za-z]/.test(selector) &&
selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
+ }
+
+ function clearMenus(e) {
+ if (e && e.which === 3) return
+ $(backdrop).remove()
+ $(toggle).each(function () {
+ var $this = $(this)
+ var $parent = getParent($this)
+ var relatedTarget = { relatedTarget: this }
+
+ if (!$parent.hasClass('open')) return
+
+ if (e && e.type == 'click' &&
/input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target))
return
+
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this.attr('aria-expanded', 'false')
+ $parent.removeClass('open').trigger('hidden.bs.dropdown',
relatedTarget)
+ })
+ }
+
+ Dropdown.prototype.toggle = function (e) {
+ var $this = $(this)
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement &&
!$parent.closest('.navbar-nav').length) {
+ // if mobile we use a backdrop because click events don't delegate
+ $(document.createElement('div'))
+ .addClass('dropdown-backdrop')
+ .insertAfter($(this))
+ .on('click', clearMenus)
+ }
+
+ var relatedTarget = { relatedTarget: this }
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this
+ .trigger('focus')
+ .attr('aria-expanded', 'true')
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown', relatedTarget)
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName))
return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ if (!isActive && e.which != 27 || isActive && e.which == 27) {
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
+ return $this.trigger('click')
+ }
+
+ var desc = ' li:not(.disabled):visible a'
+ var $items = $parent.find('.dropdown-menu' + desc)
+
+ if (!$items.length) return
+
+ var index = $items.index(e.target)
+
+ if (e.which == 38 && index > 0) index-- // up
+ if (e.which == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index = 0
+
+ $items.eq(index).trigger('focus')
+ }
+
+
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = Plugin
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ // DROPDOWN NO CONFLICT
+ // ====================
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
+
+ $(document)
+ .on('click.bs.dropdown.data-api', clearMenus)
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) {
e.stopPropagation() })
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+ .on('keydown.bs.dropdown.data-api', '.dropdown-menu',
Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.5
+ *
http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Tooltip = function (element, options) {
+ this.type = null
+ this.options = null
+ this.enabled = null
+ this.timeout = null
+ this.hoverState = null
+ this.$element = null
+ this.inState = null
+
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.VERSION = '3.3.5'
+
+ Tooltip.TRANSITION_DURATION = 150
+
+ Tooltip.DEFAULTS = {
+ animation: true,
+ placement: 'top',
+ selector: false,
+ template: '<div class="tooltip" role="tooltip"><div
class="tooltip-arrow"></div><div
class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ container: false,
+ viewport: {
+ selector: 'body',
+ padding: 0
+ }
+ }
+
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+ this.$viewport = this.options.viewport &&
$($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) :
(this.options.viewport.selector || this.options.viewport))
+ this.inState = { click: false, hover: false, focus: false }
+
+ if (this.$element[0] instanceof document.constructor &&
!this.options.selector) {
+ throw new Error('`selector` option must be specified when initializing ' +
this.type + ' on the window.document object!')
+ }
+
+ var triggers = this.options.trigger.split(' ')
+
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
+
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector,
$.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ var eventIn = trigger == 'hover' ? 'mouseenter' :
'focusin'
+ var eventOut = trigger == 'hover' ? 'mouseleave' :
'focusout'
+
+ this.$element.on(eventIn + '.' + this.type, this.options.selector,
$.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector,
$.proxy(this.leave, this))
+ }
+ }
+
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector:
'' })) :
+ this.fixTitle()
+ }
+
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay,
+ hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
+
+ return options
+ }
+
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ if (obj instanceof $.Event) {
+ self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] =
true
+ }
+
+ if (self.tip().hasClass('in') || self.hoverState == 'in') {
+ self.hoverState = 'in'
+ return
+ }
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.isInStateTrue = function () {
+ for (var key in this.inState) {
+ if (this.inState[key]) return true
+ }
+
+ return false
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ if (obj instanceof $.Event) {
+ self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] =
false
+ }
+
+ if (self.isInStateTrue()) return
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.' + this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement,
this.$element[0])
+ if (e.isDefaultPrevented() || !inDom) return
+ var that = this
+
+ var $tip = this.tip()
+
+ var tipId = this.getUID(this.type)
+
+ this.setContent()
+ $tip.attr('id', tipId)
+ this.$element.attr('aria-describedby', tipId)
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') ||
'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+ .data('bs.' + this.type, this)
+
+ this.options.container ? $tip.appendTo(this.options.container) :
$tip.insertAfter(this.$element)
+ this.$element.trigger('inserted.bs.' + this.type)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var orgPlacement = placement
+ var viewportDim = this.getPosition(this.$viewport)
+
+ placement = placement == 'bottom' && pos.bottom + actualHeight
> viewportDim.bottom ? 'top' :
+ placement == 'top' && pos.top - actualHeight
< viewportDim.top ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth
> viewportDim.width ? 'left' :
+ placement == 'left' && pos.left - actualWidth
< viewportDim.left ? 'right' :
+ placement
+
+ $tip
+ .removeClass(orgPlacement)
+ .addClass(placement)
+ }
+
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth,
actualHeight)
+
+ this.applyPlacement(calculatedOffset, placement)
+
+ var complete = function () {
+ var prevHoverState = that.hoverState
+ that.$element.trigger('shown.bs.' + that.type)
+ that.hoverState = null
+
+ if (prevHoverState == 'out') that.leave(that)
+ }
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+ }
+ }
+
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top += marginTop
+ offset.left += marginLeft
+
+ // $.fn.offset doesn't round pixel values
+ // so we use setOffset directly with our own function B-0
+ $.offset.setOffset($tip[0], $.extend({
+ using: function (props) {
+ $tip.css({
+ top: Math.round(props.top),
+ left: Math.round(props.left)
+ })
+ }
+ }, offset), 0)
+
+ $tip.addClass('in')
+
+ // check to see if placing tip in new offset caused the tip to resize itself
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ offset.top = offset.top + height - actualHeight
+ }
+
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth,
actualHeight)
+
+ if (delta.left) offset.left += delta.left
+ else offset.top += delta.top
+
+ var isVertical = /top|bottom/.test(placement)
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth :
delta.top * 2 - height + actualHeight
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' :
'offsetHeight'
+
+ $tip.offset(offset)
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+ }
+
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+ this.arrow()
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) +
'%')
+ .css(isVertical ? 'top' : 'left', '')
+ }
+
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' :
'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ Tooltip.prototype.hide = function (callback) {
+ var that = this
+ var $tip = $(this.$tip)
+ var e = $.Event('hide.bs.' + this.type)
+
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ that.$element
+ .removeAttr('aria-describedby')
+ .trigger('hidden.bs.' + that.type)
+ callback && callback()
+ }
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ $.support.transition && $tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+
+ this.hoverState = null
+
+ return this
+ }
+
+ Tooltip.prototype.fixTitle = function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof $e.attr('data-original-title') !=
'string') {
+ $e.attr('data-original-title', $e.attr('title') ||
'').attr('title', '')
+ }
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function ($element) {
+ $element = $element || this.$element
+
+ var el = $element[0]
+ var isBody = el.tagName == 'BODY'
+
+ var elRect = el.getBoundingClientRect()
+ if (elRect.width == null) {
+ // width and height are missing in IE8, so compute them manually; see
https://github.com/twbs/bootstrap/issues/14093
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height:
elRect.bottom - elRect.top })
+ }
+ var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop ||
document.body.scrollTop : $element.scrollTop() }
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } :
null
+
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
+ }
+
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth,
actualHeight) {
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left
+ pos.width / 2 - actualWidth / 2 } :
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left
+ pos.width / 2 - actualWidth / 2 } :
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight
/ 2, left: pos.left - actualWidth } :
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight
/ 2, left: pos.left + pos.width }
+
+ }
+
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth,
actualHeight) {
+ var delta = { top: 0, left: 0 }
+ if (!this.$viewport) return delta
+
+ var viewportPadding = this.options.viewport && this.options.viewport.padding
|| 0
+ var viewportDimensions = this.getPosition(this.$viewport)
+
+ if (/right|left/.test(placement)) {
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll +
actualHeight
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
+ delta.top = viewportDimensions.top - topEdgeOffset
+ } else if (bottomEdgeOffset > viewportDimensions.top +
viewportDimensions.height) { // bottom overflow
+ delta.top = viewportDimensions.top + viewportDimensions.height -
bottomEdgeOffset
+ }
+ } else {
+ var leftEdgeOffset = pos.left - viewportPadding
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+ delta.left = viewportDimensions.left - leftEdgeOffset
+ } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+ delta.left = viewportDimensions.left + viewportDimensions.width -
rightEdgeOffset
+ }
+ }
+
+ return delta
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.getUID = function (prefix) {
+ do prefix += ~~(Math.random() * 1000000)
+ while (document.getElementById(prefix))
+ return prefix
+ }
+
+ Tooltip.prototype.tip = function () {
+ if (!this.$tip) {
+ this.$tip = $(this.options.template)
+ if (this.$tip.length != 1) {
+ throw new Error(this.type + ' `template` option must consist of exactly 1
top-level element!')
+ }
+ }
+ return this.$tip
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = this
+ if (e) {
+ self = $(e.currentTarget).data('bs.' + this.type)
+ if (!self) {
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+ $(e.currentTarget).data('bs.' + this.type, self)
+ }
+ }
+
+ if (e) {
+ self.inState.click = !self.inState.click
+ if (self.isInStateTrue()) self.enter(self)
+ else self.leave(self)
+ } else {
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+ }
+
+ Tooltip.prototype.destroy = function () {
+ var that = this
+ clearTimeout(this.timeout)
+ this.hide(function () {
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
+ if (that.$tip) {
+ that.$tip.detach()
+ }
+ that.$tip = null
+ that.$arrow = null
+ that.$viewport = null
+ })
+ }
+
+
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+
+ if (!data && /destroy|hide/.test(option)) return
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = Plugin
+ $.fn.tooltip.Constructor = Tooltip
+
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.5
+ *
http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // MODAL CLASS DEFINITION
+ // ======================
+
+ var Modal = function (element, options) {
+ this.options = options
+ this.$body = $(document.body)
+ this.$element = $(element)
+ this.$dialog = this.$element.find('.modal-dialog')
+ this.$backdrop = null
+ this.isShown = null
+ this.originalBodyPad = null
+ this.scrollbarWidth = 0
+ this.ignoreBackdropClick = false
+
+ if (this.options.remote) {
+ this.$element
+ .find('.modal-content')
+ .load(this.options.remote, $.proxy(function () {
+ this.$element.trigger('loaded.bs.modal')
+ }, this))
+ }
+ }
+
+ Modal.VERSION = '3.3.5'
+
+ Modal.TRANSITION_DURATION = 300
+ Modal.BACKDROP_TRANSITION_DURATION = 150
+
+ Modal.DEFAULTS = {
+ backdrop: true,
+ keyboard: true,
+ show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
+ }
+
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.checkScrollbar()
+ this.setScrollbar()
+ this.$body.addClass('modal-open')
+
+ this.escape()
+ this.resize()
+
+ this.$element.on('click.dismiss.bs.modal',
'[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+ })
+ })
+
+ this.backdrop(function () {
+ var transition = $.support.transition &&
that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(that.$body) // don't move modals dom position
+ }
+
+ that.$element
+ .show()
+ .scrollTop(0)
+
+ that.adjustDialog()
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element.addClass('in')
+
+ that.enforceFocus()
+
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+ transition ?
+ that.$dialog // wait for modal to slide in
+ .one('bsTransitionEnd', function () {
+ that.$element.trigger('focus').trigger(e)
+ })
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ that.$element.trigger('focus').trigger(e)
+ })
+ }
+
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
+
+ e = $.Event('hide.bs.modal')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+ this.resize()
+
+ $(document).off('focusin.bs.modal')
+
+ this.$element
+ .removeClass('in')
+ .off('click.dismiss.bs.modal')
+ .off('mouseup.dismiss.bs.modal')
+
+ this.$dialog.off('mousedown.dismiss.bs.modal')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$element
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ this.hideModal()
+ }
+
+ Modal.prototype.enforceFocus = function () {
+ $(document)
+ .off('focusin.bs.modal') // guard against infinite focus loop
+ .on('focusin.bs.modal', $.proxy(function (e) {
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length)
{
+ this.$element.trigger('focus')
+ }
+ }, this))
+ }
+
+ Modal.prototype.escape = function () {
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+ e.which == 27 && this.hide()
+ }, this))
+ } else if (!this.isShown) {
+ this.$element.off('keydown.dismiss.bs.modal')
+ }
+ }
+
+ Modal.prototype.resize = function () {
+ if (this.isShown) {
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+ } else {
+ $(window).off('resize.bs.modal')
+ }
+ }
+
+ Modal.prototype.hideModal = function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.$body.removeClass('modal-open')
+ that.resetAdjustments()
+ that.resetScrollbar()
+ that.$element.trigger('hidden.bs.modal')
+ })
+ }
+
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ Modal.prototype.backdrop = function (callback) {
+ var that = this
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $(document.createElement('div'))
+ .addClass('modal-backdrop ' + animate)
+ .appendTo(this.$body)
+
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+ if (this.ignoreBackdropClick) {
+ this.ignoreBackdropClick = false
+ return
+ }
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus()
+ : this.hide()
+ }, this))
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop
+ .one('bsTransitionEnd', callback)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ var callbackRemove = function () {
+ that.removeBackdrop()
+ callback && callback()
+ }
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$backdrop
+ .one('bsTransitionEnd', callbackRemove)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callbackRemove()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+ // these following methods are used to handle overflowing modals
+
+ Modal.prototype.handleUpdate = function () {
+ this.adjustDialog()
+ }
+
+ Modal.prototype.adjustDialog = function () {
+ var modalIsOverflowing = this.$element[0].scrollHeight >
document.documentElement.clientHeight
+
+ this.$element.css({
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ?
this.scrollbarWidth : '',
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ?
this.scrollbarWidth : ''
+ })
+ }
+
+ Modal.prototype.resetAdjustments = function () {
+ this.$element.css({
+ paddingLeft: '',
+ paddingRight: ''
+ })
+ }
+
+ Modal.prototype.checkScrollbar = function () {
+ var fullWindowWidth = window.innerWidth
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+ var documentElementRect = document.documentElement.getBoundingClientRect()
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+ }
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+ this.scrollbarWidth = this.measureScrollbar()
+ }
+
+ Modal.prototype.setScrollbar = function () {
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+ this.originalBodyPad = document.body.style.paddingRight || ''
+ if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad +
this.scrollbarWidth)
+ }
+
+ Modal.prototype.resetScrollbar = function () {
+ this.$body.css('padding-right', this.originalBodyPad)
+ }
+
+ Modal.prototype.measureScrollbar = function () { // thx walsh
+ var scrollDiv = document.createElement('div')
+ scrollDiv.className = 'modal-scrollbar-measure'
+ this.$body.append(scrollDiv)
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+ this.$body[0].removeChild(scrollDiv)
+ return scrollbarWidth
+ }
+
+
+ // MODAL PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option, _relatedTarget) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.modal')
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option ==
'object' && option)
+
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option](_relatedTarget)
+ else if (options.show) data.show(_relatedTarget)
+ })
+ }
+
+ var old = $.fn.modal
+
+ $.fn.modal = Plugin
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ // MODAL DATA-API
+ // ==============
+
+ $(document).on('click.bs.modal.data-api',
'[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ var href = $this.attr('href')
+ var $target = $($this.attr('data-target') || (href &&
href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({
remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+ if ($this.is('a')) e.preventDefault()
+
+ $target.one('show.bs.modal', function (showEvent) {
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal
will actually get shown
+ $target.one('hidden.bs.modal', function () {
+ $this.is(':visible') && $this.trigger('focus')
+ })
+ })
+ Plugin.call($target, option, this)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.5
+ *
http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CSS TRANSITION SUPPORT (Shoutout:
http://www.modernizr.com/)
+ // ============================================================
+
+ function transitionEnd() {
+ var el = document.createElement('bootstrap')
+
+ var transEndEventNames = {
+ WebkitTransition : 'webkitTransitionEnd',
+ MozTransition : 'transitionend',
+ OTransition : 'oTransitionEnd otransitionend',
+ transition : 'transitionend'
+ }
+
+ for (var name in transEndEventNames) {
+ if (el.style[name] !== undefined) {
+ return { end: transEndEventNames[name] }
+ }
+ }
+
+ return false // explicit for ie8 ( ._.)
+ }
+
+ //
http://blog.alexmaccaw.com/css-transitions
+ $.fn.emulateTransitionEnd = function (duration) {
+ var called = false
+ var $el = this
+ $(this).one('bsTransitionEnd', function () { called = true })
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+ setTimeout(callback, duration)
+ return this
+ }
+
+ $(function () {
+ $.support.transition = transitionEnd()
+
+ if (!$.support.transition) return
+
+ $.event.special.bsTransitionEnd = {
+ bindType: $.support.transition.end,
+ delegateType: $.support.transition.end,
+ handle: function (e) {
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+ }
+ }
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.5
+ *
http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ this.isLoading = false
+ }
+
+ Button.VERSION = '3.3.5'
+
+ Button.DEFAULTS = {
+ loadingText: 'loading...'
+ }
+
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ var $el = this.$element
+ var val = $el.is('input') ? 'val' : 'html'
+ var data = $el.data()
+
+ state += 'Text'
+
+ if (data.resetText == null) $el.data('resetText', $el[val]())
+
+ // push to event loop to allow forms to submit
+ setTimeout($.proxy(function () {
+ $el[val](data[state] == null ? this.options[state] : data[state])
+
+ if (state == 'loadingText') {
+ this.isLoading = true
+ $el.addClass(d).attr(d, d)
+ } else if (this.isLoading) {
+ this.isLoading = false
+ $el.removeClass(d).removeAttr(d)
+ }
+ }, this), 0)
+ }
+
+ Button.prototype.toggle = function () {
+ var changed = true
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+ if ($parent.length) {
+ var $input = this.$element.find('input')
+ if ($input.prop('type') == 'radio') {
+ if ($input.prop('checked')) changed = false
+ $parent.find('.active').removeClass('active')
+ this.$element.addClass('active')
+ } else if ($input.prop('type') == 'checkbox') {
+ if (($input.prop('checked')) !==
this.$element.hasClass('active')) changed = false
+ this.$element.toggleClass('active')
+ }
+ $input.prop('checked', this.$element.hasClass('active'))
+ if (changed) $input.trigger('change')
+ } else {
+ this.$element.attr('aria-pressed',
!this.$element.hasClass('active'))
+ this.$element.toggleClass('active')
+ }
+ }
+
+
+ // BUTTON PLUGIN DEFINITION
+ // ========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.button')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+ if (option == 'toggle') data.toggle()
+ else if (option) data.setState(option)
+ })
+ }
+
+ var old = $.fn.button
+
+ $.fn.button = Plugin
+ $.fn.button.Constructor = Button
+
+
+ // BUTTON NO CONFLICT
+ // ==================
+
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ // BUTTON DATA-API
+ // ===============
+
+ $(document)
+ .on('click.bs.button.data-api', '[data-toggle^="button"]',
function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ Plugin.call($btn, 'toggle')
+ if (!($(e.target).is('input[type="radio"]') ||
$(e.target).is('input[type="checkbox"]'))) e.preventDefault()
+ })
+ .on('focus.bs.button.data-api blur.bs.button.data-api',
'[data-toggle^="button"]', function (e) {
+ $(e.target).closest('.btn').toggleClass('focus',
/^focus(in)?$/.test(e.type))
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.5
+ *
http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+ Popover.VERSION = '3.3.5'
+
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover" role="tooltip"><div
class="arrow"></div><h3
class="popover-title"></h3><div
class="popover-content"></div></div>'
+ })
+
+
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+ Popover.prototype.constructor = Popover
+
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
+
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' :
'text'](title)
+ $tip.find('.popover-content').children().detach().end()[ // we use append for
html objects to maintain js events
+ this.options.html ? (typeof content == 'string' ? 'html' :
'append') : 'text'
+ ](content)
+
+ $tip.removeClass('fade top bottom left right in')
+
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+ // this manually by checking the contents.
+ if (!$tip.find('.popover-title').html())
$tip.find('.popover-title').hide()
+ }
+
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+ }
+
+
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+
+ if (!data && /destroy|hide/.test(option)) return
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.popover
+
+ $.fn.popover = Plugin
+ $.fn.popover.Constructor = Popover
+
+
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.5
+ *
http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CAROUSEL CLASS DEFINITION
+ // =========================
+
+ var Carousel = function (element, options) {
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.paused = null
+ this.sliding = null
+ this.interval = null
+ this.$active = null
+ this.$items = null
+
+ this.options.keyboard && this.$element.on('keydown.bs.carousel',
$.proxy(this.keydown, this))
+
+ this.options.pause == 'hover' && !('ontouchstart' in
document.documentElement) && this.$element
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+ }
+
+ Carousel.VERSION = '3.3.5'
+
+ Carousel.TRANSITION_DURATION = 600
+
+ Carousel.DEFAULTS = {
+ interval: 5000,
+ pause: 'hover',
+ wrap: true,
+ keyboard: true
+ }
+
+ Carousel.prototype.keydown = function (e) {
+ if (/input|textarea/i.test(e.target.tagName)) return
+ switch (e.which) {
+ case 37: this.prev(); break
+ case 39: this.next(); break
+ default: return
+ }
+
+ e.preventDefault()
+ }
+
+ Carousel.prototype.cycle = function (e) {
+ e || (this.paused = false)
+
+ this.interval && clearInterval(this.interval)
+
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this),
this.options.interval))
+
+ return this
+ }
+
+ Carousel.prototype.getItemIndex = function (item) {
+ this.$items = item.parent().children('.item')
+ return this.$items.index(item || this.$active)
+ }
+
+ Carousel.prototype.getItemForDirection = function (direction, active) {
+ var activeIndex = this.getItemIndex(active)
+ var willWrap = (direction == 'prev' && activeIndex === 0)
+ || (direction == 'next' && activeIndex ==
(this.$items.length - 1))
+ if (willWrap && !this.options.wrap) return active
+ var delta = direction == 'prev' ? -1 : 1
+ var itemIndex = (activeIndex + delta) % this.$items.length
+ return this.$items.eq(itemIndex)
+ }
+
+ Carousel.prototype.to = function (pos) {
+ var that = this
+ var activeIndex = this.getItemIndex(this.$active =
this.$element.find('.item.active'))
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function
() { that.to(pos) }) // yes, "slid"
+ if (activeIndex == pos) return this.pause().cycle()
+
+ return this.slide(pos > activeIndex ? 'next' : 'prev',
this.$items.eq(pos))
+ }
+
+ Carousel.prototype.pause = function (e) {
+ e || (this.paused = true)
+
+ if (this.$element.find('.next, .prev').length &&
$.support.transition) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
+ }
+
+ this.interval = clearInterval(this.interval)
+
+ return this
+ }
+
+ Carousel.prototype.next = function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ Carousel.prototype.prev = function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ Carousel.prototype.slide = function (type, next) {
+ var $active = this.$element.find('.item.active')
+ var $next = next || this.getItemForDirection(type, $active)
+ var isCycling = this.interval
+ var direction = type == 'next' ? 'left' : 'right'
+ var that = this
+
+ if ($next.hasClass('active')) return (this.sliding = false)
+
+ var relatedTarget = $next[0]
+ var slideEvent = $.Event('slide.bs.carousel', {
+ relatedTarget: relatedTarget,
+ direction: direction
+ })
+ this.$element.trigger(slideEvent)
+ if (slideEvent.isDefaultPrevented()) return
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+ $nextIndicator && $nextIndicator.addClass('active')
+ }
+
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget,
direction: direction }) // yes, "slid"
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ $active
+ .one('bsTransitionEnd', function () {
+ $next.removeClass([type, direction].join('
')).addClass('active')
+ $active.removeClass(['active', direction].join(' '))
+ that.sliding = false
+ setTimeout(function () {
+ that.$element.trigger(slidEvent)
+ }, 0)
+ })
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+ } else {
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger(slidEvent)
+ }
+
+ isCycling && this.cycle()
+
+ return this
+ }
+
+
+ // CAROUSEL PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.carousel')
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option ==
'object' && option)
+ var action = typeof option == 'string' ? option : options.slide
+
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+ if (typeof option == 'number') data.to(option)
+ else if (action) data[action]()
+ else if (options.interval) data.pause().cycle()
+ })
+ }
+
+ var old = $.fn.carousel
+
+ $.fn.carousel = Plugin
+ $.fn.carousel.Constructor = Carousel
+
+
+ // CAROUSEL NO CONFLICT
+ // ====================
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
+ }
+
+
+ // CAROUSEL DATA-API
+ // =================
+
+ var clickHandler = function (e) {
+ var href
+ var $this = $(this)
+ var $target = $($this.attr('data-target') || (href =
$this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //
strip for ie7
+ if (!$target.hasClass('carousel')) return
+ var options = $.extend({}, $target.data(), $this.data())
+ var slideIndex = $this.attr('data-slide-to')
+ if (slideIndex) options.interval = false
+
+ Plugin.call($target, options)
+
+ if (slideIndex) {
+ $target.data('bs.carousel').to(slideIndex)
+ }
+
+ e.preventDefault()
+ }
+
+ $(document)
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+ $(window).on('load', function () {
+ $('[data-ride="carousel"]').each(function () {
+ var $carousel = $(this)
+ Plugin.call($carousel, $carousel.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.5
+ *
http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ this.$body = $(document.body)
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target || '') + ' .nav li >
a'
+ this.offsets = []
+ this.targets = []
+ this.activeTarget = null
+ this.scrollHeight = 0
+
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.VERSION = '3.3.5'
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.getScrollHeight = function () {
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight,
document.documentElement.scrollHeight)
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var that = this
+ var offsetMethod = 'offset'
+ var offsetBase = 0
+
+ this.offsets = []
+ this.targets = []
+ this.scrollHeight = this.getScrollHeight()
+
+ if (!$.isWindow(this.$scrollElement[0])) {
+ offsetMethod = 'position'
+ offsetBase = this.$scrollElement.scrollTop()
+ }
+
+ this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(href)
+
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ that.offsets.push(this[0])
+ that.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.getScrollHeight()
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (this.scrollHeight != scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets[targets.length - 1]) &&
this.activate(i)
+ }
+
+ if (activeTarget && scrollTop < offsets[0]) {
+ this.activeTarget = null
+ return this.clear()
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+ && this.activate(targets[i])
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ this.clear()
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+ ScrollSpy.prototype.clear = function () {
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this,
options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = Plugin
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load.bs.scrollspy.data-api', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ Plugin.call($spy, $spy.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.5
+ *
http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // COLLAPSE PUBLIC CLASS DEFINITION
+ // ================================
+
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
+ this.$trigger = $('[data-toggle="collapse"][href="#' +
element.id + '"],' +
+
'[data-toggle="collapse"][data-target="#' + element.id +
'"]')
+ this.transitioning = null
+
+ if (this.options.parent) {
+ this.$parent = this.getParent()
+ } else {
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+ }
+
+ if (this.options.toggle) this.toggle()
+ }
+
+ Collapse.VERSION = '3.3.5'
+
+ Collapse.TRANSITION_DURATION = 350
+
+ Collapse.DEFAULTS = {
+ toggle: true
+ }
+
+ Collapse.prototype.dimension = function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ Collapse.prototype.show = function () {
+ if (this.transitioning || this.$element.hasClass('in')) return
+
+ var activesData
+ var actives = this.$parent &&
this.$parent.children('.panel').children('.in, .collapsing')
+
+ if (actives && actives.length) {
+ activesData = actives.data('bs.collapse')
+ if (activesData && activesData.transitioning) return
+ }
+
+ var startEvent = $.Event('show.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ if (actives && actives.length) {
+ Plugin.call(actives, 'hide')
+ activesData || actives.data('bs.collapse', null)
+ }
+
+ var dimension = this.dimension()
+
+ this.$element
+ .removeClass('collapse')
+ .addClass('collapsing')[dimension](0)
+ .attr('aria-expanded', true)
+
+ this.$trigger
+ .removeClass('collapsed')
+ .attr('aria-expanded', true)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse in')[dimension]('')
+ this.transitioning = 0
+ this.$element
+ .trigger('shown.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+ this.$element
+ .one('bsTransitionEnd', $.proxy(complete, this))
+
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+ }
+
+ Collapse.prototype.hide = function () {
+ if (this.transitioning || !this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('hide.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var dimension = this.dimension()
+
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+ this.$element
+ .addClass('collapsing')
+ .removeClass('collapse in')
+ .attr('aria-expanded', false)
+
+ this.$trigger
+ .addClass('collapsed')
+ .attr('aria-expanded', false)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.transitioning = 0
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse')
+ .trigger('hidden.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ this.$element
+ [dimension](0)
+ .one('bsTransitionEnd', $.proxy(complete, this))
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+ }
+
+ Collapse.prototype.toggle = function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
+ }
+
+ Collapse.prototype.getParent = function () {
+ return $(this.options.parent)
+ .find('[data-toggle="collapse"][data-parent="' +
this.options.parent + '"]')
+ .each($.proxy(function (i, element) {
+ var $element = $(element)
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+ }, this))
+ .end()
+ }
+
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+ var isOpen = $element.hasClass('in')
+
+ $element.attr('aria-expanded', isOpen)
+ $trigger
+ .toggleClass('collapsed', !isOpen)
+ .attr('aria-expanded', isOpen)
+ }
+
+ function getTargetFromTrigger($trigger) {
+ var href
+ var target = $trigger.attr('data-target')
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/,
'') // strip for ie7
+
+ return $(target)
+ }
+
+
+ // COLLAPSE PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.collapse')
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option ==
'object' && option)
+
+ if (!data && options.toggle && /show|hide/.test(option))
options.toggle = false
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = Plugin
+ $.fn.collapse.Constructor = Collapse
+
+
+ // COLLAPSE NO CONFLICT
+ // ====================
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
+ }
+
+
+ // COLLAPSE DATA-API
+ // =================
+
+ $(document).on('click.bs.collapse.data-api',
'[data-toggle="collapse"]', function (e) {
+ var $this = $(this)
+
+ if (!$this.attr('data-target')) e.preventDefault()
+
+ var $target = getTargetFromTrigger($this)
+ var data = $target.data('bs.collapse')
+ var option = data ? 'toggle' : $this.data()
+
+ Plugin.call($target, option)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.5
+ *
http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
+ // jscs:disable requireDollarBeforejQueryAssignment
+ this.element = $(element)
+ // jscs:enable requireDollarBeforejQueryAssignment
+ }
+
+ Tab.VERSION = '3.3.5'
+
+ Tab.TRANSITION_DURATION = 150
+
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //
strip for ie7
+ }
+
+ if ($this.parent('li').hasClass('active')) return
+
+ var $previous = $ul.find('.active:last a')
+ var hideEvent = $.Event('hide.bs.tab', {
+ relatedTarget: $this[0]
+ })
+ var showEvent = $.Event('show.bs.tab', {
+ relatedTarget: $previous[0]
+ })
+
+ $previous.trigger(hideEvent)
+ $this.trigger(showEvent)
+
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+ var $target = $(selector)
+
+ this.activate($this.closest('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $previous.trigger({
+ type: 'hidden.bs.tab',
+ relatedTarget: $this[0]
+ })
+ $this.trigger({
+ type: 'shown.bs.tab',
+ relatedTarget: $previous[0]
+ })
+ })
+ }
+
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && ($active.length && $active.hasClass('fade') ||
!!container.find('> .fade').length)
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', false)
+
+ element
+ .addClass('active')
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if (element.parent('.dropdown-menu').length) {
+ element
+ .closest('li.dropdown')
+ .addClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+ }
+
+ callback && callback()
+ }
+
+ $active.length && transition ?
+ $active
+ .one('bsTransitionEnd', next)
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+ next()
+
+ $active.removeClass('in')
+ }
+
+
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tab
+
+ $.fn.tab = Plugin
+ $.fn.tab.Constructor = Tab
+
+
+ // TAB NO CONFLICT
+ // ===============
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ // TAB DATA-API
+ // ============
+
+ var clickHandler = function (e) {
+ e.preventDefault()
+ Plugin.call($(this), 'show')
+ }
+
+ $(document)
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]',
clickHandler)
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]',
clickHandler)
+
+}(jQuery);
diff --git a/ui/libs/jquery-ui.js b/ui/libs/jquery-ui.js
new file mode 100644
index 0000000..31ee9cd
--- /dev/null
+++ b/ui/libs/jquery-ui.js
@@ -0,0 +1,16617 @@
+/*! jQuery UI - v1.11.4 - 2015-03-11
+*
http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js,
button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js,
effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js,
effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js,
effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js,
menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js,
sortable.js, spinner.js, tabs.js, tooltip.js
+* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+
+ // AMD. Register as an anonymous module.
+ define([ "jquery" ], factory );
+ } else {
+
+ // Browser globals
+ factory( jQuery );
+ }
+}(function( $ ) {
+/*!
+ * jQuery UI Core 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/category/ui-core/
+ */
+
+
+// $.ui might exist from components with no dependencies, e.g., $.ui.position
+$.ui = $.ui || {};
+
+$.extend( $.ui, {
+ version: "1.11.4",
+
+ keyCode: {
+ BACKSPACE: 8,
+ COMMA: 188,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ LEFT: 37,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38
+ }
+});
+
+// plugins
+$.fn.extend({
+ scrollParent: function( includeHidden ) {
+ var position = this.css( "position" ),
+ excludeStaticParent = position === "absolute",
+ overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
+ scrollParent = this.parents().filter( function() {
+ var parent = $( this );
+ if ( excludeStaticParent && parent.css( "position" ) ===
"static" ) {
+ return false;
+ }
+ return overflowRegex.test( parent.css( "overflow" ) + parent.css(
"overflow-y" ) + parent.css( "overflow-x" ) );
+ }).eq( 0 );
+
+ return position === "fixed" || !scrollParent.length ? $( this[ 0
].ownerDocument || document ) : scrollParent;
+ },
+
+ uniqueId: (function() {
+ var uuid = 0;
+
+ return function() {
+ return this.each(function() {
+ if ( !this.id ) {
+ this.id = "ui-id-" + ( ++uuid );
+ }
+ });
+ };
+ })(),
+
+ removeUniqueId: function() {
+ return this.each(function() {
+ if ( /^ui-id-\d+$/.test( this.id ) ) {
+ $( this ).removeAttr( "id" );
+ }
+ });
+ }
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+ var map, mapName, img,
+ nodeName = element.nodeName.toLowerCase();
+ if ( "area" === nodeName ) {
+ map = element.parentNode;
+ mapName = map.name;
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+ return false;
+ }
+ img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
+ return !!img && visible( img );
+ }
+ return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
+ !element.disabled :
+ "a" === nodeName ?
+ element.href || isTabIndexNotNaN :
+ isTabIndexNotNaN) &&
+ // the element and all of its ancestors must be visible
+ visible( element );
+}
+
+function visible( element ) {
+ return $.expr.filters.visible( element ) &&
+ !$( element ).parents().addBack().filter(function() {
+ return $.css( this, "visibility" ) === "hidden";
+ }).length;
+}
+
+$.extend( $.expr[ ":" ], {
+ data: $.expr.createPseudo ?
+ $.expr.createPseudo(function( dataName ) {
+ return function( elem ) {
+ return !!$.data( elem, dataName );
+ };
+ }) :
+ // support: jQuery <1.8
+ function( elem, i, match ) {
+ return !!$.data( elem, match[ 3 ] );
+ },
+
+ focusable: function( element ) {
+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+ },
+
+ tabbable: function( element ) {
+ var tabIndex = $.attr( element, "tabindex" ),
+ isTabIndexNaN = isNaN( tabIndex );
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element,
!isTabIndexNaN );
+ }
+});
+
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+ $.each( [ "Width", "Height" ], function( i, name ) {
+ var side = name === "Width" ? [ "Left", "Right" ] : [
"Top", "Bottom" ],
+ type = name.toLowerCase(),
+ orig = {
+ innerWidth: $.fn.innerWidth,
+ innerHeight: $.fn.innerHeight,
+ outerWidth: $.fn.outerWidth,
+ outerHeight: $.fn.outerHeight
+ };
+
+ function reduce( elem, size, border, margin ) {
+ $.each( side, function() {
+ size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
+ if ( border ) {
+ size -= parseFloat( $.css( elem, "border" + this + "Width" ) )
|| 0;
+ }
+ if ( margin ) {
+ size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
+ }
+ });
+ return size;
+ }
+
+ $.fn[ "inner" + name ] = function( size ) {
+ if ( size === undefined ) {
+ return orig[ "inner" + name ].call( this );
+ }
+
+ return this.each(function() {
+ $( this ).css( type, reduce( this, size ) + "px" );
+ });
+ };
+
+ $.fn[ "outer" + name] = function( size, margin ) {
+ if ( typeof size !== "number" ) {
+ return orig[ "outer" + name ].call( this, size );
+ }
+
+ return this.each(function() {
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
+ });
+ };
+ });
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+ $.fn.addBack = function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ };
+}
+
+// support: jQuery 1.6.1, 1.6.2 (
http://bugs.jquery.com/ticket/9413)
+if ( $( "<a>" ).data( "a-b", "a" ).removeData(
"a-b" ).data( "a-b" ) ) {
+ $.fn.removeData = (function( removeData ) {
+ return function( key ) {
+ if ( arguments.length ) {
+ return removeData.call( this, $.camelCase( key ) );
+ } else {
+ return removeData.call( this );
+ }
+ };
+ })( $.fn.removeData );
+}
+
+// deprecated
+$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
+
+$.fn.extend({
+ focus: (function( orig ) {
+ return function( delay, fn ) {
+ return typeof delay === "number" ?
+ this.each(function() {
+ var elem = this;
+ setTimeout(function() {
+ $( elem ).focus();
+ if ( fn ) {
+ fn.call( elem );
+ }
+ }, delay );
+ }) :
+ orig.apply( this, arguments );
+ };
+ })( $.fn.focus ),
+
+ disableSelection: (function() {
+ var eventType = "onselectstart" in document.createElement( "div" )
?
+ "selectstart" :
+ "mousedown";
+
+ return function() {
+ return this.bind( eventType + ".ui-disableSelection", function( event ) {
+ event.preventDefault();
+ });
+ };
+ })(),
+
+ enableSelection: function() {
+ return this.unbind( ".ui-disableSelection" );
+ },
+
+ zIndex: function( zIndex ) {
+ if ( zIndex !== undefined ) {
+ return this.css( "zIndex", zIndex );
+ }
+
+ if ( this.length ) {
+ var elem = $( this[ 0 ] ), position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the
browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" ||
position === "fixed" ) {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index:
0;"></div></div>
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ }
+
+ return 0;
+ }
+});
+
+// $.ui.plugin is deprecated. Use $.widget() extensions instead.
+$.ui.plugin = {
+ add: function( module, option, set ) {
+ var i,
+ proto = $.ui[ module ].prototype;
+ for ( i in set ) {
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
+ }
+ },
+ call: function( instance, name, args, allowDisconnected ) {
+ var i,
+ set = instance.plugins[ name ];
+
+ if ( !set ) {
+ return;
+ }
+
+ if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
+ return;
+ }
+
+ for ( i = 0; i < set.length; i++ ) {
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
+ set[ i ][ 1 ].apply( instance.element, args );
+ }
+ }
+ }
+};
+
+
+/*!
+ * jQuery UI Widget 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/jQuery.widget/
+ */
+
+
+var widget_uuid = 0,
+ widget_slice = Array.prototype.slice;
+
+$.cleanData = (function( orig ) {
+ return function( elems ) {
+ var events, elem, i;
+ for ( i = 0; (elem = elems[i]) != null; i++ ) {
+ try {
+
+ // Only trigger remove when necessary to save time
+ events = $._data( elem, "events" );
+ if ( events && events.remove ) {
+ $( elem ).triggerHandler( "remove" );
+ }
+
+ //
http://bugs.jquery.com/ticket/8235
+ } catch ( e ) {}
+ }
+ orig( elems );
+ };
+})( $.cleanData );
+
+$.widget = function( name, base, prototype ) {
+ var fullName, existingConstructor, constructor, basePrototype,
+ // proxiedPrototype allows the provided prototype to remain unmodified
+ // so that it can be used as a mixin for multiple widgets (#8876)
+ proxiedPrototype = {},
+ namespace = name.split( "." )[ 0 ];
+
+ name = name.split( "." )[ 1 ];
+ fullName = namespace + "-" + name;
+
+ if ( !prototype ) {
+ prototype = base;
+ base = $.Widget;
+ }
+
+ // create selector for plugin
+ $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+ return !!$.data( elem, fullName );
+ };
+
+ $[ namespace ] = $[ namespace ] || {};
+ existingConstructor = $[ namespace ][ name ];
+ constructor = $[ namespace ][ name ] = function( options, element ) {
+ // allow instantiation without "new" keyword
+ if ( !this._createWidget ) {
+ return new constructor( options, element );
+ }
+
+ // allow instantiation without initializing for simple inheritance
+ // must use "new" keyword (the code above always passes args)
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+ };
+ // extend with the existing constructor to carry over any static properties
+ $.extend( constructor, existingConstructor, {
+ version: prototype.version,
+ // copy the object used to create the prototype in case we need to
+ // redefine the widget later
+ _proto: $.extend( {}, prototype ),
+ // track widgets that inherit from this widget in case this widget is
+ // redefined after a widget inherits from it
+ _childConstructors: []
+ });
+
+ basePrototype = new base();
+ // we need to make the options hash a property directly on the new instance
+ // otherwise we'll modify the options hash on the prototype that we're
+ // inheriting from
+ basePrototype.options = $.widget.extend( {}, basePrototype.options );
+ $.each( prototype, function( prop, value ) {
+ if ( !$.isFunction( value ) ) {
+ proxiedPrototype[ prop ] = value;
+ return;
+ }
+ proxiedPrototype[ prop ] = (function() {
+ var _super = function() {
+ return base.prototype[ prop ].apply( this, arguments );
+ },
+ _superApply = function( args ) {
+ return base.prototype[ prop ].apply( this, args );
+ };
+ return function() {
+ var __super = this._super,
+ __superApply = this._superApply,
+ returnValue;
+
+ this._super = _super;
+ this._superApply = _superApply;
+
+ returnValue = value.apply( this, arguments );
+
+ this._super = __super;
+ this._superApply = __superApply;
+
+ return returnValue;
+ };
+ })();
+ });
+ constructor.prototype = $.widget.extend( basePrototype, {
+ // TODO: remove support for widgetEventPrefix
+ // always use the name + a colon as the prefix, e.g., draggable:start
+ // don't prefix for widgets that aren't DOM-based
+ widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) :
name
+ }, proxiedPrototype, {
+ constructor: constructor,
+ namespace: namespace,
+ widgetName: name,
+ widgetFullName: fullName
+ });
+
+ // If this widget is being redefined then we need to find all widgets that
+ // are inheriting from it and redefine all of them so that they inherit from
+ // the new version of this widget. We're essentially trying to replace one
+ // level in the prototype chain.
+ if ( existingConstructor ) {
+ $.each( existingConstructor._childConstructors, function( i, child ) {
+ var childPrototype = child.prototype;
+
+ // redefine the child widget using the same prototype that was
+ // originally used, but inherit from the new version of the base
+ $.widget( childPrototype.namespace + "." + childPrototype.widgetName,
constructor, child._proto );
+ });
+ // remove the list of existing child constructors from the old constructor
+ // so the old child constructors can be garbage collected
+ delete existingConstructor._childConstructors;
+ } else {
+ base._childConstructors.push( constructor );
+ }
+
+ $.widget.bridge( name, constructor );
+
+ return constructor;
+};
+
+$.widget.extend = function( target ) {
+ var input = widget_slice.call( arguments, 1 ),
+ inputIndex = 0,
+ inputLength = input.length,
+ key,
+ value;
+ for ( ; inputIndex < inputLength; inputIndex++ ) {
+ for ( key in input[ inputIndex ] ) {
+ value = input[ inputIndex ][ key ];
+ if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+ // Clone objects
+ if ( $.isPlainObject( value ) ) {
+ target[ key ] = $.isPlainObject( target[ key ] ) ?
+ $.widget.extend( {}, target[ key ], value ) :
+ // Don't extend strings, arrays, etc. with objects
+ $.widget.extend( {}, value );
+ // Copy everything else by reference
+ } else {
+ target[ key ] = value;
+ }
+ }
+ }
+ }
+ return target;
+};
+
+$.widget.bridge = function( name, object ) {
+ var fullName = object.prototype.widgetFullName || name;
+ $.fn[ name ] = function( options ) {
+ var isMethodCall = typeof options === "string",
+ args = widget_slice.call( arguments, 1 ),
+ returnValue = this;
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var methodValue,
+ instance = $.data( this, fullName );
+ if ( options === "instance" ) {
+ returnValue = instance;
+ return false;
+ }
+ if ( !instance ) {
+ return $.error( "cannot call methods on " + name + " prior to
initialization; " +
+ "attempted to call method '" + options + "'" );
+ }
+ if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+ return $.error( "no such method '" + options + "' for "
+ name + " widget instance" );
+ }
+ methodValue = instance[ options ].apply( instance, args );
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue && methodValue.jquery ?
+ returnValue.pushStack( methodValue.get() ) :
+ methodValue;
+ return false;
+ }
+ });
+ } else {
+
+ // Allow multiple hashes to be passed on init
+ if ( args.length ) {
+ options = $.widget.extend.apply( null, [ options ].concat(args) );
+ }
+
+ this.each(function() {
+ var instance = $.data( this, fullName );
+ if ( instance ) {
+ instance.option( options || {} );
+ if ( instance._init ) {
+ instance._init();
+ }
+ } else {
+ $.data( this, fullName, new object( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+ widgetName: "widget",
+ widgetEventPrefix: "",
+ defaultElement: "<div>",
+ options: {
+ disabled: false,
+
+ // callbacks
+ create: null
+ },
+ _createWidget: function( options, element ) {
+ element = $( element || this.defaultElement || this )[ 0 ];
+ this.element = $( element );
+ this.uuid = widget_uuid++;
+ this.eventNamespace = "." + this.widgetName + this.uuid;
+
+ this.bindings = $();
+ this.hoverable = $();
+ this.focusable = $();
+
+ if ( element !== this ) {
+ $.data( element, this.widgetFullName, this );
+ this._on( true, this.element, {
+ remove: function( event ) {
+ if ( event.target === element ) {
+ this.destroy();
+ }
+ }
+ });
+ this.document = $( element.style ?
+ // element within the document
+ element.ownerDocument :
+ // element is window or document
+ element.document || element );
+ this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+ }
+
+ this.options = $.widget.extend( {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
+ this._create();
+ this._trigger( "create", null, this._getCreateEventData() );
+ this._init();
+ },
+ _getCreateOptions: $.noop,
+ _getCreateEventData: $.noop,
+ _create: $.noop,
+ _init: $.noop,
+
+ destroy: function() {
+ this._destroy();
+ // we can probably remove the unbind calls in 2.0
+ // all event bindings should go through this._on()
+ this.element
+ .unbind( this.eventNamespace )
+ .removeData( this.widgetFullName )
+ // support: jquery <1.6.3
+ //
http://bugs.jquery.com/ticket/9413
+ .removeData( $.camelCase( this.widgetFullName ) );
+ this.widget()
+ .unbind( this.eventNamespace )
+ .removeAttr( "aria-disabled" )
+ .removeClass(
+ this.widgetFullName + "-disabled " +
+ "ui-state-disabled" );
+
+ // clean up events and states
+ this.bindings.unbind( this.eventNamespace );
+ this.hoverable.removeClass( "ui-state-hover" );
+ this.focusable.removeClass( "ui-state-focus" );
+ },
+ _destroy: $.noop,
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key,
+ parts,
+ curOption,
+ i;
+
+ if ( arguments.length === 0 ) {
+ // don't return a reference to the internal hash
+ return $.widget.extend( {}, this.options );
+ }
+
+ if ( typeof key === "string" ) {
+ // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+ options = {};
+ parts = key.split( "." );
+ key = parts.shift();
+ if ( parts.length ) {
+ curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+ for ( i = 0; i < parts.length - 1; i++ ) {
+ curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+ curOption = curOption[ parts[ i ] ];
+ }
+ key = parts.pop();
+ if ( arguments.length === 1 ) {
+ return curOption[ key ] === undefined ? null : curOption[ key ];
+ }
+ curOption[ key ] = value;
+ } else {
+ if ( arguments.length === 1 ) {
+ return this.options[ key ] === undefined ? null : this.options[ key ];
+ }
+ options[ key ] = value;
+ }
+ }
+
+ this._setOptions( options );
+
+ return this;
+ },
+ _setOptions: function( options ) {
+ var key;
+
+ for ( key in options ) {
+ this._setOption( key, options[ key ] );
+ }
+
+ return this;
+ },
+ _setOption: function( key, value ) {
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this.widget()
+ .toggleClass( this.widgetFullName + "-disabled", !!value );
+
+ // If the widget is becoming disabled, then nothing is interactive
+ if ( value ) {
+ this.hoverable.removeClass( "ui-state-hover" );
+ this.focusable.removeClass( "ui-state-focus" );
+ }
+ }
+
+ return this;
+ },
+
+ enable: function() {
+ return this._setOptions({ disabled: false });
+ },
+ disable: function() {
+ return this._setOptions({ disabled: true });
+ },
+
+ _on: function( suppressDisabledCheck, element, handlers ) {
+ var delegateElement,
+ instance = this;
+
+ // no suppressDisabledCheck flag, shuffle arguments
+ if ( typeof suppressDisabledCheck !== "boolean" ) {
+ handlers = element;
+ element = suppressDisabledCheck;
+ suppressDisabledCheck = false;
+ }
+
+ // no element argument, shuffle and use this.element
+ if ( !handlers ) {
+ handlers = element;
+ element = this.element;
+ delegateElement = this.widget();
+ } else {
+ element = delegateElement = $( element );
+ this.bindings = this.bindings.add( element );
+ }
+
+ $.each( handlers, function( event, handler ) {
+ function handlerProxy() {
+ // allow widgets to customize the disabled handling
+ // - disabled as an array instead of boolean
+ // - disabled class as method for disabling individual parts
+ if ( !suppressDisabledCheck &&
+ ( instance.options.disabled === true ||
+ $( this ).hasClass( "ui-state-disabled" ) ) ) {
+ return;
+ }
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+
+ // copy the guid so direct unbinding works
+ if ( typeof handler !== "string" ) {
+ handlerProxy.guid = handler.guid =
+ handler.guid || handlerProxy.guid || $.guid++;
+ }
+
+ var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
+ eventName = match[1] + instance.eventNamespace,
+ selector = match[2];
+ if ( selector ) {
+ delegateElement.delegate( selector, eventName, handlerProxy );
+ } else {
+ element.bind( eventName, handlerProxy );
+ }
+ });
+ },
+
+ _off: function( element, eventName ) {
+ eventName = (eventName || "").split( " " ).join(
this.eventNamespace + " " ) +
+ this.eventNamespace;
+ element.unbind( eventName ).undelegate( eventName );
+
+ // Clear the stack to avoid memory leaks (#10056)
+ this.bindings = $( this.bindings.not( element ).get() );
+ this.focusable = $( this.focusable.not( element ).get() );
+ this.hoverable = $( this.hoverable.not( element ).get() );
+ },
+
+ _delay: function( handler, delay ) {
+ function handlerProxy() {
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+ var instance = this;
+ return setTimeout( handlerProxy, delay || 0 );
+ },
+
+ _hoverable: function( element ) {
+ this.hoverable = this.hoverable.add( element );
+ this._on( element, {
+ mouseenter: function( event ) {
+ $( event.currentTarget ).addClass( "ui-state-hover" );
+ },
+ mouseleave: function( event ) {
+ $( event.currentTarget ).removeClass( "ui-state-hover" );
+ }
+ });
+ },
+
+ _focusable: function( element ) {
+ this.focusable = this.focusable.add( element );
+ this._on( element, {
+ focusin: function( event ) {
+ $( event.currentTarget ).addClass( "ui-state-focus" );
+ },
+ focusout: function( event ) {
+ $( event.currentTarget ).removeClass( "ui-state-focus" );
+ }
+ });
+ },
+
+ _trigger: function( type, event, data ) {
+ var prop, orig,
+ callback = this.options[ type ];
+
+ data = data || {};
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ // the original event may come from any element
+ // so we need to reset the target on the new event
+ event.target = this.element[ 0 ];
+
+ // copy original event properties over to the new event
+ orig = event.originalEvent;
+ if ( orig ) {
+ for ( prop in orig ) {
+ if ( !( prop in event ) ) {
+ event[ prop ] = orig[ prop ];
+ }
+ }
+ }
+
+ this.element.trigger( event, data );
+ return !( $.isFunction( callback ) &&
+ callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method,
defaultEffect ) {
+ $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+ if ( typeof options === "string" ) {
+ options = { effect: options };
+ }
+ var hasOptions,
+ effectName = !options ?
+ method :
+ options === true || typeof options === "number" ?
+ defaultEffect :
+ options.effect || defaultEffect;
+ options = options || {};
+ if ( typeof options === "number" ) {
+ options = { duration: options };
+ }
+ hasOptions = !$.isEmptyObject( options );
+ options.complete = callback;
+ if ( options.delay ) {
+ element.delay( options.delay );
+ }
+ if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+ element[ method ]( options );
+ } else if ( effectName !== method && element[ effectName ] ) {
+ element[ effectName ]( options.duration, options.easing, callback );
+ } else {
+ element.queue(function( next ) {
+ $( this )[ method ]();
+ if ( callback ) {
+ callback.call( element[ 0 ] );
+ }
+ next();
+ });
+ }
+ };
+});
+
+var widget = $.widget;
+
+
+/*!
+ * jQuery UI Mouse 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/mouse/
+ */
+
+
+var mouseHandled = false;
+$( document ).mouseup( function() {
+ mouseHandled = false;
+});
+
+var mouse = $.widget("ui.mouse", {
+ version: "1.11.4",
+ options: {
+ cancel: "input,textarea,button,select,option",
+ distance: 1,
+ delay: 0
+ },
+ _mouseInit: function() {
+ var that = this;
+
+ this.element
+ .bind("mousedown." + this.widgetName, function(event) {
+ return that._mouseDown(event);
+ })
+ .bind("click." + this.widgetName, function(event) {
+ if (true === $.data(event.target, that.widgetName + ".preventClickEvent"))
{
+ $.removeData(event.target, that.widgetName + ".preventClickEvent");
+ event.stopImmediatePropagation();
+ return false;
+ }
+ });
+
+ this.started = false;
+ },
+
+ // TODO: make sure destroying one instance of mouse doesn't mess with
+ // other instances of mouse
+ _mouseDestroy: function() {
+ this.element.unbind("." + this.widgetName);
+ if ( this._mouseMoveDelegate ) {
+ this.document
+ .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
+ .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
+ }
+ },
+
+ _mouseDown: function(event) {
+ // don't let more than one widget handle mouseStart
+ if ( mouseHandled ) {
+ return;
+ }
+
+ this._mouseMoved = false;
+
+ // we may have missed mouseup (out of window)
+ (this._mouseStarted && this._mouseUp(event));
+
+ this._mouseDownEvent = event;
+
+ var that = this,
+ btnIsLeft = (event.which === 1),
+ // event.target.nodeName works around a bug in IE 8 with
+ // disabled inputs (#7620)
+ elIsCancel = (typeof this.options.cancel === "string" &&
event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+ return true;
+ }
+
+ this.mouseDelayMet = !this.options.delay;
+ if (!this.mouseDelayMet) {
+ this._mouseDelayTimer = setTimeout(function() {
+ that.mouseDelayMet = true;
+ }, this.options.delay);
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted = (this._mouseStart(event) !== false);
+ if (!this._mouseStarted) {
+ event.preventDefault();
+ return true;
+ }
+ }
+
+ // Click event may never have fired (Gecko & Opera)
+ if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
+ $.removeData(event.target, this.widgetName + ".preventClickEvent");
+ }
+
+ // these delegates are required to keep context
+ this._mouseMoveDelegate = function(event) {
+ return that._mouseMove(event);
+ };
+ this._mouseUpDelegate = function(event) {
+ return that._mouseUp(event);
+ };
+
+ this.document
+ .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+ .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+ event.preventDefault();
+
+ mouseHandled = true;
+ return true;
+ },
+
+ _mouseMove: function(event) {
+ // Only check for mouseups outside the document if you've moved inside the
document
+ // at least once. This prevents the firing of mouseup in the case of IE<9, which
will
+ // fire a mousemove event if content is placed under the cursor. See #7778
+ // Support: IE <9
+ if ( this._mouseMoved ) {
+ // IE mouseup check - mouseup happened when mouse was out of window
+ if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 )
&& !event.button) {
+ return this._mouseUp(event);
+
+ // Iframe mouseup check - mouseup occurred in another document
+ } else if ( !event.which ) {
+ return this._mouseUp( event );
+ }
+ }
+
+ if ( event.which || event.button ) {
+ this._mouseMoved = true;
+ }
+
+ if (this._mouseStarted) {
+ this._mouseDrag(event);
+ return event.preventDefault();
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted =
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+ }
+
+ return !this._mouseStarted;
+ },
+
+ _mouseUp: function(event) {
+ this.document
+ .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+ .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+ if (this._mouseStarted) {
+ this._mouseStarted = false;
+
+ if (event.target === this._mouseDownEvent.target) {
+ $.data(event.target, this.widgetName + ".preventClickEvent", true);
+ }
+
+ this._mouseStop(event);
+ }
+
+ mouseHandled = false;
+ return false;
+ },
+
+ _mouseDistanceMet: function(event) {
+ return (Math.max(
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
+ ) >= this.options.distance
+ );
+ },
+
+ _mouseDelayMet: function(/* event */) {
+ return this.mouseDelayMet;
+ },
+
+ // These are placeholder methods, to be overriden by extending plugin
+ _mouseStart: function(/* event */) {},
+ _mouseDrag: function(/* event */) {},
+ _mouseStop: function(/* event */) {},
+ _mouseCapture: function(/* event */) { return true; }
+});
+
+
+/*!
+ * jQuery UI Position 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/position/
+ */
+
+(function() {
+
+$.ui = $.ui || {};
+
+var cachedScrollbarWidth, supportsOffsetFractions,
+ max = Math.max,
+ abs = Math.abs,
+ round = Math.round,
+ rhorizontal = /left|center|right/,
+ rvertical = /top|center|bottom/,
+ roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+ rposition = /^\w+/,
+ rpercent = /%$/,
+ _position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+ return [
+ parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+ parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+ ];
+}
+
+function parseCss( element, property ) {
+ return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+function getDimensions( elem ) {
+ var raw = elem[0];
+ if ( raw.nodeType === 9 ) {
+ return {
+ width: elem.width(),
+ height: elem.height(),
+ offset: { top: 0, left: 0 }
+ };
+ }
+ if ( $.isWindow( raw ) ) {
+ return {
+ width: elem.width(),
+ height: elem.height(),
+ offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
+ };
+ }
+ if ( raw.preventDefault ) {
+ return {
+ width: 0,
+ height: 0,
+ offset: { top: raw.pageY, left: raw.pageX }
+ };
+ }
+ return {
+ width: elem.outerWidth(),
+ height: elem.outerHeight(),
+ offset: elem.offset()
+ };
+}
+
+$.position = {
+ scrollbarWidth: function() {
+ if ( cachedScrollbarWidth !== undefined ) {
+ return cachedScrollbarWidth;
+ }
+ var w1, w2,
+ div = $( "<div
style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div
style='height:100px;width:auto;'></div></div>" ),
+ innerDiv = div.children()[0];
+
+ $( "body" ).append( div );
+ w1 = innerDiv.offsetWidth;
+ div.css( "overflow", "scroll" );
+
+ w2 = innerDiv.offsetWidth;
+
+ if ( w1 === w2 ) {
+ w2 = div[0].clientWidth;
+ }
+
+ div.remove();
+
+ return (cachedScrollbarWidth = w1 - w2);
+ },
+ getScrollInfo: function( within ) {
+ var overflowX = within.isWindow || within.isDocument ? "" :
+ within.element.css( "overflow-x" ),
+ overflowY = within.isWindow || within.isDocument ? "" :
+ within.element.css( "overflow-y" ),
+ hasOverflowX = overflowX === "scroll" ||
+ ( overflowX === "auto" && within.width <
within.element[0].scrollWidth ),
+ hasOverflowY = overflowY === "scroll" ||
+ ( overflowY === "auto" && within.height <
within.element[0].scrollHeight );
+ return {
+ width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+ height: hasOverflowX ? $.position.scrollbarWidth() : 0
+ };
+ },
+ getWithinInfo: function( element ) {
+ var withinElement = $( element || window ),
+ isWindow = $.isWindow( withinElement[0] ),
+ isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
+ return {
+ element: withinElement,
+ isWindow: isWindow,
+ isDocument: isDocument,
+ offset: withinElement.offset() || { left: 0, top: 0 },
+ scrollLeft: withinElement.scrollLeft(),
+ scrollTop: withinElement.scrollTop(),
+
+ // support: jQuery 1.6.x
+ // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
+ width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
+ height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
+ };
+ }
+};
+
+$.fn.position = function( options ) {
+ if ( !options || !options.of ) {
+ return _position.apply( this, arguments );
+ }
+
+ // make a copy, we don't want to modify arguments
+ options = $.extend( {}, options );
+
+ var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
+ target = $( options.of ),
+ within = $.position.getWithinInfo( options.within ),
+ scrollInfo = $.position.getScrollInfo( within ),
+ collision = ( options.collision || "flip" ).split( " " ),
+ offsets = {};
+
+ dimensions = getDimensions( target );
+ if ( target[0].preventDefault ) {
+ // force left top to allow flipping
+ options.at = "left top";
+ }
+ targetWidth = dimensions.width;
+ targetHeight = dimensions.height;
+ targetOffset = dimensions.offset;
+ // clone to reuse original targetOffset later
+ basePosition = $.extend( {}, targetOffset );
+
+ // force my and at to have valid horizontal and vertical positions
+ // if a value is missing or invalid, it will be converted to center
+ $.each( [ "my", "at" ], function() {
+ var pos = ( options[ this ] || "" ).split( " " ),
+ horizontalOffset,
+ verticalOffset;
+
+ if ( pos.length === 1) {
+ pos = rhorizontal.test( pos[ 0 ] ) ?
+ pos.concat( [ "center" ] ) :
+ rvertical.test( pos[ 0 ] ) ?
+ [ "center" ].concat( pos ) :
+ [ "center", "center" ];
+ }
+ pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+ pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+ // calculate offsets
+ horizontalOffset = roffset.exec( pos[ 0 ] );
+ verticalOffset = roffset.exec( pos[ 1 ] );
+ offsets[ this ] = [
+ horizontalOffset ? horizontalOffset[ 0 ] : 0,
+ verticalOffset ? verticalOffset[ 0 ] : 0
+ ];
+
+ // reduce to just the positions without the offsets
+ options[ this ] = [
+ rposition.exec( pos[ 0 ] )[ 0 ],
+ rposition.exec( pos[ 1 ] )[ 0 ]
+ ];
+ });
+
+ // normalize collision option
+ if ( collision.length === 1 ) {
+ collision[ 1 ] = collision[ 0 ];
+ }
+
+ if ( options.at[ 0 ] === "right" ) {
+ basePosition.left += targetWidth;
+ } else if ( options.at[ 0 ] === "center" ) {
+ basePosition.left += targetWidth / 2;
+ }
+
+ if ( options.at[ 1 ] === "bottom" ) {
+ basePosition.top += targetHeight;
+ } else if ( options.at[ 1 ] === "center" ) {
+ basePosition.top += targetHeight / 2;
+ }
+
+ atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+ basePosition.left += atOffset[ 0 ];
+ basePosition.top += atOffset[ 1 ];
+
+ return this.each(function() {
+ var collisionPosition, using,
+ elem = $( this ),
+ elemWidth = elem.outerWidth(),
+ elemHeight = elem.outerHeight(),
+ marginLeft = parseCss( this, "marginLeft" ),
+ marginTop = parseCss( this, "marginTop" ),
+ collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
scrollInfo.width,
+ collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" )
+ scrollInfo.height,
+ position = $.extend( {}, basePosition ),
+ myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
+
+ if ( options.my[ 0 ] === "right" ) {
+ position.left -= elemWidth;
+ } else if ( options.my[ 0 ] === "center" ) {
+ position.left -= elemWidth / 2;
+ }
+
+ if ( options.my[ 1 ] === "bottom" ) {
+ position.top -= elemHeight;
+ } else if ( options.my[ 1 ] === "center" ) {
+ position.top -= elemHeight / 2;
+ }
+
+ position.left += myOffset[ 0 ];
+ position.top += myOffset[ 1 ];
+
+ // if the browser doesn't support fractions, then round for consistent results
+ if ( !supportsOffsetFractions ) {
+ position.left = round( position.left );
+ position.top = round( position.top );
+ }
+
+ collisionPosition = {
+ marginLeft: marginLeft,
+ marginTop: marginTop
+ };
+
+ $.each( [ "left", "top" ], function( i, dir ) {
+ if ( $.ui.position[ collision[ i ] ] ) {
+ $.ui.position[ collision[ i ] ][ dir ]( position, {
+ targetWidth: targetWidth,
+ targetHeight: targetHeight,
+ elemWidth: elemWidth,
+ elemHeight: elemHeight,
+ collisionPosition: collisionPosition,
+ collisionWidth: collisionWidth,
+ collisionHeight: collisionHeight,
+ offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
+ my: options.my,
+ at: options.at,
+ within: within,
+ elem: elem
+ });
+ }
+ });
+
+ if ( options.using ) {
+ // adds feedback as second argument to using callback, if present
+ using = function( props ) {
+ var left = targetOffset.left - position.left,
+ right = left + targetWidth - elemWidth,
+ top = targetOffset.top - position.top,
+ bottom = top + targetHeight - elemHeight,
+ feedback = {
+ target: {
+ element: target,
+ left: targetOffset.left,
+ top: targetOffset.top,
+ width: targetWidth,
+ height: targetHeight
+ },
+ element: {
+ element: elem,
+ left: position.left,
+ top: position.top,
+ width: elemWidth,
+ height: elemHeight
+ },
+ horizontal: right < 0 ? "left" : left > 0 ? "right" :
"center",
+ vertical: bottom < 0 ? "top" : top > 0 ? "bottom" :
"middle"
+ };
+ if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+ feedback.horizontal = "center";
+ }
+ if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight )
{
+ feedback.vertical = "middle";
+ }
+ if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+ feedback.important = "horizontal";
+ } else {
+ feedback.important = "vertical";
+ }
+ options.using.call( this, props, feedback );
+ };
+ }
+
+ elem.offset( $.extend( position, { using: using } ) );
+ });
+};
+
+$.ui.position = {
+ fit: {
+ left: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+ outerWidth = within.width,
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+ overLeft = withinOffset - collisionPosLeft,
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+ newOverRight;
+
+ // element is wider than within
+ if ( data.collisionWidth > outerWidth ) {
+ // element is initially over the left side of within
+ if ( overLeft > 0 && overRight <= 0 ) {
+ newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
withinOffset;
+ position.left += overLeft - newOverRight;
+ // element is initially over right side of within
+ } else if ( overRight > 0 && overLeft <= 0 ) {
+ position.left = withinOffset;
+ // element is initially over both left and right sides of within
+ } else {
+ if ( overLeft > overRight ) {
+ position.left = withinOffset + outerWidth - data.collisionWidth;
+ } else {
+ position.left = withinOffset;
+ }
+ }
+ // too far left -> align with left edge
+ } else if ( overLeft > 0 ) {
+ position.left += overLeft;
+ // too far right -> align with right edge
+ } else if ( overRight > 0 ) {
+ position.left -= overRight;
+ // adjust based on position and margin
+ } else {
+ position.left = max( position.left - collisionPosLeft, position.left );
+ }
+ },
+ top: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+ outerHeight = data.within.height,
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
+ overTop = withinOffset - collisionPosTop,
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+ newOverBottom;
+
+ // element is taller than within
+ if ( data.collisionHeight > outerHeight ) {
+ // element is initially over the top of within
+ if ( overTop > 0 && overBottom <= 0 ) {
+ newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
withinOffset;
+ position.top += overTop - newOverBottom;
+ // element is initially over bottom of within
+ } else if ( overBottom > 0 && overTop <= 0 ) {
+ position.top = withinOffset;
+ // element is initially over both top and bottom of within
+ } else {
+ if ( overTop > overBottom ) {
+ position.top = withinOffset + outerHeight - data.collisionHeight;
+ } else {
+ position.top = withinOffset;
+ }
+ }
+ // too far up -> align with top
+ } else if ( overTop > 0 ) {
+ position.top += overTop;
+ // too far down -> align with bottom edge
+ } else if ( overBottom > 0 ) {
+ position.top -= overBottom;
+ // adjust based on position and margin
+ } else {
+ position.top = max( position.top - collisionPosTop, position.top );
+ }
+ }
+ },
+ flip: {
+ left: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.offset.left + within.scrollLeft,
+ outerWidth = within.width,
+ offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+ overLeft = collisionPosLeft - offsetLeft,
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
+ myOffset = data.my[ 0 ] === "left" ?
+ -data.elemWidth :
+ data.my[ 0 ] === "right" ?
+ data.elemWidth :
+ 0,
+ atOffset = data.at[ 0 ] === "left" ?
+ data.targetWidth :
+ data.at[ 0 ] === "right" ?
+ -data.targetWidth :
+ 0,
+ offset = -2 * data.offset[ 0 ],
+ newOverRight,
+ newOverLeft;
+
+ if ( overLeft < 0 ) {
+ newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
outerWidth - withinOffset;
+ if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+ position.left += myOffset + atOffset + offset;
+ }
+ } else if ( overRight > 0 ) {
+ newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset
+ offset - offsetLeft;
+ if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+ position.left += myOffset + atOffset + offset;
+ }
+ }
+ },
+ top: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.offset.top + within.scrollTop,
+ outerHeight = within.height,
+ offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
+ overTop = collisionPosTop - offsetTop,
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+ top = data.my[ 1 ] === "top",
+ myOffset = top ?
+ -data.elemHeight :
+ data.my[ 1 ] === "bottom" ?
+ data.elemHeight :
+ 0,
+ atOffset = data.at[ 1 ] === "top" ?
+ data.targetHeight :
+ data.at[ 1 ] === "bottom" ?
+ -data.targetHeight :
+ 0,
+ offset = -2 * data.offset[ 1 ],
+ newOverTop,
+ newOverBottom;
+ if ( overTop < 0 ) {
+ newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
outerHeight - withinOffset;
+ if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
+ position.top += myOffset + atOffset + offset;
+ }
+ } else if ( overBottom > 0 ) {
+ newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
offset - offsetTop;
+ if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
+ position.top += myOffset + atOffset + offset;
+ }
+ }
+ }
+ },
+ flipfit: {
+ left: function() {
+ $.ui.position.flip.left.apply( this, arguments );
+ $.ui.position.fit.left.apply( this, arguments );
+ },
+ top: function() {
+ $.ui.position.flip.top.apply( this, arguments );
+ $.ui.position.fit.top.apply( this, arguments );
+ }
+ }
+};
+
+// fraction support test
+(function() {
+ var testElement, testElementParent, testElementStyle, offsetLeft, i,
+ body = document.getElementsByTagName( "body" )[ 0 ],
+ div = document.createElement( "div" );
+
+ //Create a "fake body" for testing based on method used in jQuery.support
+ testElement = document.createElement( body ? "div" : "body" );
+ testElementStyle = {
+ visibility: "hidden",
+ width: 0,
+ height: 0,
+ border: 0,
+ margin: 0,
+ background: "none"
+ };
+ if ( body ) {
+ $.extend( testElementStyle, {
+ position: "absolute",
+ left: "-1000px",
+ top: "-1000px"
+ });
+ }
+ for ( i in testElementStyle ) {
+ testElement.style[ i ] = testElementStyle[ i ];
+ }
+ testElement.appendChild( div );
+ testElementParent = body || document.documentElement;
+ testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+ div.style.cssText = "position: absolute; left: 10.7432222px;";
+
+ offsetLeft = $( div ).offset().left;
+ supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
+
+ testElement.innerHTML = "";
+ testElementParent.removeChild( testElement );
+})();
+
+})();
+
+var position = $.ui.position;
+
+
+/*!
+ * jQuery UI Accordion 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/accordion/
+ */
+
+
+var accordion = $.widget( "ui.accordion", {
+ version: "1.11.4",
+ options: {
+ active: 0,
+ animate: {},
+ collapsible: false,
+ event: "click",
+ header: "> li > :first-child,> :not(li):even",
+ heightStyle: "auto",
+ icons: {
+ activeHeader: "ui-icon-triangle-1-s",
+ header: "ui-icon-triangle-1-e"
+ },
+
+ // callbacks
+ activate: null,
+ beforeActivate: null
+ },
+
+ hideProps: {
+ borderTopWidth: "hide",
+ borderBottomWidth: "hide",
+ paddingTop: "hide",
+ paddingBottom: "hide",
+ height: "hide"
+ },
+
+ showProps: {
+ borderTopWidth: "show",
+ borderBottomWidth: "show",
+ paddingTop: "show",
+ paddingBottom: "show",
+ height: "show"
+ },
+
+ _create: function() {
+ var options = this.options;
+ this.prevShow = this.prevHide = $();
+ this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
+ // ARIA
+ .attr( "role", "tablist" );
+
+ // don't allow collapsible: false and active: false / null
+ if ( !options.collapsible && (options.active === false || options.active ==
null) ) {
+ options.active = 0;
+ }
+
+ this._processPanels();
+ // handle negative values
+ if ( options.active < 0 ) {
+ options.active += this.headers.length;
+ }
+ this._refresh();
+ },
+
+ _getCreateEventData: function() {
+ return {
+ header: this.active,
+ panel: !this.active.length ? $() : this.active.next()
+ };
+ },
+
+ _createIcons: function() {
+ var icons = this.options.icons;
+ if ( icons ) {
+ $( "<span>" )
+ .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
+ .prependTo( this.headers );
+ this.active.children( ".ui-accordion-header-icon" )
+ .removeClass( icons.header )
+ .addClass( icons.activeHeader );
+ this.headers.addClass( "ui-accordion-icons" );
+ }
+ },
+
+ _destroyIcons: function() {
+ this.headers
+ .removeClass( "ui-accordion-icons" )
+ .children( ".ui-accordion-header-icon" )
+ .remove();
+ },
+
+ _destroy: function() {
+ var contents;
+
+ // clean up main element
+ this.element
+ .removeClass( "ui-accordion ui-widget ui-helper-reset" )
+ .removeAttr( "role" );
+
+ // clean up headers
+ this.headers
+ .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default
" +
+ "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "aria-selected" )
+ .removeAttr( "aria-controls" )
+ .removeAttr( "tabIndex" )
+ .removeUniqueId();
+
+ this._destroyIcons();
+
+ // clean up content panels
+ contents = this.headers.next()
+ .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " +
+ "ui-accordion-content ui-accordion-content-active ui-state-disabled" )
+ .css( "display", "" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-hidden" )
+ .removeAttr( "aria-labelledby" )
+ .removeUniqueId();
+
+ if ( this.options.heightStyle !== "content" ) {
+ contents.css( "height", "" );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "active" ) {
+ // _activate() will handle invalid values and update this.options
+ this._activate( value );
+ return;
+ }
+
+ if ( key === "event" ) {
+ if ( this.options.event ) {
+ this._off( this.headers, this.options.event );
+ }
+ this._setupEvents( value );
+ }
+
+ this._super( key, value );
+
+ // setting collapsible: false while collapsed; open first panel
+ if ( key === "collapsible" && !value && this.options.active
=== false ) {
+ this._activate( 0 );
+ }
+
+ if ( key === "icons" ) {
+ this._destroyIcons();
+ if ( value ) {
+ this._createIcons();
+ }
+ }
+
+ // #5332 - opacity doesn't cascade to positioned elements in IE
+ // so we need to add the disabled class to the headers and panels
+ if ( key === "disabled" ) {
+ this.element
+ .toggleClass( "ui-state-disabled", !!value )
+ .attr( "aria-disabled", value );
+ this.headers.add( this.headers.next() )
+ .toggleClass( "ui-state-disabled", !!value );
+ }
+ },
+
+ _keydown: function( event ) {
+ if ( event.altKey || event.ctrlKey ) {
+ return;
+ }
+
+ var keyCode = $.ui.keyCode,
+ length = this.headers.length,
+ currentIndex = this.headers.index( event.target ),
+ toFocus = false;
+
+ switch ( event.keyCode ) {
+ case keyCode.RIGHT:
+ case keyCode.DOWN:
+ toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+ break;
+ case keyCode.LEFT:
+ case keyCode.UP:
+ toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+ break;
+ case keyCode.SPACE:
+ case keyCode.ENTER:
+ this._eventHandler( event );
+ break;
+ case keyCode.HOME:
+ toFocus = this.headers[ 0 ];
+ break;
+ case keyCode.END:
+ toFocus = this.headers[ length - 1 ];
+ break;
+ }
+
+ if ( toFocus ) {
+ $( event.target ).attr( "tabIndex", -1 );
+ $( toFocus ).attr( "tabIndex", 0 );
+ toFocus.focus();
+ event.preventDefault();
+ }
+ },
+
+ _panelKeyDown: function( event ) {
+ if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
+ $( event.currentTarget ).prev().focus();
+ }
+ },
+
+ refresh: function() {
+ var options = this.options;
+ this._processPanels();
+
+ // was collapsed or no panel
+ if ( ( options.active === false && options.collapsible === true ) ||
!this.headers.length ) {
+ options.active = false;
+ this.active = $();
+ // active false only when collapsible is true
+ } else if ( options.active === false ) {
+ this._activate( 0 );
+ // was active, but active panel is gone
+ } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[
0 ] ) ) {
+ // all remaining panel are disabled
+ if ( this.headers.length === this.headers.find(".ui-state-disabled").length
) {
+ options.active = false;
+ this.active = $();
+ // activate previous panel
+ } else {
+ this._activate( Math.max( 0, options.active - 1 ) );
+ }
+ // was active, active panel still exists
+ } else {
+ // make sure active index is correct
+ options.active = this.headers.index( this.active );
+ }
+
+ this._destroyIcons();
+
+ this._refresh();
+ },
+
+ _processPanels: function() {
+ var prevHeaders = this.headers,
+ prevPanels = this.panels;
+
+ this.headers = this.element.find( this.options.header )
+ .addClass( "ui-accordion-header ui-state-default ui-corner-all" );
+
+ this.panels = this.headers.next()
+ .addClass( "ui-accordion-content ui-helper-reset ui-widget-content
ui-corner-bottom" )
+ .filter( ":not(.ui-accordion-content-active)" )
+ .hide();
+
+ // Avoid memory leaks (#10056)
+ if ( prevPanels ) {
+ this._off( prevHeaders.not( this.headers ) );
+ this._off( prevPanels.not( this.panels ) );
+ }
+ },
+
+ _refresh: function() {
+ var maxHeight,
+ options = this.options,
+ heightStyle = options.heightStyle,
+ parent = this.element.parent();
+
+ this.active = this._findActive( options.active )
+ .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
+ .removeClass( "ui-corner-all" );
+ this.active.next()
+ .addClass( "ui-accordion-content-active" )
+ .show();
+
+ this.headers
+ .attr( "role", "tab" )
+ .each(function() {
+ var header = $( this ),
+ headerId = header.uniqueId().attr( "id" ),
+ panel = header.next(),
+ panelId = panel.uniqueId().attr( "id" );
+ header.attr( "aria-controls", panelId );
+ panel.attr( "aria-labelledby", headerId );
+ })
+ .next()
+ .attr( "role", "tabpanel" );
+
+ this.headers
+ .not( this.active )
+ .attr({
+ "aria-selected": "false",
+ "aria-expanded": "false",
+ tabIndex: -1
+ })
+ .next()
+ .attr({
+ "aria-hidden": "true"
+ })
+ .hide();
+
+ // make sure at least one header is in the tab order
+ if ( !this.active.length ) {
+ this.headers.eq( 0 ).attr( "tabIndex", 0 );
+ } else {
+ this.active.attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ })
+ .next()
+ .attr({
+ "aria-hidden": "false"
+ });
+ }
+
+ this._createIcons();
+
+ this._setupEvents( options.event );
+
+ if ( heightStyle === "fill" ) {
+ maxHeight = parent.height();
+ this.element.siblings( ":visible" ).each(function() {
+ var elem = $( this ),
+ position = elem.css( "position" );
+
+ if ( position === "absolute" || position === "fixed" ) {
+ return;
+ }
+ maxHeight -= elem.outerHeight( true );
+ });
+
+ this.headers.each(function() {
+ maxHeight -= $( this ).outerHeight( true );
+ });
+
+ this.headers.next()
+ .each(function() {
+ $( this ).height( Math.max( 0, maxHeight -
+ $( this ).innerHeight() + $( this ).height() ) );
+ })
+ .css( "overflow", "auto" );
+ } else if ( heightStyle === "auto" ) {
+ maxHeight = 0;
+ this.headers.next()
+ .each(function() {
+ maxHeight = Math.max( maxHeight, $( this ).css( "height", ""
).height() );
+ })
+ .height( maxHeight );
+ }
+ },
+
+ _activate: function( index ) {
+ var active = this._findActive( index )[ 0 ];
+
+ // trying to activate the already active panel
+ if ( active === this.active[ 0 ] ) {
+ return;
+ }
+
+ // trying to collapse, simulate a click on the currently active header
+ active = active || this.active[ 0 ];
+
+ this._eventHandler({
+ target: active,
+ currentTarget: active,
+ preventDefault: $.noop
+ });
+ },
+
+ _findActive: function( selector ) {
+ return typeof selector === "number" ? this.headers.eq( selector ) : $();
+ },
+
+ _setupEvents: function( event ) {
+ var events = {
+ keydown: "_keydown"
+ };
+ if ( event ) {
+ $.each( event.split( " " ), function( index, eventName ) {
+ events[ eventName ] = "_eventHandler";
+ });
+ }
+
+ this._off( this.headers.add( this.headers.next() ) );
+ this._on( this.headers, events );
+ this._on( this.headers.next(), { keydown: "_panelKeyDown" });
+ this._hoverable( this.headers );
+ this._focusable( this.headers );
+ },
+
+ _eventHandler: function( event ) {
+ var options = this.options,
+ active = this.active,
+ clicked = $( event.currentTarget ),
+ clickedIsActive = clicked[ 0 ] === active[ 0 ],
+ collapsing = clickedIsActive && options.collapsible,
+ toShow = collapsing ? $() : clicked.next(),
+ toHide = active.next(),
+ eventData = {
+ oldHeader: active,
+ oldPanel: toHide,
+ newHeader: collapsing ? $() : clicked,
+ newPanel: toShow
+ };
+
+ event.preventDefault();
+
+ if (
+ // click on active header, but not collapsible
+ ( clickedIsActive && !options.collapsible ) ||
+ // allow canceling activation
+ ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+ return;
+ }
+
+ options.active = collapsing ? false : this.headers.index( clicked );
+
+ // when the call to ._toggle() comes after the class changes
+ // it causes a very odd bug in IE 8 (see #6720)
+ this.active = clickedIsActive ? $() : clicked;
+ this._toggle( eventData );
+
+ // switch classes
+ // corner classes on the previously active header stay after the animation
+ active.removeClass( "ui-accordion-header-active ui-state-active" );
+ if ( options.icons ) {
+ active.children( ".ui-accordion-header-icon" )
+ .removeClass( options.icons.activeHeader )
+ .addClass( options.icons.header );
+ }
+
+ if ( !clickedIsActive ) {
+ clicked
+ .removeClass( "ui-corner-all" )
+ .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
+ if ( options.icons ) {
+ clicked.children( ".ui-accordion-header-icon" )
+ .removeClass( options.icons.header )
+ .addClass( options.icons.activeHeader );
+ }
+
+ clicked
+ .next()
+ .addClass( "ui-accordion-content-active" );
+ }
+ },
+
+ _toggle: function( data ) {
+ var toShow = data.newPanel,
+ toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
+
+ // handle activating a panel during the animation for another activation
+ this.prevShow.add( this.prevHide ).stop( true, true );
+ this.prevShow = toShow;
+ this.prevHide = toHide;
+
+ if ( this.options.animate ) {
+ this._animate( toShow, toHide, data );
+ } else {
+ toHide.hide();
+ toShow.show();
+ this._toggleComplete( data );
+ }
+
+ toHide.attr({
+ "aria-hidden": "true"
+ });
+ toHide.prev().attr({
+ "aria-selected": "false",
+ "aria-expanded": "false"
+ });
+ // if we're switching panels, remove the old header from the tab order
+ // if we're opening from collapsed state, remove the previous header from the tab
order
+ // if we're collapsing, then keep the collapsing header in the tab order
+ if ( toShow.length && toHide.length ) {
+ toHide.prev().attr({
+ "tabIndex": -1,
+ "aria-expanded": "false"
+ });
+ } else if ( toShow.length ) {
+ this.headers.filter(function() {
+ return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
+ })
+ .attr( "tabIndex", -1 );
+ }
+
+ toShow
+ .attr( "aria-hidden", "false" )
+ .prev()
+ .attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ },
+
+ _animate: function( toShow, toHide, data ) {
+ var total, easing, duration,
+ that = this,
+ adjust = 0,
+ boxSizing = toShow.css( "box-sizing" ),
+ down = toShow.length &&
+ ( !toHide.length || ( toShow.index() < toHide.index() ) ),
+ animate = this.options.animate || {},
+ options = down && animate.down || animate,
+ complete = function() {
+ that._toggleComplete( data );
+ };
+
+ if ( typeof options === "number" ) {
+ duration = options;
+ }
+ if ( typeof options === "string" ) {
+ easing = options;
+ }
+ // fall back from options to animation in case of partial down settings
+ easing = easing || options.easing || animate.easing;
+ duration = duration || options.duration || animate.duration;
+
+ if ( !toHide.length ) {
+ return toShow.animate( this.showProps, duration, easing, complete );
+ }
+ if ( !toShow.length ) {
+ return toHide.animate( this.hideProps, duration, easing, complete );
+ }
+
+ total = toShow.show().outerHeight();
+ toHide.animate( this.hideProps, {
+ duration: duration,
+ easing: easing,
+ step: function( now, fx ) {
+ fx.now = Math.round( now );
+ }
+ });
+ toShow
+ .hide()
+ .animate( this.showProps, {
+ duration: duration,
+ easing: easing,
+ complete: complete,
+ step: function( now, fx ) {
+ fx.now = Math.round( now );
+ if ( fx.prop !== "height" ) {
+ if ( boxSizing === "content-box" ) {
+ adjust += fx.now;
+ }
+ } else if ( that.options.heightStyle !== "content" ) {
+ fx.now = Math.round( total - toHide.outerHeight() - adjust );
+ adjust = 0;
+ }
+ }
+ });
+ },
+
+ _toggleComplete: function( data ) {
+ var toHide = data.oldPanel;
+
+ toHide
+ .removeClass( "ui-accordion-content-active" )
+ .prev()
+ .removeClass( "ui-corner-top" )
+ .addClass( "ui-corner-all" );
+
+ // Work around for rendering bug in IE (#5421)
+ if ( toHide.length ) {
+ toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
+ }
+ this._trigger( "activate", null, data );
+ }
+});
+
+
+/*!
+ * jQuery UI Menu 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/menu/
+ */
+
+
+var menu = $.widget( "ui.menu", {
+ version: "1.11.4",
+ defaultElement: "<ul>",
+ delay: 300,
+ options: {
+ icons: {
+ submenu: "ui-icon-carat-1-e"
+ },
+ items: "> *",
+ menus: "ul",
+ position: {
+ my: "left-1 top",
+ at: "right top"
+ },
+ role: "menu",
+
+ // callbacks
+ blur: null,
+ focus: null,
+ select: null
+ },
+
+ _create: function() {
+ this.activeMenu = this.element;
+
+ // Flag used to prevent firing of the click handler
+ // as the event bubbles up through nested menus
+ this.mouseHandled = false;
+ this.element
+ .uniqueId()
+ .addClass( "ui-menu ui-widget ui-widget-content" )
+ .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon"
).length )
+ .attr({
+ role: this.options.role,
+ tabIndex: 0
+ });
+
+ if ( this.options.disabled ) {
+ this.element
+ .addClass( "ui-state-disabled" )
+ .attr( "aria-disabled", "true" );
+ }
+
+ this._on({
+ // Prevent focus from sticking to links inside menu after clicking
+ // them (focus should always stay on UL during navigation).
+ "mousedown .ui-menu-item": function( event ) {
+ event.preventDefault();
+ },
+ "click .ui-menu-item": function( event ) {
+ var target = $( event.target );
+ if ( !this.mouseHandled && target.not( ".ui-state-disabled"
).length ) {
+ this.select( event );
+
+ // Only set the mouseHandled flag if the event will bubble, see #9469.
+ if ( !event.isPropagationStopped() ) {
+ this.mouseHandled = true;
+ }
+
+ // Open submenu on click
+ if ( target.has( ".ui-menu" ).length ) {
+ this.expand( event );
+ } else if ( !this.element.is( ":focus" ) && $( this.document[ 0
].activeElement ).closest( ".ui-menu" ).length ) {
+
+ // Redirect focus to the menu
+ this.element.trigger( "focus", [ true ] );
+
+ // If the active item is on the top level, let it stay active.
+ // Otherwise, blur the active item since it is no longer visible.
+ if ( this.active && this.active.parents( ".ui-menu" ).length ===
1 ) {
+ clearTimeout( this.timer );
+ }
+ }
+ }
+ },
+ "mouseenter .ui-menu-item": function( event ) {
+ // Ignore mouse events while typeahead is active, see #10458.
+ // Prevents focusing the wrong item when typeahead causes a scroll while the mouse
+ // is over an item in the menu
+ if ( this.previousFilter ) {
+ return;
+ }
+ var target = $( event.currentTarget );
+ // Remove ui-state-active class from siblings of the newly focused menu item
+ // to avoid a jump caused by adjacent elements both having a class with a border
+ target.siblings( ".ui-state-active" ).removeClass(
"ui-state-active" );
+ this.focus( event, target );
+ },
+ mouseleave: "collapseAll",
+ "mouseleave .ui-menu": "collapseAll",
+ focus: function( event, keepActiveItem ) {
+ // If there's already an active item, keep it active
+ // If not, activate the first item
+ var item = this.active || this.element.find( this.options.items ).eq( 0 );
+
+ if ( !keepActiveItem ) {
+ this.focus( event, item );
+ }
+ },
+ blur: function( event ) {
+ this._delay(function() {
+ if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
+ this.collapseAll( event );
+ }
+ });
+ },
+ keydown: "_keydown"
+ });
+
+ this.refresh();
+
+ // Clicks outside of a menu collapse any open menus
+ this._on( this.document, {
+ click: function( event ) {
+ if ( this._closeOnDocumentClick( event ) ) {
+ this.collapseAll( event );
+ }
+
+ // Reset the mouseHandled flag
+ this.mouseHandled = false;
+ }
+ });
+ },
+
+ _destroy: function() {
+ // Destroy (sub)menus
+ this.element
+ .removeAttr( "aria-activedescendant" )
+ .find( ".ui-menu" ).addBack()
+ .removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front"
)
+ .removeAttr( "role" )
+ .removeAttr( "tabIndex" )
+ .removeAttr( "aria-labelledby" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "aria-hidden" )
+ .removeAttr( "aria-disabled" )
+ .removeUniqueId()
+ .show();
+
+ // Destroy menu items
+ this.element.find( ".ui-menu-item" )
+ .removeClass( "ui-menu-item" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-disabled" )
+ .removeUniqueId()
+ .removeClass( "ui-state-hover" )
+ .removeAttr( "tabIndex" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-haspopup" )
+ .children().each( function() {
+ var elem = $( this );
+ if ( elem.data( "ui-menu-submenu-carat" ) ) {
+ elem.remove();
+ }
+ });
+
+ // Destroy menu dividers
+ this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider
ui-widget-content" );
+ },
+
+ _keydown: function( event ) {
+ var match, prev, character, skip,
+ preventDefault = true;
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.PAGE_UP:
+ this.previousPage( event );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ this.nextPage( event );
+ break;
+ case $.ui.keyCode.HOME:
+ this._move( "first", "first", event );
+ break;
+ case $.ui.keyCode.END:
+ this._move( "last", "last", event );
+ break;
+ case $.ui.keyCode.UP:
+ this.previous( event );
+ break;
+ case $.ui.keyCode.DOWN:
+ this.next( event );
+ break;
+ case $.ui.keyCode.LEFT:
+ this.collapse( event );
+ break;
+ case $.ui.keyCode.RIGHT:
+ if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+ this.expand( event );
+ }
+ break;
+ case $.ui.keyCode.ENTER:
+ case $.ui.keyCode.SPACE:
+ this._activate( event );
+ break;
+ case $.ui.keyCode.ESCAPE:
+ this.collapse( event );
+ break;
+ default:
+ preventDefault = false;
+ prev = this.previousFilter || "";
+ character = String.fromCharCode( event.keyCode );
+ skip = false;
+
+ clearTimeout( this.filterTimer );
+
+ if ( character === prev ) {
+ skip = true;
+ } else {
+ character = prev + character;
+ }
+
+ match = this._filterMenuItems( character );
+ match = skip && match.index( this.active.next() ) !== -1 ?
+ this.active.nextAll( ".ui-menu-item" ) :
+ match;
+
+ // If no matches on the current filter, reset to the last character pressed
+ // to move down the menu to the first item that starts with that character
+ if ( !match.length ) {
+ character = String.fromCharCode( event.keyCode );
+ match = this._filterMenuItems( character );
+ }
+
+ if ( match.length ) {
+ this.focus( event, match );
+ this.previousFilter = character;
+ this.filterTimer = this._delay(function() {
+ delete this.previousFilter;
+ }, 1000 );
+ } else {
+ delete this.previousFilter;
+ }
+ }
+
+ if ( preventDefault ) {
+ event.preventDefault();
+ }
+ },
+
+ _activate: function( event ) {
+ if ( !this.active.is( ".ui-state-disabled" ) ) {
+ if ( this.active.is( "[aria-haspopup='true']" ) ) {
+ this.expand( event );
+ } else {
+ this.select( event );
+ }
+ }
+ },
+
+ refresh: function() {
+ var menus, items,
+ that = this,
+ icon = this.options.icons.submenu,
+ submenus = this.element.find( this.options.menus );
+
+ this.element.toggleClass( "ui-menu-icons", !!this.element.find(
".ui-icon" ).length );
+
+ // Initialize nested menus
+ submenus.filter( ":not(.ui-menu)" )
+ .addClass( "ui-menu ui-widget ui-widget-content ui-front" )
+ .hide()
+ .attr({
+ role: this.options.role,
+ "aria-hidden": "true",
+ "aria-expanded": "false"
+ })
+ .each(function() {
+ var menu = $( this ),
+ item = menu.parent(),
+ submenuCarat = $( "<span>" )
+ .addClass( "ui-menu-icon ui-icon " + icon )
+ .data( "ui-menu-submenu-carat", true );
+
+ item
+ .attr( "aria-haspopup", "true" )
+ .prepend( submenuCarat );
+ menu.attr( "aria-labelledby", item.attr( "id" ) );
+ });
+
+ menus = submenus.add( this.element );
+ items = menus.find( this.options.items );
+
+ // Initialize menu-items containing spaces and/or dashes only as dividers
+ items.not( ".ui-menu-item" ).each(function() {
+ var item = $( this );
+ if ( that._isDivider( item ) ) {
+ item.addClass( "ui-widget-content ui-menu-divider" );
+ }
+ });
+
+ // Don't refresh list items that are already adapted
+ items.not( ".ui-menu-item, .ui-menu-divider" )
+ .addClass( "ui-menu-item" )
+ .uniqueId()
+ .attr({
+ tabIndex: -1,
+ role: this._itemRole()
+ });
+
+ // Add aria-disabled attribute to any disabled menu item
+ items.filter( ".ui-state-disabled" ).attr( "aria-disabled",
"true" );
+
+ // If the active item has been removed, blur the menu
+ if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
+ this.blur();
+ }
+ },
+
+ _itemRole: function() {
+ return {
+ menu: "menuitem",
+ listbox: "option"
+ }[ this.options.role ];
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "icons" ) {
+ this.element.find( ".ui-menu-icon" )
+ .removeClass( this.options.icons.submenu )
+ .addClass( value.submenu );
+ }
+ if ( key === "disabled" ) {
+ this.element
+ .toggleClass( "ui-state-disabled", !!value )
+ .attr( "aria-disabled", value );
+ }
+ this._super( key, value );
+ },
+
+ focus: function( event, item ) {
+ var nested, focused;
+ this.blur( event, event && event.type === "focus" );
+
+ this._scrollIntoView( item );
+
+ this.active = item.first();
+ focused = this.active.addClass( "ui-state-focus" ).removeClass(
"ui-state-active" );
+ // Only update aria-activedescendant if there's a role
+ // otherwise we assume focus is managed elsewhere
+ if ( this.options.role ) {
+ this.element.attr( "aria-activedescendant", focused.attr( "id" )
);
+ }
+
+ // Highlight active parent menu item, if any
+ this.active
+ .parent()
+ .closest( ".ui-menu-item" )
+ .addClass( "ui-state-active" );
+
+ if ( event && event.type === "keydown" ) {
+ this._close();
+ } else {
+ this.timer = this._delay(function() {
+ this._close();
+ }, this.delay );
+ }
+
+ nested = item.children( ".ui-menu" );
+ if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
+ this._startOpening(nested);
+ }
+ this.activeMenu = item.parent();
+
+ this._trigger( "focus", event, { item: item } );
+ },
+
+ _scrollIntoView: function( item ) {
+ var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+ if ( this._hasScroll() ) {
+ borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) ||
0;
+ paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
+ offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+ scroll = this.activeMenu.scrollTop();
+ elementHeight = this.activeMenu.height();
+ itemHeight = item.outerHeight();
+
+ if ( offset < 0 ) {
+ this.activeMenu.scrollTop( scroll + offset );
+ } else if ( offset + itemHeight > elementHeight ) {
+ this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+ }
+ }
+ },
+
+ blur: function( event, fromFocus ) {
+ if ( !fromFocus ) {
+ clearTimeout( this.timer );
+ }
+
+ if ( !this.active ) {
+ return;
+ }
+
+ this.active.removeClass( "ui-state-focus" );
+ this.active = null;
+
+ this._trigger( "blur", event, { item: this.active } );
+ },
+
+ _startOpening: function( submenu ) {
+ clearTimeout( this.timer );
+
+ // Don't open if already open fixes a Firefox bug that caused a .5 pixel
+ // shift in the submenu position when mousing over the carat icon
+ if ( submenu.attr( "aria-hidden" ) !== "true" ) {
+ return;
+ }
+
+ this.timer = this._delay(function() {
+ this._close();
+ this._open( submenu );
+ }, this.delay );
+ },
+
+ _open: function( submenu ) {
+ var position = $.extend({
+ of: this.active
+ }, this.options.position );
+
+ clearTimeout( this.timer );
+ this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" )
)
+ .hide()
+ .attr( "aria-hidden", "true" );
+
+ submenu
+ .show()
+ .removeAttr( "aria-hidden" )
+ .attr( "aria-expanded", "true" )
+ .position( position );
+ },
+
+ collapseAll: function( event, all ) {
+ clearTimeout( this.timer );
+ this.timer = this._delay(function() {
+ // If we were passed an event, look for the submenu that contains the event
+ var currentMenu = all ? this.element :
+ $( event && event.target ).closest( this.element.find( ".ui-menu" )
);
+
+ // If we found no valid submenu ancestor, use the main menu to close all sub menus
anyway
+ if ( !currentMenu.length ) {
+ currentMenu = this.element;
+ }
+
+ this._close( currentMenu );
+
+ this.blur( event );
+ this.activeMenu = currentMenu;
+ }, this.delay );
+ },
+
+ // With no arguments, closes the currently active menu - if nothing is active
+ // it closes all menus. If passed an argument, it will search for menus BELOW
+ _close: function( startMenu ) {
+ if ( !startMenu ) {
+ startMenu = this.active ? this.active.parent() : this.element;
+ }
+
+ startMenu
+ .find( ".ui-menu" )
+ .hide()
+ .attr( "aria-hidden", "true" )
+ .attr( "aria-expanded", "false" )
+ .end()
+ .find( ".ui-state-active" ).not( ".ui-state-focus" )
+ .removeClass( "ui-state-active" );
+ },
+
+ _closeOnDocumentClick: function( event ) {
+ return !$( event.target ).closest( ".ui-menu" ).length;
+ },
+
+ _isDivider: function( item ) {
+
+ // Match hyphen, em dash, en dash
+ return !/[^\-\u2014\u2013\s]/.test( item.text() );
+ },
+
+ collapse: function( event ) {
+ var newItem = this.active &&
+ this.active.parent().closest( ".ui-menu-item", this.element );
+ if ( newItem && newItem.length ) {
+ this._close();
+ this.focus( event, newItem );
+ }
+ },
+
+ expand: function( event ) {
+ var newItem = this.active &&
+ this.active
+ .children( ".ui-menu " )
+ .find( this.options.items )
+ .first();
+
+ if ( newItem && newItem.length ) {
+ this._open( newItem.parent() );
+
+ // Delay so Firefox will not hide activedescendant change in expanding submenu from
AT
+ this._delay(function() {
+ this.focus( event, newItem );
+ });
+ }
+ },
+
+ next: function( event ) {
+ this._move( "next", "first", event );
+ },
+
+ previous: function( event ) {
+ this._move( "prev", "last", event );
+ },
+
+ isFirstItem: function() {
+ return this.active && !this.active.prevAll( ".ui-menu-item"
).length;
+ },
+
+ isLastItem: function() {
+ return this.active && !this.active.nextAll( ".ui-menu-item"
).length;
+ },
+
+ _move: function( direction, filter, event ) {
+ var next;
+ if ( this.active ) {
+ if ( direction === "first" || direction === "last" ) {
+ next = this.active
+ [ direction === "first" ? "prevAll" : "nextAll" ](
".ui-menu-item" )
+ .eq( -1 );
+ } else {
+ next = this.active
+ [ direction + "All" ]( ".ui-menu-item" )
+ .eq( 0 );
+ }
+ }
+ if ( !next || !next.length || !this.active ) {
+ next = this.activeMenu.find( this.options.items )[ filter ]();
+ }
+
+ this.focus( event, next );
+ },
+
+ nextPage: function( event ) {
+ var item, base, height;
+
+ if ( !this.active ) {
+ this.next( event );
+ return;
+ }
+ if ( this.isLastItem() ) {
+ return;
+ }
+ if ( this._hasScroll() ) {
+ base = this.active.offset().top;
+ height = this.element.height();
+ this.active.nextAll( ".ui-menu-item" ).each(function() {
+ item = $( this );
+ return item.offset().top - base - height < 0;
+ });
+
+ this.focus( event, item );
+ } else {
+ this.focus( event, this.activeMenu.find( this.options.items )
+ [ !this.active ? "first" : "last" ]() );
+ }
+ },
+
+ previousPage: function( event ) {
+ var item, base, height;
+ if ( !this.active ) {
+ this.next( event );
+ return;
+ }
+ if ( this.isFirstItem() ) {
+ return;
+ }
+ if ( this._hasScroll() ) {
+ base = this.active.offset().top;
+ height = this.element.height();
+ this.active.prevAll( ".ui-menu-item" ).each(function() {
+ item = $( this );
+ return item.offset().top - base + height > 0;
+ });
+
+ this.focus( event, item );
+ } else {
+ this.focus( event, this.activeMenu.find( this.options.items ).first() );
+ }
+ },
+
+ _hasScroll: function() {
+ return this.element.outerHeight() < this.element.prop( "scrollHeight" );
+ },
+
+ select: function( event ) {
+ // TODO: It should never be possible to not have an active item at this
+ // point, but the tests don't trigger mouseenter before click.
+ this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
+ var ui = { item: this.active };
+ if ( !this.active.has( ".ui-menu" ).length ) {
+ this.collapseAll( event, true );
+ }
+ this._trigger( "select", event, ui );
+ },
+
+ _filterMenuItems: function(character) {
+ var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g,
"\\$&" ),
+ regex = new RegExp( "^" + escapedCharacter, "i" );
+
+ return this.activeMenu
+ .find( this.options.items )
+
+ // Only match on items, not dividers or other content (#10571)
+ .filter( ".ui-menu-item" )
+ .filter(function() {
+ return regex.test( $.trim( $( this ).text() ) );
+ });
+ }
+});
+
+
+/*!
+ * jQuery UI Autocomplete 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/autocomplete/
+ */
+
+
+$.widget( "ui.autocomplete", {
+ version: "1.11.4",
+ defaultElement: "<input>",
+ options: {
+ appendTo: null,
+ autoFocus: false,
+ delay: 300,
+ minLength: 1,
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ source: null,
+
+ // callbacks
+ change: null,
+ close: null,
+ focus: null,
+ open: null,
+ response: null,
+ search: null,
+ select: null
+ },
+
+ requestIndex: 0,
+ pending: 0,
+
+ _create: function() {
+ // Some browsers only repeat keydown events, not keypress events,
+ // so we use the suppressKeyPress flag to determine if we've already
+ // handled the keydown event. #7269
+ // Unfortunately the code for & in keypress is the same as the up arrow,
+ // so we use the suppressKeyPressRepeat flag to avoid handling keypress
+ // events when we know the keydown event was used to modify the
+ // search term. #7799
+ var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
+ nodeName = this.element[ 0 ].nodeName.toLowerCase(),
+ isTextarea = nodeName === "textarea",
+ isInput = nodeName === "input";
+
+ this.isMultiLine =
+ // Textareas are always multi-line
+ isTextarea ? true :
+ // Inputs are always single-line, even if inside a contentEditable element
+ // IE also treats inputs as contentEditable
+ isInput ? false :
+ // All other element types are determined by whether or not they're
contentEditable
+ this.element.prop( "isContentEditable" );
+
+ this.valueMethod = this.element[ isTextarea || isInput ? "val" :
"text" ];
+ this.isNewMenu = true;
+
+ this.element
+ .addClass( "ui-autocomplete-input" )
+ .attr( "autocomplete", "off" );
+
+ this._on( this.element, {
+ keydown: function( event ) {
+ if ( this.element.prop( "readOnly" ) ) {
+ suppressKeyPress = true;
+ suppressInput = true;
+ suppressKeyPressRepeat = true;
+ return;
+ }
+
+ suppressKeyPress = false;
+ suppressInput = false;
+ suppressKeyPressRepeat = false;
+ var keyCode = $.ui.keyCode;
+ switch ( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ suppressKeyPress = true;
+ this._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ suppressKeyPress = true;
+ this._move( "nextPage", event );
+ break;
+ case keyCode.UP:
+ suppressKeyPress = true;
+ this._keyEvent( "previous", event );
+ break;
+ case keyCode.DOWN:
+ suppressKeyPress = true;
+ this._keyEvent( "next", event );
+ break;
+ case keyCode.ENTER:
+ // when menu is open and has focus
+ if ( this.menu.active ) {
+ // #6055 - Opera still allows the keypress to occur
+ // which causes forms to submit
+ suppressKeyPress = true;
+ event.preventDefault();
+ this.menu.select( event );
+ }
+ break;
+ case keyCode.TAB:
+ if ( this.menu.active ) {
+ this.menu.select( event );
+ }
+ break;
+ case keyCode.ESCAPE:
+ if ( this.menu.element.is( ":visible" ) ) {
+ if ( !this.isMultiLine ) {
+ this._value( this.term );
+ }
+ this.close( event );
+ // Different browsers have different default behavior for escape
+ // Single press can mean undo or clear
+ // Double press in IE means clear the whole form
+ event.preventDefault();
+ }
+ break;
+ default:
+ suppressKeyPressRepeat = true;
+ // search timeout should be triggered before the input value is changed
+ this._searchTimeout( event );
+ break;
+ }
+ },
+ keypress: function( event ) {
+ if ( suppressKeyPress ) {
+ suppressKeyPress = false;
+ if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+ event.preventDefault();
+ }
+ return;
+ }
+ if ( suppressKeyPressRepeat ) {
+ return;
+ }
+
+ // replicate some key handlers to allow them to repeat in Firefox and Opera
+ var keyCode = $.ui.keyCode;
+ switch ( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ this._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ this._move( "nextPage", event );
+ break;
+ case keyCode.UP:
+ this._keyEvent( "previous", event );
+ break;
+ case keyCode.DOWN:
+ this._keyEvent( "next", event );
+ break;
+ }
+ },
+ input: function( event ) {
+ if ( suppressInput ) {
+ suppressInput = false;
+ event.preventDefault();
+ return;
+ }
+ this._searchTimeout( event );
+ },
+ focus: function() {
+ this.selectedItem = null;
+ this.previous = this._value();
+ },
+ blur: function( event ) {
+ if ( this.cancelBlur ) {
+ delete this.cancelBlur;
+ return;
+ }
+
+ clearTimeout( this.searching );
+ this.close( event );
+ this._change( event );
+ }
+ });
+
+ this._initSource();
+ this.menu = $( "<ul>" )
+ .addClass( "ui-autocomplete ui-front" )
+ .appendTo( this._appendTo() )
+ .menu({
+ // disable ARIA support, the live region takes care of that
+ role: null
+ })
+ .hide()
+ .menu( "instance" );
+
+ this._on( this.menu.element, {
+ mousedown: function( event ) {
+ // prevent moving focus out of the text field
+ event.preventDefault();
+
+ // IE doesn't prevent moving focus even with event.preventDefault()
+ // so we set a flag to know when we should ignore the blur event
+ this.cancelBlur = true;
+ this._delay(function() {
+ delete this.cancelBlur;
+ });
+
+ // clicking on the scrollbar causes focus to shift to the body
+ // but we can't detect a mouseup or a click immediately afterward
+ // so we have to track the next mousedown and close the menu if
+ // the user clicks somewhere outside of the autocomplete
+ var menuElement = this.menu.element[ 0 ];
+ if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+ this._delay(function() {
+ var that = this;
+ this.document.one( "mousedown", function( event ) {
+ if ( event.target !== that.element[ 0 ] &&
+ event.target !== menuElement &&
+ !$.contains( menuElement, event.target ) ) {
+ that.close();
+ }
+ });
+ });
+ }
+ },
+ menufocus: function( event, ui ) {
+ var label, item;
+ // support: Firefox
+ // Prevent accidental activation of menu items in Firefox (#7024 #9118)
+ if ( this.isNewMenu ) {
+ this.isNewMenu = false;
+ if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
+ this.menu.blur();
+
+ this.document.one( "mousemove", function() {
+ $( event.target ).trigger( event.originalEvent );
+ });
+
+ return;
+ }
+ }
+
+ item = ui.item.data( "ui-autocomplete-item" );
+ if ( false !== this._trigger( "focus", event, { item: item } ) ) {
+ // use value to match what will end up in the input, if it was a key event
+ if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
+ this._value( item.value );
+ }
+ }
+
+ // Announce the value in the liveRegion
+ label = ui.item.attr( "aria-label" ) || item.value;
+ if ( label && $.trim( label ).length ) {
+ this.liveRegion.children().hide();
+ $( "<div>" ).text( label ).appendTo( this.liveRegion );
+ }
+ },
+ menuselect: function( event, ui ) {
+ var item = ui.item.data( "ui-autocomplete-item" ),
+ previous = this.previous;
+
+ // only trigger when focus was lost (click on menu)
+ if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
+ this.element.focus();
+ this.previous = previous;
+ // #6109 - IE triggers two focus events and the second
+ // is asynchronous, so we need to reset the previous
+ // term synchronously and asynchronously :-(
+ this._delay(function() {
+ this.previous = previous;
+ this.selectedItem = item;
+ });
+ }
+
+ if ( false !== this._trigger( "select", event, { item: item } ) ) {
+ this._value( item.value );
+ }
+ // reset the term after the select event
+ // this allows custom select handling to work properly
+ this.term = this._value();
+
+ this.close( event );
+ this.selectedItem = item;
+ }
+ });
+
+ this.liveRegion = $( "<span>", {
+ role: "status",
+ "aria-live": "assertive",
+ "aria-relevant": "additions"
+ })
+ .addClass( "ui-helper-hidden-accessible" )
+ .appendTo( this.document[ 0 ].body );
+
+ // turning off autocomplete prevents the browser from remembering the
+ // value when navigating through history, so we re-enable autocomplete
+ // if the page is unloaded before the widget is destroyed. #7790
+ this._on( this.window, {
+ beforeunload: function() {
+ this.element.removeAttr( "autocomplete" );
+ }
+ });
+ },
+
+ _destroy: function() {
+ clearTimeout( this.searching );
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" );
+ this.menu.element.remove();
+ this.liveRegion.remove();
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+ if ( key === "source" ) {
+ this._initSource();
+ }
+ if ( key === "appendTo" ) {
+ this.menu.element.appendTo( this._appendTo() );
+ }
+ if ( key === "disabled" && value && this.xhr ) {
+ this.xhr.abort();
+ }
+ },
+
+ _appendTo: function() {
+ var element = this.options.appendTo;
+
+ if ( element ) {
+ element = element.jquery || element.nodeType ?
+ $( element ) :
+ this.document.find( element ).eq( 0 );
+ }
+
+ if ( !element || !element[ 0 ] ) {
+ element = this.element.closest( ".ui-front" );
+ }
+
+ if ( !element.length ) {
+ element = this.document[ 0 ].body;
+ }
+
+ return element;
+ },
+
+ _initSource: function() {
+ var array, url,
+ that = this;
+ if ( $.isArray( this.options.source ) ) {
+ array = this.options.source;
+ this.source = function( request, response ) {
+ response( $.ui.autocomplete.filter( array, request.term ) );
+ };
+ } else if ( typeof this.options.source === "string" ) {
+ url = this.options.source;
+ this.source = function( request, response ) {
+ if ( that.xhr ) {
+ that.xhr.abort();
+ }
+ that.xhr = $.ajax({
+ url: url,
+ data: request,
+ dataType: "json",
+ success: function( data ) {
+ response( data );
+ },
+ error: function() {
+ response([]);
+ }
+ });
+ };
+ } else {
+ this.source = this.options.source;
+ }
+ },
+
+ _searchTimeout: function( event ) {
+ clearTimeout( this.searching );
+ this.searching = this._delay(function() {
+
+ // Search if the value has changed, or if the user retypes the same value (see #7434)
+ var equalValues = this.term === this._value(),
+ menuVisible = this.menu.element.is( ":visible" ),
+ modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
+
+ if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) )
{
+ this.selectedItem = null;
+ this.search( null, event );
+ }
+ }, this.options.delay );
+ },
+
+ search: function( value, event ) {
+ value = value != null ? value : this._value();
+
+ // always save the actual value, not the one passed as an argument
+ this.term = this._value();
+
+ if ( value.length < this.options.minLength ) {
+ return this.close( event );
+ }
+
+ if ( this._trigger( "search", event ) === false ) {
+ return;
+ }
+
+ return this._search( value );
+ },
+
+ _search: function( value ) {
+ this.pending++;
+ this.element.addClass( "ui-autocomplete-loading" );
+ this.cancelSearch = false;
+
+ this.source( { term: value }, this._response() );
+ },
+
+ _response: function() {
+ var index = ++this.requestIndex;
+
+ return $.proxy(function( content ) {
+ if ( index === this.requestIndex ) {
+ this.__response( content );
+ }
+
+ this.pending--;
+ if ( !this.pending ) {
+ this.element.removeClass( "ui-autocomplete-loading" );
+ }
+ }, this );
+ },
+
+ __response: function( content ) {
+ if ( content ) {
+ content = this._normalize( content );
+ }
+ this._trigger( "response", null, { content: content } );
+ if ( !this.options.disabled && content && content.length &&
!this.cancelSearch ) {
+ this._suggest( content );
+ this._trigger( "open" );
+ } else {
+ // use ._close() instead of .close() so we don't cancel future searches
+ this._close();
+ }
+ },
+
+ close: function( event ) {
+ this.cancelSearch = true;
+ this._close( event );
+ },
+
+ _close: function( event ) {
+ if ( this.menu.element.is( ":visible" ) ) {
+ this.menu.element.hide();
+ this.menu.blur();
+ this.isNewMenu = true;
+ this._trigger( "close", event );
+ }
+ },
+
+ _change: function( event ) {
+ if ( this.previous !== this._value() ) {
+ this._trigger( "change", event, { item: this.selectedItem } );
+ }
+ },
+
+ _normalize: function( items ) {
+ // assume all items have the right format when the first item is complete
+ if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
+ return items;
+ }
+ return $.map( items, function( item ) {
+ if ( typeof item === "string" ) {
+ return {
+ label: item,
+ value: item
+ };
+ }
+ return $.extend( {}, item, {
+ label: item.label || item.value,
+ value: item.value || item.label
+ });
+ });
+ },
+
+ _suggest: function( items ) {
+ var ul = this.menu.element.empty();
+ this._renderMenu( ul, items );
+ this.isNewMenu = true;
+ this.menu.refresh();
+
+ // size and position menu
+ ul.show();
+ this._resizeMenu();
+ ul.position( $.extend({
+ of: this.element
+ }, this.options.position ) );
+
+ if ( this.options.autoFocus ) {
+ this.menu.next();
+ }
+ },
+
+ _resizeMenu: function() {
+ var ul = this.menu.element;
+ ul.outerWidth( Math.max(
+ // Firefox wraps long text (possibly a rounding bug)
+ // so we add 1px to avoid the wrapping (#7513)
+ ul.width( "" ).outerWidth() + 1,
+ this.element.outerWidth()
+ ) );
+ },
+
+ _renderMenu: function( ul, items ) {
+ var that = this;
+ $.each( items, function( index, item ) {
+ that._renderItemData( ul, item );
+ });
+ },
+
+ _renderItemData: function( ul, item ) {
+ return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
+ },
+
+ _renderItem: function( ul, item ) {
+ return $( "<li>" ).text( item.label ).appendTo( ul );
+ },
+
+ _move: function( direction, event ) {
+ if ( !this.menu.element.is( ":visible" ) ) {
+ this.search( null, event );
+ return;
+ }
+ if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
+ this.menu.isLastItem() && /^next/.test( direction ) ) {
+
+ if ( !this.isMultiLine ) {
+ this._value( this.term );
+ }
+
+ this.menu.blur();
+ return;
+ }
+ this.menu[ direction ]( event );
+ },
+
+ widget: function() {
+ return this.menu.element;
+ },
+
+ _value: function() {
+ return this.valueMethod.apply( this.element, arguments );
+ },
+
+ _keyEvent: function( keyEvent, event ) {
+ if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+ this._move( keyEvent, event );
+
+ // prevents moving cursor to beginning/end of the text field in some browsers
+ event.preventDefault();
+ }
+ }
+});
+
+$.extend( $.ui.autocomplete, {
+ escapeRegex: function( value ) {
+ return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
+ },
+ filter: function( array, term ) {
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
+ return $.grep( array, function( value ) {
+ return matcher.test( value.label || value.value || value );
+ });
+ }
+});
+
+// live region extension, adding a `messages` option
+// NOTE: This is an experimental API. We are still investigating
+// a full solution for string manipulation and internationalization.
+$.widget( "ui.autocomplete", $.ui.autocomplete, {
+ options: {
+ messages: {
+ noResults: "No search results.",
+ results: function( amount ) {
+ return amount + ( amount > 1 ? " results are" : " result is" )
+
+ " available, use up and down arrow keys to navigate.";
+ }
+ }
+ },
+
+ __response: function( content ) {
+ var message;
+ this._superApply( arguments );
+ if ( this.options.disabled || this.cancelSearch ) {
+ return;
+ }
+ if ( content && content.length ) {
+ message = this.options.messages.results( content.length );
+ } else {
+ message = this.options.messages.noResults;
+ }
+ this.liveRegion.children().hide();
+ $( "<div>" ).text( message ).appendTo( this.liveRegion );
+ }
+});
+
+var autocomplete = $.ui.autocomplete;
+
+
+/*!
+ * jQuery UI Button 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/button/
+ */
+
+
+var lastActive,
+ baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons
ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+ formResetHandler = function() {
+ var form = $( this );
+ setTimeout(function() {
+ form.find( ":ui-button" ).button( "refresh" );
+ }, 1 );
+ },
+ radioGroup = function( radio ) {
+ var name = radio.name,
+ form = radio.form,
+ radios = $( [] );
+ if ( name ) {
+ name = name.replace( /'/g, "\\'" );
+ if ( form ) {
+ radios = $( form ).find( "[name='" + name +
"'][type=radio]" );
+ } else {
+ radios = $( "[name='" + name + "'][type=radio]",
radio.ownerDocument )
+ .filter(function() {
+ return !this.form;
+ });
+ }
+ }
+ return radios;
+ };
+
+$.widget( "ui.button", {
+ version: "1.11.4",
+ defaultElement: "<button>",
+ options: {
+ disabled: null,
+ text: true,
+ label: null,
+ icons: {
+ primary: null,
+ secondary: null
+ }
+ },
+ _create: function() {
+ this.element.closest( "form" )
+ .unbind( "reset" + this.eventNamespace )
+ .bind( "reset" + this.eventNamespace, formResetHandler );
+
+ if ( typeof this.options.disabled !== "boolean" ) {
+ this.options.disabled = !!this.element.prop( "disabled" );
+ } else {
+ this.element.prop( "disabled", this.options.disabled );
+ }
+
+ this._determineButtonType();
+ this.hasTitle = !!this.buttonElement.attr( "title" );
+
+ var that = this,
+ options = this.options,
+ toggleButton = this.type === "checkbox" || this.type === "radio",
+ activeClass = !toggleButton ? "ui-state-active" : "";
+
+ if ( options.label === null ) {
+ options.label = (this.type === "input" ? this.buttonElement.val() :
this.buttonElement.html());
+ }
+
+ this._hoverable( this.buttonElement );
+
+ this.buttonElement
+ .addClass( baseClasses )
+ .attr( "role", "button" )
+ .bind( "mouseenter" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return;
+ }
+ if ( this === lastActive ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "mouseleave" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( activeClass );
+ })
+ .bind( "click" + this.eventNamespace, function( event ) {
+ if ( options.disabled ) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+ });
+
+ // Can't use _focusable() because the element that receives focus
+ // and the element that gets the ui-state-focus class are different
+ this._on({
+ focus: function() {
+ this.buttonElement.addClass( "ui-state-focus" );
+ },
+ blur: function() {
+ this.buttonElement.removeClass( "ui-state-focus" );
+ }
+ });
+
+ if ( toggleButton ) {
+ this.element.bind( "change" + this.eventNamespace, function() {
+ that.refresh();
+ });
+ }
+
+ if ( this.type === "checkbox" ) {
+ this.buttonElement.bind( "click" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ });
+ } else if ( this.type === "radio" ) {
+ this.buttonElement.bind( "click" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ that.buttonElement.attr( "aria-pressed", "true" );
+
+ var radio = that.element[ 0 ];
+ radioGroup( radio )
+ .not( radio )
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ });
+ } else {
+ this.buttonElement
+ .bind( "mousedown" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ lastActive = this;
+ that.document.one( "mouseup", function() {
+ lastActive = null;
+ });
+ })
+ .bind( "mouseup" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).removeClass( "ui-state-active" );
+ })
+ .bind( "keydown" + this.eventNamespace, function(event) {
+ if ( options.disabled ) {
+ return false;
+ }
+ if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER )
{
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ // see #8559, we bind to blur here in case the button element loses
+ // focus between keydown and keyup, it would be left in an "active" state
+ .bind( "keyup" + this.eventNamespace + " blur" +
this.eventNamespace, function() {
+ $( this ).removeClass( "ui-state-active" );
+ });
+
+ if ( this.buttonElement.is("a") ) {
+ this.buttonElement.keyup(function(event) {
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
+ // TODO pass through original event correctly (just as 2nd argument doesn't
work)
+ $( this ).click();
+ }
+ });
+ }
+ }
+
+ this._setOption( "disabled", options.disabled );
+ this._resetButton();
+ },
+
+ _determineButtonType: function() {
+ var ancestor, labelSelector, checked;
+
+ if ( this.element.is("[type=checkbox]") ) {
+ this.type = "checkbox";
+ } else if ( this.element.is("[type=radio]") ) {
+ this.type = "radio";
+ } else if ( this.element.is("input") ) {
+ this.type = "input";
+ } else {
+ this.type = "button";
+ }
+
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ // we don't search against the document in case the element
+ // is disconnected from the DOM
+ ancestor = this.element.parents().last();
+ labelSelector = "label[for='" + this.element.attr("id") +
"']";
+ this.buttonElement = ancestor.find( labelSelector );
+ if ( !this.buttonElement.length ) {
+ ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+ this.buttonElement = ancestor.filter( labelSelector );
+ if ( !this.buttonElement.length ) {
+ this.buttonElement = ancestor.find( labelSelector );
+ }
+ }
+ this.element.addClass( "ui-helper-hidden-accessible" );
+
+ checked = this.element.is( ":checked" );
+ if ( checked ) {
+ this.buttonElement.addClass( "ui-state-active" );
+ }
+ this.buttonElement.prop( "aria-pressed", checked );
+ } else {
+ this.buttonElement = this.element;
+ }
+ },
+
+ widget: function() {
+ return this.buttonElement;
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-helper-hidden-accessible" );
+ this.buttonElement
+ .removeClass( baseClasses + " ui-state-active " + typeClasses )
+ .removeAttr( "role" )
+ .removeAttr( "aria-pressed" )
+ .html( this.buttonElement.find(".ui-button-text").html() );
+
+ if ( !this.hasTitle ) {
+ this.buttonElement.removeAttr( "title" );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+ if ( key === "disabled" ) {
+ this.widget().toggleClass( "ui-state-disabled", !!value );
+ this.element.prop( "disabled", !!value );
+ if ( value ) {
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ this.buttonElement.removeClass( "ui-state-focus" );
+ } else {
+ this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
+ }
+ }
+ return;
+ }
+ this._resetButton();
+ },
+
+ refresh: function() {
+ //See #8237 & #8828
+ var isDisabled = this.element.is( "input, button" ) ? this.element.is(
":disabled" ) : this.element.hasClass( "ui-button-disabled" );
+
+ if ( isDisabled !== this.options.disabled ) {
+ this._setOption( "disabled", isDisabled );
+ }
+ if ( this.type === "radio" ) {
+ radioGroup( this.element[0] ).each(function() {
+ if ( $( this ).is( ":checked" ) ) {
+ $( this ).button( "widget" )
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ $( this ).button( "widget" )
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ });
+ } else if ( this.type === "checkbox" ) {
+ if ( this.element.is( ":checked" ) ) {
+ this.buttonElement
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ this.buttonElement
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ }
+ },
+
+ _resetButton: function() {
+ if ( this.type === "input" ) {
+ if ( this.options.label ) {
+ this.element.val( this.options.label );
+ }
+ return;
+ }
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
+ buttonText = $( "<span></span>", this.document[0] )
+ .addClass( "ui-button-text" )
+ .html( this.options.label )
+ .appendTo( buttonElement.empty() )
+ .text(),
+ icons = this.options.icons,
+ multipleIcons = icons.primary && icons.secondary,
+ buttonClasses = [];
+
+ if ( icons.primary || icons.secondary ) {
+ if ( this.options.text ) {
+ buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s"
: ( icons.primary ? "-primary" : "-secondary" ) ) );
+ }
+
+ if ( icons.primary ) {
+ buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon
" + icons.primary + "'></span>" );
+ }
+
+ if ( icons.secondary ) {
+ buttonElement.append( "<span class='ui-button-icon-secondary ui-icon
" + icons.secondary + "'></span>" );
+ }
+
+ if ( !this.options.text ) {
+ buttonClasses.push( multipleIcons ? "ui-button-icons-only" :
"ui-button-icon-only" );
+
+ if ( !this.hasTitle ) {
+ buttonElement.attr( "title", $.trim( buttonText ) );
+ }
+ }
+ } else {
+ buttonClasses.push( "ui-button-text-only" );
+ }
+ buttonElement.addClass( buttonClasses.join( " " ) );
+ }
+});
+
+$.widget( "ui.buttonset", {
+ version: "1.11.4",
+ options: {
+ items: "button, input[type=button], input[type=submit], input[type=reset],
input[type=checkbox], input[type=radio], a, :data(ui-button)"
+ },
+
+ _create: function() {
+ this.element.addClass( "ui-buttonset" );
+ },
+
+ _init: function() {
+ this.refresh();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "disabled" ) {
+ this.buttons.button( "option", key, value );
+ }
+
+ this._super( key, value );
+ },
+
+ refresh: function() {
+ var rtl = this.element.css( "direction" ) === "rtl",
+ allButtons = this.element.find( this.options.items ),
+ existingButtons = allButtons.filter( ":ui-button" );
+
+ // Initialize new buttons
+ allButtons.not( ":ui-button" ).button();
+
+ // Refresh existing buttons
+ existingButtons.button( "refresh" );
+
+ this.buttons = allButtons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+ .filter( ":first" )
+ .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
+ .end()
+ .filter( ":last" )
+ .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
+ .end()
+ .end();
+ },
+
+ _destroy: function() {
+ this.element.removeClass( "ui-buttonset" );
+ this.buttons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-left ui-corner-right" )
+ .end()
+ .button( "destroy" );
+ }
+});
+
+var button = $.ui.button;
+
+
+/*!
+ * jQuery UI Datepicker 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/datepicker/
+ */
+
+
+$.extend($.ui, { datepicker: { version: "1.11.4" } });
+
+var datepicker_instActive;
+
+function datepicker_getZindex( elem ) {
+ var position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the
browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" || position
=== "fixed" ) {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index:
0;"></div></div>
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+
+ return 0;
+}
+/* Date picker manager.
+ Use the singleton instance of this class, $.datepicker, to interact with the date
picker.
+ Settings for (groups of) date pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+function Datepicker() {
+ this._curInst = null; // The current instance in use
+ this._keyEvent = false; // If the last event was a key event
+ this._disabledInputs = []; // List of date picker inputs that have been disabled
+ this._datepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker
division
+ this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker
class
+ this._appendClass = "ui-datepicker-append"; // The name of the append marker
class
+ this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger
marker class
+ this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker
class
+ this._disableClass = "ui-datepicker-disabled"; // The name of the disabled
covering marker class
+ this._unselectableClass = "ui-datepicker-unselectable"; // The name of the
unselectable cell marker class
+ this._currentClass = "ui-datepicker-current-day"; // The name of the current
day marker class
+ this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day
hover marker class
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[""] = { // Default regional settings
+ closeText: "Done", // Display text for close link
+ prevText: "Prev", // Display text for previous month link
+ nextText: "Next", // Display text for next month link
+ currentText: "Today", // Display text for current month link
+ monthNames:
["January","February","March","April","May","June",
+ "July","August","September","October","November","December"],
// Names of months for drop-down and formatting
+ monthNamesShort: ["Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"], // For formatting
+ dayNames: ["Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"], //
For formatting
+ dayNamesShort: ["Sun", "Mon", "Tue", "Wed",
"Thu", "Fri", "Sat"], // For formatting
+ dayNamesMin:
["Su","Mo","Tu","We","Th","Fr","Sa"],
// Column headings for days starting at Sunday
+ weekHeader: "Wk", // Column header for week of the year
+ dateFormat: "mm/dd/yy", // See format options on parseDate
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+ isRTL: false, // True if right-to-left language, false if left-to-right
+ showMonthAfterYear: false, // True if the year select precedes month, false for month
then year
+ yearSuffix: "" // Additional text to append to the year in the month headers
+ };
+ this._defaults = { // Global defaults for all the date picker instances
+ showOn: "focus", // "focus" for popup on focus,
+ // "button" for trigger button, or "both" for either
+ showAnim: "fadeIn", // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ defaultDate: null, // Used when field is blank: actual date,
+ // +/-number for offset from today, null for today
+ appendText: "", // Display text following the input box, e.g. showing the
format
+ buttonText: "...", // Text for trigger button
+ buttonImage: "", // URL for trigger button image
+ buttonImageOnly: false, // True if the image appears alone, false if it appears on a
button
+ hideIfNoPrevNext: false, // True to hide next/previous month links
+ // if not applicable, false to just disable them
+ navigationAsDateFormat: false, // True if date formatting applied to prev/today/next
links
+ gotoCurrent: false, // True if today link goes back to current selection instead
+ changeMonth: false, // True if month can be selected directly, false if only prev/next
+ changeYear: false, // True if year can be selected directly, false if only prev/next
+ yearRange: "c-10:c+10", // Range of years to display in drop-down,
+ // either relative to today's year (-nn:+nn), relative to currently displayed
year
+ // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+ showOtherMonths: false, // True to show dates in other months, false to leave blank
+ selectOtherMonths: false, // True to allow selection of dates in other months, false
for unselectable
+ showWeek: false, // True to show week of the year, false to not show it
+ calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+ // takes a Date and returns the number of the week for it
+ shortYearCutoff: "+10", // Short year values < this are in the current
century,
+ // > this are in the previous century,
+ // string value starting with "+" for current year + value
+ minDate: null, // The earliest selectable date, or null for no limit
+ maxDate: null, // The latest selectable date, or null for no limit
+ duration: "fast", // Duration of display/closure
+ beforeShowDay: null, // Function that takes a date and returns an array with
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or
"",
+ // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+ beforeShow: null, // Function that takes an input field and
+ // returns a set of custom settings for the date picker
+ onSelect: null, // Define a callback function when a date is selected
+ onChangeMonthYear: null, // Define a callback function when the month or year is
changed
+ onClose: null, // Define a callback function when the datepicker is closed
+ numberOfMonths: 1, // Number of months to show at a time
+ showCurrentAtPos: 0, // The position in multipe months at which to show the current
month (starting at 0)
+ stepMonths: 1, // Number of months to step back/forward
+ stepBigMonths: 12, // Number of months to step back/forward for the big links
+ altField: "", // Selector for an alternate field to store selected dates
into
+ altFormat: "", // The date format to use for the alternate field
+ constrainInput: true, // The input is constrained by the current date format
+ showButtonPanel: false, // True to show button panel, false to not show it
+ autoSize: false, // True to size the input for the date format, false to leave as is
+ disabled: false // The initial disabled state
+ };
+ $.extend(this._defaults, this.regional[""]);
+ this.regional.en = $.extend( true, {}, this.regional[ "" ]);
+ this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
+ this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId +
"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix
ui-corner-all'></div>"));
+}
+
+$.extend(Datepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a date picker. */
+ markerClassName: "hasDatepicker",
+
+ //Keep track of the maximum number of rows displayed (see #7043)
+ maxRows: 4,
+
+ // TODO rename to "widget" when switching to widget factory
+ _widgetDatepicker: function() {
+ return this.dpDiv;
+ },
+
+ /* Override the default settings for all instances of the date picker.
+ * @param settings object - the new settings to use as defaults (anonymous object)
+ * @return the manager object
+ */
+ setDefaults: function(settings) {
+ datepicker_extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the date picker to a jQuery selection.
+ * @param target element - the target input field or division or span
+ * @param settings object - the new settings to use for this date picker instance
(anonymous)
+ */
+ _attachDatepicker: function(target, settings) {
+ var nodeName, inline, inst;
+ nodeName = target.nodeName.toLowerCase();
+ inline = (nodeName === "div" || nodeName === "span");
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = "dp" + this.uuid;
+ }
+ inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {});
+ if (nodeName === "input") {
+ this._connectDatepicker(target, inst);
+ } else if (inline) {
+ this._inlineDatepicker(target, inst);
+ }
+ },
+
+ /* Create a new instance object. */
+ _newInst: function(target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape
jQuery meta chars
+ return {id: id, input: target, // associated target
+ selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+ drawMonth: 0, drawYear: 0, // month being drawn
+ inline: inline, // is datepicker inline or not
+ dpDiv: (!inline ? this.dpDiv : // presentation div
+ datepicker_bindHover($("<div class='" + this._inlineClass + "
ui-datepicker ui-widget ui-widget-content ui-helper-clearfix
ui-corner-all'></div>")))};
+ },
+
+ /* Attach the date picker to an input field. */
+ _connectDatepicker: function(target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName)) {
+ return;
+ }
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).keydown(this._doKeyDown).
+ keypress(this._doKeyPress).keyup(this._doKeyUp);
+ this._autoSize(inst);
+ $.data(target, "datepicker", inst);
+ //If disabled option is true, disable the datepicker once it has been attached to the
input (see ticket #5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function(input, inst) {
+ var showOn, buttonText, buttonImage,
+ appendText = this._get(inst, "appendText"),
+ isRTL = this._get(inst, "isRTL");
+
+ if (inst.append) {
+ inst.append.remove();
+ }
+ if (appendText) {
+ inst.append = $("<span class='" + this._appendClass +
"'>" + appendText + "</span>");
+ input[isRTL ? "before" : "after"](inst.append);
+ }
+
+ input.unbind("focus", this._showDatepicker);
+
+ if (inst.trigger) {
+ inst.trigger.remove();
+ }
+
+ showOn = this._get(inst, "showOn");
+ if (showOn === "focus" || showOn === "both") { // pop-up date
picker when in the marked field
+ input.focus(this._showDatepicker);
+ }
+ if (showOn === "button" || showOn === "both") { // pop-up date
picker when button clicked
+ buttonText = this._get(inst, "buttonText");
+ buttonImage = this._get(inst, "buttonImage");
+ inst.trigger = $(this._get(inst, "buttonImageOnly") ?
+ $("<img/>").addClass(this._triggerClass).
+ attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+ $("<button
type='button'></button>").addClass(this._triggerClass).
+ html(!buttonImage ? buttonText : $("<img/>").attr(
+ { src:buttonImage, alt:buttonText, title:buttonText })));
+ input[isRTL ? "before" : "after"](inst.trigger);
+ inst.trigger.click(function() {
+ if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0])
{
+ $.datepicker._hideDatepicker();
+ } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !==
input[0]) {
+ $.datepicker._hideDatepicker();
+ $.datepicker._showDatepicker(input[0]);
+ } else {
+ $.datepicker._showDatepicker(input[0]);
+ }
+ return false;
+ });
+ }
+ },
+
+ /* Apply the maximum length for the date format. */
+ _autoSize: function(inst) {
+ if (this._get(inst, "autoSize") && !inst.inline) {
+ var findMax, max, maxI, i,
+ date = new Date(2009, 12 - 1, 20), // Ensure double digits
+ dateFormat = this._get(inst, "dateFormat");
+
+ if (dateFormat.match(/[DM]/)) {
+ findMax = function(names) {
+ max = 0;
+ maxI = 0;
+ for (i = 0; i < names.length; i++) {
+ if (names[i].length > max) {
+ max = names[i].length;
+ maxI = i;
+ }
+ }
+ return maxI;
+ };
+ date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+ "monthNames" : "monthNamesShort"))));
+ date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+ "dayNames" : "dayNamesShort"))) + 20 - date.getDay());
+ }
+ inst.input.attr("size", this._formatDate(inst, date).length);
+ }
+ },
+
+ /* Attach an inline date picker to a div. */
+ _inlineDatepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName)) {
+ return;
+ }
+ divSpan.addClass(this.markerClassName).append(inst.dpDiv);
+ $.data(target, "datepicker", inst);
+ this._setDate(inst, this._getDefaultDate(inst), true);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ //If disabled option is true, disable the datepicker before showing it (see ticket
#5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
+ // Set display:block in place of inst.dpDiv.show() which won't work on disconnected
elements
+ //
http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has
zero height
+ inst.dpDiv.css( "display", "block" );
+ },
+
+ /* Pop-up the date picker in a "dialog" box.
+ * @param input element - ignored
+ * @param date string or Date - the initial date to display
+ * @param onSelect function - the function to call when a date is selected
+ * @param settings object - update the dialog date picker instance's settings
(anonymous object)
+ * @param pos int[2] - coordinates for the dialog's position within the screen or
+ * event - with x/y coordinates or
+ * leave empty for default (screen centre)
+ * @return the manager object
+ */
+ _dialogDatepicker: function(input, date, onSelect, settings, pos) {
+ var id, browserWidth, browserHeight, scrollX, scrollY,
+ inst = this._dialogInst; // internal instance
+
+ if (!inst) {
+ this.uuid += 1;
+ id = "dp" + this.uuid;
+ this._dialogInput = $("<input type='text' id='" + id +
+ "' style='position: absolute; top: -100px; width:
0px;'/>");
+ this._dialogInput.keydown(this._doKeyDown);
+ $("body").append(this._dialogInput);
+ inst = this._dialogInst = this._newInst(this._dialogInput, false);
+ inst.settings = {};
+ $.data(this._dialogInput[0], "datepicker", inst);
+ }
+ datepicker_extendRemove(inst.settings, settings || {});
+ date = (date && date.constructor === Date ? this._formatDate(inst, date) :
date);
+ this._dialogInput.val(date);
+
+ this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+ if (!this._pos) {
+ browserWidth = document.documentElement.clientWidth;
+ browserHeight = document.documentElement.clientHeight;
+ scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ this._pos = // should use actual width/height below
+ [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+ }
+
+ // move input on screen for focus, but hidden behind dialog
+ this._dialogInput.css("left", (this._pos[0] + 20) +
"px").css("top", this._pos[1] + "px");
+ inst.settings.onSelect = onSelect;
+ this._inDialog = true;
+ this.dpDiv.addClass(this._dialogClass);
+ this._showDatepicker(this._dialogInput[0]);
+ if ($.blockUI) {
+ $.blockUI(this.dpDiv);
+ }
+ $.data(this._dialogInput[0], "datepicker", inst);
+ return this;
+ },
+
+ /* Detach a datepicker from its control.
+ * @param target element - the target input field or division or span
+ */
+ _destroyDatepicker: function(target) {
+ var nodeName,
+ $target = $(target),
+ inst = $.data(target, "datepicker");
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+
+ nodeName = target.nodeName.toLowerCase();
+ $.removeData(target, "datepicker");
+ if (nodeName === "input") {
+ inst.append.remove();
+ inst.trigger.remove();
+ $target.removeClass(this.markerClassName).
+ unbind("focus", this._showDatepicker).
+ unbind("keydown", this._doKeyDown).
+ unbind("keypress", this._doKeyPress).
+ unbind("keyup", this._doKeyUp);
+ } else if (nodeName === "div" || nodeName === "span") {
+ $target.removeClass(this.markerClassName).empty();
+ }
+
+ if ( datepicker_instActive === inst ) {
+ datepicker_instActive = null;
+ }
+ },
+
+ /* Enable the date picker to a jQuery selection.
+ * @param target element - the target input field or division or span
+ */
+ _enableDatepicker: function(target) {
+ var nodeName, inline,
+ $target = $(target),
+ inst = $.data(target, "datepicker");
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+
+ nodeName = target.nodeName.toLowerCase();
+ if (nodeName === "input") {
+ target.disabled = false;
+ inst.trigger.filter("button").
+ each(function() { this.disabled = false; }).end().
+ filter("img").css({opacity: "1.0", cursor: ""});
+ } else if (nodeName === "div" || nodeName === "span") {
+ inline = $target.children("." + this._inlineClass);
+ inline.children().removeClass("ui-state-disabled");
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ prop("disabled", false);
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value === target ? null : value); }); // delete entry
+ },
+
+ /* Disable the date picker to a jQuery selection.
+ * @param target element - the target input field or division or span
+ */
+ _disableDatepicker: function(target) {
+ var nodeName, inline,
+ $target = $(target),
+ inst = $.data(target, "datepicker");
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+
+ nodeName = target.nodeName.toLowerCase();
+ if (nodeName === "input") {
+ target.disabled = true;
+ inst.trigger.filter("button").
+ each(function() { this.disabled = true; }).end().
+ filter("img").css({opacity: "0.5", cursor:
"default"});
+ } else if (nodeName === "div" || nodeName === "span") {
+ inline = $target.children("." + this._inlineClass);
+ inline.children().addClass("ui-state-disabled");
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ prop("disabled", true);
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value === target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = target;
+ },
+
+ /* Is the first field in a jQuery collection disabled as a datepicker?
+ * @param target element - the target input field or division or span
+ * @return boolean - true if disabled, false if enabled
+ */
+ _isDisabledDatepicker: function(target) {
+ if (!target) {
+ return false;
+ }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] === target) {
+ return true;
+ }
+ }
+ return false;
+ },
+
+ /* Retrieve the instance data for the target control.
+ * @param target element - the target input field or division or span
+ * @return object - the associated instance data
+ * @throws error if a jQuery problem getting data
+ */
+ _getInst: function(target) {
+ try {
+ return $.data(target, "datepicker");
+ }
+ catch (err) {
+ throw "Missing instance data for this datepicker";
+ }
+ },
+
+ /* Update or retrieve the settings for a date picker attached to an input field or
division.
+ * @param target element - the target input field or division or span
+ * @param name object - the new settings to update or
+ * string - the name of the setting to change or retrieve,
+ * when retrieving also "all" for all instance settings or
+ * "defaults" for all global defaults
+ * @param value any - the new value for the setting
+ * (omit if above is an object or to retrieve a value)
+ */
+ _optionDatepicker: function(target, name, value) {
+ var settings, date, minDate, maxDate,
+ inst = this._getInst(target);
+
+ if (arguments.length === 2 && typeof name === "string") {
+ return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
+ (inst ? (name === "all" ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+
+ settings = name || {};
+ if (typeof name === "string") {
+ settings = {};
+ settings[name] = value;
+ }
+
+ if (inst) {
+ if (this._curInst === inst) {
+ this._hideDatepicker();
+ }
+
+ date = this._getDateDatepicker(target, true);
+ minDate = this._getMinMaxDate(inst, "min");
+ maxDate = this._getMinMaxDate(inst, "max");
+ datepicker_extendRemove(inst.settings, settings);
+ // reformat the old minDate/maxDate values if dateFormat changes and a new
minDate/maxDate isn't provided
+ if (minDate !== null && settings.dateFormat !== undefined &&
settings.minDate === undefined) {
+ inst.settings.minDate = this._formatDate(inst, minDate);
+ }
+ if (maxDate !== null && settings.dateFormat !== undefined &&
settings.maxDate === undefined) {
+ inst.settings.maxDate = this._formatDate(inst, maxDate);
+ }
+ if ( "disabled" in settings ) {
+ if ( settings.disabled ) {
+ this._disableDatepicker(target);
+ } else {
+ this._enableDatepicker(target);
+ }
+ }
+ this._attachments($(target), inst);
+ this._autoSize(inst);
+ this._setDate(inst, date);
+ this._updateAlternate(inst);
+ this._updateDatepicker(inst);
+ }
+ },
+
+ // change method deprecated
+ _changeDatepicker: function(target, name, value) {
+ this._optionDatepicker(target, name, value);
+ },
+
+ /* Redraw the date picker attached to an input field or division.
+ * @param target element - the target input field or division or span
+ */
+ _refreshDatepicker: function(target) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._updateDatepicker(inst);
+ }
+ },
+
+ /* Set the dates for a jQuery selection.
+ * @param target element - the target input field or division or span
+ * @param date Date - the new date
+ */
+ _setDateDatepicker: function(target, date) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setDate(inst, date);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ }
+ },
+
+ /* Get the date(s) for the first entry in a jQuery selection.
+ * @param target element - the target input field or division or span
+ * @param noDefault boolean - true if no default date is to be used
+ * @return Date - the current date
+ */
+ _getDateDatepicker: function(target, noDefault) {
+ var inst = this._getInst(target);
+ if (inst && !inst.inline) {
+ this._setDateFromField(inst, noDefault);
+ }
+ return (inst ? this._getDate(inst) : null);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function(event) {
+ var onSelect, dateStr, sel,
+ inst = $.datepicker._getInst(event.target),
+ handled = true,
+ isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
+
+ inst._keyEvent = true;
+ if ($.datepicker._datepickerShowing) {
+ switch (event.keyCode) {
+ case 9: $.datepicker._hideDatepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
+ $.datepicker._currentClass + ")", inst.dpDiv);
+ if (sel[0]) {
+ $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear,
sel[0]);
+ }
+
+ onSelect = $.datepicker._get(inst, "onSelect");
+ if (onSelect) {
+ dateStr = $.datepicker._formatDate(inst);
+
+ // trigger custom callback
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+ } else {
+ $.datepicker._hideDatepicker();
+ }
+
+ return false; // don't submit the form
+ case 27: $.datepicker._hideDatepicker();
+ break; // hide on escape
+ case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, "stepBigMonths") :
+ -$.datepicker._get(inst, "stepMonths")), "M");
+ break; // previous month/year on page up/+ ctrl
+ case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, "stepBigMonths") :
+ +$.datepicker._get(inst, "stepMonths")), "M");
+ break; // next month/year on page down/+ ctrl
+ case 35: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._clearDate(event.target);
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // clear on ctrl or command +end
+ case 36: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._gotoToday(event.target);
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // current on ctrl or command +home
+ case 37: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ // -1 day on ctrl or command +left
+ if (event.originalEvent.altKey) {
+ $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, "stepBigMonths") :
+ -$.datepicker._get(inst, "stepMonths")), "M");
+ }
+ // next month/year on alt +left on Mac
+ break;
+ case 38: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, -7, "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // -1 week on ctrl or command +up
+ case 39: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ // +1 day on ctrl or command +right
+ if (event.originalEvent.altKey) {
+ $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, "stepBigMonths") :
+ +$.datepicker._get(inst, "stepMonths")), "M");
+ }
+ // next month/year on alt +right
+ break;
+ case 40: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, +7, "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // +1 week on ctrl or command +down
+ default: handled = false;
+ }
+ } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker
on ctrl+home
+ $.datepicker._showDatepicker(this);
+ } else {
+ handled = false;
+ }
+
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Filter entered characters - based on date format. */
+ _doKeyPress: function(event) {
+ var chars, chr,
+ inst = $.datepicker._getInst(event.target);
+
+ if ($.datepicker._get(inst, "constrainInput")) {
+ chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
+ chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
+ return event.ctrlKey || event.metaKey || (chr < " " || !chars ||
chars.indexOf(chr) > -1);
+ }
+ },
+
+ /* Synchronise manual entry and field/alternate field. */
+ _doKeyUp: function(event) {
+ var date,
+ inst = $.datepicker._getInst(event.target);
+
+ if (inst.input.val() !== inst.lastVal) {
+ try {
+ date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
+ (inst.input ? inst.input.val() : null),
+ $.datepicker._getFormatConfig(inst));
+
+ if (date) { // only if valid
+ $.datepicker._setDateFromField(inst);
+ $.datepicker._updateAlternate(inst);
+ $.datepicker._updateDatepicker(inst);
+ }
+ }
+ catch (err) {
+ }
+ }
+ return true;
+ },
+
+ /* Pop-up the date picker for a given input field.
+ * If false returned from beforeShow event handler do not show.
+ * @param input element - the input field attached to the date picker or
+ * event - if triggered by focus
+ */
+ _showDatepicker: function(input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() !== "input") { // find from button/image
trigger
+ input = $("input", input.parentNode)[0];
+ }
+
+ if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) {
// already here
+ return;
+ }
+
+ var inst, beforeShow, beforeShowSettings, isFixed,
+ offset, showAnim, duration;
+
+ inst = $.datepicker._getInst(input);
+ if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
+ $.datepicker._curInst.dpDiv.stop(true, true);
+ if ( inst && $.datepicker._datepickerShowing ) {
+ $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
+ }
+ }
+
+ beforeShow = $.datepicker._get(inst, "beforeShow");
+ beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+ if(beforeShowSettings === false){
+ return;
+ }
+ datepicker_extendRemove(inst.settings, beforeShowSettings);
+
+ inst.lastVal = null;
+ $.datepicker._lastInput = input;
+ $.datepicker._setDateFromField(inst);
+
+ if ($.datepicker._inDialog) { // hide cursor
+ input.value = "";
+ }
+ if (!$.datepicker._pos) { // position below input
+ $.datepicker._pos = $.datepicker._findPos(input);
+ $.datepicker._pos[1] += input.offsetHeight; // add the height
+ }
+
+ isFixed = false;
+ $(input).parents().each(function() {
+ isFixed |= $(this).css("position") === "fixed";
+ return !isFixed;
+ });
+
+ offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+ $.datepicker._pos = null;
+ //to avoid flashes on Firefox
+ inst.dpDiv.empty();
+ // determine sizing offscreen
+ inst.dpDiv.css({position: "absolute", display: "block", top:
"-1000px"});
+ $.datepicker._updateDatepicker(inst);
+ // fix width for dynamic number of date pickers
+ // and adjust position before showing
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
+ inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+ "static" : (isFixed ? "fixed" : "absolute")), display:
"none",
+ left: offset.left + "px", top: offset.top + "px"});
+
+ if (!inst.inline) {
+ showAnim = $.datepicker._get(inst, "showAnim");
+ duration = $.datepicker._get(inst, "duration");
+ inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
+ $.datepicker._datepickerShowing = true;
+
+ if ( $.effects && $.effects.effect[ showAnim ] ) {
+ inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"),
duration);
+ } else {
+ inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
+ }
+
+ if ( $.datepicker._shouldFocusInput( inst ) ) {
+ inst.input.focus();
+ }
+
+ $.datepicker._curInst = inst;
+ }
+ },
+
+ /* Generate the date picker content. */
+ _updateDatepicker: function(inst) {
+ this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+ datepicker_instActive = inst; // for delegate hover events
+ inst.dpDiv.empty().append(this._generateHTML(inst));
+ this._attachHandlers(inst);
+
+ var origyearshtml,
+ numMonths = this._getNumberOfMonths(inst),
+ cols = numMonths[1],
+ width = 17,
+ activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
+
+ if ( activeCell.length > 0 ) {
+ datepicker_handleMouseover.apply( activeCell.get( 0 ) );
+ }
+
+ inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3
ui-datepicker-multi-4").width("");
+ if (cols > 1) {
+ inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width",
(width * cols) + "em");
+ }
+ inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" :
"remove") +
+ "Class"]("ui-datepicker-multi");
+ inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove")
+
+ "Class"]("ui-datepicker-rtl");
+
+ if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing
&& $.datepicker._shouldFocusInput( inst ) ) {
+ inst.input.focus();
+ }
+
+ // deffered render of the years select (to avoid flashes on Firefox)
+ if( inst.yearshtml ){
+ origyearshtml = inst.yearshtml;
+ setTimeout(function(){
+ //assure that inst.yearshtml didn't change.
+ if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+ inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
+ }
+ origyearshtml = inst.yearshtml = null;
+ }, 0);
+ }
+ },
+
+ // #6694 - don't focus the input if it's already focused
+ // this breaks the change event in IE
+ // Support: IE and jQuery <1.9
+ _shouldFocusInput: function( inst ) {
+ return inst.input && inst.input.is( ":visible" ) &&
!inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function(inst, offset, isFixed) {
+ var dpWidth = inst.dpDiv.outerWidth(),
+ dpHeight = inst.dpDiv.outerHeight(),
+ inputWidth = inst.input ? inst.input.outerWidth() : 0,
+ inputHeight = inst.input ? inst.input.outerHeight() : 0,
+ viewWidth = document.documentElement.clientWidth + (isFixed ? 0 :
$(document).scrollLeft()),
+ viewHeight = document.documentElement.clientHeight + (isFixed ? 0 :
$(document).scrollTop());
+
+ offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left === inst.input.offset().left) ?
$(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top === (inst.input.offset().top +
inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place
if so.
+ offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth &&
viewWidth > dpWidth) ?
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight &&
viewHeight > dpHeight) ?
+ Math.abs(dpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function(obj) {
+ var position,
+ inst = this._getInst(obj),
+ isRTL = this._get(inst, "isRTL");
+
+ while (obj && (obj.type === "hidden" || obj.nodeType !== 1 ||
$.expr.filters.hidden(obj))) {
+ obj = obj[isRTL ? "previousSibling" : "nextSibling"];
+ }
+
+ position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Hide the date picker from view.
+ * @param input element - the input field attached to the date picker
+ */
+ _hideDatepicker: function(input) {
+ var showAnim, duration, postProcess, onClose,
+ inst = this._curInst;
+
+ if (!inst || (input && inst !== $.data(input, "datepicker"))) {
+ return;
+ }
+
+ if (this._datepickerShowing) {
+ showAnim = this._get(inst, "showAnim");
+ duration = this._get(inst, "duration");
+ postProcess = function() {
+ $.datepicker._tidyDialog(inst);
+ };
+
+ // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+ if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
{
+ inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration,
postProcess);
+ } else {
+ inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
+ (showAnim === "fadeIn" ? "fadeOut" :
"hide"))]((showAnim ? duration : null), postProcess);
+ }
+
+ if (!showAnim) {
+ postProcess();
+ }
+ this._datepickerShowing = false;
+
+ onClose = this._get(inst, "onClose");
+ if (onClose) {
+ onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() :
""), inst]);
+ }
+
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: "absolute", left: "0", top:
"-100px" });
+ if ($.blockUI) {
+ $.unblockUI();
+ $("body").append(this.dpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function(inst) {
+ inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
+ },
+
+ /* Close date picker if clicked elsewhere. */
+ _checkExternalClick: function(event) {
+ if (!$.datepicker._curInst) {
+ return;
+ }
+
+ var $target = $(event.target),
+ inst = $.datepicker._getInst($target[0]);
+
+ if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
+ $target.parents("#" + $.datepicker._mainDivId).length === 0 &&
+ !$target.hasClass($.datepicker.markerClassName) &&
+ !$target.closest("." + $.datepicker._triggerClass).length &&
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog &&
$.blockUI) ) ) ||
+ ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !==
inst ) ) {
+ $.datepicker._hideDatepicker();
+ }
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustDate: function(id, offset, period) {
+ var target = $(id),
+ inst = this._getInst(target[0]);
+
+ if (this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ this._adjustInstDate(inst, offset +
+ (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), //
undo positioning
+ period);
+ this._updateDatepicker(inst);
+ },
+
+ /* Action for current link. */
+ _gotoToday: function(id) {
+ var date,
+ target = $(id),
+ inst = this._getInst(target[0]);
+
+ if (this._get(inst, "gotoCurrent") && inst.currentDay) {
+ inst.selectedDay = inst.currentDay;
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+ inst.drawYear = inst.selectedYear = inst.currentYear;
+ } else {
+ date = new Date();
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ }
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a new month/year. */
+ _selectMonthYear: function(id, select, period) {
+ var target = $(id),
+ inst = this._getInst(target[0]);
+
+ inst["selected" + (period === "M" ? "Month" :
"Year")] =
+ inst["draw" + (period === "M" ? "Month" :
"Year")] =
+ parseInt(select.options[select.selectedIndex].value,10);
+
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a day. */
+ _selectDay: function(id, month, year, td) {
+ var inst,
+ target = $(id);
+
+ if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0]))
{
+ return;
+ }
+
+ inst = this._getInst(target[0]);
+ inst.selectedDay = inst.currentDay = $("a", td).html();
+ inst.selectedMonth = inst.currentMonth = month;
+ inst.selectedYear = inst.currentYear = year;
+ this._selectDate(id, this._formatDate(inst,
+ inst.currentDay, inst.currentMonth, inst.currentYear));
+ },
+
+ /* Erase the input field and hide the date picker. */
+ _clearDate: function(id) {
+ var target = $(id);
+ this._selectDate(target, "");
+ },
+
+ /* Update the input field with the selected date. */
+ _selectDate: function(id, dateStr) {
+ var onSelect,
+ target = $(id),
+ inst = this._getInst(target[0]);
+
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input) {
+ inst.input.val(dateStr);
+ }
+ this._updateAlternate(inst);
+
+ onSelect = this._get(inst, "onSelect");
+ if (onSelect) {
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger
custom callback
+ } else if (inst.input) {
+ inst.input.trigger("change"); // fire the change event
+ }
+
+ if (inst.inline){
+ this._updateDatepicker(inst);
+ } else {
+ this._hideDatepicker();
+ this._lastInput = inst.input[0];
+ if (typeof(inst.input[0]) !== "object") {
+ inst.input.focus(); // restore focus
+ }
+ this._lastInput = null;
+ }
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst) {
+ var altFormat, date, dateStr,
+ altField = this._get(inst, "altField");
+
+ if (altField) { // update alternate field too
+ altFormat = this._get(inst, "altFormat") || this._get(inst,
"dateFormat");
+ date = this._getDate(inst);
+ dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+ $(altField).each(function() { $(this).val(dateStr); });
+ }
+ },
+
+ /* Set as beforeShowDay function to prevent selection of weekends.
+ * @param date Date - the date to customise
+ * @return [boolean, string] - is this date selectable?, what is its CSS class?
+ */
+ noWeekends: function(date) {
+ var day = date.getDay();
+ return [(day > 0 && day < 6), ""];
+ },
+
+ /* Set as calculateWeek to determine the week of the year based on the ISO 8601
definition.
+ * @param date Date - the date to get the week for
+ * @return number - the number of the week within the year that contains this date
+ */
+ iso8601Week: function(date) {
+ var time,
+ checkDate = new Date(date.getTime());
+
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+
+ time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+ },
+
+ /* Parse a string value into a date object.
+ * See formatDate below for the possible formats.
+ *
+ * @param format string - the expected format of the date
+ * @param value string - the date in the above format
+ * @param settings Object - attributes include:
+ * shortYearCutoff number - the cutoff year for determining the century (optional)
+ * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ * dayNames string[7] - names of the days from Sunday (optional)
+ * monthNamesShort string[12] - abbreviated names of the months (optional)
+ * monthNames string[12] - names of the months (optional)
+ * @return Date - the extracted date value or null if value is blank
+ */
+ parseDate: function (format, value, settings) {
+ if (format == null || value == null) {
+ throw "Invalid arguments";
+ }
+
+ value = (typeof value === "object" ? value.toString() : value +
"");
+ if (value === "") {
+ return null;
+ }
+
+ var iFormat, dim, extra,
+ iValue = 0,
+ shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) ||
this._defaults.shortYearCutoff,
+ shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ?
shortYearCutoffTemp :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
+ dayNamesShort = (settings ? settings.dayNamesShort : null) ||
this._defaults.dayNamesShort,
+ dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
+ monthNamesShort = (settings ? settings.monthNamesShort : null) ||
this._defaults.monthNamesShort,
+ monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
+ year = -1,
+ month = -1,
+ day = -1,
+ doy = -1,
+ literal = false,
+ date,
+ // Check whether a format character is doubled
+ lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1)
=== match);
+ if (matches) {
+ iFormat++;
+ }
+ return matches;
+ },
+ // Extract a number from the string value
+ getNumber = function(match) {
+ var isDoubled = lookAhead(match),
+ size = (match === "@" ? 14 : (match === "!" ? 20 :
+ (match === "y" && isDoubled ? 4 : (match === "o" ? 3 :
2)))),
+ minSize = (match === "y" ? size : 1),
+ digits = new RegExp("^\\d{" + minSize + "," + size +
"}"),
+ num = value.substring(iValue).match(digits);
+ if (!num) {
+ throw "Missing number at position " + iValue;
+ }
+ iValue += num[0].length;
+ return parseInt(num[0], 10);
+ },
+ // Extract a name from the string value and convert to an index
+ getName = function(match, shortNames, longNames) {
+ var index = -1,
+ names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+ return [ [k, v] ];
+ }).sort(function (a, b) {
+ return -(a[1].length - b[1].length);
+ });
+
+ $.each(names, function (i, pair) {
+ var name = pair[1];
+ if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
+ index = pair[0];
+ iValue += name.length;
+ return false;
+ }
+ });
+ if (index !== -1) {
+ return index + 1;
+ } else {
+ throw "Unknown name at position " + iValue;
+ }
+ },
+ // Confirm that a literal character matches the string value
+ checkLiteral = function() {
+ if (value.charAt(iValue) !== format.charAt(iFormat)) {
+ throw "Unexpected literal at position " + iValue;
+ }
+ iValue++;
+ };
+
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === "'" &&
!lookAhead("'")) {
+ literal = false;
+ } else {
+ checkLiteral();
+ }
+ } else {
+ switch (format.charAt(iFormat)) {
+ case "d":
+ day = getNumber("d");
+ break;
+ case "D":
+ getName("D", dayNamesShort, dayNames);
+ break;
+ case "o":
+ doy = getNumber("o");
+ break;
+ case "m":
+ month = getNumber("m");
+ break;
+ case "M":
+ month = getName("M", monthNamesShort, monthNames);
+ break;
+ case "y":
+ year = getNumber("y");
+ break;
+ case "@":
+ date = new Date(getNumber("@"));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "!":
+ date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "'":
+ if (lookAhead("'")){
+ checkLiteral();
+ } else {
+ literal = true;
+ }
+ break;
+ default:
+ checkLiteral();
+ }
+ }
+ }
+
+ if (iValue < value.length){
+ extra = value.substr(iValue);
+ if (!/^\s+/.test(extra)) {
+ throw "Extra/unparsed characters found in date: " + extra;
+ }
+ }
+
+ if (year === -1) {
+ year = new Date().getFullYear();
+ } else if (year < 100) {
+ year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+ (year <= shortYearCutoff ? 0 : -100);
+ }
+
+ if (doy > -1) {
+ month = 1;
+ day = doy;
+ do {
+ dim = this._getDaysInMonth(year, month - 1);
+ if (day <= dim) {
+ break;
+ }
+ month++;
+ day -= dim;
+ } while (true);
+ }
+
+ date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+ if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !==
day) {
+ throw "Invalid date"; // E.g. 31/02/00
+ }
+ return date;
+ },
+
+ /* Standard date formats. */
+ ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
+ COOKIE: "D, dd M yy",
+ ISO_8601: "yy-mm-dd",
+ RFC_822: "D, d M y",
+ RFC_850: "DD, dd-M-y",
+ RFC_1036: "D, d M y",
+ RFC_1123: "D, d M yy",
+ RFC_2822: "D, d M yy",
+ RSS: "D, d M y", // RFC 822
+ TICKS: "!",
+ TIMESTAMP: "@",
+ W3C: "yy-mm-dd", // ISO 8601
+
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+ /* Format a date object into a string value.
+ * The format can be combinations of the following:
+ * d - day of month (no leading zero)
+ * dd - day of month (two digit)
+ * o - day of year (no leading zeros)
+ * oo - day of year (three digit)
+ * D - day name short
+ * DD - day name long
+ * m - month of year (no leading zero)
+ * mm - month of year (two digit)
+ * M - month name short
+ * MM - month name long
+ * y - year (two digit)
+ * yy - year (four digit)
+ * @ - Unix timestamp (ms since 01/01/1970)
+ * ! - Windows ticks (100ns since 01/01/0001)
+ * "..." - literal text
+ * '' - single quote
+ *
+ * @param format string - the desired format of the date
+ * @param date Date - the date value to format
+ * @param settings Object - attributes include:
+ * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ * dayNames string[7] - names of the days from Sunday (optional)
+ * monthNamesShort string[12] - abbreviated names of the months (optional)
+ * monthNames string[12] - names of the months (optional)
+ * @return string - the date in the above format
+ */
+ formatDate: function (format, date, settings) {
+ if (!date) {
+ return "";
+ }
+
+ var iFormat,
+ dayNamesShort = (settings ? settings.dayNamesShort : null) ||
this._defaults.dayNamesShort,
+ dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
+ monthNamesShort = (settings ? settings.monthNamesShort : null) ||
this._defaults.monthNamesShort,
+ monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
+ // Check whether a format character is doubled
+ lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1)
=== match);
+ if (matches) {
+ iFormat++;
+ }
+ return matches;
+ },
+ // Format a number, with leading zero if necessary
+ formatNumber = function(match, value, len) {
+ var num = "" + value;
+ if (lookAhead(match)) {
+ while (num.length < len) {
+ num = "0" + num;
+ }
+ }
+ return num;
+ },
+ // Format a name, short or long as requested
+ formatName = function(match, value, shortNames, longNames) {
+ return (lookAhead(match) ? longNames[value] : shortNames[value]);
+ },
+ output = "",
+ literal = false;
+
+ if (date) {
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === "'" &&
!lookAhead("'")) {
+ literal = false;
+ } else {
+ output += format.charAt(iFormat);
+ }
+ } else {
+ switch (format.charAt(iFormat)) {
+ case "d":
+ output += formatNumber("d", date.getDate(), 2);
+ break;
+ case "D":
+ output += formatName("D", date.getDay(), dayNamesShort, dayNames);
+ break;
+ case "o":
+ output += formatNumber("o",
+ Math.round((new Date(date.getFullYear(), date.getMonth(),
date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000),
3);
+ break;
+ case "m":
+ output += formatNumber("m", date.getMonth() + 1, 2);
+ break;
+ case "M":
+ output += formatName("M", date.getMonth(), monthNamesShort,
monthNames);
+ break;
+ case "y":
+ output += (lookAhead("y") ? date.getFullYear() :
+ (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() %
100);
+ break;
+ case "@":
+ output += date.getTime();
+ break;
+ case "!":
+ output += date.getTime() * 10000 + this._ticksTo1970;
+ break;
+ case "'":
+ if (lookAhead("'")) {
+ output += "'";
+ } else {
+ literal = true;
+ }
+ break;
+ default:
+ output += format.charAt(iFormat);
+ }
+ }
+ }
+ }
+ return output;
+ },
+
+ /* Extract all possible characters from the date format. */
+ _possibleChars: function (format) {
+ var iFormat,
+ chars = "",
+ literal = false,
+ // Check whether a format character is doubled
+ lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1)
=== match);
+ if (matches) {
+ iFormat++;
+ }
+ return matches;
+ };
+
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === "'" &&
!lookAhead("'")) {
+ literal = false;
+ } else {
+ chars += format.charAt(iFormat);
+ }
+ } else {
+ switch (format.charAt(iFormat)) {
+ case "d": case "m": case "y": case "@":
+ chars += "0123456789";
+ break;
+ case "D": case "M":
+ return null; // Accept anything
+ case "'":
+ if (lookAhead("'")) {
+ chars += "'";
+ } else {
+ literal = true;
+ }
+ break;
+ default:
+ chars += format.charAt(iFormat);
+ }
+ }
+ }
+ return chars;
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function(inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing date and initialise date picker. */
+ _setDateFromField: function(inst, noDefault) {
+ if (inst.input.val() === inst.lastVal) {
+ return;
+ }
+
+ var dateFormat = this._get(inst, "dateFormat"),
+ dates = inst.lastVal = inst.input ? inst.input.val() : null,
+ defaultDate = this._getDefaultDate(inst),
+ date = defaultDate,
+ settings = this._getFormatConfig(inst);
+
+ try {
+ date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+ } catch (event) {
+ dates = (noDefault ? "" : dates);
+ }
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ inst.currentDay = (dates ? date.getDate() : 0);
+ inst.currentMonth = (dates ? date.getMonth() : 0);
+ inst.currentYear = (dates ? date.getFullYear() : 0);
+ this._adjustInstDate(inst);
+ },
+
+ /* Retrieve the default date shown on opening. */
+ _getDefaultDate: function(inst) {
+ return this._restrictMinMax(inst,
+ this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
+ },
+
+ /* A date may be specified as an exact value or a relative one. */
+ _determineDate: function(inst, date, defaultDate) {
+ var offsetNumeric = function(offset) {
+ var date = new Date();
+ date.setDate(date.getDate() + offset);
+ return date;
+ },
+ offsetString = function(offset) {
+ try {
+ return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
+ offset, $.datepicker._getFormatConfig(inst));
+ }
+ catch (e) {
+ // Ignore
+ }
+
+ var date = (offset.toLowerCase().match(/^c/) ?
+ $.datepicker._getDate(inst) : null) || new Date(),
+ year = date.getFullYear(),
+ month = date.getMonth(),
+ day = date.getDate(),
+ pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
+ matches = pattern.exec(offset);
+
+ while (matches) {
+ switch (matches[2] || "d") {
+ case "d" : case "D" :
+ day += parseInt(matches[1],10); break;
+ case "w" : case "W" :
+ day += parseInt(matches[1],10) * 7; break;
+ case "m" : case "M" :
+ month += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ case "y": case "Y" :
+ year += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ }
+ matches = pattern.exec(offset);
+ }
+ return new Date(year, month, day);
+ },
+ newDate = (date == null || date === "" ? defaultDate : (typeof date ===
"string" ? offsetString(date) :
+ (typeof date === "number" ? (isNaN(date) ? defaultDate :
offsetNumeric(date)) : new Date(date.getTime()))));
+
+ newDate = (newDate && newDate.toString() === "Invalid Date" ?
defaultDate : newDate);
+ if (newDate) {
+ newDate.setHours(0);
+ newDate.setMinutes(0);
+ newDate.setSeconds(0);
+ newDate.setMilliseconds(0);
+ }
+ return this._daylightSavingAdjust(newDate);
+ },
+
+ /* Handle switch to/from daylight saving.
+ * Hours may be non-zero on daylight saving cut-over:
+ * > 12 when midnight changeover, but then cannot generate
+ * midnight datetime, so jump to 1AM, otherwise reset.
+ * @param date (Date) the date to check
+ * @return (Date) the corrected date
+ */
+ _daylightSavingAdjust: function(date) {
+ if (!date) {
+ return null;
+ }
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+ return date;
+ },
+
+ /* Set the date(s) directly. */
+ _setDate: function(inst, date, noChange) {
+ var clear = !date,
+ origMonth = inst.selectedMonth,
+ origYear = inst.selectedYear,
+ newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+
+ inst.selectedDay = inst.currentDay = newDate.getDate();
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+ inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+ if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) &&
!noChange) {
+ this._notifyChange(inst);
+ }
+ this._adjustInstDate(inst);
+ if (inst.input) {
+ inst.input.val(clear ? "" : this._formatDate(inst));
+ }
+ },
+
+ /* Retrieve the date(s) directly. */
+ _getDate: function(inst) {
+ var startDate = (!inst.currentYear || (inst.input && inst.input.val() ===
"") ? null :
+ this._daylightSavingAdjust(new Date(
+ inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return startDate;
+ },
+
+ /* Attach the onxxx handlers. These are declared statically so
+ * they work with static code transformers like Caja.
+ */
+ _attachHandlers: function(inst) {
+ var stepMonths = this._get(inst, "stepMonths"),
+ id = "#" + inst.id.replace( /\\\\/g, "\\" );
+ inst.dpDiv.find("[data-handler]").map(function () {
+ var handler = {
+ prev: function () {
+ $.datepicker._adjustDate(id, -stepMonths, "M");
+ },
+ next: function () {
+ $.datepicker._adjustDate(id, +stepMonths, "M");
+ },
+ hide: function () {
+ $.datepicker._hideDatepicker();
+ },
+ today: function () {
+ $.datepicker._gotoToday(id);
+ },
+ selectDay: function () {
+ $.datepicker._selectDay(id, +this.getAttribute("data-month"),
+this.getAttribute("data-year"), this);
+ return false;
+ },
+ selectMonth: function () {
+ $.datepicker._selectMonthYear(id, this, "M");
+ return false;
+ },
+ selectYear: function () {
+ $.datepicker._selectMonthYear(id, this, "Y");
+ return false;
+ }
+ };
+ $(this).bind(this.getAttribute("data-event"),
handler[this.getAttribute("data-handler")]);
+ });
+ },
+
+ /* Generate the HTML for the current state of the date picker. */
+ _generateHTML: function(inst) {
+ var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
+ controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
+ monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
+ selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
+ cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
+ printDate, dRow, tbody, daySettings, otherMonth, unselectable,
+ tempDate = new Date(),
+ today = this._daylightSavingAdjust(
+ new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear
time
+ isRTL = this._get(inst, "isRTL"),
+ showButtonPanel = this._get(inst, "showButtonPanel"),
+ hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
+ navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
+ numMonths = this._getNumberOfMonths(inst),
+ showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
+ stepMonths = this._get(inst, "stepMonths"),
+ isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
+ currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+ new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
+ minDate = this._getMinMaxDate(inst, "min"),
+ maxDate = this._getMinMaxDate(inst, "max"),
+ drawMonth = inst.drawMonth - showCurrentAtPos,
+ drawYear = inst.drawYear;
+
+ if (drawMonth < 0) {
+ drawMonth += 12;
+ drawYear--;
+ }
+ if (maxDate) {
+ maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+ maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+ maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+ while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+ drawMonth--;
+ if (drawMonth < 0) {
+ drawMonth = 11;
+ drawYear--;
+ }
+ }
+ }
+ inst.drawMonth = drawMonth;
+ inst.drawYear = drawYear;
+
+ prevText = this._get(inst, "prevText");
+ prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+ this._getFormatConfig(inst)));
+
+ prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+ "<a class='ui-datepicker-prev ui-corner-all'
data-handler='prev' data-event='click'" +
+ " title='" + prevText + "'><span class='ui-icon
ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") +
"'>" + prevText + "</span></a>" :
+ (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev
ui-corner-all ui-state-disabled' title='"+ prevText +"'><span
class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" :
"w") + "'>" + prevText +
"</span></a>"));
+
+ nextText = this._get(inst, "nextText");
+ nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+ this._getFormatConfig(inst)));
+
+ next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+ "<a class='ui-datepicker-next ui-corner-all'
data-handler='next' data-event='click'" +
+ " title='" + nextText + "'><span class='ui-icon
ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") +
"'>" + nextText + "</span></a>" :
+ (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next
ui-corner-all ui-state-disabled' title='"+ nextText + "'><span
class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" :
"e") + "'>" + nextText +
"</span></a>"));
+
+ currentText = this._get(inst, "currentText");
+ gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ?
currentDate : today);
+ currentText = (!navigationAsDateFormat ? currentText :
+ this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+
+ controls = (!inst.inline ? "<button type='button'
class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all'
data-handler='hide' data-event='click'>" +
+ this._get(inst, "closeText") + "</button>" : "");
+
+ buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane
ui-widget-content'>" + (isRTL ? controls : "") +
+ (this._isInRange(inst, gotoDate) ? "<button type='button'
class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all'
data-handler='today' data-event='click'" +
+ ">" + currentText + "</button>" : "") + (isRTL
? "" : controls) + "</div>" : "";
+
+ firstDay = parseInt(this._get(inst, "firstDay"),10);
+ firstDay = (isNaN(firstDay) ? 0 : firstDay);
+
+ showWeek = this._get(inst, "showWeek");
+ dayNames = this._get(inst, "dayNames");
+ dayNamesMin = this._get(inst, "dayNamesMin");
+ monthNames = this._get(inst, "monthNames");
+ monthNamesShort = this._get(inst, "monthNamesShort");
+ beforeShowDay = this._get(inst, "beforeShowDay");
+ showOtherMonths = this._get(inst, "showOtherMonths");
+ selectOtherMonths = this._get(inst, "selectOtherMonths");
+ defaultDate = this._getDefaultDate(inst);
+ html = "";
+ dow;
+ for (row = 0; row < numMonths[0]; row++) {
+ group = "";
+ this.maxRows = 4;
+ for (col = 0; col < numMonths[1]; col++) {
+ selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth,
inst.selectedDay));
+ cornerClass = " ui-corner-all";
+ calender = "";
+ if (isMultiMonth) {
+ calender += "<div class='ui-datepicker-group";
+ if (numMonths[1] > 1) {
+ switch (col) {
+ case 0: calender += " ui-datepicker-group-first";
+ cornerClass = " ui-corner-" + (isRTL ? "right" :
"left"); break;
+ case numMonths[1]-1: calender += " ui-datepicker-group-last";
+ cornerClass = " ui-corner-" + (isRTL ? "left" :
"right"); break;
+ default: calender += " ui-datepicker-group-middle"; cornerClass =
""; break;
+ }
+ }
+ calender += "'>";
+ }
+ calender += "<div class='ui-datepicker-header ui-widget-header
ui-helper-clearfix" + cornerClass + "'>" +
+ (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) :
"") +
+ (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) :
"") +
+ this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+ row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+ "</div><table
class='ui-datepicker-calendar'><thead>" +
+ "<tr>";
+ thead = (showWeek ? "<th class='ui-datepicker-week-col'>" +
this._get(inst, "weekHeader") + "</th>" : "");
+ for (dow = 0; dow < 7; dow++) { // days of the week
+ day = (dow + firstDay) % 7;
+ thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5
? " class='ui-datepicker-week-end'" : "") + ">"
+
+ "<span title='" + dayNames[day] + "'>" +
dayNamesMin[day] + "</span></th>";
+ }
+ calender += thead + "</tr></thead><tbody>";
+ daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+ if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
+ inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+ }
+ leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+ curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to
generate
+ numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows :
curRows); //If multiple months, use the higher number of rows (see #7043)
+ this.maxRows = numRows;
+ printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+ for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+ calender += "<tr>";
+ tbody = (!showWeek ? "" : "<td
class='ui-datepicker-week-col'>" +
+ this._get(inst, "calculateWeek")(printDate) + "</td>");
+ for (dow = 0; dow < 7; dow++) { // create date picker days
+ daySettings = (beforeShowDay ?
+ beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true,
""]);
+ otherMonth = (printDate.getMonth() !== drawMonth);
+ unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+ (minDate && printDate < minDate) || (maxDate && printDate >
maxDate);
+ tbody += "<td class='" +
+ ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" :
"") + // highlight weekends
+ (otherMonth ? " ui-datepicker-other-month" : "") + //
highlight days from other months
+ ((printDate.getTime() === selectedDate.getTime() && drawMonth ===
inst.selectedMonth && inst._keyEvent) || // user pressed key
+ (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime()
=== selectedDate.getTime()) ?
+ // or defaultDate is current printedDate and defaultDate is selectedDate
+ " " + this._dayOverClass : "") + // highlight selected day
+ (unselectable ? " " + this._unselectableClass + "
ui-state-disabled": "") + // highlight unselectable days
+ (otherMonth && !showOtherMonths ? "" : " " +
daySettings[1] + // highlight custom dates
+ (printDate.getTime() === currentDate.getTime() ? " " +
this._currentClass : "") + // highlight selected day
+ (printDate.getTime() === today.getTime() ? " ui-datepicker-today" :
"")) + "'" + // highlight today (if different)
+ ((!otherMonth || showOtherMonths) && daySettings[2] ? "
title='" + daySettings[2].replace(/'/g, "'") +
"'" : "") + // cell title
+ (unselectable ? "" : " data-handler='selectDay'
data-event='click' data-month='" + printDate.getMonth() + "'
data-year='" + printDate.getFullYear() + "'") + ">" +
// actions
+ (otherMonth && !showOtherMonths ? " " : // display for
other months
+ (unselectable ? "<span class='ui-state-default'>" +
printDate.getDate() + "</span>" : "<a
class='ui-state-default" +
+ (printDate.getTime() === today.getTime() ? " ui-state-highlight" :
"") +
+ (printDate.getTime() === currentDate.getTime() ? " ui-state-active" :
"") + // highlight selected day
+ (otherMonth ? " ui-priority-secondary" : "") + // distinguish
dates from other months
+ "' href='#'>" + printDate.getDate() +
"</a>")) + "</td>"; // display selectable date
+ printDate.setDate(printDate.getDate() + 1);
+ printDate = this._daylightSavingAdjust(printDate);
+ }
+ calender += tbody + "</tr>";
+ }
+ drawMonth++;
+ if (drawMonth > 11) {
+ drawMonth = 0;
+ drawYear++;
+ }
+ calender += "</tbody></table>" + (isMultiMonth ?
"</div>" +
+ ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div
class='ui-datepicker-row-break'></div>" : "") :
"");
+ group += calender;
+ }
+ html += group;
+ }
+ html += buttonPanel;
+ inst._keyEvent = false;
+ return html;
+ },
+
+ /* Generate the month and year header. */
+ _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+ secondary, monthNames, monthNamesShort) {
+
+ var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
+ changeMonth = this._get(inst, "changeMonth"),
+ changeYear = this._get(inst, "changeYear"),
+ showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
+ html = "<div class='ui-datepicker-title'>",
+ monthHtml = "";
+
+ // month selection
+ if (secondary || !changeMonth) {
+ monthHtml += "<span class='ui-datepicker-month'>" +
monthNames[drawMonth] + "</span>";
+ } else {
+ inMinYear = (minDate && minDate.getFullYear() === drawYear);
+ inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
+ monthHtml += "<select class='ui-datepicker-month'
data-handler='selectMonth' data-event='change'>";
+ for ( month = 0; month < 12; month++) {
+ if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month
<= maxDate.getMonth())) {
+ monthHtml += "<option value='" + month + "'" +
+ (month === drawMonth ? " selected='selected'" : "") +
+ ">" + monthNamesShort[month] + "</option>";
+ }
+ }
+ monthHtml += "</select>";
+ }
+
+ if (!showMonthAfterYear) {
+ html += monthHtml + (secondary || !(changeMonth && changeYear) ?
" " : "");
+ }
+
+ // year selection
+ if ( !inst.yearshtml ) {
+ inst.yearshtml = "";
+ if (secondary || !changeYear) {
+ html += "<span class='ui-datepicker-year'>" + drawYear +
"</span>";
+ } else {
+ // determine range of years to display
+ years = this._get(inst, "yearRange").split(":");
+ thisYear = new Date().getFullYear();
+ determineYear = function(value) {
+ var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+ (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
+ parseInt(value, 10)));
+ return (isNaN(year) ? thisYear : year);
+ };
+ year = determineYear(years[0]);
+ endYear = Math.max(year, determineYear(years[1] || ""));
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+ inst.yearshtml += "<select class='ui-datepicker-year'
data-handler='selectYear' data-event='change'>";
+ for (; year <= endYear; year++) {
+ inst.yearshtml += "<option value='" + year + "'" +
+ (year === drawYear ? " selected='selected'" : "") +
+ ">" + year + "</option>";
+ }
+ inst.yearshtml += "</select>";
+
+ html += inst.yearshtml;
+ inst.yearshtml = null;
+ }
+ }
+
+ html += this._get(inst, "yearSuffix");
+ if (showMonthAfterYear) {
+ html += (secondary || !(changeMonth && changeYear) ? " " :
"") + monthHtml;
+ }
+ html += "</div>"; // Close datepicker_header
+ return html;
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustInstDate: function(inst, offset, period) {
+ var year = inst.drawYear + (period === "Y" ? offset : 0),
+ month = inst.drawMonth + (period === "M" ? offset : 0),
+ day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period ===
"D" ? offset : 0),
+ date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month,
day)));
+
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ if (period === "M" || period === "Y") {
+ this._notifyChange(inst);
+ }
+ },
+
+ /* Ensure a date is within any min/max bounds. */
+ _restrictMinMax: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, "min"),
+ maxDate = this._getMinMaxDate(inst, "max"),
+ newDate = (minDate && date < minDate ? minDate : date);
+ return (maxDate && newDate > maxDate ? maxDate : newDate);
+ },
+
+ /* Notify change of month/year. */
+ _notifyChange: function(inst) {
+ var onChange = this._get(inst, "onChangeMonthYear");
+ if (onChange) {
+ onChange.apply((inst.input ? inst.input[0] : null),
+ [inst.selectedYear, inst.selectedMonth + 1, inst]);
+ }
+ },
+
+ /* Determine the number of months to show. */
+ _getNumberOfMonths: function(inst) {
+ var numMonths = this._get(inst, "numberOfMonths");
+ return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1,
numMonths] : numMonths));
+ },
+
+ /* Determine the current maximum date - ensure no time components are set. */
+ _getMinMaxDate: function(inst, minMax) {
+ return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
+ },
+
+ /* Find the number of days in a given month. */
+ _getDaysInMonth: function(year, month) {
+ return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+ },
+
+ /* Find the day of the week of the first of a month. */
+ _getFirstDayOfMonth: function(year, month) {
+ return new Date(year, month, 1).getDay();
+ },
+
+ /* Determines if we should allow a "next/prev" month display change. */
+ _canAdjustMonth: function(inst, offset, curYear, curMonth) {
+ var numMonths = this._getNumberOfMonths(inst),
+ date = this._daylightSavingAdjust(new Date(curYear,
+ curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+
+ if (offset < 0) {
+ date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+ }
+ return this._isInRange(inst, date);
+ },
+
+ /* Is the given date in the accepted range? */
+ _isInRange: function(inst, date) {
+ var yearSplit, currentYear,
+ minDate = this._getMinMaxDate(inst, "min"),
+ maxDate = this._getMinMaxDate(inst, "max"),
+ minYear = null,
+ maxYear = null,
+ years = this._get(inst, "yearRange");
+ if (years){
+ yearSplit = years.split(":");
+ currentYear = new Date().getFullYear();
+ minYear = parseInt(yearSplit[0], 10);
+ maxYear = parseInt(yearSplit[1], 10);
+ if ( yearSplit[0].match(/[+\-].*/) ) {
+ minYear += currentYear;
+ }
+ if ( yearSplit[1].match(/[+\-].*/) ) {
+ maxYear += currentYear;
+ }
+ }
+
+ return ((!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime()) &&
+ (!minYear || date.getFullYear() >= minYear) &&
+ (!maxYear || date.getFullYear() <= maxYear));
+ },
+
+ /* Provide the configuration settings for formatting/parsing. */
+ _getFormatConfig: function(inst) {
+ var shortYearCutoff = this._get(inst, "shortYearCutoff");
+ shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ return {shortYearCutoff: shortYearCutoff,
+ dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst,
"dayNames"),
+ monthNamesShort: this._get(inst, "monthNamesShort"), monthNames:
this._get(inst, "monthNames")};
+ },
+
+ /* Format the given date for display. */
+ _formatDate: function(inst, day, month, year) {
+ if (!day) {
+ inst.currentDay = inst.selectedDay;
+ inst.currentMonth = inst.selectedMonth;
+ inst.currentYear = inst.selectedYear;
+ }
+ var date = (day ? (typeof day === "object" ? day :
+ this._daylightSavingAdjust(new Date(year, month, day))) :
+ this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth,
inst.currentDay)));
+ return this.formatDate(this._get(inst, "dateFormat"), date,
this._getFormatConfig(inst));
+ }
+});
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find
their way back to the active picker.
+ */
+function datepicker_bindHover(dpDiv) {
+ var selector = "button, .ui-datepicker-prev, .ui-datepicker-next,
.ui-datepicker-calendar td a";
+ return dpDiv.delegate(selector, "mouseout", function() {
+ $(this).removeClass("ui-state-hover");
+ if (this.className.indexOf("ui-datepicker-prev") !== -1) {
+ $(this).removeClass("ui-datepicker-prev-hover");
+ }
+ if (this.className.indexOf("ui-datepicker-next") !== -1) {
+ $(this).removeClass("ui-datepicker-next-hover");
+ }
+ })
+ .delegate( selector, "mouseover", datepicker_handleMouseover );
+}
+
+function datepicker_handleMouseover() {
+ if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline?
datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
+ $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
+ $(this).addClass("ui-state-hover");
+ if (this.className.indexOf("ui-datepicker-prev") !== -1) {
+ $(this).addClass("ui-datepicker-prev-hover");
+ }
+ if (this.className.indexOf("ui-datepicker-next") !== -1) {
+ $(this).addClass("ui-datepicker-next-hover");
+ }
+ }
+}
+
+/* jQuery extend now ignores nulls! */
+function datepicker_extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props) {
+ if (props[name] == null) {
+ target[name] = props[name];
+ }
+ }
+ return target;
+}
+
+/* Invoke the datepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new datepicker functionality
+ @return jQuery object */
+$.fn.datepicker = function(options){
+
+ /* Verify an empty collection wasn't passed - Fixes #6976 */
+ if ( !this.length ) {
+ return this;
+ }
+
+ /* Initialise the date picker. */
+ if (!$.datepicker.initialized) {
+ $(document).mousedown($.datepicker._checkExternalClick);
+ $.datepicker.initialized = true;
+ }
+
+ /* Append datepicker main container to body if not exist. */
+ if ($("#"+$.datepicker._mainDivId).length === 0) {
+ $("body").append($.datepicker.dpDiv);
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options === "string" && (options === "isDisabled"
|| options === "getDate" || options === "widget")) {
+ return $.datepicker["_" + options + "Datepicker"].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ }
+ if (options === "option" && arguments.length === 2 && typeof
arguments[1] === "string") {
+ return $.datepicker["_" + options + "Datepicker"].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ }
+ return this.each(function() {
+ typeof options === "string" ?
+ $.datepicker["_" + options + "Datepicker"].
+ apply($.datepicker, [this].concat(otherArgs)) :
+ $.datepicker._attachDatepicker(this, options);
+ });
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.11.4";
+
+var datepicker = $.datepicker;
+
+
+/*!
+ * jQuery UI Draggable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/draggable/
+ */
+
+
+$.widget("ui.draggable", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "drag",
+ options: {
+ addClasses: true,
+ appendTo: "parent",
+ axis: false,
+ connectToSortable: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ iframeFix: false,
+ opacity: false,
+ refreshPositions: false,
+ revert: false,
+ revertDuration: 500,
+ scope: "default",
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ snap: false,
+ snapMode: "both",
+ snapTolerance: 20,
+ stack: false,
+ zIndex: false,
+
+ // callbacks
+ drag: null,
+ start: null,
+ stop: null
+ },
+ _create: function() {
+
+ if ( this.options.helper === "original" ) {
+ this._setPositionRelative();
+ }
+ if (this.options.addClasses){
+ this.element.addClass("ui-draggable");
+ }
+ if (this.options.disabled){
+ this.element.addClass("ui-draggable-disabled");
+ }
+ this._setHandleClassName();
+
+ this._mouseInit();
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+ if ( key === "handle" ) {
+ this._removeHandleClassName();
+ this._setHandleClassName();
+ }
+ },
+
+ _destroy: function() {
+ if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
+ this.destroyOnClear = true;
+ return;
+ }
+ this.element.removeClass( "ui-draggable ui-draggable-dragging
ui-draggable-disabled" );
+ this._removeHandleClassName();
+ this._mouseDestroy();
+ },
+
+ _mouseCapture: function(event) {
+ var o = this.options;
+
+ this._blurActiveElement( event );
+
+ // among others, prevent a drag on a resizable-handle
+ if (this.helper || o.disabled ||
$(event.target).closest(".ui-resizable-handle").length > 0) {
+ return false;
+ }
+
+ //Quit if we're not on a valid handle
+ this.handle = this._getHandle(event);
+ if (!this.handle) {
+ return false;
+ }
+
+ this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
+
+ return true;
+
+ },
+
+ _blockFrames: function( selector ) {
+ this.iframeBlocks = this.document.find( selector ).map(function() {
+ var iframe = $( this );
+
+ return $( "<div>" )
+ .css( "position", "absolute" )
+ .appendTo( iframe.parent() )
+ .outerWidth( iframe.outerWidth() )
+ .outerHeight( iframe.outerHeight() )
+ .offset( iframe.offset() )[ 0 ];
+ });
+ },
+
+ _unblockFrames: function() {
+ if ( this.iframeBlocks ) {
+ this.iframeBlocks.remove();
+ delete this.iframeBlocks;
+ }
+ },
+
+ _blurActiveElement: function( event ) {
+ var document = this.document[ 0 ];
+
+ // Only need to blur if the event occurred on the draggable itself, see #10527
+ if ( !this.handleElement.is( event.target ) ) {
+ return;
+ }
+
+ // support: IE9
+ // IE9 throws an "Unspecified error" accessing document.activeElement from an
<iframe>
+ try {
+
+ // Support: IE9, IE10
+ // If the <body> is blurred, IE will switch windows, see #9520
+ if ( document.activeElement && document.activeElement.nodeName.toLowerCase()
!== "body" ) {
+
+ // Blur any element that currently has focus, see #4261
+ $( document.activeElement ).blur();
+ }
+ } catch ( error ) {}
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options;
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ this.helper.addClass("ui-draggable-dragging");
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ //If ddmanager is used for droppables, set the global draggable
+ if ($.ui.ddmanager) {
+ $.ui.ddmanager.current = this;
+ }
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Store the helper's css position
+ this.cssPosition = this.helper.css( "position" );
+ this.scrollParent = this.helper.scrollParent( true );
+ this.offsetParent = this.helper.offsetParent();
+ this.hasFixedAncestor = this.helper.parents().filter(function() {
+ return $( this ).css( "position" ) === "fixed";
+ }).length > 0;
+
+ //The element's absolute position on the page minus margins
+ this.positionAbs = this.element.offset();
+ this._refreshOffsets( event );
+
+ //Generate the original position
+ this.originalPosition = this.position = this._generatePosition( event, false );
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Set a containment if given in the options
+ this._setContainment();
+
+ //Trigger event + callbacks
+ if (this._trigger("start", event) === false) {
+ this._clear();
+ return false;
+ }
+
+ //Recache the helper size
+ this._cacheHelperProportions();
+
+ //Prepare the droppable offsets
+ if ($.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ // Reset helper's right/bottom css if they're set and set explicit width/height
instead
+ // as this prevents resizing of elements with right/bottom set (see #7772)
+ this._normalizeRightBottom();
+
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to
be visible before getting its correct position
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has started
(see #5003)
+ if ( $.ui.ddmanager ) {
+ $.ui.ddmanager.dragStart(this, event);
+ }
+
+ return true;
+ },
+
+ _refreshOffsets: function( event ) {
+ this.offset = {
+ top: this.positionAbs.top - this.margins.top,
+ left: this.positionAbs.left - this.margins.left,
+ scroll: false,
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset()
+ };
+
+ this.offset.click = {
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ };
+ },
+
+ _mouseDrag: function(event, noPropagation) {
+ // reset any necessary cached properties (see #5009)
+ if ( this.hasFixedAncestor ) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ //Compute the helpers position
+ this.position = this._generatePosition( event, true );
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Call plugins and callbacks and use the resulting position if something is returned
+ if (!noPropagation) {
+ var ui = this._uiHash();
+ if (this._trigger("drag", event, ui) === false) {
+ this._mouseUp({});
+ return false;
+ }
+ this.position = ui.position;
+ }
+
+ this.helper[ 0 ].style.left = this.position.left + "px";
+ this.helper[ 0 ].style.top = this.position.top + "px";
+
+ if ($.ui.ddmanager) {
+ $.ui.ddmanager.drag(this, event);
+ }
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ //If we are using droppables, inform the manager about the drop
+ var that = this,
+ dropped = false;
+ if ($.ui.ddmanager && !this.options.dropBehaviour) {
+ dropped = $.ui.ddmanager.drop(this, event);
+ }
+
+ //if a drop comes from outside (a sortable)
+ if (this.dropped) {
+ dropped = this.dropped;
+ this.dropped = false;
+ }
+
+ if ((this.options.revert === "invalid" && !dropped) ||
(this.options.revert === "valid" && dropped) || this.options.revert ===
true || ($.isFunction(this.options.revert) &&
this.options.revert.call(this.element, dropped))) {
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration,
10), function() {
+ if (that._trigger("stop", event) !== false) {
+ that._clear();
+ }
+ });
+ } else {
+ if (this._trigger("stop", event) !== false) {
+ this._clear();
+ }
+ }
+
+ return false;
+ },
+
+ _mouseUp: function( event ) {
+ this._unblockFrames();
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has stopped
(see #5003)
+ if ( $.ui.ddmanager ) {
+ $.ui.ddmanager.dragStop(this, event);
+ }
+
+ // Only need to focus if the event occurred on the draggable itself, see #10527
+ if ( this.handleElement.is( event.target ) ) {
+ // The interaction is over; whether or not the click resulted in a drag, focus the
element
+ this.element.focus();
+ }
+
+ return $.ui.mouse.prototype._mouseUp.call(this, event);
+ },
+
+ cancel: function() {
+
+ if (this.helper.is(".ui-draggable-dragging")) {
+ this._mouseUp({});
+ } else {
+ this._clear();
+ }
+
+ return this;
+
+ },
+
+ _getHandle: function(event) {
+ return this.options.handle ?
+ !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
+ true;
+ },
+
+ _setHandleClassName: function() {
+ this.handleElement = this.options.handle ?
+ this.element.find( this.options.handle ) : this.element;
+ this.handleElement.addClass( "ui-draggable-handle" );
+ },
+
+ _removeHandleClassName: function() {
+ this.handleElement.removeClass( "ui-draggable-handle" );
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options,
+ helperIsFunction = $.isFunction( o.helper ),
+ helper = helperIsFunction ?
+ $( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
+ ( o.helper === "clone" ?
+ this.element.clone().removeAttr( "id" ) :
+ this.element );
+
+ if (!helper.parents("body").length) {
+ helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode :
o.appendTo));
+ }
+
+ //
http://bugs.jqueryui.com/ticket/9446
+ // a helper function can return the original element
+ // which wouldn't have been set to relative in _create
+ if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
+ this._setPositionRelative();
+ }
+
+ if (helper[0] !== this.element[0] &&
!(/(fixed|absolute)/).test(helper.css("position"))) {
+ helper.css("position", "absolute");
+ }
+
+ return helper;
+
+ },
+
+ _setPositionRelative: function() {
+ if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
+ this.element[ 0 ].style.position = "relative";
+ }
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj === "string") {
+ obj = obj.split(" ");
+ }
+ if ($.isArray(obj)) {
+ obj = { left: +obj[0], top: +obj[1] || 0 };
+ }
+ if ("left" in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ("right" in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right +
this.margins.left;
+ }
+ if ("top" in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ("bottom" in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom +
this.margins.top;
+ }
+ },
+
+ _isRootNode: function( element ) {
+ return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
+ },
+
+ _getParentOffset: function() {
+
+ //Get the offsetParent and cache its position
+ var po = this.offsetParent.offset(),
+ document = this.document[ 0 ];
+
+ // This is a special case where we need to modify a offset calculated on start, since
the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based
on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent
isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent,
and never recalculated upon drag
+ if (this.cssPosition === "absolute" && this.scrollParent[0] !==
document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
+ po = { top: 0, left: 0 };
+ }
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) ||
0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+ if ( this.cssPosition !== "relative" ) {
+ return { top: 0, left: 0 };
+ }
+
+ var p = this.element.position(),
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+ return {
+ top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + (
!scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
+ left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + (
!scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
+ };
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.element.css("marginLeft"), 10) || 0),
+ top: (parseInt(this.element.css("marginTop"), 10) || 0),
+ right: (parseInt(this.element.css("marginRight"), 10) || 0),
+ bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var isUserScrollable, c, ce,
+ o = this.options,
+ document = this.document[ 0 ];
+
+ this.relativeContainer = null;
+
+ if ( !o.containment ) {
+ this.containment = null;
+ return;
+ }
+
+ if ( o.containment === "window" ) {
+ this.containment = [
+ $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+ $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+ $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width -
this.margins.left,
+ $( window ).scrollTop() + ( $( window ).height() ||
document.body.parentNode.scrollHeight ) - this.helperProportions.height -
this.margins.top
+ ];
+ return;
+ }
+
+ if ( o.containment === "document") {
+ this.containment = [
+ 0,
+ 0,
+ $( document ).width() - this.helperProportions.width - this.margins.left,
+ ( $( document ).height() || document.body.parentNode.scrollHeight ) -
this.helperProportions.height - this.margins.top
+ ];
+ return;
+ }
+
+ if ( o.containment.constructor === Array ) {
+ this.containment = o.containment;
+ return;
+ }
+
+ if ( o.containment === "parent" ) {
+ o.containment = this.helper[ 0 ].parentNode;
+ }
+
+ c = $( o.containment );
+ ce = c[ 0 ];
+
+ if ( !ce ) {
+ return;
+ }
+
+ isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
+
+ this.containment = [
+ ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css(
"paddingLeft" ), 10 ) || 0 ),
+ ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css(
"paddingTop" ), 10 ) || 0 ),
+ ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
+ ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
+ ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
+ this.helperProportions.width -
+ this.margins.left -
+ this.margins.right,
+ ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight )
-
+ ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
+ ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
+ this.helperProportions.height -
+ this.margins.top -
+ this.margins.bottom
+ ];
+ this.relativeContainer = c;
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if (!pos) {
+ pos = this.position;
+ }
+
+ var mod = d === "absolute" ? 1 : -1,
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+ return {
+ top: (
+ pos.top + // The absolute mouse position
+ this.offset.relative.top * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.top * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : (
scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
+ ),
+ left: (
+ pos.left + // The absolute mouse position
+ this.offset.relative.left * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.left * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : (
scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function( event, constrainPosition ) {
+
+ var containment, co, top, left,
+ o = this.options,
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
+ pageX = event.pageX,
+ pageY = event.pageY;
+
+ // Cache the scroll
+ if ( !scrollIsRootNode || !this.offset.scroll ) {
+ this.offset.scroll = {
+ top: this.scrollParent.scrollTop(),
+ left: this.scrollParent.scrollLeft()
+ };
+ }
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ // If we are not dragging yet, we won't check for options
+ if ( constrainPosition ) {
+ if ( this.containment ) {
+ if ( this.relativeContainer ){
+ co = this.relativeContainer.offset();
+ containment = [
+ this.containment[ 0 ] + co.left,
+ this.containment[ 1 ] + co.top,
+ this.containment[ 2 ] + co.left,
+ this.containment[ 3 ] + co.top
+ ];
+ } else {
+ containment = this.containment;
+ }
+
+ if (event.pageX - this.offset.click.left < containment[0]) {
+ pageX = containment[0] + this.offset.click.left;
+ }
+ if (event.pageY - this.offset.click.top < containment[1]) {
+ pageY = containment[1] + this.offset.click.top;
+ }
+ if (event.pageX - this.offset.click.left > containment[2]) {
+ pageX = containment[2] + this.offset.click.left;
+ }
+ if (event.pageY - this.offset.click.top > containment[3]) {
+ pageY = containment[3] + this.offset.click.top;
+ }
+ }
+
+ if (o.grid) {
+ //Check for grid elements set to 0 to prevent divide by 0 error causing invalid
argument errors in IE (see ticket #6950)
+ top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) /
o.grid[1]) * o.grid[1] : this.originalPageY;
+ pageY = containment ? ((top - this.offset.click.top >= containment[1] || top -
this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >=
containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) /
o.grid[0]) * o.grid[0] : this.originalPageX;
+ pageX = containment ? ((left - this.offset.click.left >= containment[0] || left -
this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >=
containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ if ( o.axis === "y" ) {
+ pageX = this.originalPageX;
+ }
+
+ if ( o.axis === "x" ) {
+ pageY = this.originalPageY;
+ }
+ }
+
+ return {
+ top: (
+ pageY - // The absolute mouse position
+ this.offset.click.top - // Click offset (relative to the element)
+ this.offset.relative.top - // Only for relative positioned nodes: Relative
offset from element to offset parent
+ this.offset.parent.top + // The offsetParent's offset without borders
(offset + border)
+ ( this.cssPosition === "fixed" ? -this.offset.scroll.top : (
scrollIsRootNode ? 0 : this.offset.scroll.top ) )
+ ),
+ left: (
+ pageX - // The absolute mouse position
+ this.offset.click.left - // Click offset (relative to the element)
+ this.offset.relative.left - // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.left + // The offsetParent's offset without borders
(offset + border)
+ ( this.cssPosition === "fixed" ? -this.offset.scroll.left : (
scrollIsRootNode ? 0 : this.offset.scroll.left ) )
+ )
+ };
+
+ },
+
+ _clear: function() {
+ this.helper.removeClass("ui-draggable-dragging");
+ if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
+ this.helper.remove();
+ }
+ this.helper = null;
+ this.cancelHelperRemoval = false;
+ if ( this.destroyOnClear ) {
+ this.destroy();
+ }
+ },
+
+ _normalizeRightBottom: function() {
+ if ( this.options.axis !== "y" && this.helper.css( "right"
) !== "auto" ) {
+ this.helper.width( this.helper.width() );
+ this.helper.css( "right", "auto" );
+ }
+ if ( this.options.axis !== "x" && this.helper.css( "bottom"
) !== "auto" ) {
+ this.helper.height( this.helper.height() );
+ this.helper.css( "bottom", "auto" );
+ }
+ },
+
+ // From now on bulk stuff - mainly helpers
+
+ _trigger: function( type, event, ui ) {
+ ui = ui || this._uiHash();
+ $.ui.plugin.call( this, type, [ event, ui, this ], true );
+
+ // Absolute position and offset (see #6884 ) have to be recalculated after plugins
+ if ( /^(drag|start|stop)/.test( type ) ) {
+ this.positionAbs = this._convertPositionTo( "absolute" );
+ ui.offset = this.positionAbs;
+ }
+ return $.Widget.prototype._trigger.call( this, type, event, ui );
+ },
+
+ plugins: {},
+
+ _uiHash: function() {
+ return {
+ helper: this.helper,
+ position: this.position,
+ originalPosition: this.originalPosition,
+ offset: this.positionAbs
+ };
+ }
+
+});
+
+$.ui.plugin.add( "draggable", "connectToSortable", {
+ start: function( event, ui, draggable ) {
+ var uiSortable = $.extend( {}, ui, {
+ item: draggable.element
+ });
+
+ draggable.sortables = [];
+ $( draggable.options.connectToSortable ).each(function() {
+ var sortable = $( this ).sortable( "instance" );
+
+ if ( sortable && !sortable.options.disabled ) {
+ draggable.sortables.push( sortable );
+
+ // refreshPositions is called at drag start to refresh the containerCache
+ // which is used in drag. This ensures it's initialized and synchronized
+ // with any changes that might have happened on the page since initialization.
+ sortable.refreshPositions();
+ sortable._trigger("activate", event, uiSortable);
+ }
+ });
+ },
+ stop: function( event, ui, draggable ) {
+ var uiSortable = $.extend( {}, ui, {
+ item: draggable.element
+ });
+
+ draggable.cancelHelperRemoval = false;
+
+ $.each( draggable.sortables, function() {
+ var sortable = this;
+
+ if ( sortable.isOver ) {
+ sortable.isOver = 0;
+
+ // Allow this sortable to handle removing the helper
+ draggable.cancelHelperRemoval = true;
+ sortable.cancelHelperRemoval = false;
+
+ // Use _storedCSS To restore properties in the sortable,
+ // as this also handles revert (#9675) since the draggable
+ // may have modified them in unexpected ways (#8809)
+ sortable._storedCSS = {
+ position: sortable.placeholder.css( "position" ),
+ top: sortable.placeholder.css( "top" ),
+ left: sortable.placeholder.css( "left" )
+ };
+
+ sortable._mouseStop(event);
+
+ // Once drag has ended, the sortable should return to using
+ // its original helper, not the shared helper from draggable
+ sortable.options.helper = sortable.options._helper;
+ } else {
+ // Prevent this Sortable from removing the helper.
+ // However, don't set the draggable to remove the helper
+ // either as another connected Sortable may yet handle the removal.
+ sortable.cancelHelperRemoval = true;
+
+ sortable._trigger( "deactivate", event, uiSortable );
+ }
+ });
+ },
+ drag: function( event, ui, draggable ) {
+ $.each( draggable.sortables, function() {
+ var innermostIntersecting = false,
+ sortable = this;
+
+ // Copy over variables that sortable's _intersectsWith uses
+ sortable.positionAbs = draggable.positionAbs;
+ sortable.helperProportions = draggable.helperProportions;
+ sortable.offset.click = draggable.offset.click;
+
+ if ( sortable._intersectsWith( sortable.containerCache ) ) {
+ innermostIntersecting = true;
+
+ $.each( draggable.sortables, function() {
+ // Copy over variables that sortable's _intersectsWith uses
+ this.positionAbs = draggable.positionAbs;
+ this.helperProportions = draggable.helperProportions;
+ this.offset.click = draggable.offset.click;
+
+ if ( this !== sortable &&
+ this._intersectsWith( this.containerCache ) &&
+ $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
+ innermostIntersecting = false;
+ }
+
+ return innermostIntersecting;
+ });
+ }
+
+ if ( innermostIntersecting ) {
+ // If it intersects, we use a little isOver variable and set it once,
+ // so that the move-in stuff gets fired only once.
+ if ( !sortable.isOver ) {
+ sortable.isOver = 1;
+
+ // Store draggable's parent in case we need to reappend to it later.
+ draggable._parent = ui.helper.parent();
+
+ sortable.currentItem = ui.helper
+ .appendTo( sortable.element )
+ .data( "ui-sortable-item", true );
+
+ // Store helper option to later restore it
+ sortable.options._helper = sortable.options.helper;
+
+ sortable.options.helper = function() {
+ return ui.helper[ 0 ];
+ };
+
+ // Fire the start events of the sortable with our passed browser event,
+ // and our own helper (so it doesn't create a new one)
+ event.target = sortable.currentItem[ 0 ];
+ sortable._mouseCapture( event, true );
+ sortable._mouseStart( event, true, true );
+
+ // Because the browser event is way off the new appended portlet,
+ // modify necessary variables to reflect the changes
+ sortable.offset.click.top = draggable.offset.click.top;
+ sortable.offset.click.left = draggable.offset.click.left;
+ sortable.offset.parent.left -= draggable.offset.parent.left -
+ sortable.offset.parent.left;
+ sortable.offset.parent.top -= draggable.offset.parent.top -
+ sortable.offset.parent.top;
+
+ draggable._trigger( "toSortable", event );
+
+ // Inform draggable that the helper is in a valid drop zone,
+ // used solely in the revert option to handle "valid/invalid".
+ draggable.dropped = sortable.element;
+
+ // Need to refreshPositions of all sortables in the case that
+ // adding to one sortable changes the location of the other sortables (#9675)
+ $.each( draggable.sortables, function() {
+ this.refreshPositions();
+ });
+
+ // hack so receive/update callbacks work (mostly)
+ draggable.currentItem = draggable.element;
+ sortable.fromOutside = draggable;
+ }
+
+ if ( sortable.currentItem ) {
+ sortable._mouseDrag( event );
+ // Copy the sortable's position because the draggable's can potentially
reflect
+ // a relative position, while sortable is always absolute, which the dragged
+ // element has now become. (#8809)
+ ui.position = sortable.position;
+ }
+ } else {
+ // If it doesn't intersect with the sortable, and it intersected before,
+ // we fake the drag stop of the sortable, but make sure it doesn't remove
+ // the helper by using cancelHelperRemoval.
+ if ( sortable.isOver ) {
+
+ sortable.isOver = 0;
+ sortable.cancelHelperRemoval = true;
+
+ // Calling sortable's mouseStop would trigger a revert,
+ // so revert must be temporarily false until after mouseStop is called.
+ sortable.options._revert = sortable.options.revert;
+ sortable.options.revert = false;
+
+ sortable._trigger( "out", event, sortable._uiHash( sortable ) );
+ sortable._mouseStop( event, true );
+
+ // restore sortable behaviors that were modfied
+ // when the draggable entered the sortable area (#9481)
+ sortable.options.revert = sortable.options._revert;
+ sortable.options.helper = sortable.options._helper;
+
+ if ( sortable.placeholder ) {
+ sortable.placeholder.remove();
+ }
+
+ // Restore and recalculate the draggable's offset considering the sortable
+ // may have modified them in unexpected ways. (#8809, #10669)
+ ui.helper.appendTo( draggable._parent );
+ draggable._refreshOffsets( event );
+ ui.position = draggable._generatePosition( event, true );
+
+ draggable._trigger( "fromSortable", event );
+
+ // Inform draggable that the helper is no longer in a valid drop zone
+ draggable.dropped = false;
+
+ // Need to refreshPositions of all sortables just in case removing
+ // from one sortable changes the location of other sortables (#9675)
+ $.each( draggable.sortables, function() {
+ this.refreshPositions();
+ });
+ }
+ }
+ });
+ }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+ start: function( event, ui, instance ) {
+ var t = $( "body" ),
+ o = instance.options;
+
+ if (t.css("cursor")) {
+ o._cursor = t.css("cursor");
+ }
+ t.css("cursor", o.cursor);
+ },
+ stop: function( event, ui, instance ) {
+ var o = instance.options;
+ if (o._cursor) {
+ $("body").css("cursor", o._cursor);
+ }
+ }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+ start: function( event, ui, instance ) {
+ var t = $( ui.helper ),
+ o = instance.options;
+ if (t.css("opacity")) {
+ o._opacity = t.css("opacity");
+ }
+ t.css("opacity", o.opacity);
+ },
+ stop: function( event, ui, instance ) {
+ var o = instance.options;
+ if (o._opacity) {
+ $(ui.helper).css("opacity", o._opacity);
+ }
+ }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+ start: function( event, ui, i ) {
+ if ( !i.scrollParentNotHidden ) {
+ i.scrollParentNotHidden = i.helper.scrollParent( false );
+ }
+
+ if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
+ i.overflowOffset = i.scrollParentNotHidden.offset();
+ }
+ },
+ drag: function( event, ui, i ) {
+
+ var o = i.options,
+ scrolled = false,
+ scrollParent = i.scrollParentNotHidden[ 0 ],
+ document = i.document[ 0 ];
+
+ if ( scrollParent !== document && scrollParent.tagName !== "HTML" )
{
+ if ( !o.axis || o.axis !== "x" ) {
+ if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
o.scrollSensitivity ) {
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
+ } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
+ }
+ }
+
+ if ( !o.axis || o.axis !== "y" ) {
+ if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
o.scrollSensitivity ) {
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
+ } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
+ }
+ }
+
+ } else {
+
+ if (!o.axis || o.axis !== "x") {
+ if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ } else if ($(window).height() - (event.pageY - $(document).scrollTop()) <
o.scrollSensitivity) {
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+ }
+ }
+
+ if (!o.axis || o.axis !== "y") {
+ if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) <
o.scrollSensitivity) {
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+ }
+ }
+
+ }
+
+ if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(i, event);
+ }
+
+ }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+ start: function( event, ui, i ) {
+
+ var o = i.options;
+
+ i.snapElements = [];
+
+ $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) :
o.snap).each(function() {
+ var $t = $(this),
+ $o = $t.offset();
+ if (this !== i.element[0]) {
+ i.snapElements.push({
+ item: this,
+ width: $t.outerWidth(), height: $t.outerHeight(),
+ top: $o.top, left: $o.left
+ });
+ }
+ });
+
+ },
+ drag: function( event, ui, inst ) {
+
+ var ts, bs, ls, rs, l, r, t, b, i, first,
+ o = inst.options,
+ d = o.snapTolerance,
+ x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+ for (i = inst.snapElements.length - 1; i >= 0; i--){
+
+ l = inst.snapElements[i].left - inst.margins.left;
+ r = l + inst.snapElements[i].width;
+ t = inst.snapElements[i].top - inst.margins.top;
+ b = t + inst.snapElements[i].height;
+
+ if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains(
inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
+ if (inst.snapElements[i].snapping) {
+ (inst.options.snap.release && inst.options.snap.release.call(inst.element,
event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ }
+ inst.snapElements[i].snapping = false;
+ continue;
+ }
+
+ if (o.snapMode !== "inner") {
+ ts = Math.abs(t - y2) <= d;
+ bs = Math.abs(b - y1) <= d;
+ ls = Math.abs(l - x2) <= d;
+ rs = Math.abs(r - x1) <= d;
+ if (ts) {
+ ui.position.top = inst._convertPositionTo("relative", { top: t -
inst.helperProportions.height, left: 0 }).top;
+ }
+ if (bs) {
+ ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0
}).top;
+ }
+ if (ls) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l -
inst.helperProportions.width }).left;
+ }
+ if (rs) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r
}).left;
+ }
+ }
+
+ first = (ts || bs || ls || rs);
+
+ if (o.snapMode !== "outer") {
+ ts = Math.abs(t - y1) <= d;
+ bs = Math.abs(b - y2) <= d;
+ ls = Math.abs(l - x1) <= d;
+ rs = Math.abs(r - x2) <= d;
+ if (ts) {
+ ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0
}).top;
+ }
+ if (bs) {
+ ui.position.top = inst._convertPositionTo("relative", { top: b -
inst.helperProportions.height, left: 0 }).top;
+ }
+ if (ls) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l
}).left;
+ }
+ if (rs) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r -
inst.helperProportions.width }).left;
+ }
+ }
+
+ if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event,
$.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ }
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+ }
+
+ }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+ start: function( event, ui, instance ) {
+ var min,
+ o = instance.options,
+ group = $.makeArray($(o.stack)).sort(function(a, b) {
+ return (parseInt($(a).css("zIndex"), 10) || 0) -
(parseInt($(b).css("zIndex"), 10) || 0);
+ });
+
+ if (!group.length) { return; }
+
+ min = parseInt($(group[0]).css("zIndex"), 10) || 0;
+ $(group).each(function(i) {
+ $(this).css("zIndex", min + i);
+ });
+ this.css("zIndex", (min + group.length));
+ }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+ start: function( event, ui, instance ) {
+ var t = $( ui.helper ),
+ o = instance.options;
+
+ if (t.css("zIndex")) {
+ o._zIndex = t.css("zIndex");
+ }
+ t.css("zIndex", o.zIndex);
+ },
+ stop: function( event, ui, instance ) {
+ var o = instance.options;
+
+ if (o._zIndex) {
+ $(ui.helper).css("zIndex", o._zIndex);
+ }
+ }
+});
+
+var draggable = $.ui.draggable;
+
+
+/*!
+ * jQuery UI Resizable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/resizable/
+ */
+
+
+$.widget("ui.resizable", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "resize",
+ options: {
+ alsoResize: false,
+ animate: false,
+ animateDuration: "slow",
+ animateEasing: "swing",
+ aspectRatio: false,
+ autoHide: false,
+ containment: false,
+ ghost: false,
+ grid: false,
+ handles: "e,s,se",
+ helper: false,
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 10,
+ minWidth: 10,
+ // See #7960
+ zIndex: 90,
+
+ // callbacks
+ resize: null,
+ start: null,
+ stop: null
+ },
+
+ _num: function( value ) {
+ return parseInt( value, 10 ) || 0;
+ },
+
+ _isNumber: function( value ) {
+ return !isNaN( parseInt( value, 10 ) );
+ },
+
+ _hasScroll: function( el, a ) {
+
+ if ( $( el ).css( "overflow" ) === "hidden") {
+ return false;
+ }
+
+ var scroll = ( a && a === "left" ) ? "scrollLeft" :
"scrollTop",
+ has = false;
+
+ if ( el[ scroll ] > 0 ) {
+ return true;
+ }
+
+ // TODO: determine which cases actually cause this to happen
+ // if the element doesn't have the scroll set, see if it's possible to
+ // set the scroll
+ el[ scroll ] = 1;
+ has = ( el[ scroll ] > 0 );
+ el[ scroll ] = 0;
+ return has;
+ },
+
+ _create: function() {
+
+ var n, i, handle, axis, hname,
+ that = this,
+ o = this.options;
+ this.element.addClass("ui-resizable");
+
+ $.extend(this, {
+ _aspectRatio: !!(o.aspectRatio),
+ aspectRatio: o.aspectRatio,
+ originalElement: this.element,
+ _proportionallyResizeElements: [],
+ _helper: o.helper || o.ghost || o.animate ? o.helper ||
"ui-resizable-helper" : null
+ });
+
+ // Wrap the element if it cannot hold child nodes
+ if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
+
+ this.element.wrap(
+ $("<div class='ui-wrapper' style='overflow:
hidden;'></div>").css({
+ position: this.element.css("position"),
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight(),
+ top: this.element.css("top"),
+ left: this.element.css("left")
+ })
+ );
+
+ this.element = this.element.parent().data(
+ "ui-resizable", this.element.resizable( "instance" )
+ );
+
+ this.elementIsWrapper = true;
+
+ this.element.css({
+ marginLeft: this.originalElement.css("marginLeft"),
+ marginTop: this.originalElement.css("marginTop"),
+ marginRight: this.originalElement.css("marginRight"),
+ marginBottom: this.originalElement.css("marginBottom")
+ });
+ this.originalElement.css({
+ marginLeft: 0,
+ marginTop: 0,
+ marginRight: 0,
+ marginBottom: 0
+ });
+ // support: Safari
+ // Prevent Safari textarea resize
+ this.originalResizeStyle = this.originalElement.css("resize");
+ this.originalElement.css("resize", "none");
+
+ this._proportionallyResizeElements.push( this.originalElement.css({
+ position: "static",
+ zoom: 1,
+ display: "block"
+ }) );
+
+ // support: IE9
+ // avoid IE jump (hard set the margin)
+ this.originalElement.css({ margin: this.originalElement.css("margin") });
+
+ this._proportionallyResize();
+ }
+
+ this.handles = o.handles ||
+ ( !$(".ui-resizable-handle", this.element).length ?
+ "e,s,se" : {
+ n: ".ui-resizable-n",
+ e: ".ui-resizable-e",
+ s: ".ui-resizable-s",
+ w: ".ui-resizable-w",
+ se: ".ui-resizable-se",
+ sw: ".ui-resizable-sw",
+ ne: ".ui-resizable-ne",
+ nw: ".ui-resizable-nw"
+ } );
+
+ this._handles = $();
+ if ( this.handles.constructor === String ) {
+
+ if ( this.handles === "all") {
+ this.handles = "n,e,s,w,se,sw,ne,nw";
+ }
+
+ n = this.handles.split(",");
+ this.handles = {};
+
+ for (i = 0; i < n.length; i++) {
+
+ handle = $.trim(n[i]);
+ hname = "ui-resizable-" + handle;
+ axis = $("<div class='ui-resizable-handle " + hname +
"'></div>");
+
+ axis.css({ zIndex: o.zIndex });
+
+ // TODO : What's going on here?
+ if ("se" === handle) {
+ axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
+ }
+
+ this.handles[handle] = ".ui-resizable-" + handle;
+ this.element.append(axis);
+ }
+
+ }
+
+ this._renderAxis = function(target) {
+
+ var i, axis, padPos, padWrapper;
+
+ target = target || this.element;
+
+ for (i in this.handles) {
+
+ if (this.handles[i].constructor === String) {
+ this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
+ } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
+ this.handles[ i ] = $( this.handles[ i ] );
+ this._on( this.handles[ i ], { "mousedown": that._mouseDown });
+ }
+
+ if (this.elementIsWrapper &&
this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
+
+ axis = $(this.handles[i], this.element);
+
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+ padPos = [ "padding",
+ /ne|nw|n/.test(i) ? "Top" :
+ /se|sw|s/.test(i) ? "Bottom" :
+ /^e$/.test(i) ? "Right" : "Left" ].join("");
+
+ target.css(padPos, padWrapper);
+
+ this._proportionallyResize();
+ }
+
+ this._handles = this._handles.add( this.handles[ i ] );
+ }
+ };
+
+ // TODO: make renderAxis a prototype function
+ this._renderAxis(this.element);
+
+ this._handles = this._handles.add( this.element.find( ".ui-resizable-handle"
) );
+ this._handles.disableSelection();
+
+ this._handles.mouseover(function() {
+ if (!that.resizing) {
+ if (this.className) {
+ axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+ }
+ that.axis = axis && axis[1] ? axis[1] : "se";
+ }
+ });
+
+ if (o.autoHide) {
+ this._handles.hide();
+ $(this.element)
+ .addClass("ui-resizable-autohide")
+ .mouseenter(function() {
+ if (o.disabled) {
+ return;
+ }
+ $(this).removeClass("ui-resizable-autohide");
+ that._handles.show();
+ })
+ .mouseleave(function() {
+ if (o.disabled) {
+ return;
+ }
+ if (!that.resizing) {
+ $(this).addClass("ui-resizable-autohide");
+ that._handles.hide();
+ }
+ });
+ }
+
+ this._mouseInit();
+ },
+
+ _destroy: function() {
+
+ this._mouseDestroy();
+
+ var wrapper,
+ _destroy = function(exp) {
+ $(exp)
+ .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+ .removeData("resizable")
+ .removeData("ui-resizable")
+ .unbind(".resizable")
+ .find(".ui-resizable-handle")
+ .remove();
+ };
+
+ // TODO: Unwrap at same DOM position
+ if (this.elementIsWrapper) {
+ _destroy(this.element);
+ wrapper = this.element;
+ this.originalElement.css({
+ position: wrapper.css("position"),
+ width: wrapper.outerWidth(),
+ height: wrapper.outerHeight(),
+ top: wrapper.css("top"),
+ left: wrapper.css("left")
+ }).insertAfter( wrapper );
+ wrapper.remove();
+ }
+
+ this.originalElement.css("resize", this.originalResizeStyle);
+ _destroy(this.originalElement);
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+ var i, handle,
+ capture = false;
+
+ for (i in this.handles) {
+ handle = $(this.handles[i])[0];
+ if (handle === event.target || $.contains(handle, event.target)) {
+ capture = true;
+ }
+ }
+
+ return !this.options.disabled && capture;
+ },
+
+ _mouseStart: function(event) {
+
+ var curleft, curtop, cursor,
+ o = this.options,
+ el = this.element;
+
+ this.resizing = true;
+
+ this._renderProxy();
+
+ curleft = this._num(this.helper.css("left"));
+ curtop = this._num(this.helper.css("top"));
+
+ if (o.containment) {
+ curleft += $(o.containment).scrollLeft() || 0;
+ curtop += $(o.containment).scrollTop() || 0;
+ }
+
+ this.offset = this.helper.offset();
+ this.position = { left: curleft, top: curtop };
+
+ this.size = this._helper ? {
+ width: this.helper.width(),
+ height: this.helper.height()
+ } : {
+ width: el.width(),
+ height: el.height()
+ };
+
+ this.originalSize = this._helper ? {
+ width: el.outerWidth(),
+ height: el.outerHeight()
+ } : {
+ width: el.width(),
+ height: el.height()
+ };
+
+ this.sizeDiff = {
+ width: el.outerWidth() - el.width(),
+ height: el.outerHeight() - el.height()
+ };
+
+ this.originalPosition = { left: curleft, top: curtop };
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+ this.aspectRatio = (typeof o.aspectRatio === "number") ?
+ o.aspectRatio :
+ ((this.originalSize.width / this.originalSize.height) || 1);
+
+ cursor = $(".ui-resizable-" + this.axis).css("cursor");
+ $("body").css("cursor", cursor === "auto" ? this.axis +
"-resize" : cursor);
+
+ el.addClass("ui-resizable-resizing");
+ this._propagate("start", event);
+ return true;
+ },
+
+ _mouseDrag: function(event) {
+
+ var data, props,
+ smp = this.originalMousePosition,
+ a = this.axis,
+ dx = (event.pageX - smp.left) || 0,
+ dy = (event.pageY - smp.top) || 0,
+ trigger = this._change[a];
+
+ this._updatePrevProperties();
+
+ if (!trigger) {
+ return false;
+ }
+
+ data = trigger.apply(this, [ event, dx, dy ]);
+
+ this._updateVirtualBoundaries(event.shiftKey);
+ if (this._aspectRatio || event.shiftKey) {
+ data = this._updateRatio(data, event);
+ }
+
+ data = this._respectSize(data, event);
+
+ this._updateCache(data);
+
+ this._propagate("resize", event);
+
+ props = this._applyChanges();
+
+ if ( !this._helper && this._proportionallyResizeElements.length ) {
+ this._proportionallyResize();
+ }
+
+ if ( !$.isEmptyObject( props ) ) {
+ this._updatePrevProperties();
+ this._trigger( "resize", event, this.ui() );
+ this._applyChanges();
+ }
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ this.resizing = false;
+ var pr, ista, soffseth, soffsetw, s, left, top,
+ o = this.options, that = this;
+
+ if (this._helper) {
+
+ pr = this._proportionallyResizeElements;
+ ista = pr.length && (/textarea/i).test(pr[0].nodeName);
+ soffseth = ista && this._hasScroll(pr[0], "left") ? 0 :
that.sizeDiff.height;
+ soffsetw = ista ? 0 : that.sizeDiff.width;
+
+ s = {
+ width: (that.helper.width() - soffsetw),
+ height: (that.helper.height() - soffseth)
+ };
+ left = (parseInt(that.element.css("left"), 10) +
+ (that.position.left - that.originalPosition.left)) || null;
+ top = (parseInt(that.element.css("top"), 10) +
+ (that.position.top - that.originalPosition.top)) || null;
+
+ if (!o.animate) {
+ this.element.css($.extend(s, { top: top, left: left }));
+ }
+
+ that.helper.height(that.size.height);
+ that.helper.width(that.size.width);
+
+ if (this._helper && !o.animate) {
+ this._proportionallyResize();
+ }
+ }
+
+ $("body").css("cursor", "auto");
+
+ this.element.removeClass("ui-resizable-resizing");
+
+ this._propagate("stop", event);
+
+ if (this._helper) {
+ this.helper.remove();
+ }
+
+ return false;
+
+ },
+
+ _updatePrevProperties: function() {
+ this.prevPosition = {
+ top: this.position.top,
+ left: this.position.left
+ };
+ this.prevSize = {
+ width: this.size.width,
+ height: this.size.height
+ };
+ },
+
+ _applyChanges: function() {
+ var props = {};
+
+ if ( this.position.top !== this.prevPosition.top ) {
+ props.top = this.position.top + "px";
+ }
+ if ( this.position.left !== this.prevPosition.left ) {
+ props.left = this.position.left + "px";
+ }
+ if ( this.size.width !== this.prevSize.width ) {
+ props.width = this.size.width + "px";
+ }
+ if ( this.size.height !== this.prevSize.height ) {
+ props.height = this.size.height + "px";
+ }
+
+ this.helper.css( props );
+
+ return props;
+ },
+
+ _updateVirtualBoundaries: function(forceAspectRatio) {
+ var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
+ o = this.options;
+
+ b = {
+ minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
+ maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+ minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
+ maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
+ };
+
+ if (this._aspectRatio || forceAspectRatio) {
+ pMinWidth = b.minHeight * this.aspectRatio;
+ pMinHeight = b.minWidth / this.aspectRatio;
+ pMaxWidth = b.maxHeight * this.aspectRatio;
+ pMaxHeight = b.maxWidth / this.aspectRatio;
+
+ if (pMinWidth > b.minWidth) {
+ b.minWidth = pMinWidth;
+ }
+ if (pMinHeight > b.minHeight) {
+ b.minHeight = pMinHeight;
+ }
+ if (pMaxWidth < b.maxWidth) {
+ b.maxWidth = pMaxWidth;
+ }
+ if (pMaxHeight < b.maxHeight) {
+ b.maxHeight = pMaxHeight;
+ }
+ }
+ this._vBoundaries = b;
+ },
+
+ _updateCache: function(data) {
+ this.offset = this.helper.offset();
+ if (this._isNumber(data.left)) {
+ this.position.left = data.left;
+ }
+ if (this._isNumber(data.top)) {
+ this.position.top = data.top;
+ }
+ if (this._isNumber(data.height)) {
+ this.size.height = data.height;
+ }
+ if (this._isNumber(data.width)) {
+ this.size.width = data.width;
+ }
+ },
+
+ _updateRatio: function( data ) {
+
+ var cpos = this.position,
+ csize = this.size,
+ a = this.axis;
+
+ if (this._isNumber(data.height)) {
+ data.width = (data.height * this.aspectRatio);
+ } else if (this._isNumber(data.width)) {
+ data.height = (data.width / this.aspectRatio);
+ }
+
+ if (a === "sw") {
+ data.left = cpos.left + (csize.width - data.width);
+ data.top = null;
+ }
+ if (a === "nw") {
+ data.top = cpos.top + (csize.height - data.height);
+ data.left = cpos.left + (csize.width - data.width);
+ }
+
+ return data;
+ },
+
+ _respectSize: function( data ) {
+
+ var o = this._vBoundaries,
+ a = this.axis,
+ ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth <
data.width),
+ ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight
< data.height),
+ isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth >
data.width),
+ isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight
> data.height),
+ dw = this.originalPosition.left + this.originalSize.width,
+ dh = this.position.top + this.size.height,
+ cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+ if (isminw) {
+ data.width = o.minWidth;
+ }
+ if (isminh) {
+ data.height = o.minHeight;
+ }
+ if (ismaxw) {
+ data.width = o.maxWidth;
+ }
+ if (ismaxh) {
+ data.height = o.maxHeight;
+ }
+
+ if (isminw && cw) {
+ data.left = dw - o.minWidth;
+ }
+ if (ismaxw && cw) {
+ data.left = dw - o.maxWidth;
+ }
+ if (isminh && ch) {
+ data.top = dh - o.minHeight;
+ }
+ if (ismaxh && ch) {
+ data.top = dh - o.maxHeight;
+ }
+
+ // Fixing jump error on top/left - bug #2330
+ if (!data.width && !data.height && !data.left && data.top) {
+ data.top = null;
+ } else if (!data.width && !data.height && !data.top &&
data.left) {
+ data.left = null;
+ }
+
+ return data;
+ },
+
+ _getPaddingPlusBorderDimensions: function( element ) {
+ var i = 0,
+ widths = [],
+ borders = [
+ element.css( "borderTopWidth" ),
+ element.css( "borderRightWidth" ),
+ element.css( "borderBottomWidth" ),
+ element.css( "borderLeftWidth" )
+ ],
+ paddings = [
+ element.css( "paddingTop" ),
+ element.css( "paddingRight" ),
+ element.css( "paddingBottom" ),
+ element.css( "paddingLeft" )
+ ];
+
+ for ( ; i < 4; i++ ) {
+ widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
+ widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
+ }
+
+ return {
+ height: widths[ 0 ] + widths[ 2 ],
+ width: widths[ 1 ] + widths[ 3 ]
+ };
+ },
+
+ _proportionallyResize: function() {
+
+ if (!this._proportionallyResizeElements.length) {
+ return;
+ }
+
+ var prel,
+ i = 0,
+ element = this.helper || this.element;
+
+ for ( ; i < this._proportionallyResizeElements.length; i++) {
+
+ prel = this._proportionallyResizeElements[i];
+
+ // TODO: Seems like a bug to cache this.outerDimensions
+ // considering that we are in a loop.
+ if (!this.outerDimensions) {
+ this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
+ }
+
+ prel.css({
+ height: (element.height() - this.outerDimensions.height) || 0,
+ width: (element.width() - this.outerDimensions.width) || 0
+ });
+
+ }
+
+ },
+
+ _renderProxy: function() {
+
+ var el = this.element, o = this.options;
+ this.elementOffset = el.offset();
+
+ if (this._helper) {
+
+ this.helper = this.helper || $("<div
style='overflow:hidden;'></div>");
+
+ this.helper.addClass(this._helper).css({
+ width: this.element.outerWidth() - 1,
+ height: this.element.outerHeight() - 1,
+ position: "absolute",
+ left: this.elementOffset.left + "px",
+ top: this.elementOffset.top + "px",
+ zIndex: ++o.zIndex //TODO: Don't modify option
+ });
+
+ this.helper
+ .appendTo("body")
+ .disableSelection();
+
+ } else {
+ this.helper = this.element;
+ }
+
+ },
+
+ _change: {
+ e: function(event, dx) {
+ return { width: this.originalSize.width + dx };
+ },
+ w: function(event, dx) {
+ var cs = this.originalSize, sp = this.originalPosition;
+ return { left: sp.left + dx, width: cs.width - dx };
+ },
+ n: function(event, dx, dy) {
+ var cs = this.originalSize, sp = this.originalPosition;
+ return { top: sp.top + dy, height: cs.height - dy };
+ },
+ s: function(event, dx, dy) {
+ return { height: this.originalSize.height + dy };
+ },
+ se: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments),
+ this._change.e.apply(this, [ event, dx, dy ]));
+ },
+ sw: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments),
+ this._change.w.apply(this, [ event, dx, dy ]));
+ },
+ ne: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments),
+ this._change.e.apply(this, [ event, dx, dy ]));
+ },
+ nw: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments),
+ this._change.w.apply(this, [ event, dx, dy ]));
+ }
+ },
+
+ _propagate: function(n, event) {
+ $.ui.plugin.call(this, n, [ event, this.ui() ]);
+ (n !== "resize" && this._trigger(n, event, this.ui()));
+ },
+
+ plugins: {},
+
+ ui: function() {
+ return {
+ originalElement: this.originalElement,
+ element: this.element,
+ helper: this.helper,
+ position: this.position,
+ size: this.size,
+ originalSize: this.originalSize,
+ originalPosition: this.originalPosition
+ };
+ }
+
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "animate", {
+
+ stop: function( event ) {
+ var that = $(this).resizable( "instance" ),
+ o = that.options,
+ pr = that._proportionallyResizeElements,
+ ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && that._hasScroll(pr[0], "left") ? 0 :
that.sizeDiff.height,
+ soffsetw = ista ? 0 : that.sizeDiff.width,
+ style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth)
},
+ left = (parseInt(that.element.css("left"), 10) +
+ (that.position.left - that.originalPosition.left)) || null,
+ top = (parseInt(that.element.css("top"), 10) +
+ (that.position.top - that.originalPosition.top)) || null;
+
+ that.element.animate(
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
+ duration: o.animateDuration,
+ easing: o.animateEasing,
+ step: function() {
+
+ var data = {
+ width: parseInt(that.element.css("width"), 10),
+ height: parseInt(that.element.css("height"), 10),
+ top: parseInt(that.element.css("top"), 10),
+ left: parseInt(that.element.css("left"), 10)
+ };
+
+ if (pr && pr.length) {
+ $(pr[0]).css({ width: data.width, height: data.height });
+ }
+
+ // propagating resize, and updating values for each animation step
+ that._updateCache(data);
+ that._propagate("resize", event);
+
+ }
+ }
+ );
+ }
+
+});
+
+$.ui.plugin.add( "resizable", "containment", {
+
+ start: function() {
+ var element, p, co, ch, cw, width, height,
+ that = $( this ).resizable( "instance" ),
+ o = that.options,
+ el = that.element,
+ oc = o.containment,
+ ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0
) : oc;
+
+ if ( !ce ) {
+ return;
+ }
+
+ that.containerElement = $( ce );
+
+ if ( /document/.test( oc ) || oc === document ) {
+ that.containerOffset = {
+ left: 0,
+ top: 0
+ };
+ that.containerPosition = {
+ left: 0,
+ top: 0
+ };
+
+ that.parentData = {
+ element: $( document ),
+ left: 0,
+ top: 0,
+ width: $( document ).width(),
+ height: $( document ).height() || document.body.parentNode.scrollHeight
+ };
+ } else {
+ element = $( ce );
+ p = [];
+ $([ "Top", "Right", "Left", "Bottom"
]).each(function( i, name ) {
+ p[ i ] = that._num( element.css( "padding" + name ) );
+ });
+
+ that.containerOffset = element.offset();
+ that.containerPosition = element.position();
+ that.containerSize = {
+ height: ( element.innerHeight() - p[ 3 ] ),
+ width: ( element.innerWidth() - p[ 1 ] )
+ };
+
+ co = that.containerOffset;
+ ch = that.containerSize.height;
+ cw = that.containerSize.width;
+ width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
+ height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
+
+ that.parentData = {
+ element: ce,
+ left: co.left,
+ top: co.top,
+ width: width,
+ height: height
+ };
+ }
+ },
+
+ resize: function( event ) {
+ var woset, hoset, isParent, isOffsetRelative,
+ that = $( this ).resizable( "instance" ),
+ o = that.options,
+ co = that.containerOffset,
+ cp = that.position,
+ pRatio = that._aspectRatio || event.shiftKey,
+ cop = {
+ top: 0,
+ left: 0
+ },
+ ce = that.containerElement,
+ continueResize = true;
+
+ if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" )
) ) {
+ cop = co;
+ }
+
+ if ( cp.left < ( that._helper ? co.left : 0 ) ) {
+ that.size.width = that.size.width +
+ ( that._helper ?
+ ( that.position.left - co.left ) :
+ ( that.position.left - cop.left ) );
+
+ if ( pRatio ) {
+ that.size.height = that.size.width / that.aspectRatio;
+ continueResize = false;
+ }
+ that.position.left = o.helper ? co.left : 0;
+ }
+
+ if ( cp.top < ( that._helper ? co.top : 0 ) ) {
+ that.size.height = that.size.height +
+ ( that._helper ?
+ ( that.position.top - co.top ) :
+ that.position.top );
+
+ if ( pRatio ) {
+ that.size.width = that.size.height * that.aspectRatio;
+ continueResize = false;
+ }
+ that.position.top = that._helper ? co.top : 0;
+ }
+
+ isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
+ isOffsetRelative = /relative|absolute/.test( that.containerElement.css(
"position" ) );
+
+ if ( isParent && isOffsetRelative ) {
+ that.offset.left = that.parentData.left + that.position.left;
+ that.offset.top = that.parentData.top + that.position.top;
+ } else {
+ that.offset.left = that.element.offset().left;
+ that.offset.top = that.element.offset().top;
+ }
+
+ woset = Math.abs( that.sizeDiff.width +
+ (that._helper ?
+ that.offset.left - cop.left :
+ (that.offset.left - co.left)) );
+
+ hoset = Math.abs( that.sizeDiff.height +
+ (that._helper ?
+ that.offset.top - cop.top :
+ (that.offset.top - co.top)) );
+
+ if ( woset + that.size.width >= that.parentData.width ) {
+ that.size.width = that.parentData.width - woset;
+ if ( pRatio ) {
+ that.size.height = that.size.width / that.aspectRatio;
+ continueResize = false;
+ }
+ }
+
+ if ( hoset + that.size.height >= that.parentData.height ) {
+ that.size.height = that.parentData.height - hoset;
+ if ( pRatio ) {
+ that.size.width = that.size.height * that.aspectRatio;
+ continueResize = false;
+ }
+ }
+
+ if ( !continueResize ) {
+ that.position.left = that.prevPosition.left;
+ that.position.top = that.prevPosition.top;
+ that.size.width = that.prevSize.width;
+ that.size.height = that.prevSize.height;
+ }
+ },
+
+ stop: function() {
+ var that = $( this ).resizable( "instance" ),
+ o = that.options,
+ co = that.containerOffset,
+ cop = that.containerPosition,
+ ce = that.containerElement,
+ helper = $( that.helper ),
+ ho = helper.offset(),
+ w = helper.outerWidth() - that.sizeDiff.width,
+ h = helper.outerHeight() - that.sizeDiff.height;
+
+ if ( that._helper && !o.animate && ( /relative/ ).test( ce.css(
"position" ) ) ) {
+ $( this ).css({
+ left: ho.left - cop.left - co.left,
+ width: w,
+ height: h
+ });
+ }
+
+ if ( that._helper && !o.animate && ( /static/ ).test( ce.css(
"position" ) ) ) {
+ $( this ).css({
+ left: ho.left - cop.left - co.left,
+ width: w,
+ height: h
+ });
+ }
+ }
+});
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+ start: function() {
+ var that = $(this).resizable( "instance" ),
+ o = that.options;
+
+ $(o.alsoResize).each(function() {
+ var el = $(this);
+ el.data("ui-resizable-alsoresize", {
+ width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+ left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"),
10)
+ });
+ });
+ },
+
+ resize: function(event, ui) {
+ var that = $(this).resizable( "instance" ),
+ o = that.options,
+ os = that.originalSize,
+ op = that.originalPosition,
+ delta = {
+ height: (that.size.height - os.height) || 0,
+ width: (that.size.width - os.width) || 0,
+ top: (that.position.top - op.top) || 0,
+ left: (that.position.left - op.left) || 0
+ };
+
+ $(o.alsoResize).each(function() {
+ var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style =
{},
+ css = el.parents(ui.originalElement[0]).length ?
+ [ "width", "height" ] :
+ [ "width", "height", "top", "left" ];
+
+ $.each(css, function(i, prop) {
+ var sum = (start[prop] || 0) + (delta[prop] || 0);
+ if (sum && sum >= 0) {
+ style[prop] = sum || null;
+ }
+ });
+
+ el.css(style);
+ });
+ },
+
+ stop: function() {
+ $(this).removeData("resizable-alsoresize");
+ }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+ start: function() {
+
+ var that = $(this).resizable( "instance" ), o = that.options, cs =
that.size;
+
+ that.ghost = that.originalElement.clone();
+ that.ghost
+ .css({
+ opacity: 0.25,
+ display: "block",
+ position: "relative",
+ height: cs.height,
+ width: cs.width,
+ margin: 0,
+ left: 0,
+ top: 0
+ })
+ .addClass("ui-resizable-ghost")
+ .addClass(typeof o.ghost === "string" ? o.ghost : "");
+
+ that.ghost.appendTo(that.helper);
+
+ },
+
+ resize: function() {
+ var that = $(this).resizable( "instance" );
+ if (that.ghost) {
+ that.ghost.css({
+ position: "relative",
+ height: that.size.height,
+ width: that.size.width
+ });
+ }
+ },
+
+ stop: function() {
+ var that = $(this).resizable( "instance" );
+ if (that.ghost && that.helper) {
+ that.helper.get(0).removeChild(that.ghost.get(0));
+ }
+ }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+ resize: function() {
+ var outerDimensions,
+ that = $(this).resizable( "instance" ),
+ o = that.options,
+ cs = that.size,
+ os = that.originalSize,
+ op = that.originalPosition,
+ a = that.axis,
+ grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
+ gridX = (grid[0] || 1),
+ gridY = (grid[1] || 1),
+ ox = Math.round((cs.width - os.width) / gridX) * gridX,
+ oy = Math.round((cs.height - os.height) / gridY) * gridY,
+ newWidth = os.width + ox,
+ newHeight = os.height + oy,
+ isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
+ isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
+ isMinWidth = o.minWidth && (o.minWidth > newWidth),
+ isMinHeight = o.minHeight && (o.minHeight > newHeight);
+
+ o.grid = grid;
+
+ if (isMinWidth) {
+ newWidth += gridX;
+ }
+ if (isMinHeight) {
+ newHeight += gridY;
+ }
+ if (isMaxWidth) {
+ newWidth -= gridX;
+ }
+ if (isMaxHeight) {
+ newHeight -= gridY;
+ }
+
+ if (/^(se|s|e)$/.test(a)) {
+ that.size.width = newWidth;
+ that.size.height = newHeight;
+ } else if (/^(ne)$/.test(a)) {
+ that.size.width = newWidth;
+ that.size.height = newHeight;
+ that.position.top = op.top - oy;
+ } else if (/^(sw)$/.test(a)) {
+ that.size.width = newWidth;
+ that.size.height = newHeight;
+ that.position.left = op.left - ox;
+ } else {
+ if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
+ outerDimensions = that._getPaddingPlusBorderDimensions( this );
+ }
+
+ if ( newHeight - gridY > 0 ) {
+ that.size.height = newHeight;
+ that.position.top = op.top - oy;
+ } else {
+ newHeight = gridY - outerDimensions.height;
+ that.size.height = newHeight;
+ that.position.top = op.top + os.height - newHeight;
+ }
+ if ( newWidth - gridX > 0 ) {
+ that.size.width = newWidth;
+ that.position.left = op.left - ox;
+ } else {
+ newWidth = gridX - outerDimensions.width;
+ that.size.width = newWidth;
+ that.position.left = op.left + os.width - newWidth;
+ }
+ }
+ }
+
+});
+
+var resizable = $.ui.resizable;
+
+
+/*!
+ * jQuery UI Dialog 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/dialog/
+ */
+
+
+var dialog = $.widget( "ui.dialog", {
+ version: "1.11.4",
+ options: {
+ appendTo: "body",
+ autoOpen: true,
+ buttons: [],
+ closeOnEscape: true,
+ closeText: "Close",
+ dialogClass: "",
+ draggable: true,
+ hide: null,
+ height: "auto",
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 150,
+ minWidth: 150,
+ modal: false,
+ position: {
+ my: "center",
+ at: "center",
+ of: window,
+ collision: "fit",
+ // Ensure the titlebar is always visible
+ using: function( pos ) {
+ var topOffset = $( this ).css( pos ).offset().top;
+ if ( topOffset < 0 ) {
+ $( this ).css( "top", pos.top - topOffset );
+ }
+ }
+ },
+ resizable: true,
+ show: null,
+ title: null,
+ width: 300,
+
+ // callbacks
+ beforeClose: null,
+ close: null,
+ drag: null,
+ dragStart: null,
+ dragStop: null,
+ focus: null,
+ open: null,
+ resize: null,
+ resizeStart: null,
+ resizeStop: null
+ },
+
+ sizeRelatedOptions: {
+ buttons: true,
+ height: true,
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true,
+ width: true
+ },
+
+ resizableRelatedOptions: {
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true
+ },
+
+ _create: function() {
+ this.originalCss = {
+ display: this.element[ 0 ].style.display,
+ width: this.element[ 0 ].style.width,
+ minHeight: this.element[ 0 ].style.minHeight,
+ maxHeight: this.element[ 0 ].style.maxHeight,
+ height: this.element[ 0 ].style.height
+ };
+ this.originalPosition = {
+ parent: this.element.parent(),
+ index: this.element.parent().children().index( this.element )
+ };
+ this.originalTitle = this.element.attr( "title" );
+ this.options.title = this.options.title || this.originalTitle;
+
+ this._createWrapper();
+
+ this.element
+ .show()
+ .removeAttr( "title" )
+ .addClass( "ui-dialog-content ui-widget-content" )
+ .appendTo( this.uiDialog );
+
+ this._createTitlebar();
+ this._createButtonPane();
+
+ if ( this.options.draggable && $.fn.draggable ) {
+ this._makeDraggable();
+ }
+ if ( this.options.resizable && $.fn.resizable ) {
+ this._makeResizable();
+ }
+
+ this._isOpen = false;
+
+ this._trackFocus();
+ },
+
+ _init: function() {
+ if ( this.options.autoOpen ) {
+ this.open();
+ }
+ },
+
+ _appendTo: function() {
+ var element = this.options.appendTo;
+ if ( element && (element.jquery || element.nodeType) ) {
+ return $( element );
+ }
+ return this.document.find( element || "body" ).eq( 0 );
+ },
+
+ _destroy: function() {
+ var next,
+ originalPosition = this.originalPosition;
+
+ this._untrackInstance();
+ this._destroyOverlay();
+
+ this.element
+ .removeUniqueId()
+ .removeClass( "ui-dialog-content ui-widget-content" )
+ .css( this.originalCss )
+ // Without detaching first, the following becomes really slow
+ .detach();
+
+ this.uiDialog.stop( true, true ).remove();
+
+ if ( this.originalTitle ) {
+ this.element.attr( "title", this.originalTitle );
+ }
+
+ next = originalPosition.parent.children().eq( originalPosition.index );
+ // Don't try to place the dialog next to itself (#8613)
+ if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
+ next.before( this.element );
+ } else {
+ originalPosition.parent.append( this.element );
+ }
+ },
+
+ widget: function() {
+ return this.uiDialog;
+ },
+
+ disable: $.noop,
+ enable: $.noop,
+
+ close: function( event ) {
+ var activeElement,
+ that = this;
+
+ if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
+ return;
+ }
+
+ this._isOpen = false;
+ this._focusedElement = null;
+ this._destroyOverlay();
+ this._untrackInstance();
+
+ if ( !this.opener.filter( ":focusable" ).focus().length ) {
+
+ // support: IE9
+ // IE9 throws an "Unspecified error" accessing document.activeElement from
an <iframe>
+ try {
+ activeElement = this.document[ 0 ].activeElement;
+
+ // Support: IE9, IE10
+ // If the <body> is blurred, IE will switch windows, see #4520
+ if ( activeElement && activeElement.nodeName.toLowerCase() !==
"body" ) {
+
+ // Hiding a focused element doesn't trigger blur in WebKit
+ // so in case we have nothing to focus on, explicitly blur the active element
+ //
https://bugs.webkit.org/show_bug.cgi?id=47182
+ $( activeElement ).blur();
+ }
+ } catch ( error ) {}
+ }
+
+ this._hide( this.uiDialog, this.options.hide, function() {
+ that._trigger( "close", event );
+ });
+ },
+
+ isOpen: function() {
+ return this._isOpen;
+ },
+
+ moveToTop: function() {
+ this._moveToTop();
+ },
+
+ _moveToTop: function( event, silent ) {
+ var moved = false,
+ zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
+ return +$( this ).css( "z-index" );
+ }).get(),
+ zIndexMax = Math.max.apply( null, zIndices );
+
+ if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
+ this.uiDialog.css( "z-index", zIndexMax + 1 );
+ moved = true;
+ }
+
+ if ( moved && !silent ) {
+ this._trigger( "focus", event );
+ }
+ return moved;
+ },
+
+ open: function() {
+ var that = this;
+ if ( this._isOpen ) {
+ if ( this._moveToTop() ) {
+ this._focusTabbable();
+ }
+ return;
+ }
+
+ this._isOpen = true;
+ this.opener = $( this.document[ 0 ].activeElement );
+
+ this._size();
+ this._position();
+ this._createOverlay();
+ this._moveToTop( null, true );
+
+ // Ensure the overlay is moved to the top with the dialog, but only when
+ // opening. The overlay shouldn't move after the dialog is open so that
+ // modeless dialogs opened after the modal dialog stack properly.
+ if ( this.overlay ) {
+ this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1
);
+ }
+
+ this._show( this.uiDialog, this.options.show, function() {
+ that._focusTabbable();
+ that._trigger( "focus" );
+ });
+
+ // Track the dialog immediately upon openening in case a focus event
+ // somehow occurs outside of the dialog before an element inside the
+ // dialog is focused (#10152)
+ this._makeFocusTarget();
+
+ this._trigger( "open" );
+ },
+
+ _focusTabbable: function() {
+ // Set focus to the first match:
+ // 1. An element that was focused previously
+ // 2. First element inside the dialog matching [autofocus]
+ // 3. Tabbable element inside the content element
+ // 4. Tabbable element inside the buttonpane
+ // 5. The close button
+ // 6. The dialog itself
+ var hasFocus = this._focusedElement;
+ if ( !hasFocus ) {
+ hasFocus = this.element.find( "[autofocus]" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.element.find( ":tabbable" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.uiDialog;
+ }
+ hasFocus.eq( 0 ).focus();
+ },
+
+ _keepFocus: function( event ) {
+ function checkFocus() {
+ var activeElement = this.document[0].activeElement,
+ isActive = this.uiDialog[0] === activeElement ||
+ $.contains( this.uiDialog[0], activeElement );
+ if ( !isActive ) {
+ this._focusTabbable();
+ }
+ }
+ event.preventDefault();
+ checkFocus.call( this );
+ // support: IE
+ // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
+ // so we check again later
+ this._delay( checkFocus );
+ },
+
+ _createWrapper: function() {
+ this.uiDialog = $("<div>")
+ .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "
+
+ this.options.dialogClass )
+ .hide()
+ .attr({
+ // Setting tabIndex makes the div focusable
+ tabIndex: -1,
+ role: "dialog"
+ })
+ .appendTo( this._appendTo() );
+
+ this._on( this.uiDialog, {
+ keydown: function( event ) {
+ if ( this.options.closeOnEscape && !event.isDefaultPrevented() &&
event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE ) {
+ event.preventDefault();
+ this.close( event );
+ return;
+ }
+
+ // prevent tabbing out of dialogs
+ if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
+ return;
+ }
+ var tabbables = this.uiDialog.find( ":tabbable" ),
+ first = tabbables.filter( ":first" ),
+ last = tabbables.filter( ":last" );
+
+ if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) &&
!event.shiftKey ) {
+ this._delay(function() {
+ first.focus();
+ });
+ event.preventDefault();
+ } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] )
&& event.shiftKey ) {
+ this._delay(function() {
+ last.focus();
+ });
+ event.preventDefault();
+ }
+ },
+ mousedown: function( event ) {
+ if ( this._moveToTop( event ) ) {
+ this._focusTabbable();
+ }
+ }
+ });
+
+ // We assume that any existing aria-describedby attribute means
+ // that the dialog content is marked up properly
+ // otherwise we brute force the content as the description
+ if ( !this.element.find( "[aria-describedby]" ).length ) {
+ this.uiDialog.attr({
+ "aria-describedby": this.element.uniqueId().attr( "id" )
+ });
+ }
+ },
+
+ _createTitlebar: function() {
+ var uiDialogTitle;
+
+ this.uiDialogTitlebar = $( "<div>" )
+ .addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all
ui-helper-clearfix" )
+ .prependTo( this.uiDialog );
+ this._on( this.uiDialogTitlebar, {
+ mousedown: function( event ) {
+ // Don't prevent click on close button (#8838)
+ // Focusing a dialog that is partially scrolled out of view
+ // causes the browser to scroll it into view, preventing the click event
+ if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
+ // Dialog isn't getting focus when dragging (#8063)
+ this.uiDialog.focus();
+ }
+ }
+ });
+
+ // support: IE
+ // Use type="button" to prevent enter keypresses in textboxes from closing
the
+ // dialog in IE (#9312)
+ this.uiDialogTitlebarClose = $( "<button
type='button'></button>" )
+ .button({
+ label: this.options.closeText,
+ icons: {
+ primary: "ui-icon-closethick"
+ },
+ text: false
+ })
+ .addClass( "ui-dialog-titlebar-close" )
+ .appendTo( this.uiDialogTitlebar );
+ this._on( this.uiDialogTitlebarClose, {
+ click: function( event ) {
+ event.preventDefault();
+ this.close( event );
+ }
+ });
+
+ uiDialogTitle = $( "<span>" )
+ .uniqueId()
+ .addClass( "ui-dialog-title" )
+ .prependTo( this.uiDialogTitlebar );
+ this._title( uiDialogTitle );
+
+ this.uiDialog.attr({
+ "aria-labelledby": uiDialogTitle.attr( "id" )
+ });
+ },
+
+ _title: function( title ) {
+ if ( !this.options.title ) {
+ title.html( " " );
+ }
+ title.text( this.options.title );
+ },
+
+ _createButtonPane: function() {
+ this.uiDialogButtonPane = $( "<div>" )
+ .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
+
+ this.uiButtonSet = $( "<div>" )
+ .addClass( "ui-dialog-buttonset" )
+ .appendTo( this.uiDialogButtonPane );
+
+ this._createButtons();
+ },
+
+ _createButtons: function() {
+ var that = this,
+ buttons = this.options.buttons;
+
+ // if we already have a button pane, remove it
+ this.uiDialogButtonPane.remove();
+ this.uiButtonSet.empty();
+
+ if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) )
{
+ this.uiDialog.removeClass( "ui-dialog-buttons" );
+ return;
+ }
+
+ $.each( buttons, function( name, props ) {
+ var click, buttonOptions;
+ props = $.isFunction( props ) ?
+ { click: props, text: name } :
+ props;
+ // Default to a non-submitting button
+ props = $.extend( { type: "button" }, props );
+ // Change the context for the click callback to be the main element
+ click = props.click;
+ props.click = function() {
+ click.apply( that.element[ 0 ], arguments );
+ };
+ buttonOptions = {
+ icons: props.icons,
+ text: props.showText
+ };
+ delete props.icons;
+ delete props.showText;
+ $( "<button></button>", props )
+ .button( buttonOptions )
+ .appendTo( that.uiButtonSet );
+ });
+ this.uiDialog.addClass( "ui-dialog-buttons" );
+ this.uiDialogButtonPane.appendTo( this.uiDialog );
+ },
+
+ _makeDraggable: function() {
+ var that = this,
+ options = this.options;
+
+ function filteredUi( ui ) {
+ return {
+ position: ui.position,
+ offset: ui.offset
+ };
+ }
+
+ this.uiDialog.draggable({
+ cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
+ handle: ".ui-dialog-titlebar",
+ containment: "document",
+ start: function( event, ui ) {
+ $( this ).addClass( "ui-dialog-dragging" );
+ that._blockFrames();
+ that._trigger( "dragStart", event, filteredUi( ui ) );
+ },
+ drag: function( event, ui ) {
+ that._trigger( "drag", event, filteredUi( ui ) );
+ },
+ stop: function( event, ui ) {
+ var left = ui.offset.left - that.document.scrollLeft(),
+ top = ui.offset.top - that.document.scrollTop();
+
+ options.position = {
+ my: "left top",
+ at: "left" + (left >= 0 ? "+" : "") + left + "
" +
+ "top" + (top >= 0 ? "+" : "") + top,
+ of: that.window
+ };
+ $( this ).removeClass( "ui-dialog-dragging" );
+ that._unblockFrames();
+ that._trigger( "dragStop", event, filteredUi( ui ) );
+ }
+ });
+ },
+
+ _makeResizable: function() {
+ var that = this,
+ options = this.options,
+ handles = options.resizable,
+ // .ui-resizable has position: relative defined in the stylesheet
+ // but dialogs have to use absolute or fixed positioning
+ position = this.uiDialog.css("position"),
+ resizeHandles = typeof handles === "string" ?
+ handles :
+ "n,e,s,w,se,sw,ne,nw";
+
+ function filteredUi( ui ) {
+ return {
+ originalPosition: ui.originalPosition,
+ originalSize: ui.originalSize,
+ position: ui.position,
+ size: ui.size
+ };
+ }
+
+ this.uiDialog.resizable({
+ cancel: ".ui-dialog-content",
+ containment: "document",
+ alsoResize: this.element,
+ maxWidth: options.maxWidth,
+ maxHeight: options.maxHeight,
+ minWidth: options.minWidth,
+ minHeight: this._minHeight(),
+ handles: resizeHandles,
+ start: function( event, ui ) {
+ $( this ).addClass( "ui-dialog-resizing" );
+ that._blockFrames();
+ that._trigger( "resizeStart", event, filteredUi( ui ) );
+ },
+ resize: function( event, ui ) {
+ that._trigger( "resize", event, filteredUi( ui ) );
+ },
+ stop: function( event, ui ) {
+ var offset = that.uiDialog.offset(),
+ left = offset.left - that.document.scrollLeft(),
+ top = offset.top - that.document.scrollTop();
+
+ options.height = that.uiDialog.height();
+ options.width = that.uiDialog.width();
+ options.position = {
+ my: "left top",
+ at: "left" + (left >= 0 ? "+" : "") + left + "
" +
+ "top" + (top >= 0 ? "+" : "") + top,
+ of: that.window
+ };
+ $( this ).removeClass( "ui-dialog-resizing" );
+ that._unblockFrames();
+ that._trigger( "resizeStop", event, filteredUi( ui ) );
+ }
+ })
+ .css( "position", position );
+ },
+
+ _trackFocus: function() {
+ this._on( this.widget(), {
+ focusin: function( event ) {
+ this._makeFocusTarget();
+ this._focusedElement = $( event.target );
+ }
+ });
+ },
+
+ _makeFocusTarget: function() {
+ this._untrackInstance();
+ this._trackingInstances().unshift( this );
+ },
+
+ _untrackInstance: function() {
+ var instances = this._trackingInstances(),
+ exists = $.inArray( this, instances );
+ if ( exists !== -1 ) {
+ instances.splice( exists, 1 );
+ }
+ },
+
+ _trackingInstances: function() {
+ var instances = this.document.data( "ui-dialog-instances" );
+ if ( !instances ) {
+ instances = [];
+ this.document.data( "ui-dialog-instances", instances );
+ }
+ return instances;
+ },
+
+ _minHeight: function() {
+ var options = this.options;
+
+ return options.height === "auto" ?
+ options.minHeight :
+ Math.min( options.minHeight, options.height );
+ },
+
+ _position: function() {
+ // Need to show the dialog to get the actual offset in the position plugin
+ var isVisible = this.uiDialog.is( ":visible" );
+ if ( !isVisible ) {
+ this.uiDialog.show();
+ }
+ this.uiDialog.position( this.options.position );
+ if ( !isVisible ) {
+ this.uiDialog.hide();
+ }
+ },
+
+ _setOptions: function( options ) {
+ var that = this,
+ resize = false,
+ resizableOptions = {};
+
+ $.each( options, function( key, value ) {
+ that._setOption( key, value );
+
+ if ( key in that.sizeRelatedOptions ) {
+ resize = true;
+ }
+ if ( key in that.resizableRelatedOptions ) {
+ resizableOptions[ key ] = value;
+ }
+ });
+
+ if ( resize ) {
+ this._size();
+ this._position();
+ }
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+ this.uiDialog.resizable( "option", resizableOptions );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var isDraggable, isResizable,
+ uiDialog = this.uiDialog;
+
+ if ( key === "dialogClass" ) {
+ uiDialog
+ .removeClass( this.options.dialogClass )
+ .addClass( value );
+ }
+
+ if ( key === "disabled" ) {
+ return;
+ }
+
+ this._super( key, value );
+
+ if ( key === "appendTo" ) {
+ this.uiDialog.appendTo( this._appendTo() );
+ }
+
+ if ( key === "buttons" ) {
+ this._createButtons();
+ }
+
+ if ( key === "closeText" ) {
+ this.uiDialogTitlebarClose.button({
+ // Ensure that we always pass a string
+ label: "" + value
+ });
+ }
+
+ if ( key === "draggable" ) {
+ isDraggable = uiDialog.is( ":data(ui-draggable)" );
+ if ( isDraggable && !value ) {
+ uiDialog.draggable( "destroy" );
+ }
+
+ if ( !isDraggable && value ) {
+ this._makeDraggable();
+ }
+ }
+
+ if ( key === "position" ) {
+ this._position();
+ }
+
+ if ( key === "resizable" ) {
+ // currently resizable, becoming non-resizable
+ isResizable = uiDialog.is( ":data(ui-resizable)" );
+ if ( isResizable && !value ) {
+ uiDialog.resizable( "destroy" );
+ }
+
+ // currently resizable, changing handles
+ if ( isResizable && typeof value === "string" ) {
+ uiDialog.resizable( "option", "handles", value );
+ }
+
+ // currently non-resizable, becoming resizable
+ if ( !isResizable && value !== false ) {
+ this._makeResizable();
+ }
+ }
+
+ if ( key === "title" ) {
+ this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
+ }
+ },
+
+ _size: function() {
+ // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+ // divs will both have width and height set, so we need to reset them
+ var nonContentHeight, minContentHeight, maxContentHeight,
+ options = this.options;
+
+ // Reset content sizing
+ this.element.show().css({
+ width: "auto",
+ minHeight: 0,
+ maxHeight: "none",
+ height: 0
+ });
+
+ if ( options.minWidth > options.width ) {
+ options.width = options.minWidth;
+ }
+
+ // reset wrapper sizing
+ // determine the height of all the non-content elements
+ nonContentHeight = this.uiDialog.css({
+ height: "auto",
+ width: options.width
+ })
+ .outerHeight();
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+ maxContentHeight = typeof options.maxHeight === "number" ?
+ Math.max( 0, options.maxHeight - nonContentHeight ) :
+ "none";
+
+ if ( options.height === "auto" ) {
+ this.element.css({
+ minHeight: minContentHeight,
+ maxHeight: maxContentHeight,
+ height: "auto"
+ });
+ } else {
+ this.element.height( Math.max( 0, options.height - nonContentHeight ) );
+ }
+
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+ this.uiDialog.resizable( "option", "minHeight", this._minHeight()
);
+ }
+ },
+
+ _blockFrames: function() {
+ this.iframeBlocks = this.document.find( "iframe" ).map(function() {
+ var iframe = $( this );
+
+ return $( "<div>" )
+ .css({
+ position: "absolute",
+ width: iframe.outerWidth(),
+ height: iframe.outerHeight()
+ })
+ .appendTo( iframe.parent() )
+ .offset( iframe.offset() )[0];
+ });
+ },
+
+ _unblockFrames: function() {
+ if ( this.iframeBlocks ) {
+ this.iframeBlocks.remove();
+ delete this.iframeBlocks;
+ }
+ },
+
+ _allowInteraction: function( event ) {
+ if ( $( event.target ).closest( ".ui-dialog" ).length ) {
+ return true;
+ }
+
+ // TODO: Remove hack when datepicker implements
+ // the .ui-front logic (#8989)
+ return !!$( event.target ).closest( ".ui-datepicker" ).length;
+ },
+
+ _createOverlay: function() {
+ if ( !this.options.modal ) {
+ return;
+ }
+
+ // We use a delay in case the overlay is created from an
+ // event that we're going to be cancelling (#2804)
+ var isOpening = true;
+ this._delay(function() {
+ isOpening = false;
+ });
+
+ if ( !this.document.data( "ui-dialog-overlays" ) ) {
+
+ // Prevent use of anchors and inputs
+ // Using _on() for an event handler shared across many instances is
+ // safe because the dialogs stack and must be closed in reverse order
+ this._on( this.document, {
+ focusin: function( event ) {
+ if ( isOpening ) {
+ return;
+ }
+
+ if ( !this._allowInteraction( event ) ) {
+ event.preventDefault();
+ this._trackingInstances()[ 0 ]._focusTabbable();
+ }
+ }
+ });
+ }
+
+ this.overlay = $( "<div>" )
+ .addClass( "ui-widget-overlay ui-front" )
+ .appendTo( this._appendTo() );
+ this._on( this.overlay, {
+ mousedown: "_keepFocus"
+ });
+ this.document.data( "ui-dialog-overlays",
+ (this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
+ },
+
+ _destroyOverlay: function() {
+ if ( !this.options.modal ) {
+ return;
+ }
+
+ if ( this.overlay ) {
+ var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
+
+ if ( !overlays ) {
+ this.document
+ .unbind( "focusin" )
+ .removeData( "ui-dialog-overlays" );
+ } else {
+ this.document.data( "ui-dialog-overlays", overlays );
+ }
+
+ this.overlay.remove();
+ this.overlay = null;
+ }
+ }
+});
+
+
+/*!
+ * jQuery UI Droppable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/droppable/
+ */
+
+
+$.widget( "ui.droppable", {
+ version: "1.11.4",
+ widgetEventPrefix: "drop",
+ options: {
+ accept: "*",
+ activeClass: false,
+ addClasses: true,
+ greedy: false,
+ hoverClass: false,
+ scope: "default",
+ tolerance: "intersect",
+
+ // callbacks
+ activate: null,
+ deactivate: null,
+ drop: null,
+ out: null,
+ over: null
+ },
+ _create: function() {
+
+ var proportions,
+ o = this.options,
+ accept = o.accept;
+
+ this.isover = false;
+ this.isout = true;
+
+ this.accept = $.isFunction( accept ) ? accept : function( d ) {
+ return d.is( accept );
+ };
+
+ this.proportions = function( /* valueToWrite */ ) {
+ if ( arguments.length ) {
+ // Store the droppable's proportions
+ proportions = arguments[ 0 ];
+ } else {
+ // Retrieve or derive the droppable's proportions
+ return proportions ?
+ proportions :
+ proportions = {
+ width: this.element[ 0 ].offsetWidth,
+ height: this.element[ 0 ].offsetHeight
+ };
+ }
+ };
+
+ this._addToManager( o.scope );
+
+ o.addClasses && this.element.addClass( "ui-droppable" );
+
+ },
+
+ _addToManager: function( scope ) {
+ // Add the reference and positions to the manager
+ $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
+ $.ui.ddmanager.droppables[ scope ].push( this );
+ },
+
+ _splice: function( drop ) {
+ var i = 0;
+ for ( ; i < drop.length; i++ ) {
+ if ( drop[ i ] === this ) {
+ drop.splice( i, 1 );
+ }
+ }
+ },
+
+ _destroy: function() {
+ var drop = $.ui.ddmanager.droppables[ this.options.scope ];
+
+ this._splice( drop );
+
+ this.element.removeClass( "ui-droppable ui-droppable-disabled" );
+ },
+
+ _setOption: function( key, value ) {
+
+ if ( key === "accept" ) {
+ this.accept = $.isFunction( value ) ? value : function( d ) {
+ return d.is( value );
+ };
+ } else if ( key === "scope" ) {
+ var drop = $.ui.ddmanager.droppables[ this.options.scope ];
+
+ this._splice( drop );
+ this._addToManager( value );
+ }
+
+ this._super( key, value );
+ },
+
+ _activate: function( event ) {
+ var draggable = $.ui.ddmanager.current;
+ if ( this.options.activeClass ) {
+ this.element.addClass( this.options.activeClass );
+ }
+ if ( draggable ){
+ this._trigger( "activate", event, this.ui( draggable ) );
+ }
+ },
+
+ _deactivate: function( event ) {
+ var draggable = $.ui.ddmanager.current;
+ if ( this.options.activeClass ) {
+ this.element.removeClass( this.options.activeClass );
+ }
+ if ( draggable ){
+ this._trigger( "deactivate", event, this.ui( draggable ) );
+ }
+ },
+
+ _over: function( event ) {
+
+ var draggable = $.ui.ddmanager.current;
+
+ // Bail if draggable and droppable are same element
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] ===
this.element[ 0 ] ) {
+ return;
+ }
+
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element
) ) ) {
+ if ( this.options.hoverClass ) {
+ this.element.addClass( this.options.hoverClass );
+ }
+ this._trigger( "over", event, this.ui( draggable ) );
+ }
+
+ },
+
+ _out: function( event ) {
+
+ var draggable = $.ui.ddmanager.current;
+
+ // Bail if draggable and droppable are same element
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] ===
this.element[ 0 ] ) {
+ return;
+ }
+
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element
) ) ) {
+ if ( this.options.hoverClass ) {
+ this.element.removeClass( this.options.hoverClass );
+ }
+ this._trigger( "out", event, this.ui( draggable ) );
+ }
+
+ },
+
+ _drop: function( event, custom ) {
+
+ var draggable = custom || $.ui.ddmanager.current,
+ childrenIntersection = false;
+
+ // Bail if draggable and droppable are same element
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] ===
this.element[ 0 ] ) {
+ return false;
+ }
+
+ this.element.find( ":data(ui-droppable)" ).not(
".ui-draggable-dragging" ).each(function() {
+ var inst = $( this ).droppable( "instance" );
+ if (
+ inst.options.greedy &&
+ !inst.options.disabled &&
+ inst.options.scope === draggable.options.scope &&
+ inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) )
&&
+ $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ),
inst.options.tolerance, event )
+ ) { childrenIntersection = true; return false; }
+ });
+ if ( childrenIntersection ) {
+ return false;
+ }
+
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element
) ) ) {
+ if ( this.options.activeClass ) {
+ this.element.removeClass( this.options.activeClass );
+ }
+ if ( this.options.hoverClass ) {
+ this.element.removeClass( this.options.hoverClass );
+ }
+ this._trigger( "drop", event, this.ui( draggable ) );
+ return this.element;
+ }
+
+ return false;
+
+ },
+
+ ui: function( c ) {
+ return {
+ draggable: ( c.currentItem || c.element ),
+ helper: c.helper,
+ position: c.position,
+ offset: c.positionAbs
+ };
+ }
+
+});
+
+$.ui.intersect = (function() {
+ function isOverAxis( x, reference, size ) {
+ return ( x >= reference ) && ( x < ( reference + size ) );
+ }
+
+ return function( draggable, droppable, toleranceMode, event ) {
+
+ if ( !droppable.offset ) {
+ return false;
+ }
+
+ var x1 = ( draggable.positionAbs || draggable.position.absolute ).left +
draggable.margins.left,
+ y1 = ( draggable.positionAbs || draggable.position.absolute ).top +
draggable.margins.top,
+ x2 = x1 + draggable.helperProportions.width,
+ y2 = y1 + draggable.helperProportions.height,
+ l = droppable.offset.left,
+ t = droppable.offset.top,
+ r = l + droppable.proportions().width,
+ b = t + droppable.proportions().height;
+
+ switch ( toleranceMode ) {
+ case "fit":
+ return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b
);
+ case "intersect":
+ return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right
Half
+ x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
+ t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
+ y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
+ case "pointer":
+ return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
isOverAxis( event.pageX, l, droppable.proportions().width );
+ case "touch":
+ return (
+ ( y1 >= t && y1 <= b ) || // Top edge touching
+ ( y2 >= t && y2 <= b ) || // Bottom edge touching
+ ( y1 < t && y2 > b ) // Surrounded vertically
+ ) && (
+ ( x1 >= l && x1 <= r ) || // Left edge touching
+ ( x2 >= l && x2 <= r ) || // Right edge touching
+ ( x1 < l && x2 > r ) // Surrounded horizontally
+ );
+ default:
+ return false;
+ }
+ };
+})();
+
+/*
+ This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+ current: null,
+ droppables: { "default": [] },
+ prepareOffsets: function( t, event ) {
+
+ var i, j,
+ m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
+ type = event ? event.type : null, // workaround for #2317
+ list = ( t.currentItem || t.element ).find( ":data(ui-droppable)"
).addBack();
+
+ droppablesLoop: for ( i = 0; i < m.length; i++ ) {
+
+ // No disabled and non-accepted
+ if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0
], ( t.currentItem || t.element ) ) ) ) {
+ continue;
+ }
+
+ // Filter out elements in the current dragged item
+ for ( j = 0; j < list.length; j++ ) {
+ if ( list[ j ] === m[ i ].element[ 0 ] ) {
+ m[ i ].proportions().height = 0;
+ continue droppablesLoop;
+ }
+ }
+
+ m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
+ if ( !m[ i ].visible ) {
+ continue;
+ }
+
+ // Activate the droppable if used directly from draggables
+ if ( type === "mousedown" ) {
+ m[ i ]._activate.call( m[ i ], event );
+ }
+
+ m[ i ].offset = m[ i ].element.offset();
+ m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0
].offsetHeight });
+
+ }
+
+ },
+ drop: function( draggable, event ) {
+
+ var dropped = false;
+ // Create a copy of the droppables in case the list changes during the drop (#9116)
+ $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(),
function() {
+
+ if ( !this.options ) {
+ return;
+ }
+ if ( !this.options.disabled && this.visible && $.ui.intersect(
draggable, this, this.options.tolerance, event ) ) {
+ dropped = this._drop.call( this, event ) || dropped;
+ }
+
+ if ( !this.options.disabled && this.visible && this.accept.call(
this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
+ this.isout = true;
+ this.isover = false;
+ this._deactivate.call( this, event );
+ }
+
+ });
+ return dropped;
+
+ },
+ dragStart: function( draggable, event ) {
+ // Listen for scrolling so that if the dragging causes scrolling the position of the
droppables can be recalculated (see #5003)
+ draggable.element.parentsUntil( "body" ).bind( "scroll.droppable",
function() {
+ if ( !draggable.options.refreshPositions ) {
+ $.ui.ddmanager.prepareOffsets( draggable, event );
+ }
+ });
+ },
+ drag: function( draggable, event ) {
+
+ // If you have a highly dynamic page, you might try this option. It renders positions
every time you move the mouse.
+ if ( draggable.options.refreshPositions ) {
+ $.ui.ddmanager.prepareOffsets( draggable, event );
+ }
+
+ // Run through all droppables and check their positions based on specific tolerance
options
+ $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
+
+ if ( this.options.disabled || this.greedyChild || !this.visible ) {
+ return;
+ }
+
+ var parentInstance, scope, parent,
+ intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
+ c = !intersects && this.isover ? "isout" : ( intersects &&
!this.isover ? "isover" : null );
+ if ( !c ) {
+ return;
+ }
+
+ if ( this.options.greedy ) {
+ // find droppable parents with same scope
+ scope = this.options.scope;
+ parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
+ return $( this ).droppable( "instance" ).options.scope === scope;
+ });
+
+ if ( parent.length ) {
+ parentInstance = $( parent[ 0 ] ).droppable( "instance" );
+ parentInstance.greedyChild = ( c === "isover" );
+ }
+ }
+
+ // we just moved into a greedy child
+ if ( parentInstance && c === "isover" ) {
+ parentInstance.isover = false;
+ parentInstance.isout = true;
+ parentInstance._out.call( parentInstance, event );
+ }
+
+ this[ c ] = true;
+ this[c === "isout" ? "isover" : "isout"] = false;
+ this[c === "isover" ? "_over" : "_out"].call( this,
event );
+
+ // we just moved out of a greedy child
+ if ( parentInstance && c === "isout" ) {
+ parentInstance.isout = false;
+ parentInstance.isover = true;
+ parentInstance._over.call( parentInstance, event );
+ }
+ });
+
+ },
+ dragStop: function( draggable, event ) {
+ draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable"
);
+ // Call prepareOffsets one final time since IE does not fire return scroll events when
overflow was caused by drag (see #5003)
+ if ( !draggable.options.refreshPositions ) {
+ $.ui.ddmanager.prepareOffsets( draggable, event );
+ }
+ }
+};
+
+var droppable = $.ui.droppable;
+
+
+/*!
+ * jQuery UI Effects 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/category/effects-core/
+ */
+
+
+var dataSpace = "ui-effects-",
+
+ // Create a local jQuery because jQuery Color relies on it and the
+ // global may not exist with AMD and a custom build (#10199)
+ jQuery = $;
+
+$.effects = {
+ effect: {}
+};
+
+/*!
+ * jQuery Color Animations v2.1.2
+ *
https://github.com/jquery/jquery-color
+ *
+ * Copyright 2014 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ * Date: Wed Jan 16 08:47:09 2013 -0600
+ */
+(function( jQuery, undefined ) {
+
+ var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor
borderTopColor color columnRuleColor outlineColor textDecorationColor
textEmphasisColor",
+
+ // plusequals test for += 100 -= 100
+ rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
+ // a set of RE's that can match strings and generate color tuples.
+ stringParsers = [ {
+ re:
/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+ parse: function( execResult ) {
+ return [
+ execResult[ 1 ],
+ execResult[ 2 ],
+ execResult[ 3 ],
+ execResult[ 4 ]
+ ];
+ }
+ }, {
+ re:
/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+ parse: function( execResult ) {
+ return [
+ execResult[ 1 ] * 2.55,
+ execResult[ 2 ] * 2.55,
+ execResult[ 3 ] * 2.55,
+ execResult[ 4 ]
+ ];
+ }
+ }, {
+ // this regex ignores A-F because it's compared against an already lowercased
string
+ re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
+ parse: function( execResult ) {
+ return [
+ parseInt( execResult[ 1 ], 16 ),
+ parseInt( execResult[ 2 ], 16 ),
+ parseInt( execResult[ 3 ], 16 )
+ ];
+ }
+ }, {
+ // this regex ignores A-F because it's compared against an already lowercased
string
+ re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
+ parse: function( execResult ) {
+ return [
+ parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
+ parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
+ parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
+ ];
+ }
+ }, {
+ re:
/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+ space: "hsla",
+ parse: function( execResult ) {
+ return [
+ execResult[ 1 ],
+ execResult[ 2 ] / 100,
+ execResult[ 3 ] / 100,
+ execResult[ 4 ]
+ ];
+ }
+ } ],
+
+ // jQuery.Color( )
+ color = jQuery.Color = function( color, green, blue, alpha ) {
+ return new jQuery.Color.fn.parse( color, green, blue, alpha );
+ },
+ spaces = {
+ rgba: {
+ props: {
+ red: {
+ idx: 0,
+ type: "byte"
+ },
+ green: {
+ idx: 1,
+ type: "byte"
+ },
+ blue: {
+ idx: 2,
+ type: "byte"
+ }
+ }
+ },
+
+ hsla: {
+ props: {
+ hue: {
+ idx: 0,
+ type: "degrees"
+ },
+ saturation: {
+ idx: 1,
+ type: "percent"
+ },
+ lightness: {
+ idx: 2,
+ type: "percent"
+ }
+ }
+ }
+ },
+ propTypes = {
+ "byte": {
+ floor: true,
+ max: 255
+ },
+ "percent": {
+ max: 1
+ },
+ "degrees": {
+ mod: 360,
+ floor: true
+ }
+ },
+ support = color.support = {},
+
+ // element for support tests
+ supportElem = jQuery( "<p>" )[ 0 ],
+
+ // colors = jQuery.Color.names
+ colors,
+
+ // local aliases of functions called often
+ each = jQuery.each;
+
+// determine rgba support immediately
+supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
+support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
+
+// define cache name and alpha properties
+// for rgba and hsla spaces
+each( spaces, function( spaceName, space ) {
+ space.cache = "_" + spaceName;
+ space.props.alpha = {
+ idx: 3,
+ type: "percent",
+ def: 1
+ };
+});
+
+function clamp( value, prop, allowEmpty ) {
+ var type = propTypes[ prop.type ] || {};
+
+ if ( value == null ) {
+ return (allowEmpty || !prop.def) ? null : prop.def;
+ }
+
+ // ~~ is an short way of doing floor for positive numbers
+ value = type.floor ? ~~value : parseFloat( value );
+
+ // IE will pass in empty strings as value for alpha,
+ // which will hit this case
+ if ( isNaN( value ) ) {
+ return prop.def;
+ }
+
+ if ( type.mod ) {
+ // we add mod before modding to make sure that negatives values
+ // get converted properly: -10 -> 350
+ return (value + type.mod) % type.mod;
+ }
+
+ // for now all property types without mod have min and max
+ return 0 > value ? 0 : type.max < value ? type.max : value;
+}
+
+function stringParse( string ) {
+ var inst = color(),
+ rgba = inst._rgba = [];
+
+ string = string.toLowerCase();
+
+ each( stringParsers, function( i, parser ) {
+ var parsed,
+ match = parser.re.exec( string ),
+ values = match && parser.parse( match ),
+ spaceName = parser.space || "rgba";
+
+ if ( values ) {
+ parsed = inst[ spaceName ]( values );
+
+ // if this was an rgba parse the assignment might happen twice
+ // oh well....
+ inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
+ rgba = inst._rgba = parsed._rgba;
+
+ // exit each( stringParsers ) here because we matched
+ return false;
+ }
+ });
+
+ // Found a stringParser that handled it
+ if ( rgba.length ) {
+
+ // if this came from a parsed string, force "transparent" when alpha is 0
+ // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
+ if ( rgba.join() === "0,0,0,0" ) {
+ jQuery.extend( rgba, colors.transparent );
+ }
+ return inst;
+ }
+
+ // named colors
+ return colors[ string ];
+}
+
+color.fn = jQuery.extend( color.prototype, {
+ parse: function( red, green, blue, alpha ) {
+ if ( red === undefined ) {
+ this._rgba = [ null, null, null, null ];
+ return this;
+ }
+ if ( red.jquery || red.nodeType ) {
+ red = jQuery( red ).css( green );
+ green = undefined;
+ }
+
+ var inst = this,
+ type = jQuery.type( red ),
+ rgba = this._rgba = [];
+
+ // more than 1 argument specified - assume ( red, green, blue, alpha )
+ if ( green !== undefined ) {
+ red = [ red, green, blue, alpha ];
+ type = "array";
+ }
+
+ if ( type === "string" ) {
+ return this.parse( stringParse( red ) || colors._default );
+ }
+
+ if ( type === "array" ) {
+ each( spaces.rgba.props, function( key, prop ) {
+ rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
+ });
+ return this;
+ }
+
+ if ( type === "object" ) {
+ if ( red instanceof color ) {
+ each( spaces, function( spaceName, space ) {
+ if ( red[ space.cache ] ) {
+ inst[ space.cache ] = red[ space.cache ].slice();
+ }
+ });
+ } else {
+ each( spaces, function( spaceName, space ) {
+ var cache = space.cache;
+ each( space.props, function( key, prop ) {
+
+ // if the cache doesn't exist, and we know how to convert
+ if ( !inst[ cache ] && space.to ) {
+
+ // if the value was null, we don't need to copy it
+ // if the key was alpha, we don't need to copy it either
+ if ( key === "alpha" || red[ key ] == null ) {
+ return;
+ }
+ inst[ cache ] = space.to( inst._rgba );
+ }
+
+ // this is the only case where we allow nulls for ALL properties.
+ // call clamp with alwaysAllowEmpty
+ inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
+ });
+
+ // everything defined but alpha?
+ if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) )
< 0 ) {
+ // use the default of 1
+ inst[ cache ][ 3 ] = 1;
+ if ( space.from ) {
+ inst._rgba = space.from( inst[ cache ] );
+ }
+ }
+ });
+ }
+ return this;
+ }
+ },
+ is: function( compare ) {
+ var is = color( compare ),
+ same = true,
+ inst = this;
+
+ each( spaces, function( _, space ) {
+ var localCache,
+ isCache = is[ space.cache ];
+ if (isCache) {
+ localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) ||
[];
+ each( space.props, function( _, prop ) {
+ if ( isCache[ prop.idx ] != null ) {
+ same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
+ return same;
+ }
+ });
+ }
+ return same;
+ });
+ return same;
+ },
+ _space: function() {
+ var used = [],
+ inst = this;
+ each( spaces, function( spaceName, space ) {
+ if ( inst[ space.cache ] ) {
+ used.push( spaceName );
+ }
+ });
+ return used.pop();
+ },
+ transition: function( other, distance ) {
+ var end = color( other ),
+ spaceName = end._space(),
+ space = spaces[ spaceName ],
+ startColor = this.alpha() === 0 ? color( "transparent" ) : this,
+ start = startColor[ space.cache ] || space.to( startColor._rgba ),
+ result = start.slice();
+
+ end = end[ space.cache ];
+ each( space.props, function( key, prop ) {
+ var index = prop.idx,
+ startValue = start[ index ],
+ endValue = end[ index ],
+ type = propTypes[ prop.type ] || {};
+
+ // if null, don't override start value
+ if ( endValue === null ) {
+ return;
+ }
+ // if null - use end
+ if ( startValue === null ) {
+ result[ index ] = endValue;
+ } else {
+ if ( type.mod ) {
+ if ( endValue - startValue > type.mod / 2 ) {
+ startValue += type.mod;
+ } else if ( startValue - endValue > type.mod / 2 ) {
+ startValue -= type.mod;
+ }
+ }
+ result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
+ }
+ });
+ return this[ spaceName ]( result );
+ },
+ blend: function( opaque ) {
+ // if we are already opaque - return ourself
+ if ( this._rgba[ 3 ] === 1 ) {
+ return this;
+ }
+
+ var rgb = this._rgba.slice(),
+ a = rgb.pop(),
+ blend = color( opaque )._rgba;
+
+ return color( jQuery.map( rgb, function( v, i ) {
+ return ( 1 - a ) * blend[ i ] + a * v;
+ }));
+ },
+ toRgbaString: function() {
+ var prefix = "rgba(",
+ rgba = jQuery.map( this._rgba, function( v, i ) {
+ return v == null ? ( i > 2 ? 1 : 0 ) : v;
+ });
+
+ if ( rgba[ 3 ] === 1 ) {
+ rgba.pop();
+ prefix = "rgb(";
+ }
+
+ return prefix + rgba.join() + ")";
+ },
+ toHslaString: function() {
+ var prefix = "hsla(",
+ hsla = jQuery.map( this.hsla(), function( v, i ) {
+ if ( v == null ) {
+ v = i > 2 ? 1 : 0;
+ }
+
+ // catch 1 and 2
+ if ( i && i < 3 ) {
+ v = Math.round( v * 100 ) + "%";
+ }
+ return v;
+ });
+
+ if ( hsla[ 3 ] === 1 ) {
+ hsla.pop();
+ prefix = "hsl(";
+ }
+ return prefix + hsla.join() + ")";
+ },
+ toHexString: function( includeAlpha ) {
+ var rgba = this._rgba.slice(),
+ alpha = rgba.pop();
+
+ if ( includeAlpha ) {
+ rgba.push( ~~( alpha * 255 ) );
+ }
+
+ return "#" + jQuery.map( rgba, function( v ) {
+
+ // default to 0 when nulls exist
+ v = ( v || 0 ).toString( 16 );
+ return v.length === 1 ? "0" + v : v;
+ }).join("");
+ },
+ toString: function() {
+ return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
+ }
+});
+color.fn.parse.prototype = color.fn;
+
+// hsla conversions adapted from:
+//
https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk...
+
+function hue2rgb( p, q, h ) {
+ h = ( h + 1 ) % 1;
+ if ( h * 6 < 1 ) {
+ return p + ( q - p ) * h * 6;
+ }
+ if ( h * 2 < 1) {
+ return q;
+ }
+ if ( h * 3 < 2 ) {
+ return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
+ }
+ return p;
+}
+
+spaces.hsla.to = function( rgba ) {
+ if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
+ return [ null, null, null, rgba[ 3 ] ];
+ }
+ var r = rgba[ 0 ] / 255,
+ g = rgba[ 1 ] / 255,
+ b = rgba[ 2 ] / 255,
+ a = rgba[ 3 ],
+ max = Math.max( r, g, b ),
+ min = Math.min( r, g, b ),
+ diff = max - min,
+ add = max + min,
+ l = add * 0.5,
+ h, s;
+
+ if ( min === max ) {
+ h = 0;
+ } else if ( r === max ) {
+ h = ( 60 * ( g - b ) / diff ) + 360;
+ } else if ( g === max ) {
+ h = ( 60 * ( b - r ) / diff ) + 120;
+ } else {
+ h = ( 60 * ( r - g ) / diff ) + 240;
+ }
+
+ // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
+ // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
+ if ( diff === 0 ) {
+ s = 0;
+ } else if ( l <= 0.5 ) {
+ s = diff / add;
+ } else {
+ s = diff / ( 2 - add );
+ }
+ return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
+};
+
+spaces.hsla.from = function( hsla ) {
+ if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
+ return [ null, null, null, hsla[ 3 ] ];
+ }
+ var h = hsla[ 0 ] / 360,
+ s = hsla[ 1 ],
+ l = hsla[ 2 ],
+ a = hsla[ 3 ],
+ q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
+ p = 2 * l - q;
+
+ return [
+ Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
+ Math.round( hue2rgb( p, q, h ) * 255 ),
+ Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
+ a
+ ];
+};
+
+each( spaces, function( spaceName, space ) {
+ var props = space.props,
+ cache = space.cache,
+ to = space.to,
+ from = space.from;
+
+ // makes rgba() and hsla()
+ color.fn[ spaceName ] = function( value ) {
+
+ // generate a cache for this space if it doesn't exist
+ if ( to && !this[ cache ] ) {
+ this[ cache ] = to( this._rgba );
+ }
+ if ( value === undefined ) {
+ return this[ cache ].slice();
+ }
+
+ var ret,
+ type = jQuery.type( value ),
+ arr = ( type === "array" || type === "object" ) ? value :
arguments,
+ local = this[ cache ].slice();
+
+ each( props, function( key, prop ) {
+ var val = arr[ type === "object" ? key : prop.idx ];
+ if ( val == null ) {
+ val = local[ prop.idx ];
+ }
+ local[ prop.idx ] = clamp( val, prop );
+ });
+
+ if ( from ) {
+ ret = color( from( local ) );
+ ret[ cache ] = local;
+ return ret;
+ } else {
+ return color( local );
+ }
+ };
+
+ // makes red() green() blue() alpha() hue() saturation() lightness()
+ each( props, function( key, prop ) {
+ // alpha is included in more than one space
+ if ( color.fn[ key ] ) {
+ return;
+ }
+ color.fn[ key ] = function( value ) {
+ var vtype = jQuery.type( value ),
+ fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba"
) : spaceName ),
+ local = this[ fn ](),
+ cur = local[ prop.idx ],
+ match;
+
+ if ( vtype === "undefined" ) {
+ return cur;
+ }
+
+ if ( vtype === "function" ) {
+ value = value.call( this, cur );
+ vtype = jQuery.type( value );
+ }
+ if ( value == null && prop.empty ) {
+ return this;
+ }
+ if ( vtype === "string" ) {
+ match = rplusequals.exec( value );
+ if ( match ) {
+ value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
+ }
+ }
+ local[ prop.idx ] = value;
+ return this[ fn ]( local );
+ };
+ });
+});
+
+// add cssHook and .fx.step function for each named hook.
+// accept a space separated string of properties
+color.hook = function( hook ) {
+ var hooks = hook.split( " " );
+ each( hooks, function( i, hook ) {
+ jQuery.cssHooks[ hook ] = {
+ set: function( elem, value ) {
+ var parsed, curElem,
+ backgroundColor = "";
+
+ if ( value !== "transparent" && ( jQuery.type( value ) !==
"string" || ( parsed = stringParse( value ) ) ) ) {
+ value = color( parsed || value );
+ if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
+ curElem = hook === "backgroundColor" ? elem.parentNode : elem;
+ while (
+ (backgroundColor === "" || backgroundColor === "transparent")
&&
+ curElem && curElem.style
+ ) {
+ try {
+ backgroundColor = jQuery.css( curElem, "backgroundColor" );
+ curElem = curElem.parentNode;
+ } catch ( e ) {
+ }
+ }
+
+ value = value.blend( backgroundColor && backgroundColor !==
"transparent" ?
+ backgroundColor :
+ "_default" );
+ }
+
+ value = value.toRgbaString();
+ }
+ try {
+ elem.style[ hook ] = value;
+ } catch ( e ) {
+ // wrapped to prevent IE from throwing errors on "invalid" values like
'auto' or 'inherit'
+ }
+ }
+ };
+ jQuery.fx.step[ hook ] = function( fx ) {
+ if ( !fx.colorInit ) {
+ fx.start = color( fx.elem, hook );
+ fx.end = color( fx.end );
+ fx.colorInit = true;
+ }
+ jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
+ };
+ });
+
+};
+
+color.hook( stepHooks );
+
+jQuery.cssHooks.borderColor = {
+ expand: function( value ) {
+ var expanded = {};
+
+ each( [ "Top", "Right", "Bottom", "Left" ],
function( i, part ) {
+ expanded[ "border" + part + "Color" ] = value;
+ });
+ return expanded;
+ }
+};
+
+// Basic color names only.
+// Usage of any of the other color names requires adding yourself or including
+// jquery.color.svg-names.js.
+colors = jQuery.Color.names = {
+ // 4.1. Basic color keywords
+ aqua: "#00ffff",
+ black: "#000000",
+ blue: "#0000ff",
+ fuchsia: "#ff00ff",
+ gray: "#808080",
+ green: "#008000",
+ lime: "#00ff00",
+ maroon: "#800000",
+ navy: "#000080",
+ olive: "#808000",
+ purple: "#800080",
+ red: "#ff0000",
+ silver: "#c0c0c0",
+ teal: "#008080",
+ white: "#ffffff",
+ yellow: "#ffff00",
+
+ // 4.2.3. "transparent" color keyword
+ transparent: [ null, null, null, 0 ],
+
+ _default: "#ffffff"
+};
+
+})( jQuery );
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+(function() {
+
+var classAnimationActions = [ "add", "remove", "toggle" ],
+ shorthandStyles = {
+ border: 1,
+ borderBottom: 1,
+ borderColor: 1,
+ borderLeft: 1,
+ borderRight: 1,
+ borderTop: 1,
+ borderWidth: 1,
+ margin: 1,
+ padding: 1
+ };
+
+$.each([ "borderLeftStyle", "borderRightStyle",
"borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
+ $.fx.step[ prop ] = function( fx ) {
+ if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 &&
!fx.setAttr ) {
+ jQuery.style( fx.elem, prop, fx.end );
+ fx.setAttr = true;
+ }
+ };
+});
+
+function getElementStyles( elem ) {
+ var key, len,
+ style = elem.ownerDocument.defaultView ?
+ elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
+ elem.currentStyle,
+ styles = {};
+
+ if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ]
) {
+ len = style.length;
+ while ( len-- ) {
+ key = style[ len ];
+ if ( typeof style[ key ] === "string" ) {
+ styles[ $.camelCase( key ) ] = style[ key ];
+ }
+ }
+ // support: Opera, IE <9
+ } else {
+ for ( key in style ) {
+ if ( typeof style[ key ] === "string" ) {
+ styles[ key ] = style[ key ];
+ }
+ }
+ }
+
+ return styles;
+}
+
+function styleDifference( oldStyle, newStyle ) {
+ var diff = {},
+ name, value;
+
+ for ( name in newStyle ) {
+ value = newStyle[ name ];
+ if ( oldStyle[ name ] !== value ) {
+ if ( !shorthandStyles[ name ] ) {
+ if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
+ diff[ name ] = value;
+ }
+ }
+ }
+ }
+
+ return diff;
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+ $.fn.addBack = function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ };
+}
+
+$.effects.animateClass = function( value, duration, easing, callback ) {
+ var o = $.speed( duration, easing, callback );
+
+ return this.queue( function() {
+ var animated = $( this ),
+ baseClass = animated.attr( "class" ) || "",
+ applyClassChange,
+ allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
+
+ // map the animated objects to store the original styles.
+ allAnimations = allAnimations.map(function() {
+ var el = $( this );
+ return {
+ el: el,
+ start: getElementStyles( this )
+ };
+ });
+
+ // apply class change
+ applyClassChange = function() {
+ $.each( classAnimationActions, function(i, action) {
+ if ( value[ action ] ) {
+ animated[ action + "Class" ]( value[ action ] );
+ }
+ });
+ };
+ applyClassChange();
+
+ // map all animated objects again - calculate new styles and diff
+ allAnimations = allAnimations.map(function() {
+ this.end = getElementStyles( this.el[ 0 ] );
+ this.diff = styleDifference( this.start, this.end );
+ return this;
+ });
+
+ // apply original class
+ animated.attr( "class", baseClass );
+
+ // map all animated objects again - this time collecting a promise
+ allAnimations = allAnimations.map(function() {
+ var styleInfo = this,
+ dfd = $.Deferred(),
+ opts = $.extend({}, o, {
+ queue: false,
+ complete: function() {
+ dfd.resolve( styleInfo );
+ }
+ });
+
+ this.el.animate( this.diff, opts );
+ return dfd.promise();
+ });
+
+ // once all animations have completed:
+ $.when.apply( $, allAnimations.get() ).done(function() {
+
+ // set the final class
+ applyClassChange();
+
+ // for each animated element,
+ // clear all css properties that were animated
+ $.each( arguments, function() {
+ var el = this.el;
+ $.each( this.diff, function(key) {
+ el.css( key, "" );
+ });
+ });
+
+ // this is guarnteed to be there if you use jQuery.speed()
+ // it also handles dequeuing the next anim...
+ o.complete.call( animated[ 0 ] );
+ });
+ });
+};
+
+$.fn.extend({
+ addClass: (function( orig ) {
+ return function( classNames, speed, easing, callback ) {
+ return speed ?
+ $.effects.animateClass.call( this,
+ { add: classNames }, speed, easing, callback ) :
+ orig.apply( this, arguments );
+ };
+ })( $.fn.addClass ),
+
+ removeClass: (function( orig ) {
+ return function( classNames, speed, easing, callback ) {
+ return arguments.length > 1 ?
+ $.effects.animateClass.call( this,
+ { remove: classNames }, speed, easing, callback ) :
+ orig.apply( this, arguments );
+ };
+ })( $.fn.removeClass ),
+
+ toggleClass: (function( orig ) {
+ return function( classNames, force, speed, easing, callback ) {
+ if ( typeof force === "boolean" || force === undefined ) {
+ if ( !speed ) {
+ // without speed parameter
+ return orig.apply( this, arguments );
+ } else {
+ return $.effects.animateClass.call( this,
+ (force ? { add: classNames } : { remove: classNames }),
+ speed, easing, callback );
+ }
+ } else {
+ // without force parameter
+ return $.effects.animateClass.call( this,
+ { toggle: classNames }, force, speed, easing );
+ }
+ };
+ })( $.fn.toggleClass ),
+
+ switchClass: function( remove, add, speed, easing, callback) {
+ return $.effects.animateClass.call( this, {
+ add: add,
+ remove: remove
+ }, speed, easing, callback );
+ }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+(function() {
+
+$.extend( $.effects, {
+ version: "1.11.4",
+
+ // Saves a set of properties in a data storage
+ save: function( element, set ) {
+ for ( var i = 0; i < set.length; i++ ) {
+ if ( set[ i ] !== null ) {
+ element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
+ }
+ }
+ },
+
+ // Restores a set of previously saved properties from a data storage
+ restore: function( element, set ) {
+ var val, i;
+ for ( i = 0; i < set.length; i++ ) {
+ if ( set[ i ] !== null ) {
+ val = element.data( dataSpace + set[ i ] );
+ // support: jQuery 1.6.2
+ //
http://bugs.jquery.com/ticket/9917
+ // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
+ // We can't differentiate between "" and 0 here, so we just assume
+ // empty string since it's likely to be a more common value...
+ if ( val === undefined ) {
+ val = "";
+ }
+ element.css( set[ i ], val );
+ }
+ }
+ },
+
+ setMode: function( el, mode ) {
+ if (mode === "toggle") {
+ mode = el.is( ":hidden" ) ? "show" : "hide";
+ }
+ return mode;
+ },
+
+ // Translates a [top,left] array into a baseline value
+ // this should be a little more flexible in the future to handle a string & hash
+ getBaseline: function( origin, original ) {
+ var y, x;
+ switch ( origin[ 0 ] ) {
+ case "top": y = 0; break;
+ case "middle": y = 0.5; break;
+ case "bottom": y = 1; break;
+ default: y = origin[ 0 ] / original.height;
+ }
+ switch ( origin[ 1 ] ) {
+ case "left": x = 0; break;
+ case "center": x = 0.5; break;
+ case "right": x = 1; break;
+ default: x = origin[ 1 ] / original.width;
+ }
+ return {
+ x: x,
+ y: y
+ };
+ },
+
+ // Wraps the element around a wrapper that copies position properties
+ createWrapper: function( element ) {
+
+ // if the element is already wrapped, return it
+ if ( element.parent().is( ".ui-effects-wrapper" )) {
+ return element.parent();
+ }
+
+ // wrap the element
+ var props = {
+ width: element.outerWidth(true),
+ height: element.outerHeight(true),
+ "float": element.css( "float" )
+ },
+ wrapper = $( "<div></div>" )
+ .addClass( "ui-effects-wrapper" )
+ .css({
+ fontSize: "100%",
+ background: "transparent",
+ border: "none",
+ margin: 0,
+ padding: 0
+ }),
+ // Store the size in case width/height are defined in % - Fixes #5245
+ size = {
+ width: element.width(),
+ height: element.height()
+ },
+ active = document.activeElement;
+
+ // support: Firefox
+ // Firefox incorrectly exposes anonymous content
+ //
https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+ try {
+ active.id;
+ } catch ( e ) {
+ active = document.body;
+ }
+
+ element.wrap( wrapper );
+
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+
+ wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems
to actually lose the reference to the wrapped element
+
+ // transfer positioning properties to the wrapper
+ if ( element.css( "position" ) === "static" ) {
+ wrapper.css({ position: "relative" });
+ element.css({ position: "relative" });
+ } else {
+ $.extend( props, {
+ position: element.css( "position" ),
+ zIndex: element.css( "z-index" )
+ });
+ $.each([ "top", "left", "bottom", "right" ],
function(i, pos) {
+ props[ pos ] = element.css( pos );
+ if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
+ props[ pos ] = "auto";
+ }
+ });
+ element.css({
+ position: "relative",
+ top: 0,
+ left: 0,
+ right: "auto",
+ bottom: "auto"
+ });
+ }
+ element.css(size);
+
+ return wrapper.css( props ).show();
+ },
+
+ removeWrapper: function( element ) {
+ var active = document.activeElement;
+
+ if ( element.parent().is( ".ui-effects-wrapper" ) ) {
+ element.parent().replaceWith( element );
+
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+ }
+
+ return element;
+ },
+
+ setTransition: function( element, list, factor, value ) {
+ value = value || {};
+ $.each( list, function( i, x ) {
+ var unit = element.cssUnit( x );
+ if ( unit[ 0 ] > 0 ) {
+ value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
+ }
+ });
+ return value;
+ }
+});
+
+// return an effect options object for the given parameters:
+function _normalizeArguments( effect, options, speed, callback ) {
+
+ // allow passing all options as the first parameter
+ if ( $.isPlainObject( effect ) ) {
+ options = effect;
+ effect = effect.effect;
+ }
+
+ // convert to an object
+ effect = { effect: effect };
+
+ // catch (effect, null, ...)
+ if ( options == null ) {
+ options = {};
+ }
+
+ // catch (effect, callback)
+ if ( $.isFunction( options ) ) {
+ callback = options;
+ speed = null;
+ options = {};
+ }
+
+ // catch (effect, speed, ?)
+ if ( typeof options === "number" || $.fx.speeds[ options ] ) {
+ callback = speed;
+ speed = options;
+ options = {};
+ }
+
+ // catch (effect, options, callback)
+ if ( $.isFunction( speed ) ) {
+ callback = speed;
+ speed = null;
+ }
+
+ // add options to effect
+ if ( options ) {
+ $.extend( effect, options );
+ }
+
+ speed = speed || options.duration;
+ effect.duration = $.fx.off ? 0 :
+ typeof speed === "number" ? speed :
+ speed in $.fx.speeds ? $.fx.speeds[ speed ] :
+ $.fx.speeds._default;
+
+ effect.complete = callback || options.complete;
+
+ return effect;
+}
+
+function standardAnimationOption( option ) {
+ // Valid standard speeds (nothing, number, named speed)
+ if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
+ return true;
+ }
+
+ // Invalid strings - treat as "normal" speed
+ if ( typeof option === "string" && !$.effects.effect[ option ] ) {
+ return true;
+ }
+
+ // Complete callback
+ if ( $.isFunction( option ) ) {
+ return true;
+ }
+
+ // Options hash (but not naming an effect)
+ if ( typeof option === "object" && !option.effect ) {
+ return true;
+ }
+
+ // Didn't match any standard API
+ return false;
+}
+
+$.fn.extend({
+ effect: function( /* effect, options, speed, callback */ ) {
+ var args = _normalizeArguments.apply( this, arguments ),
+ mode = args.mode,
+ queue = args.queue,
+ effectMethod = $.effects.effect[ args.effect ];
+
+ if ( $.fx.off || !effectMethod ) {
+ // delegate to the original method (e.g., .show()) if possible
+ if ( mode ) {
+ return this[ mode ]( args.duration, args.complete );
+ } else {
+ return this.each( function() {
+ if ( args.complete ) {
+ args.complete.call( this );
+ }
+ });
+ }
+ }
+
+ function run( next ) {
+ var elem = $( this ),
+ complete = args.complete,
+ mode = args.mode;
+
+ function done() {
+ if ( $.isFunction( complete ) ) {
+ complete.call( elem[0] );
+ }
+ if ( $.isFunction( next ) ) {
+ next();
+ }
+ }
+
+ // If the element already has the correct final state, delegate to
+ // the core methods so the internal tracking of "olddisplay" works.
+ if ( elem.is( ":hidden" ) ? mode === "hide" : mode ===
"show" ) {
+ elem[ mode ]();
+ done();
+ } else {
+ effectMethod.call( elem[0], args, done );
+ }
+ }
+
+ return queue === false ? this.each( run ) : this.queue( queue || "fx", run
);
+ },
+
+ show: (function( orig ) {
+ return function( option ) {
+ if ( standardAnimationOption( option ) ) {
+ return orig.apply( this, arguments );
+ } else {
+ var args = _normalizeArguments.apply( this, arguments );
+ args.mode = "show";
+ return this.effect.call( this, args );
+ }
+ };
+ })( $.fn.show ),
+
+ hide: (function( orig ) {
+ return function( option ) {
+ if ( standardAnimationOption( option ) ) {
+ return orig.apply( this, arguments );
+ } else {
+ var args = _normalizeArguments.apply( this, arguments );
+ args.mode = "hide";
+ return this.effect.call( this, args );
+ }
+ };
+ })( $.fn.hide ),
+
+ toggle: (function( orig ) {
+ return function( option ) {
+ if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
+ return orig.apply( this, arguments );
+ } else {
+ var args = _normalizeArguments.apply( this, arguments );
+ args.mode = "toggle";
+ return this.effect.call( this, args );
+ }
+ };
+ })( $.fn.toggle ),
+
+ // helper functions
+ cssUnit: function(key) {
+ var style = this.css( key ),
+ val = [];
+
+ $.each( [ "em", "px", "%", "pt" ], function( i,
unit ) {
+ if ( style.indexOf( unit ) > 0 ) {
+ val = [ parseFloat( style ), unit ];
+ }
+ });
+ return val;
+ }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+(function() {
+
+// based on easing equations from Robert Penner (
http://www.robertpenner.com/easing)
+
+var baseEasings = {};
+
+$.each( [ "Quad", "Cubic", "Quart", "Quint",
"Expo" ], function( i, name ) {
+ baseEasings[ name ] = function( p ) {
+ return Math.pow( p, i + 2 );
+ };
+});
+
+$.extend( baseEasings, {
+ Sine: function( p ) {
+ return 1 - Math.cos( p * Math.PI / 2 );
+ },
+ Circ: function( p ) {
+ return 1 - Math.sqrt( 1 - p * p );
+ },
+ Elastic: function( p ) {
+ return p === 0 || p === 1 ? p :
+ -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
+ },
+ Back: function( p ) {
+ return p * p * ( 3 * p - 2 );
+ },
+ Bounce: function( p ) {
+ var pow2,
+ bounce = 4;
+
+ while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+ return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2
);
+ }
+});
+
+$.each( baseEasings, function( name, easeIn ) {
+ $.easing[ "easeIn" + name ] = easeIn;
+ $.easing[ "easeOut" + name ] = function( p ) {
+ return 1 - easeIn( 1 - p );
+ };
+ $.easing[ "easeInOut" + name ] = function( p ) {
+ return p < 0.5 ?
+ easeIn( p * 2 ) / 2 :
+ 1 - easeIn( p * -2 + 2 ) / 2;
+ };
+});
+
+})();
+
+var effect = $.effects;
+
+
+/*!
+ * jQuery UI Effects Blind 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/blind-effect/
+ */
+
+
+var effectBlind = $.effects.effect.blind = function( o, done ) {
+ // Create element
+ var el = $( this ),
+ rvertical = /up|down|vertical/,
+ rpositivemotion = /up|left|vertical|horizontal/,
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ direction = o.direction || "up",
+ vertical = rvertical.test( direction ),
+ ref = vertical ? "height" : "width",
+ ref2 = vertical ? "top" : "left",
+ motion = rpositivemotion.test( direction ),
+ animation = {},
+ show = mode === "show",
+ wrapper, distance, margin;
+
+ // if already wrapped, the wrapper's properties are my property. #6245
+ if ( el.parent().is( ".ui-effects-wrapper" ) ) {
+ $.effects.save( el.parent(), props );
+ } else {
+ $.effects.save( el, props );
+ }
+ el.show();
+ wrapper = $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+
+ distance = wrapper[ ref ]();
+ margin = parseFloat( wrapper.css( ref2 ) ) || 0;
+
+ animation[ ref ] = show ? distance : 0;
+ if ( !motion ) {
+ el
+ .css( vertical ? "bottom" : "right", 0 )
+ .css( vertical ? "top" : "left", "auto" )
+ .css({ position: "absolute" });
+
+ animation[ ref2 ] = show ? margin : distance + margin;
+ }
+
+ // start at 0 if we are showing
+ if ( show ) {
+ wrapper.css( ref, 0 );
+ if ( !motion ) {
+ wrapper.css( ref2, margin + distance );
+ }
+ }
+
+ // Animate
+ wrapper.animate( animation, {
+ duration: o.duration,
+ easing: o.easing,
+ queue: false,
+ complete: function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Bounce 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/bounce-effect/
+ */
+
+
+var effectBounce = $.effects.effect.bounce = function( o, done ) {
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+
+ // defaults:
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ hide = mode === "hide",
+ show = mode === "show",
+ direction = o.direction || "up",
+ distance = o.distance,
+ times = o.times || 5,
+
+ // number of internal animations
+ anims = times * 2 + ( show || hide ? 1 : 0 ),
+ speed = o.duration / anims,
+ easing = o.easing,
+
+ // utility:
+ ref = ( direction === "up" || direction === "down" ) ?
"top" : "left",
+ motion = ( direction === "up" || direction === "left" ),
+ i,
+ upAnim,
+ downAnim,
+
+ // we will need to re-assemble the queue to stack our animations in place
+ queue = el.queue(),
+ queuelen = queue.length;
+
+ // Avoid touching opacity to prevent clearType and PNG issues in IE
+ if ( show || hide ) {
+ props.push( "opacity" );
+ }
+
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el ); // Create Wrapper
+
+ // default distance for the BIGGEST bounce is the outer Distance / 3
+ if ( !distance ) {
+ distance = el[ ref === "top" ? "outerHeight" :
"outerWidth" ]() / 3;
+ }
+
+ if ( show ) {
+ downAnim = { opacity: 1 };
+ downAnim[ ref ] = 0;
+
+ // if we are showing, force opacity 0 and set the initial position
+ // then do the "first" animation
+ el.css( "opacity", 0 )
+ .css( ref, motion ? -distance * 2 : distance * 2 )
+ .animate( downAnim, speed, easing );
+ }
+
+ // start at the smallest distance if we are hiding
+ if ( hide ) {
+ distance = distance / Math.pow( 2, times - 1 );
+ }
+
+ downAnim = {};
+ downAnim[ ref ] = 0;
+ // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
+ for ( i = 0; i < times; i++ ) {
+ upAnim = {};
+ upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+ el.animate( upAnim, speed, easing )
+ .animate( downAnim, speed, easing );
+
+ distance = hide ? distance * 2 : distance / 2;
+ }
+
+ // Last Bounce when Hiding
+ if ( hide ) {
+ upAnim = { opacity: 0 };
+ upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+ el.animate( upAnim, speed, easing );
+ }
+
+ el.queue(function() {
+ if ( hide ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ });
+
+ // inject all the animations we just queued to be first in line (after
"inprogress")
+ if ( queuelen > 1) {
+ queue.splice.apply( queue,
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+ }
+ el.dequeue();
+
+};
+
+
+/*!
+ * jQuery UI Effects Clip 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/clip-effect/
+ */
+
+
+var effectClip = $.effects.effect.clip = function( o, done ) {
+ // Create element
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+ direction = o.direction || "vertical",
+ vert = direction === "vertical",
+ size = vert ? "height" : "width",
+ position = vert ? "top" : "left",
+ animation = {},
+ wrapper, animate, distance;
+
+ // Save & Show
+ $.effects.save( el, props );
+ el.show();
+
+ // Create Wrapper
+ wrapper = $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+ animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
+ distance = animate[ size ]();
+
+ // Shift
+ if ( show ) {
+ animate.css( size, 0 );
+ animate.css( position, distance / 2 );
+ }
+
+ // Create Animation Object:
+ animation[ size ] = show ? distance : 0;
+ animation[ position ] = show ? 0 : distance / 2;
+
+ // Animate
+ animate.animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( !show ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+
+};
+
+
+/*!
+ * jQuery UI Effects Drop 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/drop-effect/
+ */
+
+
+var effectDrop = $.effects.effect.drop = function( o, done ) {
+
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "opacity", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+ direction = o.direction || "left",
+ ref = ( direction === "up" || direction === "down" ) ?
"top" : "left",
+ motion = ( direction === "up" || direction === "left" ) ?
"pos" : "neg",
+ animation = {
+ opacity: show ? 1 : 0
+ },
+ distance;
+
+ // Adjust
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el );
+
+ distance = o.distance || el[ ref === "top" ? "outerHeight" :
"outerWidth" ]( true ) / 2;
+
+ if ( show ) {
+ el
+ .css( "opacity", 0 )
+ .css( ref, motion === "pos" ? -distance : distance );
+ }
+
+ // Animation
+ animation[ ref ] = ( show ?
+ ( motion === "pos" ? "+=" : "-=" ) :
+ ( motion === "pos" ? "-=" : "+=" ) ) +
+ distance;
+
+ // Animate
+ el.animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Explode 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/explode-effect/
+ */
+
+
+var effectExplode = $.effects.effect.explode = function( o, done ) {
+
+ var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
+ cells = rows,
+ el = $( this ),
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+
+ // show and then visibility:hidden the element before calculating offset
+ offset = el.show().css( "visibility", "hidden" ).offset(),
+
+ // width and height of a piece
+ width = Math.ceil( el.outerWidth() / cells ),
+ height = Math.ceil( el.outerHeight() / rows ),
+ pieces = [],
+
+ // loop
+ i, j, left, top, mx, my;
+
+ // children animate complete:
+ function childComplete() {
+ pieces.push( this );
+ if ( pieces.length === rows * cells ) {
+ animComplete();
+ }
+ }
+
+ // clone the element for each row and cell.
+ for ( i = 0; i < rows ; i++ ) { // ===>
+ top = offset.top + i * height;
+ my = i - ( rows - 1 ) / 2 ;
+
+ for ( j = 0; j < cells ; j++ ) { // |||
+ left = offset.left + j * width;
+ mx = j - ( cells - 1 ) / 2 ;
+
+ // Create a clone of the now hidden main element that will be absolute positioned
+ // within a wrapper div off the -left and -top equal to size of our pieces
+ el
+ .clone()
+ .appendTo( "body" )
+ .wrap( "<div></div>" )
+ .css({
+ position: "absolute",
+ visibility: "visible",
+ left: -j * width,
+ top: -i * height
+ })
+
+ // select the wrapper - make it overflow: hidden and absolute positioned based on
+ // where the original was located +left and +top equal to the size of pieces
+ .parent()
+ .addClass( "ui-effects-explode" )
+ .css({
+ position: "absolute",
+ overflow: "hidden",
+ width: width,
+ height: height,
+ left: left + ( show ? mx * width : 0 ),
+ top: top + ( show ? my * height : 0 ),
+ opacity: show ? 0 : 1
+ }).animate({
+ left: left + ( show ? 0 : mx * width ),
+ top: top + ( show ? 0 : my * height ),
+ opacity: show ? 1 : 0
+ }, o.duration || 500, o.easing, childComplete );
+ }
+ }
+
+ function animComplete() {
+ el.css({
+ visibility: "visible"
+ });
+ $( pieces ).remove();
+ if ( !show ) {
+ el.hide();
+ }
+ done();
+ }
+};
+
+
+/*!
+ * jQuery UI Effects Fade 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/fade-effect/
+ */
+
+
+var effectFade = $.effects.effect.fade = function( o, done ) {
+ var el = $( this ),
+ mode = $.effects.setMode( el, o.mode || "toggle" );
+
+ el.animate({
+ opacity: mode
+ }, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: done
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Fold 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/fold-effect/
+ */
+
+
+var effectFold = $.effects.effect.fold = function( o, done ) {
+
+ // Create element
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+ hide = mode === "hide",
+ size = o.size || 15,
+ percent = /([0-9]+)%/.exec( size ),
+ horizFirst = !!o.horizFirst,
+ widthFirst = show !== horizFirst,
+ ref = widthFirst ? [ "width", "height" ] : [ "height",
"width" ],
+ duration = o.duration / 2,
+ wrapper, distance,
+ animation1 = {},
+ animation2 = {};
+
+ $.effects.save( el, props );
+ el.show();
+
+ // Create Wrapper
+ wrapper = $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+ distance = widthFirst ?
+ [ wrapper.width(), wrapper.height() ] :
+ [ wrapper.height(), wrapper.width() ];
+
+ if ( percent ) {
+ size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
+ }
+ if ( show ) {
+ wrapper.css( horizFirst ? {
+ height: 0,
+ width: size
+ } : {
+ height: size,
+ width: 0
+ });
+ }
+
+ // Animation
+ animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
+ animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
+
+ // Animate
+ wrapper
+ .animate( animation1, duration, o.easing )
+ .animate( animation2, duration, o.easing, function() {
+ if ( hide ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ });
+
+};
+
+
+/*!
+ * jQuery UI Effects Highlight 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/highlight-effect/
+ */
+
+
+var effectHighlight = $.effects.effect.highlight = function( o, done ) {
+ var elem = $( this ),
+ props = [ "backgroundImage", "backgroundColor", "opacity"
],
+ mode = $.effects.setMode( elem, o.mode || "show" ),
+ animation = {
+ backgroundColor: elem.css( "backgroundColor" )
+ };
+
+ if (mode === "hide") {
+ animation.opacity = 0;
+ }
+
+ $.effects.save( elem, props );
+
+ elem
+ .show()
+ .css({
+ backgroundImage: "none",
+ backgroundColor: o.color || "#ffff99"
+ })
+ .animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( mode === "hide" ) {
+ elem.hide();
+ }
+ $.effects.restore( elem, props );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Size 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/size-effect/
+ */
+
+
+var effectSize = $.effects.effect.size = function( o, done ) {
+
+ // Create element
+ var original, baseline, factor,
+ el = $( this ),
+ props0 = [ "position", "top", "bottom", "left",
"right", "width", "height", "overflow",
"opacity" ],
+
+ // Always restore
+ props1 = [ "position", "top", "bottom", "left",
"right", "overflow", "opacity" ],
+
+ // Copy for children
+ props2 = [ "width", "height", "overflow" ],
+ cProps = [ "fontSize" ],
+ vProps = [ "borderTopWidth", "borderBottomWidth",
"paddingTop", "paddingBottom" ],
+ hProps = [ "borderLeftWidth", "borderRightWidth",
"paddingLeft", "paddingRight" ],
+
+ // Set options
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ restore = o.restore || mode !== "effect",
+ scale = o.scale || "both",
+ origin = o.origin || [ "middle", "center" ],
+ position = el.css( "position" ),
+ props = restore ? props0 : props1,
+ zero = {
+ height: 0,
+ width: 0,
+ outerHeight: 0,
+ outerWidth: 0
+ };
+
+ if ( mode === "show" ) {
+ el.show();
+ }
+ original = {
+ height: el.height(),
+ width: el.width(),
+ outerHeight: el.outerHeight(),
+ outerWidth: el.outerWidth()
+ };
+
+ if ( o.mode === "toggle" && mode === "show" ) {
+ el.from = o.to || zero;
+ el.to = o.from || original;
+ } else {
+ el.from = o.from || ( mode === "show" ? zero : original );
+ el.to = o.to || ( mode === "hide" ? zero : original );
+ }
+
+ // Set scaling factor
+ factor = {
+ from: {
+ y: el.from.height / original.height,
+ x: el.from.width / original.width
+ },
+ to: {
+ y: el.to.height / original.height,
+ x: el.to.width / original.width
+ }
+ };
+
+ // Scale the css box
+ if ( scale === "box" || scale === "both" ) {
+
+ // Vertical props scaling
+ if ( factor.from.y !== factor.to.y ) {
+ props = props.concat( vProps );
+ el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
+ el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
+ }
+
+ // Horizontal props scaling
+ if ( factor.from.x !== factor.to.x ) {
+ props = props.concat( hProps );
+ el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
+ el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
+ }
+ }
+
+ // Scale the content
+ if ( scale === "content" || scale === "both" ) {
+
+ // Vertical props scaling
+ if ( factor.from.y !== factor.to.y ) {
+ props = props.concat( cProps ).concat( props2 );
+ el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
+ el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
+ }
+ }
+
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el );
+ el.css( "overflow", "hidden" ).css( el.from );
+
+ // Adjust
+ if (origin) { // Calculate baseline shifts
+ baseline = $.effects.getBaseline( origin, original );
+ el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
+ el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
+ el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
+ el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
+ }
+ el.css( el.from ); // set top & left
+
+ // Animate
+ if ( scale === "content" || scale === "both" ) { // Scale the
children
+
+ // Add margins/font-size
+ vProps = vProps.concat([ "marginTop", "marginBottom"
]).concat(cProps);
+ hProps = hProps.concat([ "marginLeft", "marginRight" ]);
+ props2 = props0.concat(vProps).concat(hProps);
+
+ el.find( "*[width]" ).each( function() {
+ var child = $( this ),
+ c_original = {
+ height: child.height(),
+ width: child.width(),
+ outerHeight: child.outerHeight(),
+ outerWidth: child.outerWidth()
+ };
+ if (restore) {
+ $.effects.save(child, props2);
+ }
+
+ child.from = {
+ height: c_original.height * factor.from.y,
+ width: c_original.width * factor.from.x,
+ outerHeight: c_original.outerHeight * factor.from.y,
+ outerWidth: c_original.outerWidth * factor.from.x
+ };
+ child.to = {
+ height: c_original.height * factor.to.y,
+ width: c_original.width * factor.to.x,
+ outerHeight: c_original.height * factor.to.y,
+ outerWidth: c_original.width * factor.to.x
+ };
+
+ // Vertical props scaling
+ if ( factor.from.y !== factor.to.y ) {
+ child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
+ child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
+ }
+
+ // Horizontal props scaling
+ if ( factor.from.x !== factor.to.x ) {
+ child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
+ child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
+ }
+
+ // Animate children
+ child.css( child.from );
+ child.animate( child.to, o.duration, o.easing, function() {
+
+ // Restore children
+ if ( restore ) {
+ $.effects.restore( child, props2 );
+ }
+ });
+ });
+ }
+
+ // Animate
+ el.animate( el.to, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( el.to.opacity === 0 ) {
+ el.css( "opacity", el.from.opacity );
+ }
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ if ( !restore ) {
+
+ // we need to calculate our new positioning based on the scaling
+ if ( position === "static" ) {
+ el.css({
+ position: "relative",
+ top: el.to.top,
+ left: el.to.left
+ });
+ } else {
+ $.each([ "top", "left" ], function( idx, pos ) {
+ el.css( pos, function( _, str ) {
+ var val = parseInt( str, 10 ),
+ toRef = idx ? el.to.left : el.to.top;
+
+ // if original was "auto", recalculate the new value from wrapper
+ if ( str === "auto" ) {
+ return toRef + "px";
+ }
+
+ return val + toRef + "px";
+ });
+ });
+ }
+ }
+
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+
+};
+
+
+/*!
+ * jQuery UI Effects Scale 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/scale-effect/
+ */
+
+
+var effectScale = $.effects.effect.scale = function( o, done ) {
+
+ // Create element
+ var el = $( this ),
+ options = $.extend( true, {}, o ),
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ percent = parseInt( o.percent, 10 ) ||
+ ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
+ direction = o.direction || "both",
+ origin = o.origin,
+ original = {
+ height: el.height(),
+ width: el.width(),
+ outerHeight: el.outerHeight(),
+ outerWidth: el.outerWidth()
+ },
+ factor = {
+ y: direction !== "horizontal" ? (percent / 100) : 1,
+ x: direction !== "vertical" ? (percent / 100) : 1
+ };
+
+ // We are going to pass this effect to the size effect:
+ options.effect = "size";
+ options.queue = false;
+ options.complete = done;
+
+ // Set default origin and restore for show/hide
+ if ( mode !== "effect" ) {
+ options.origin = origin || [ "middle", "center" ];
+ options.restore = true;
+ }
+
+ options.from = o.from || ( mode === "show" ? {
+ height: 0,
+ width: 0,
+ outerHeight: 0,
+ outerWidth: 0
+ } : original );
+ options.to = {
+ height: original.height * factor.y,
+ width: original.width * factor.x,
+ outerHeight: original.outerHeight * factor.y,
+ outerWidth: original.outerWidth * factor.x
+ };
+
+ // Fade option to support puff
+ if ( options.fade ) {
+ if ( mode === "show" ) {
+ options.from.opacity = 0;
+ options.to.opacity = 1;
+ }
+ if ( mode === "hide" ) {
+ options.from.opacity = 1;
+ options.to.opacity = 0;
+ }
+ }
+
+ // Animate
+ el.effect( options );
+
+};
+
+
+/*!
+ * jQuery UI Effects Puff 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/puff-effect/
+ */
+
+
+var effectPuff = $.effects.effect.puff = function( o, done ) {
+ var elem = $( this ),
+ mode = $.effects.setMode( elem, o.mode || "hide" ),
+ hide = mode === "hide",
+ percent = parseInt( o.percent, 10 ) || 150,
+ factor = percent / 100,
+ original = {
+ height: elem.height(),
+ width: elem.width(),
+ outerHeight: elem.outerHeight(),
+ outerWidth: elem.outerWidth()
+ };
+
+ $.extend( o, {
+ effect: "scale",
+ queue: false,
+ fade: true,
+ mode: mode,
+ complete: done,
+ percent: hide ? percent : 100,
+ from: hide ?
+ original :
+ {
+ height: original.height * factor,
+ width: original.width * factor,
+ outerHeight: original.outerHeight * factor,
+ outerWidth: original.outerWidth * factor
+ }
+ });
+
+ elem.effect( o );
+};
+
+
+/*!
+ * jQuery UI Effects Pulsate 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/pulsate-effect/
+ */
+
+
+var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
+ var elem = $( this ),
+ mode = $.effects.setMode( elem, o.mode || "show" ),
+ show = mode === "show",
+ hide = mode === "hide",
+ showhide = ( show || mode === "hide" ),
+
+ // showing or hiding leaves of the "last" animation
+ anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
+ duration = o.duration / anims,
+ animateTo = 0,
+ queue = elem.queue(),
+ queuelen = queue.length,
+ i;
+
+ if ( show || !elem.is(":visible")) {
+ elem.css( "opacity", 0 ).show();
+ animateTo = 1;
+ }
+
+ // anims - 1 opacity "toggles"
+ for ( i = 1; i < anims; i++ ) {
+ elem.animate({
+ opacity: animateTo
+ }, duration, o.easing );
+ animateTo = 1 - animateTo;
+ }
+
+ elem.animate({
+ opacity: animateTo
+ }, duration, o.easing);
+
+ elem.queue(function() {
+ if ( hide ) {
+ elem.hide();
+ }
+ done();
+ });
+
+ // We just queued up "anims" animations, we need to put them next in the
queue
+ if ( queuelen > 1 ) {
+ queue.splice.apply( queue,
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+ }
+ elem.dequeue();
+};
+
+
+/*!
+ * jQuery UI Effects Shake 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/shake-effect/
+ */
+
+
+var effectShake = $.effects.effect.shake = function( o, done ) {
+
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ direction = o.direction || "left",
+ distance = o.distance || 20,
+ times = o.times || 3,
+ anims = times * 2 + 1,
+ speed = Math.round( o.duration / anims ),
+ ref = (direction === "up" || direction === "down") ?
"top" : "left",
+ positiveMotion = (direction === "up" || direction === "left"),
+ animation = {},
+ animation1 = {},
+ animation2 = {},
+ i,
+
+ // we will need to re-assemble the queue to stack our animations in place
+ queue = el.queue(),
+ queuelen = queue.length;
+
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el );
+
+ // Animation
+ animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
+ animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance *
2;
+ animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance *
2;
+
+ // Animate
+ el.animate( animation, speed, o.easing );
+
+ // Shakes
+ for ( i = 1; i < times; i++ ) {
+ el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
+ }
+ el
+ .animate( animation1, speed, o.easing )
+ .animate( animation, speed / 2, o.easing )
+ .queue(function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ });
+
+ // inject all the animations we just queued to be first in line (after
"inprogress")
+ if ( queuelen > 1) {
+ queue.splice.apply( queue,
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+ }
+ el.dequeue();
+
+};
+
+
+/*!
+ * jQuery UI Effects Slide 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/slide-effect/
+ */
+
+
+var effectSlide = $.effects.effect.slide = function( o, done ) {
+
+ // Create element
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "width", "height" ],
+ mode = $.effects.setMode( el, o.mode || "show" ),
+ show = mode === "show",
+ direction = o.direction || "left",
+ ref = (direction === "up" || direction === "down") ?
"top" : "left",
+ positiveMotion = (direction === "up" || direction === "left"),
+ distance,
+ animation = {};
+
+ // Adjust
+ $.effects.save( el, props );
+ el.show();
+ distance = o.distance || el[ ref === "top" ? "outerHeight" :
"outerWidth" ]( true );
+
+ $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+
+ if ( show ) {
+ el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance)
: distance );
+ }
+
+ // Animation
+ animation[ ref ] = ( show ?
+ ( positiveMotion ? "+=" : "-=") :
+ ( positiveMotion ? "-=" : "+=")) +
+ distance;
+
+ // Animate
+ el.animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Transfer 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/transfer-effect/
+ */
+
+
+var effectTransfer = $.effects.effect.transfer = function( o, done ) {
+ var elem = $( this ),
+ target = $( o.to ),
+ targetFixed = target.css( "position" ) === "fixed",
+ body = $("body"),
+ fixTop = targetFixed ? body.scrollTop() : 0,
+ fixLeft = targetFixed ? body.scrollLeft() : 0,
+ endPosition = target.offset(),
+ animation = {
+ top: endPosition.top - fixTop,
+ left: endPosition.left - fixLeft,
+ height: target.innerHeight(),
+ width: target.innerWidth()
+ },
+ startPosition = elem.offset(),
+ transfer = $( "<div class='ui-effects-transfer'></div>"
)
+ .appendTo( document.body )
+ .addClass( o.className )
+ .css({
+ top: startPosition.top - fixTop,
+ left: startPosition.left - fixLeft,
+ height: elem.innerHeight(),
+ width: elem.innerWidth(),
+ position: targetFixed ? "fixed" : "absolute"
+ })
+ .animate( animation, o.duration, o.easing, function() {
+ transfer.remove();
+ done();
+ });
+};
+
+
+/*!
+ * jQuery UI Progressbar 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/progressbar/
+ */
+
+
+var progressbar = $.widget( "ui.progressbar", {
+ version: "1.11.4",
+ options: {
+ max: 100,
+ value: 0,
+
+ change: null,
+ complete: null
+ },
+
+ min: 0,
+
+ _create: function() {
+ // Constrain initial value
+ this.oldValue = this.options.value = this._constrainedValue();
+
+ this.element
+ .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .attr({
+ // Only set static values, aria-valuenow and aria-valuemax are
+ // set inside _refreshValue()
+ role: "progressbar",
+ "aria-valuemin": this.min
+ });
+
+ this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header
ui-corner-left'></div>" )
+ .appendTo( this.element );
+
+ this._refreshValue();
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+
+ this.valueDiv.remove();
+ },
+
+ value: function( newValue ) {
+ if ( newValue === undefined ) {
+ return this.options.value;
+ }
+
+ this.options.value = this._constrainedValue( newValue );
+ this._refreshValue();
+ },
+
+ _constrainedValue: function( newValue ) {
+ if ( newValue === undefined ) {
+ newValue = this.options.value;
+ }
+
+ this.indeterminate = newValue === false;
+
+ // sanitize value
+ if ( typeof newValue !== "number" ) {
+ newValue = 0;
+ }
+
+ return this.indeterminate ? false :
+ Math.min( this.options.max, Math.max( this.min, newValue ) );
+ },
+
+ _setOptions: function( options ) {
+ // Ensure "value" option is set after other values (like max)
+ var value = options.value;
+ delete options.value;
+
+ this._super( options );
+
+ this.options.value = this._constrainedValue( value );
+ this._refreshValue();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "max" ) {
+ // Don't allow a max less than min
+ value = Math.max( this.min, value );
+ }
+ if ( key === "disabled" ) {
+ this.element
+ .toggleClass( "ui-state-disabled", !!value )
+ .attr( "aria-disabled", value );
+ }
+ this._super( key, value );
+ },
+
+ _percentage: function() {
+ return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / (
this.options.max - this.min );
+ },
+
+ _refreshValue: function() {
+ var value = this.options.value,
+ percentage = this._percentage();
+
+ this.valueDiv
+ .toggle( this.indeterminate || value > this.min )
+ .toggleClass( "ui-corner-right", value === this.options.max )
+ .width( percentage.toFixed(0) + "%" );
+
+ this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate
);
+
+ if ( this.indeterminate ) {
+ this.element.removeAttr( "aria-valuenow" );
+ if ( !this.overlayDiv ) {
+ this.overlayDiv = $( "<div
class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
+ }
+ } else {
+ this.element.attr({
+ "aria-valuemax": this.options.max,
+ "aria-valuenow": value
+ });
+ if ( this.overlayDiv ) {
+ this.overlayDiv.remove();
+ this.overlayDiv = null;
+ }
+ }
+
+ if ( this.oldValue !== value ) {
+ this.oldValue = value;
+ this._trigger( "change" );
+ }
+ if ( value === this.options.max ) {
+ this._trigger( "complete" );
+ }
+ }
+});
+
+
+/*!
+ * jQuery UI Selectable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/selectable/
+ */
+
+
+var selectable = $.widget("ui.selectable", $.ui.mouse, {
+ version: "1.11.4",
+ options: {
+ appendTo: "body",
+ autoRefresh: true,
+ distance: 0,
+ filter: "*",
+ tolerance: "touch",
+
+ // callbacks
+ selected: null,
+ selecting: null,
+ start: null,
+ stop: null,
+ unselected: null,
+ unselecting: null
+ },
+ _create: function() {
+ var selectees,
+ that = this;
+
+ this.element.addClass("ui-selectable");
+
+ this.dragged = false;
+
+ // cache selectee children based on filter
+ this.refresh = function() {
+ selectees = $(that.options.filter, that.element[0]);
+ selectees.addClass("ui-selectee");
+ selectees.each(function() {
+ var $this = $(this),
+ pos = $this.offset();
+ $.data(this, "selectable-item", {
+ element: this,
+ $element: $this,
+ left: pos.left,
+ top: pos.top,
+ right: pos.left + $this.outerWidth(),
+ bottom: pos.top + $this.outerHeight(),
+ startselected: false,
+ selected: $this.hasClass("ui-selected"),
+ selecting: $this.hasClass("ui-selecting"),
+ unselecting: $this.hasClass("ui-unselecting")
+ });
+ });
+ };
+ this.refresh();
+
+ this.selectees = selectees.addClass("ui-selectee");
+
+ this._mouseInit();
+
+ this.helper = $("<div
class='ui-selectable-helper'></div>");
+ },
+
+ _destroy: function() {
+ this.selectees
+ .removeClass("ui-selectee")
+ .removeData("selectable-item");
+ this.element
+ .removeClass("ui-selectable ui-selectable-disabled");
+ this._mouseDestroy();
+ },
+
+ _mouseStart: function(event) {
+ var that = this,
+ options = this.options;
+
+ this.opos = [ event.pageX, event.pageY ];
+
+ if (this.options.disabled) {
+ return;
+ }
+
+ this.selectees = $(options.filter, this.element[0]);
+
+ this._trigger("start", event);
+
+ $(options.appendTo).append(this.helper);
+ // position helper (lasso)
+ this.helper.css({
+ "left": event.pageX,
+ "top": event.pageY,
+ "width": 0,
+ "height": 0
+ });
+
+ if (options.autoRefresh) {
+ this.refresh();
+ }
+
+ this.selectees.filter(".ui-selected").each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.startselected = true;
+ if (!event.metaKey && !event.ctrlKey) {
+ selectee.$element.removeClass("ui-selected");
+ selectee.selected = false;
+ selectee.$element.addClass("ui-unselecting");
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ });
+
+ $(event.target).parents().addBack().each(function() {
+ var doSelect,
+ selectee = $.data(this, "selectable-item");
+ if (selectee) {
+ doSelect = (!event.metaKey && !event.ctrlKey) ||
!selectee.$element.hasClass("ui-selected");
+ selectee.$element
+ .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+ .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+ selectee.unselecting = !doSelect;
+ selectee.selecting = doSelect;
+ selectee.selected = doSelect;
+ // selectable (UN)SELECTING callback
+ if (doSelect) {
+ that._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ } else {
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ return false;
+ }
+ });
+
+ },
+
+ _mouseDrag: function(event) {
+
+ this.dragged = true;
+
+ if (this.options.disabled) {
+ return;
+ }
+
+ var tmp,
+ that = this,
+ options = this.options,
+ x1 = this.opos[0],
+ y1 = this.opos[1],
+ x2 = event.pageX,
+ y2 = event.pageY;
+
+ if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
+ if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
+ this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
+
+ this.selectees.each(function() {
+ var selectee = $.data(this, "selectable-item"),
+ hit = false;
+
+ //prevent helper from being selected if appendTo: selectable
+ if (!selectee || selectee.element === that.element[0]) {
+ return;
+ }
+
+ if (options.tolerance === "touch") {
+ hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 ||
selectee.bottom < y1) );
+ } else if (options.tolerance === "fit") {
+ hit = (selectee.left > x1 && selectee.right < x2 &&
selectee.top > y1 && selectee.bottom < y2);
+ }
+
+ if (hit) {
+ // SELECT
+ if (selectee.selected) {
+ selectee.$element.removeClass("ui-selected");
+ selectee.selected = false;
+ }
+ if (selectee.unselecting) {
+ selectee.$element.removeClass("ui-unselecting");
+ selectee.unselecting = false;
+ }
+ if (!selectee.selecting) {
+ selectee.$element.addClass("ui-selecting");
+ selectee.selecting = true;
+ // selectable SELECTING callback
+ that._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ }
+ } else {
+ // UNSELECT
+ if (selectee.selecting) {
+ if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
+ selectee.$element.removeClass("ui-selecting");
+ selectee.selecting = false;
+ selectee.$element.addClass("ui-selected");
+ selectee.selected = true;
+ } else {
+ selectee.$element.removeClass("ui-selecting");
+ selectee.selecting = false;
+ if (selectee.startselected) {
+ selectee.$element.addClass("ui-unselecting");
+ selectee.unselecting = true;
+ }
+ // selectable UNSELECTING callback
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ if (selectee.selected) {
+ if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
+ selectee.$element.removeClass("ui-selected");
+ selectee.selected = false;
+
+ selectee.$element.addClass("ui-unselecting");
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ }
+ });
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+ var that = this;
+
+ this.dragged = false;
+
+ $(".ui-unselecting", this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass("ui-unselecting");
+ selectee.unselecting = false;
+ selectee.startselected = false;
+ that._trigger("unselected", event, {
+ unselected: selectee.element
+ });
+ });
+ $(".ui-selecting", this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
+ selectee.selecting = false;
+ selectee.selected = true;
+ selectee.startselected = true;
+ that._trigger("selected", event, {
+ selected: selectee.element
+ });
+ });
+ this._trigger("stop", event);
+
+ this.helper.remove();
+
+ return false;
+ }
+
+});
+
+
+/*!
+ * jQuery UI Selectmenu 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/selectmenu
+ */
+
+
+var selectmenu = $.widget( "ui.selectmenu", {
+ version: "1.11.4",
+ defaultElement: "<select>",
+ options: {
+ appendTo: null,
+ disabled: null,
+ icons: {
+ button: "ui-icon-triangle-1-s"
+ },
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ width: null,
+
+ // callbacks
+ change: null,
+ close: null,
+ focus: null,
+ open: null,
+ select: null
+ },
+
+ _create: function() {
+ var selectmenuId = this.element.uniqueId().attr( "id" );
+ this.ids = {
+ element: selectmenuId,
+ button: selectmenuId + "-button",
+ menu: selectmenuId + "-menu"
+ };
+
+ this._drawButton();
+ this._drawMenu();
+
+ if ( this.options.disabled ) {
+ this.disable();
+ }
+ },
+
+ _drawButton: function() {
+ var that = this;
+
+ // Associate existing label with the new button
+ this.label = $( "label[for='" + this.ids.element + "']"
).attr( "for", this.ids.button );
+ this._on( this.label, {
+ click: function( event ) {
+ this.button.focus();
+ event.preventDefault();
+ }
+ });
+
+ // Hide original select element
+ this.element.hide();
+
+ // Create button
+ this.button = $( "<span>", {
+ "class": "ui-selectmenu-button ui-widget ui-state-default
ui-corner-all",
+ tabindex: this.options.disabled ? -1 : 0,
+ id: this.ids.button,
+ role: "combobox",
+ "aria-expanded": "false",
+ "aria-autocomplete": "list",
+ "aria-owns": this.ids.menu,
+ "aria-haspopup": "true"
+ })
+ .insertAfter( this.element );
+
+ $( "<span>", {
+ "class": "ui-icon " + this.options.icons.button
+ })
+ .prependTo( this.button );
+
+ this.buttonText = $( "<span>", {
+ "class": "ui-selectmenu-text"
+ })
+ .appendTo( this.button );
+
+ this._setText( this.buttonText, this.element.find( "option:selected" ).text()
);
+ this._resizeButton();
+
+ this._on( this.button, this._buttonEvents );
+ this.button.one( "focusin", function() {
+
+ // Delay rendering the menu items until the button receives focus.
+ // The menu may have already been rendered via a programmatic open.
+ if ( !that.menuItems ) {
+ that._refreshMenu();
+ }
+ });
+ this._hoverable( this.button );
+ this._focusable( this.button );
+ },
+
+ _drawMenu: function() {
+ var that = this;
+
+ // Create menu
+ this.menu = $( "<ul>", {
+ "aria-hidden": "true",
+ "aria-labelledby": this.ids.button,
+ id: this.ids.menu
+ });
+
+ // Wrap menu
+ this.menuWrap = $( "<div>", {
+ "class": "ui-selectmenu-menu ui-front"
+ })
+ .append( this.menu )
+ .appendTo( this._appendTo() );
+
+ // Initialize menu widget
+ this.menuInstance = this.menu
+ .menu({
+ role: "listbox",
+ select: function( event, ui ) {
+ event.preventDefault();
+
+ // support: IE8
+ // If the item was selected via a click, the text selection
+ // will be destroyed in IE
+ that._setSelection();
+
+ that._select( ui.item.data( "ui-selectmenu-item" ), event );
+ },
+ focus: function( event, ui ) {
+ var item = ui.item.data( "ui-selectmenu-item" );
+
+ // Prevent inital focus from firing and check if its a newly focused item
+ if ( that.focusIndex != null && item.index !== that.focusIndex ) {
+ that._trigger( "focus", event, { item: item } );
+ if ( !that.isOpen ) {
+ that._select( item, event );
+ }
+ }
+ that.focusIndex = item.index;
+
+ that.button.attr( "aria-activedescendant",
+ that.menuItems.eq( item.index ).attr( "id" ) );
+ }
+ })
+ .menu( "instance" );
+
+ // Adjust menu styles to dropdown
+ this.menu
+ .addClass( "ui-corner-bottom" )
+ .removeClass( "ui-corner-all" );
+
+ // Don't close the menu on mouseleave
+ this.menuInstance._off( this.menu, "mouseleave" );
+
+ // Cancel the menu's collapseAll on document click
+ this.menuInstance._closeOnDocumentClick = function() {
+ return false;
+ };
+
+ // Selects often contain empty items, but never contain dividers
+ this.menuInstance._isDivider = function() {
+ return false;
+ };
+ },
+
+ refresh: function() {
+ this._refreshMenu();
+ this._setText( this.buttonText, this._getSelectedItem().text() );
+ if ( !this.options.width ) {
+ this._resizeButton();
+ }
+ },
+
+ _refreshMenu: function() {
+ this.menu.empty();
+
+ var item,
+ options = this.element.find( "option" );
+
+ if ( !options.length ) {
+ return;
+ }
+
+ this._parseOptions( options );
+ this._renderMenu( this.menu, this.items );
+
+ this.menuInstance.refresh();
+ this.menuItems = this.menu.find( "li" ).not(
".ui-selectmenu-optgroup" );
+
+ item = this._getSelectedItem();
+
+ // Update the menu to have the correct item focused
+ this.menuInstance.focus( null, item );
+ this._setAria( item.data( "ui-selectmenu-item" ) );
+
+ // Set disabled state
+ this._setOption( "disabled", this.element.prop( "disabled" ) );
+ },
+
+ open: function( event ) {
+ if ( this.options.disabled ) {
+ return;
+ }
+
+ // If this is the first time the menu is being opened, render the items
+ if ( !this.menuItems ) {
+ this._refreshMenu();
+ } else {
+
+ // Menu clears focus on close, reset focus to selected item
+ this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus"
);
+ this.menuInstance.focus( null, this._getSelectedItem() );
+ }
+
+ this.isOpen = true;
+ this._toggleAttr();
+ this._resizeMenu();
+ this._position();
+
+ this._on( this.document, this._documentClick );
+
+ this._trigger( "open", event );
+ },
+
+ _position: function() {
+ this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
+ },
+
+ close: function( event ) {
+ if ( !this.isOpen ) {
+ return;
+ }
+
+ this.isOpen = false;
+ this._toggleAttr();
+
+ this.range = null;
+ this._off( this.document );
+
+ this._trigger( "close", event );
+ },
+
+ widget: function() {
+ return this.button;
+ },
+
+ menuWidget: function() {
+ return this.menu;
+ },
+
+ _renderMenu: function( ul, items ) {
+ var that = this,
+ currentOptgroup = "";
+
+ $.each( items, function( index, item ) {
+ if ( item.optgroup !== currentOptgroup ) {
+ $( "<li>", {
+ "class": "ui-selectmenu-optgroup ui-menu-divider" +
+ ( item.element.parent( "optgroup" ).prop( "disabled" ) ?
+ " ui-state-disabled" :
+ "" ),
+ text: item.optgroup
+ })
+ .appendTo( ul );
+
+ currentOptgroup = item.optgroup;
+ }
+
+ that._renderItemData( ul, item );
+ });
+ },
+
+ _renderItemData: function( ul, item ) {
+ return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
+ },
+
+ _renderItem: function( ul, item ) {
+ var li = $( "<li>" );
+
+ if ( item.disabled ) {
+ li.addClass( "ui-state-disabled" );
+ }
+ this._setText( li, item.label );
+
+ return li.appendTo( ul );
+ },
+
+ _setText: function( element, value ) {
+ if ( value ) {
+ element.text( value );
+ } else {
+ element.html( " " );
+ }
+ },
+
+ _move: function( direction, event ) {
+ var item, next,
+ filter = ".ui-menu-item";
+
+ if ( this.isOpen ) {
+ item = this.menuItems.eq( this.focusIndex );
+ } else {
+ item = this.menuItems.eq( this.element[ 0 ].selectedIndex );
+ filter += ":not(.ui-state-disabled)";
+ }
+
+ if ( direction === "first" || direction === "last" ) {
+ next = item[ direction === "first" ? "prevAll" :
"nextAll" ]( filter ).eq( -1 );
+ } else {
+ next = item[ direction + "All" ]( filter ).eq( 0 );
+ }
+
+ if ( next.length ) {
+ this.menuInstance.focus( event, next );
+ }
+ },
+
+ _getSelectedItem: function() {
+ return this.menuItems.eq( this.element[ 0 ].selectedIndex );
+ },
+
+ _toggle: function( event ) {
+ this[ this.isOpen ? "close" : "open" ]( event );
+ },
+
+ _setSelection: function() {
+ var selection;
+
+ if ( !this.range ) {
+ return;
+ }
+
+ if ( window.getSelection ) {
+ selection = window.getSelection();
+ selection.removeAllRanges();
+ selection.addRange( this.range );
+
+ // support: IE8
+ } else {
+ this.range.select();
+ }
+
+ // support: IE
+ // Setting the text selection kills the button focus in IE, but
+ // restoring the focus doesn't kill the selection.
+ this.button.focus();
+ },
+
+ _documentClick: {
+ mousedown: function( event ) {
+ if ( !this.isOpen ) {
+ return;
+ }
+
+ if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button
).length ) {
+ this.close( event );
+ }
+ }
+ },
+
+ _buttonEvents: {
+
+ // Prevent text selection from being reset when interacting with the selectmenu
(#10144)
+ mousedown: function() {
+ var selection;
+
+ if ( window.getSelection ) {
+ selection = window.getSelection();
+ if ( selection.rangeCount ) {
+ this.range = selection.getRangeAt( 0 );
+ }
+
+ // support: IE8
+ } else {
+ this.range = document.selection.createRange();
+ }
+ },
+
+ click: function( event ) {
+ this._setSelection();
+ this._toggle( event );
+ },
+
+ keydown: function( event ) {
+ var preventDefault = true;
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.TAB:
+ case $.ui.keyCode.ESCAPE:
+ this.close( event );
+ preventDefault = false;
+ break;
+ case $.ui.keyCode.ENTER:
+ if ( this.isOpen ) {
+ this._selectFocusedItem( event );
+ }
+ break;
+ case $.ui.keyCode.UP:
+ if ( event.altKey ) {
+ this._toggle( event );
+ } else {
+ this._move( "prev", event );
+ }
+ break;
+ case $.ui.keyCode.DOWN:
+ if ( event.altKey ) {
+ this._toggle( event );
+ } else {
+ this._move( "next", event );
+ }
+ break;
+ case $.ui.keyCode.SPACE:
+ if ( this.isOpen ) {
+ this._selectFocusedItem( event );
+ } else {
+ this._toggle( event );
+ }
+ break;
+ case $.ui.keyCode.LEFT:
+ this._move( "prev", event );
+ break;
+ case $.ui.keyCode.RIGHT:
+ this._move( "next", event );
+ break;
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.PAGE_UP:
+ this._move( "first", event );
+ break;
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_DOWN:
+ this._move( "last", event );
+ break;
+ default:
+ this.menu.trigger( event );
+ preventDefault = false;
+ }
+
+ if ( preventDefault ) {
+ event.preventDefault();
+ }
+ }
+ },
+
+ _selectFocusedItem: function( event ) {
+ var item = this.menuItems.eq( this.focusIndex );
+ if ( !item.hasClass( "ui-state-disabled" ) ) {
+ this._select( item.data( "ui-selectmenu-item" ), event );
+ }
+ },
+
+ _select: function( item, event ) {
+ var oldIndex = this.element[ 0 ].selectedIndex;
+
+ // Change native select element
+ this.element[ 0 ].selectedIndex = item.index;
+ this._setText( this.buttonText, item.label );
+ this._setAria( item );
+ this._trigger( "select", event, { item: item } );
+
+ if ( item.index !== oldIndex ) {
+ this._trigger( "change", event, { item: item } );
+ }
+
+ this.close( event );
+ },
+
+ _setAria: function( item ) {
+ var id = this.menuItems.eq( item.index ).attr( "id" );
+
+ this.button.attr({
+ "aria-labelledby": id,
+ "aria-activedescendant": id
+ });
+ this.menu.attr( "aria-activedescendant", id );
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "icons" ) {
+ this.button.find( "span.ui-icon" )
+ .removeClass( this.options.icons.button )
+ .addClass( value.button );
+ }
+
+ this._super( key, value );
+
+ if ( key === "appendTo" ) {
+ this.menuWrap.appendTo( this._appendTo() );
+ }
+
+ if ( key === "disabled" ) {
+ this.menuInstance.option( "disabled", value );
+ this.button
+ .toggleClass( "ui-state-disabled", value )
+ .attr( "aria-disabled", value );
+
+ this.element.prop( "disabled", value );
+ if ( value ) {
+ this.button.attr( "tabindex", -1 );
+ this.close();
+ } else {
+ this.button.attr( "tabindex", 0 );
+ }
+ }
+
+ if ( key === "width" ) {
+ this._resizeButton();
+ }
+ },
+
+ _appendTo: function() {
+ var element = this.options.appendTo;
+
+ if ( element ) {
+ element = element.jquery || element.nodeType ?
+ $( element ) :
+ this.document.find( element ).eq( 0 );
+ }
+
+ if ( !element || !element[ 0 ] ) {
+ element = this.element.closest( ".ui-front" );
+ }
+
+ if ( !element.length ) {
+ element = this.document[ 0 ].body;
+ }
+
+ return element;
+ },
+
+ _toggleAttr: function() {
+ this.button
+ .toggleClass( "ui-corner-top", this.isOpen )
+ .toggleClass( "ui-corner-all", !this.isOpen )
+ .attr( "aria-expanded", this.isOpen );
+ this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
+ this.menu.attr( "aria-hidden", !this.isOpen );
+ },
+
+ _resizeButton: function() {
+ var width = this.options.width;
+
+ if ( !width ) {
+ width = this.element.show().outerWidth();
+ this.element.hide();
+ }
+
+ this.button.outerWidth( width );
+ },
+
+ _resizeMenu: function() {
+ this.menu.outerWidth( Math.max(
+ this.button.outerWidth(),
+
+ // support: IE10
+ // IE10 wraps long text (possibly a rounding bug)
+ // so we add 1px to avoid the wrapping
+ this.menu.width( "" ).outerWidth() + 1
+ ) );
+ },
+
+ _getCreateOptions: function() {
+ return { disabled: this.element.prop( "disabled" ) };
+ },
+
+ _parseOptions: function( options ) {
+ var data = [];
+ options.each(function( index, item ) {
+ var option = $( item ),
+ optgroup = option.parent( "optgroup" );
+ data.push({
+ element: option,
+ index: index,
+ value: option.val(),
+ label: option.text(),
+ optgroup: optgroup.attr( "label" ) || "",
+ disabled: optgroup.prop( "disabled" ) || option.prop( "disabled"
)
+ });
+ });
+ this.items = data;
+ },
+
+ _destroy: function() {
+ this.menuWrap.remove();
+ this.button.remove();
+ this.element.show();
+ this.element.removeUniqueId();
+ this.label.attr( "for", this.ids.element );
+ }
+});
+
+
+/*!
+ * jQuery UI Slider 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/slider/
+ */
+
+
+var slider = $.widget( "ui.slider", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "slide",
+
+ options: {
+ animate: false,
+ distance: 0,
+ max: 100,
+ min: 0,
+ orientation: "horizontal",
+ range: false,
+ step: 1,
+ value: 0,
+ values: null,
+
+ // callbacks
+ change: null,
+ slide: null,
+ start: null,
+ stop: null
+ },
+
+ // number of pages in a slider
+ // (how many times can you page up/down to go through the whole range)
+ numPages: 5,
+
+ _create: function() {
+ this._keySliding = false;
+ this._mouseSliding = false;
+ this._animateOff = true;
+ this._handleIndex = null;
+ this._detectOrientation();
+ this._mouseInit();
+ this._calculateNewMax();
+
+ this.element
+ .addClass( "ui-slider" +
+ " ui-slider-" + this.orientation +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all");
+
+ this._refresh();
+ this._setOption( "disabled", this.options.disabled );
+
+ this._animateOff = false;
+ },
+
+ _refresh: function() {
+ this._createRange();
+ this._createHandles();
+ this._setupEvents();
+ this._refreshValue();
+ },
+
+ _createHandles: function() {
+ var i, handleCount,
+ options = this.options,
+ existingHandles = this.element.find( ".ui-slider-handle" ).addClass(
"ui-state-default ui-corner-all" ),
+ handle = "<span class='ui-slider-handle ui-state-default
ui-corner-all' tabindex='0'></span>",
+ handles = [];
+
+ handleCount = ( options.values && options.values.length ) || 1;
+
+ if ( existingHandles.length > handleCount ) {
+ existingHandles.slice( handleCount ).remove();
+ existingHandles = existingHandles.slice( 0, handleCount );
+ }
+
+ for ( i = existingHandles.length; i < handleCount; i++ ) {
+ handles.push( handle );
+ }
+
+ this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo(
this.element ) );
+
+ this.handle = this.handles.eq( 0 );
+
+ this.handles.each(function( i ) {
+ $( this ).data( "ui-slider-handle-index", i );
+ });
+ },
+
+ _createRange: function() {
+ var options = this.options,
+ classes = "";
+
+ if ( options.range ) {
+ if ( options.range === true ) {
+ if ( !options.values ) {
+ options.values = [ this._valueMin(), this._valueMin() ];
+ } else if ( options.values.length && options.values.length !== 2 ) {
+ options.values = [ options.values[0], options.values[0] ];
+ } else if ( $.isArray( options.values ) ) {
+ options.values = options.values.slice(0);
+ }
+ }
+
+ if ( !this.range || !this.range.length ) {
+ this.range = $( "<div></div>" )
+ .appendTo( this.element );
+
+ classes = "ui-slider-range" +
+ // note: this isn't the most fittingly semantic framework class for this
element,
+ // but worked best visually with a variety of themes
+ " ui-widget-header ui-corner-all";
+ } else {
+ this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
+ // Handle range switching from true to min/max
+ .css({
+ "left": "",
+ "bottom": ""
+ });
+ }
+
+ this.range.addClass( classes +
+ ( ( options.range === "min" || options.range === "max" ) ? "
ui-slider-range-" + options.range : "" ) );
+ } else {
+ if ( this.range ) {
+ this.range.remove();
+ }
+ this.range = null;
+ }
+ },
+
+ _setupEvents: function() {
+ this._off( this.handles );
+ this._on( this.handles, this._handleEvents );
+ this._hoverable( this.handles );
+ this._focusable( this.handles );
+ },
+
+ _destroy: function() {
+ this.handles.remove();
+ if ( this.range ) {
+ this.range.remove();
+ }
+
+ this.element
+ .removeClass( "ui-slider" +
+ " ui-slider-horizontal" +
+ " ui-slider-vertical" +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" );
+
+ this._mouseDestroy();
+ },
+
+ _mouseCapture: function( event ) {
+ var position, normValue, distance, closestHandle, index, allowed, offset,
mouseOverHandle,
+ that = this,
+ o = this.options;
+
+ if ( o.disabled ) {
+ return false;
+ }
+
+ this.elementSize = {
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight()
+ };
+ this.elementOffset = this.element.offset();
+
+ position = { x: event.pageX, y: event.pageY };
+ normValue = this._normValueFromMouse( position );
+ distance = this._valueMax() - this._valueMin() + 1;
+ this.handles.each(function( i ) {
+ var thisDistance = Math.abs( normValue - that.values(i) );
+ if (( distance > thisDistance ) ||
+ ( distance === thisDistance &&
+ (i === that._lastChangedValue || that.values(i) === o.min ))) {
+ distance = thisDistance;
+ closestHandle = $( this );
+ index = i;
+ }
+ });
+
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return false;
+ }
+ this._mouseSliding = true;
+
+ this._handleIndex = index;
+
+ closestHandle
+ .addClass( "ui-state-active" )
+ .focus();
+
+ offset = closestHandle.offset();
+ mouseOverHandle = !$( event.target ).parents().addBack().is(
".ui-slider-handle" );
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+ top: event.pageY - offset.top -
+ ( closestHandle.height() / 2 ) -
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+ };
+
+ if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+ this._slide( event, index, normValue );
+ }
+ this._animateOff = true;
+ return true;
+ },
+
+ _mouseStart: function() {
+ return true;
+ },
+
+ _mouseDrag: function( event ) {
+ var position = { x: event.pageX, y: event.pageY },
+ normValue = this._normValueFromMouse( position );
+
+ this._slide( event, this._handleIndex, normValue );
+
+ return false;
+ },
+
+ _mouseStop: function( event ) {
+ this.handles.removeClass( "ui-state-active" );
+ this._mouseSliding = false;
+
+ this._stop( event, this._handleIndex );
+ this._change( event, this._handleIndex );
+
+ this._handleIndex = null;
+ this._clickOffset = null;
+ this._animateOff = false;
+
+ return false;
+ },
+
+ _detectOrientation: function() {
+ this.orientation = ( this.options.orientation === "vertical" ) ?
"vertical" : "horizontal";
+ },
+
+ _normValueFromMouse: function( position ) {
+ var pixelTotal,
+ pixelMouse,
+ percentMouse,
+ valueTotal,
+ valueMouse;
+
+ if ( this.orientation === "horizontal" ) {
+ pixelTotal = this.elementSize.width;
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ?
this._clickOffset.left : 0 );
+ } else {
+ pixelTotal = this.elementSize.height;
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ?
this._clickOffset.top : 0 );
+ }
+
+ percentMouse = ( pixelMouse / pixelTotal );
+ if ( percentMouse > 1 ) {
+ percentMouse = 1;
+ }
+ if ( percentMouse < 0 ) {
+ percentMouse = 0;
+ }
+ if ( this.orientation === "vertical" ) {
+ percentMouse = 1 - percentMouse;
+ }
+
+ valueTotal = this._valueMax() - this._valueMin();
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+ return this._trimAlignValue( valueMouse );
+ },
+
+ _start: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+ return this._trigger( "start", event, uiHash );
+ },
+
+ _slide: function( event, index, newVal ) {
+ var otherVal,
+ newValues,
+ allowed;
+
+ if ( this.options.values && this.options.values.length ) {
+ otherVal = this.values( index ? 0 : 1 );
+
+ if ( ( this.options.values.length === 2 && this.options.range === true )
&&
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal
< otherVal ) )
+ ) {
+ newVal = otherVal;
+ }
+
+ if ( newVal !== this.values( index ) ) {
+ newValues = this.values();
+ newValues[ index ] = newVal;
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal,
+ values: newValues
+ } );
+ otherVal = this.values( index ? 0 : 1 );
+ if ( allowed !== false ) {
+ this.values( index, newVal );
+ }
+ }
+ } else {
+ if ( newVal !== this.value() ) {
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal
+ } );
+ if ( allowed !== false ) {
+ this.value( newVal );
+ }
+ }
+ }
+ },
+
+ _stop: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "stop", event, uiHash );
+ },
+
+ _change: function( event, index ) {
+ if ( !this._keySliding && !this._mouseSliding ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ //store the last changed value index for reference when handles overlap
+ this._lastChangedValue = index;
+
+ this._trigger( "change", event, uiHash );
+ }
+ },
+
+ value: function( newValue ) {
+ if ( arguments.length ) {
+ this.options.value = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, 0 );
+ return;
+ }
+
+ return this._value();
+ },
+
+ values: function( index, newValue ) {
+ var vals,
+ newValues,
+ i;
+
+ if ( arguments.length > 1 ) {
+ this.options.values[ index ] = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, index );
+ return;
+ }
+
+ if ( arguments.length ) {
+ if ( $.isArray( arguments[ 0 ] ) ) {
+ vals = this.options.values;
+ newValues = arguments[ 0 ];
+ for ( i = 0; i < vals.length; i += 1 ) {
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
+ this._change( null, i );
+ }
+ this._refreshValue();
+ } else {
+ if ( this.options.values && this.options.values.length ) {
+ return this._values( index );
+ } else {
+ return this.value();
+ }
+ }
+ } else {
+ return this._values();
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var i,
+ valsLength = 0;
+
+ if ( key === "range" && this.options.range === true ) {
+ if ( value === "min" ) {
+ this.options.value = this._values( 0 );
+ this.options.values = null;
+ } else if ( value === "max" ) {
+ this.options.value = this._values( this.options.values.length - 1 );
+ this.options.values = null;
+ }
+ }
+
+ if ( $.isArray( this.options.values ) ) {
+ valsLength = this.options.values.length;
+ }
+
+ if ( key === "disabled" ) {
+ this.element.toggleClass( "ui-state-disabled", !!value );
+ }
+
+ this._super( key, value );
+
+ switch ( key ) {
+ case "orientation":
+ this._detectOrientation();
+ this.element
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+ .addClass( "ui-slider-" + this.orientation );
+ this._refreshValue();
+
+ // Reset positioning from previous orientation
+ this.handles.css( value === "horizontal" ? "bottom" :
"left", "" );
+ break;
+ case "value":
+ this._animateOff = true;
+ this._refreshValue();
+ this._change( null, 0 );
+ this._animateOff = false;
+ break;
+ case "values":
+ this._animateOff = true;
+ this._refreshValue();
+ for ( i = 0; i < valsLength; i += 1 ) {
+ this._change( null, i );
+ }
+ this._animateOff = false;
+ break;
+ case "step":
+ case "min":
+ case "max":
+ this._animateOff = true;
+ this._calculateNewMax();
+ this._refreshValue();
+ this._animateOff = false;
+ break;
+ case "range":
+ this._animateOff = true;
+ this._refresh();
+ this._animateOff = false;
+ break;
+ }
+ },
+
+ //internal value getter
+ // _value() returns value trimmed by min and max, aligned by step
+ _value: function() {
+ var val = this.options.value;
+ val = this._trimAlignValue( val );
+
+ return val;
+ },
+
+ //internal values getter
+ // _values() returns array of values trimmed by min and max, aligned by step
+ // _values( index ) returns single value trimmed by min and max, aligned by step
+ _values: function( index ) {
+ var val,
+ vals,
+ i;
+
+ if ( arguments.length ) {
+ val = this.options.values[ index ];
+ val = this._trimAlignValue( val );
+
+ return val;
+ } else if ( this.options.values && this.options.values.length ) {
+ // .slice() creates a copy of the array
+ // this copy gets trimmed by min and max and then returned
+ vals = this.options.values.slice();
+ for ( i = 0; i < vals.length; i += 1) {
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
+ }
+
+ return vals;
+ } else {
+ return [];
+ }
+ },
+
+ // returns the step-aligned value that val is closest to, between (inclusive) min and
max
+ _trimAlignValue: function( val ) {
+ if ( val <= this._valueMin() ) {
+ return this._valueMin();
+ }
+ if ( val >= this._valueMax() ) {
+ return this._valueMax();
+ }
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
+ valModStep = (val - this._valueMin()) % step,
+ alignValue = val - valModStep;
+
+ if ( Math.abs(valModStep) * 2 >= step ) {
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
+ }
+
+ // Since JavaScript has problems with large floats, round
+ // the final value to 5 digits after the decimal point (see #4124)
+ return parseFloat( alignValue.toFixed(5) );
+ },
+
+ _calculateNewMax: function() {
+ var max = this.options.max,
+ min = this._valueMin(),
+ step = this.options.step,
+ aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) *
step;
+ max = aboveMin + min;
+ this.max = parseFloat( max.toFixed( this._precision() ) );
+ },
+
+ _precision: function() {
+ var precision = this._precisionOf( this.options.step );
+ if ( this.options.min !== null ) {
+ precision = Math.max( precision, this._precisionOf( this.options.min ) );
+ }
+ return precision;
+ },
+
+ _precisionOf: function( num ) {
+ var str = num.toString(),
+ decimal = str.indexOf( "." );
+ return decimal === -1 ? 0 : str.length - decimal - 1;
+ },
+
+ _valueMin: function() {
+ return this.options.min;
+ },
+
+ _valueMax: function() {
+ return this.max;
+ },
+
+ _refreshValue: function() {
+ var lastValPercent, valPercent, value, valueMin, valueMax,
+ oRange = this.options.range,
+ o = this.options,
+ that = this,
+ animate = ( !this._animateOff ) ? o.animate : false,
+ _set = {};
+
+ if ( this.options.values && this.options.values.length ) {
+ this.handles.each(function( i ) {
+ valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() -
that._valueMin() ) * 100;
+ _set[ that.orientation === "horizontal" ? "left" :
"bottom" ] = valPercent + "%";
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set,
o.animate );
+ if ( that.options.range === true ) {
+ if ( that.orientation === "horizontal" ) {
+ if ( i === 0 ) {
+ that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
left: valPercent + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ that.range[ animate ? "animate" : "css" ]( { width: (
valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ } else {
+ if ( i === 0 ) {
+ that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
bottom: ( valPercent ) + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ that.range[ animate ? "animate" : "css" ]( { height: (
valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+ lastValPercent = valPercent;
+ });
+ } else {
+ value = this.value();
+ valueMin = this._valueMin();
+ valueMax = this._valueMax();
+ valPercent = ( valueMax !== valueMin ) ?
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+ 0;
+ _set[ this.orientation === "horizontal" ? "left" :
"bottom" ] = valPercent + "%";
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set,
o.animate );
+
+ if ( oRange === "min" && this.orientation === "horizontal"
) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width:
valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "horizontal"
) {
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 -
valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ if ( oRange === "min" && this.orientation === "vertical" )
{
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height:
valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "vertical" )
{
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 -
valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ },
+
+ _handleEvents: {
+ keydown: function( event ) {
+ var allowed, curVal, newVal, step,
+ index = $( event.target ).data( "ui-slider-handle-index" );
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_UP:
+ case $.ui.keyCode.PAGE_DOWN:
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ event.preventDefault();
+ if ( !this._keySliding ) {
+ this._keySliding = true;
+ $( event.target ).addClass( "ui-state-active" );
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return;
+ }
+ }
+ break;
+ }
+
+ step = this.options.step;
+ if ( this.options.values && this.options.values.length ) {
+ curVal = newVal = this.values( index );
+ } else {
+ curVal = newVal = this.value();
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ newVal = this._valueMin();
+ break;
+ case $.ui.keyCode.END:
+ newVal = this._valueMax();
+ break;
+ case $.ui.keyCode.PAGE_UP:
+ newVal = this._trimAlignValue(
+ curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
+ );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ newVal = this._trimAlignValue(
+ curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ if ( curVal === this._valueMax() ) {
+ return;
+ }
+ newVal = this._trimAlignValue( curVal + step );
+ break;
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ if ( curVal === this._valueMin() ) {
+ return;
+ }
+ newVal = this._trimAlignValue( curVal - step );
+ break;
+ }
+
+ this._slide( event, index, newVal );
+ },
+ keyup: function( event ) {
+ var index = $( event.target ).data( "ui-slider-handle-index" );
+
+ if ( this._keySliding ) {
+ this._keySliding = false;
+ this._stop( event, index );
+ this._change( event, index );
+ $( event.target ).removeClass( "ui-state-active" );
+ }
+ }
+ }
+});
+
+
+/*!
+ * jQuery UI Sortable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/sortable/
+ */
+
+
+var sortable = $.widget("ui.sortable", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "sort",
+ ready: false,
+ options: {
+ appendTo: "parent",
+ axis: false,
+ connectWith: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ dropOnEmpty: true,
+ forcePlaceholderSize: false,
+ forceHelperSize: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ items: "> *",
+ opacity: false,
+ placeholder: false,
+ revert: false,
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ scope: "default",
+ tolerance: "intersect",
+ zIndex: 1000,
+
+ // callbacks
+ activate: null,
+ beforeStop: null,
+ change: null,
+ deactivate: null,
+ out: null,
+ over: null,
+ receive: null,
+ remove: null,
+ sort: null,
+ start: null,
+ stop: null,
+ update: null
+ },
+
+ _isOverAxis: function( x, reference, size ) {
+ return ( x >= reference ) && ( x < ( reference + size ) );
+ },
+
+ _isFloating: function( item ) {
+ return (/left|right/).test(item.css("float")) ||
(/inline|table-cell/).test(item.css("display"));
+ },
+
+ _create: function() {
+ this.containerCache = {};
+ this.element.addClass("ui-sortable");
+
+ //Get the items
+ this.refresh();
+
+ //Let's determine the parent's offset
+ this.offset = this.element.offset();
+
+ //Initialize mouse events for interaction
+ this._mouseInit();
+
+ this._setHandleClassName();
+
+ //We're ready to go
+ this.ready = true;
+
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+
+ if ( key === "handle" ) {
+ this._setHandleClassName();
+ }
+ },
+
+ _setHandleClassName: function() {
+ this.element.find( ".ui-sortable-handle" ).removeClass(
"ui-sortable-handle" );
+ $.each( this.items, function() {
+ ( this.instance.options.handle ?
+ this.item.find( this.instance.options.handle ) : this.item )
+ .addClass( "ui-sortable-handle" );
+ });
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-sortable ui-sortable-disabled" )
+ .find( ".ui-sortable-handle" )
+ .removeClass( "ui-sortable-handle" );
+ this._mouseDestroy();
+
+ for ( var i = this.items.length - 1; i >= 0; i-- ) {
+ this.items[i].item.removeData(this.widgetName + "-item");
+ }
+
+ return this;
+ },
+
+ _mouseCapture: function(event, overrideHandle) {
+ var currentItem = null,
+ validHandle = false,
+ that = this;
+
+ if (this.reverting) {
+ return false;
+ }
+
+ if(this.options.disabled || this.options.type === "static") {
+ return false;
+ }
+
+ //We have to refresh the items data once first
+ this._refreshItems(event);
+
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
+ $(event.target).parents().each(function() {
+ if($.data(this, that.widgetName + "-item") === that) {
+ currentItem = $(this);
+ return false;
+ }
+ });
+ if($.data(event.target, that.widgetName + "-item") === that) {
+ currentItem = $(event.target);
+ }
+
+ if(!currentItem) {
+ return false;
+ }
+ if(this.options.handle && !overrideHandle) {
+ $(this.options.handle, currentItem).find("*").addBack().each(function() {
+ if(this === event.target) {
+ validHandle = true;
+ }
+ });
+ if(!validHandle) {
+ return false;
+ }
+ }
+
+ this.currentItem = currentItem;
+ this._removeCurrentsFromItems();
+ return true;
+
+ },
+
+ _mouseStart: function(event, overrideHandle, noActivation) {
+
+ var i, body,
+ o = this.options;
+
+ this.currentContainer = this;
+
+ //We only need to call refreshPositions, because the refreshItems call has been moved
to mouseCapture
+ this.refreshPositions();
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Get the next scrolling parent
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.currentItem.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus
the actual position calculation - only used for relative positioned helper
+ });
+
+ // Only after we got the offset, we can change the helper's position to absolute
+ // TODO: Still need to figure out a way to make relative sorting possible
+ this.helper.css("position", "absolute");
+ this.cssPosition = this.helper.css("position");
+
+ //Generate the original position
+ this.originalPosition = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Cache the former DOM position
+ this.domPosition = { prev: this.currentItem.prev()[0], parent:
this.currentItem.parent()[0] };
+
+ //If the helper is not the original, hide the original so it's not playing any role
during the drag, won't cause anything bad this way
+ if(this.helper[0] !== this.currentItem[0]) {
+ this.currentItem.hide();
+ }
+
+ //Create the placeholder
+ this._createPlaceholder();
+
+ //Set a containment if given in the options
+ if(o.containment) {
+ this._setContainment();
+ }
+
+ if( o.cursor && o.cursor !== "auto" ) { // cursor option
+ body = this.document.find( "body" );
+
+ // support: IE
+ this.storedCursor = body.css( "cursor" );
+ body.css( "cursor", o.cursor );
+
+ this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+"
!important; }</style>" ).appendTo( body );
+ }
+
+ if(o.opacity) { // opacity option
+ if (this.helper.css("opacity")) {
+ this._storedOpacity = this.helper.css("opacity");
+ }
+ this.helper.css("opacity", o.opacity);
+ }
+
+ if(o.zIndex) { // zIndex option
+ if (this.helper.css("zIndex")) {
+ this._storedZIndex = this.helper.css("zIndex");
+ }
+ this.helper.css("zIndex", o.zIndex);
+ }
+
+ //Prepare scrolling
+ if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName
!== "HTML") {
+ this.overflowOffset = this.scrollParent.offset();
+ }
+
+ //Call callbacks
+ this._trigger("start", event, this._uiHash());
+
+ //Recache the helper size
+ if(!this._preserveHelperProportions) {
+ this._cacheHelperProportions();
+ }
+
+
+ //Post "activate" events to possible containers
+ if( !noActivation ) {
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
+ this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
+ }
+ }
+
+ //Prepare possible droppables
+ if($.ui.ddmanager) {
+ $.ui.ddmanager.current = this;
+ }
+
+ if ($.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ this.dragging = true;
+
+ this.helper.addClass("ui-sortable-helper");
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be
visible before getting its correct position
+ return true;
+
+ },
+
+ _mouseDrag: function(event) {
+ var i, item, itemElement, intersection,
+ o = this.options,
+ scrolled = false;
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ if (!this.lastPositionAbs) {
+ this.lastPositionAbs = this.positionAbs;
+ }
+
+ //Do scrolling
+ if(this.options.scroll) {
+ if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName
!== "HTML") {
+
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY <
o.scrollSensitivity) {
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop +
o.scrollSpeed;
+ } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop -
o.scrollSpeed;
+ }
+
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX <
o.scrollSensitivity) {
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft +
o.scrollSpeed;
+ } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft -
o.scrollSpeed;
+ }
+
+ } else {
+
+ if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
+ scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
+ } else if(this.window.height() - (event.pageY - this.document.scrollTop()) <
o.scrollSensitivity) {
+ scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
+ }
+
+ if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
+ scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
+ } else if(this.window.width() - (event.pageX - this.document.scrollLeft()) <
o.scrollSensitivity) {
+ scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
+ }
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+ }
+
+ //Regenerate the absolute position used for position checks
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Set the helper position
+ if(!this.options.axis || this.options.axis !== "y") {
+ this.helper[0].style.left = this.position.left+"px";
+ }
+ if(!this.options.axis || this.options.axis !== "x") {
+ this.helper[0].style.top = this.position.top+"px";
+ }
+
+ //Rearrange
+ for (i = this.items.length - 1; i >= 0; i--) {
+
+ //Cache variables and intersection, continue if no intersection
+ item = this.items[i];
+ itemElement = item.item[0];
+ intersection = this._intersectsWithPointer(item);
+ if (!intersection) {
+ continue;
+ }
+
+ // Only put the placeholder inside the current Container, skip all
+ // items from other containers. This works because when moving
+ // an item from one container to another the
+ // currentContainer is switched before the placeholder is moved.
+ //
+ // Without this, moving items in "sub-sortables" can cause
+ // the placeholder to jitter between the outer and inner container.
+ if (item.instance !== this.currentContainer) {
+ continue;
+ }
+
+ // cannot intersect with itself
+ // no useless actions that have been done before
+ // no action if the item moved is the parent of the item checked
+ if (itemElement !== this.currentItem[0] &&
+ this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !==
itemElement &&
+ !$.contains(this.placeholder[0], itemElement) &&
+ (this.options.type === "semi-dynamic" ? !$.contains(this.element[0],
itemElement) : true)
+ ) {
+
+ this.direction = intersection === 1 ? "down" : "up";
+
+ if (this.options.tolerance === "pointer" ||
this._intersectsWithSides(item)) {
+ this._rearrange(event, item);
+ } else {
+ break;
+ }
+
+ this._trigger("change", event, this._uiHash());
+ break;
+ }
+ }
+
+ //Post events to containers
+ this._contactContainers(event);
+
+ //Interconnect with droppables
+ if($.ui.ddmanager) {
+ $.ui.ddmanager.drag(this, event);
+ }
+
+ //Call callbacks
+ this._trigger("sort", event, this._uiHash());
+
+ this.lastPositionAbs = this.positionAbs;
+ return false;
+
+ },
+
+ _mouseStop: function(event, noPropagation) {
+
+ if(!event) {
+ return;
+ }
+
+ //If we are using droppables, inform the manager about the drop
+ if ($.ui.ddmanager && !this.options.dropBehaviour) {
+ $.ui.ddmanager.drop(this, event);
+ }
+
+ if(this.options.revert) {
+ var that = this,
+ cur = this.placeholder.offset(),
+ axis = this.options.axis,
+ animation = {};
+
+ if ( !axis || axis === "x" ) {
+ animation.left = cur.left - this.offset.parent.left - this.margins.left +
(this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
+ }
+ if ( !axis || axis === "y" ) {
+ animation.top = cur.top - this.offset.parent.top - this.margins.top +
(this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
+ }
+ this.reverting = true;
+ $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500,
function() {
+ that._clear(event);
+ });
+ } else {
+ this._clear(event, noPropagation);
+ }
+
+ return false;
+
+ },
+
+ cancel: function() {
+
+ if(this.dragging) {
+
+ this._mouseUp({ target: null });
+
+ if(this.options.helper === "original") {
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ //Post deactivating events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ this.containers[i]._trigger("deactivate", null, this._uiHash(this));
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", null, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ if (this.placeholder) {
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it
unbinds ALL events from the original node!
+ if(this.placeholder[0].parentNode) {
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+ }
+ if(this.options.helper !== "original" && this.helper &&
this.helper[0].parentNode) {
+ this.helper.remove();
+ }
+
+ $.extend(this, {
+ helper: null,
+ dragging: false,
+ reverting: false,
+ _noFinalSort: null
+ });
+
+ if(this.domPosition.prev) {
+ $(this.domPosition.prev).after(this.currentItem);
+ } else {
+ $(this.domPosition.parent).prepend(this.currentItem);
+ }
+ }
+
+ return this;
+
+ },
+
+ serialize: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected),
+ str = [];
+ o = o || {};
+
+ $(items).each(function() {
+ var res = ($(o.item || this).attr(o.attribute || "id") ||
"").match(o.expression || (/(.+)[\-=_](.+)/));
+ if (res) {
+ str.push((o.key || res[1]+"[]")+"="+(o.key &&
o.expression ? res[1] : res[2]));
+ }
+ });
+
+ if(!str.length && o.key) {
+ str.push(o.key + "=");
+ }
+
+ return str.join("&");
+
+ },
+
+ toArray: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected),
+ ret = [];
+
+ o = o || {};
+
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id")
|| ""); });
+ return ret;
+
+ },
+
+ /* Be careful with the following core functions */
+ _intersectsWith: function(item) {
+
+ var x1 = this.positionAbs.left,
+ x2 = x1 + this.helperProportions.width,
+ y1 = this.positionAbs.top,
+ y2 = y1 + this.helperProportions.height,
+ l = item.left,
+ r = l + item.width,
+ t = item.top,
+ b = t + item.height,
+ dyClick = this.offset.click.top,
+ dxClick = this.offset.click.left,
+ isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick )
> t && ( y1 + dyClick ) < b ),
+ isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick )
> l && ( x1 + dxClick ) < r ),
+ isOverElement = isOverElementHeight && isOverElementWidth;
+
+ if ( this.options.tolerance === "pointer" ||
+ this.options.forcePointerForContainers ||
+ (this.options.tolerance !== "pointer" &&
this.helperProportions[this.floating ? "width" : "height"] >
item[this.floating ? "width" : "height"])
+ ) {
+ return isOverElement;
+ } else {
+
+ return (l < x1 + (this.helperProportions.width / 2) && // Right Half
+ x2 - (this.helperProportions.width / 2) < r && // Left Half
+ t < y1 + (this.helperProportions.height / 2) && // Bottom Half
+ y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+ }
+ },
+
+ _intersectsWithPointer: function(item) {
+
+ var isOverElementHeight = (this.options.axis === "x") ||
this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+ isOverElementWidth = (this.options.axis === "y") ||
this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+ isOverElement = isOverElementHeight && isOverElementWidth,
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (!isOverElement) {
+ return false;
+ }
+
+ return this.floating ?
+ ( ((horizontalDirection && horizontalDirection === "right") ||
verticalDirection === "down") ? 2 : 1 )
+ : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
+
+ },
+
+ _intersectsWithSides: function(item) {
+
+ var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top,
item.top + (item.height/2), item.height),
+ isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left,
item.left + (item.width/2), item.width),
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (this.floating && horizontalDirection) {
+ return ((horizontalDirection === "right" && isOverRightHalf) ||
(horizontalDirection === "left" && !isOverRightHalf));
+ } else {
+ return verticalDirection && ((verticalDirection === "down"
&& isOverBottomHalf) || (verticalDirection === "up" &&
!isOverBottomHalf));
+ }
+
+ },
+
+ _getDragVerticalDirection: function() {
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
+ return delta !== 0 && (delta > 0 ? "down" : "up");
+ },
+
+ _getDragHorizontalDirection: function() {
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
+ return delta !== 0 && (delta > 0 ? "right" : "left");
+ },
+
+ refresh: function(event) {
+ this._refreshItems(event);
+ this._setHandleClassName();
+ this.refreshPositions();
+ return this;
+ },
+
+ _connectWith: function() {
+ var options = this.options;
+ return options.connectWith.constructor === String ? [options.connectWith] :
options.connectWith;
+ },
+
+ _getItemsAsjQuery: function(connected) {
+
+ var i, j, cur, inst,
+ items = [],
+ queries = [],
+ connectWith = this._connectWith();
+
+ if(connectWith && connected) {
+ for (i = connectWith.length - 1; i >= 0; i--){
+ cur = $(connectWith[i], this.document[0]);
+ for ( j = cur.length - 1; j >= 0; j--){
+ inst = $.data(cur[j], this.widgetFullName);
+ if(inst && inst !== this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ?
inst.options.items.call(inst.element) : $(inst.options.items,
inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
inst]);
+ }
+ }
+ }
+ }
+
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element,
null, { options: this.options, item: this.currentItem }) : $(this.options.items,
this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
this]);
+
+ function addItems() {
+ items.push( this );
+ }
+ for (i = queries.length - 1; i >= 0; i--){
+ queries[i][0].each( addItems );
+ }
+
+ return $(items);
+
+ },
+
+ _removeCurrentsFromItems: function() {
+
+ var list = this.currentItem.find(":data(" + this.widgetName +
"-item)");
+
+ this.items = $.grep(this.items, function (item) {
+ for (var j=0; j < list.length; j++) {
+ if(list[j] === item.item[0]) {
+ return false;
+ }
+ }
+ return true;
+ });
+
+ },
+
+ _refreshItems: function(event) {
+
+ this.items = [];
+ this.containers = [this];
+
+ var i, j, cur, inst, targetData, _queries, item, queriesLength,
+ items = this.items,
+ queries = [[$.isFunction(this.options.items) ?
this.options.items.call(this.element[0], event, { item: this.currentItem }) :
$(this.options.items, this.element), this]],
+ connectWith = this._connectWith();
+
+ if(connectWith && this.ready) { //Shouldn't be run the first time through
due to massive slow-down
+ for (i = connectWith.length - 1; i >= 0; i--){
+ cur = $(connectWith[i], this.document[0]);
+ for (j = cur.length - 1; j >= 0; j--){
+ inst = $.data(cur[j], this.widgetFullName);
+ if(inst && inst !== this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ?
inst.options.items.call(inst.element[0], event, { item: this.currentItem }) :
$(inst.options.items, inst.element), inst]);
+ this.containers.push(inst);
+ }
+ }
+ }
+ }
+
+ for (i = queries.length - 1; i >= 0; i--) {
+ targetData = queries[i][1];
+ _queries = queries[i][0];
+
+ for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+ item = $(_queries[j]);
+
+ item.data(this.widgetName + "-item", targetData); // Data for target
checking (mouse manager)
+
+ items.push({
+ item: item,
+ instance: targetData,
+ width: 0, height: 0,
+ left: 0, top: 0
+ });
+ }
+ }
+
+ },
+
+ refreshPositions: function(fast) {
+
+ // Determine whether items are being displayed horizontally
+ this.floating = this.items.length ?
+ this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
+ false;
+
+ //This has to be redone because due to the item being moved out/into the offsetParent,
the offsetParent's position will change
+ if(this.offsetParent && this.helper) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ var i, item, t, p;
+
+ for (i = this.items.length - 1; i >= 0; i--){
+ item = this.items[i];
+
+ //We ignore calculating positions of all connected containers when we're not over
them
+ if(item.instance !== this.currentContainer && this.currentContainer &&
item.item[0] !== this.currentItem[0]) {
+ continue;
+ }
+
+ t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) :
item.item;
+
+ if (!fast) {
+ item.width = t.outerWidth();
+ item.height = t.outerHeight();
+ }
+
+ p = t.offset();
+ item.left = p.left;
+ item.top = p.top;
+ }
+
+ if(this.options.custom && this.options.custom.refreshContainers) {
+ this.options.custom.refreshContainers.call(this);
+ } else {
+ for (i = this.containers.length - 1; i >= 0; i--){
+ p = this.containers[i].element.offset();
+ this.containers[i].containerCache.left = p.left;
+ this.containers[i].containerCache.top = p.top;
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+ }
+ }
+
+ return this;
+ },
+
+ _createPlaceholder: function(that) {
+ that = that || this;
+ var className,
+ o = that.options;
+
+ if(!o.placeholder || o.placeholder.constructor === String) {
+ className = o.placeholder;
+ o.placeholder = {
+ element: function() {
+
+ var nodeName = that.currentItem[0].nodeName.toLowerCase(),
+ element = $( "<" + nodeName + ">", that.document[0] )
+ .addClass(className || that.currentItem[0].className+"
ui-sortable-placeholder")
+ .removeClass("ui-sortable-helper");
+
+ if ( nodeName === "tbody" ) {
+ that._createTrPlaceholder(
+ that.currentItem.find( "tr" ).eq( 0 ),
+ $( "<tr>", that.document[ 0 ] ).appendTo( element )
+ );
+ } else if ( nodeName === "tr" ) {
+ that._createTrPlaceholder( that.currentItem, element );
+ } else if ( nodeName === "img" ) {
+ element.attr( "src", that.currentItem.attr( "src" ) );
+ }
+
+ if ( !className ) {
+ element.css( "visibility", "hidden" );
+ }
+
+ return element;
+ },
+ update: function(container, p) {
+
+ // 1. If a className is set as 'placeholder option, we don't force sizes -
the class is responsible for that
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a
class name is specified
+ if(className && !o.forcePlaceholderSize) {
+ return;
+ }
+
+ //If the element doesn't have a actual height by itself (without styles coming
from a stylesheet), it receives the inline height from the dragged item
+ if(!p.height()) { p.height(that.currentItem.innerHeight() -
parseInt(that.currentItem.css("paddingTop")||0, 10) -
parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
+ if(!p.width()) { p.width(that.currentItem.innerWidth() -
parseInt(that.currentItem.css("paddingLeft")||0, 10) -
parseInt(that.currentItem.css("paddingRight")||0, 10)); }
+ }
+ };
+ }
+
+ //Create the placeholder
+ that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
+
+ //Append it after the actual current item
+ that.currentItem.after(that.placeholder);
+
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+ o.placeholder.update(that, that.placeholder);
+
+ },
+
+ _createTrPlaceholder: function( sourceTr, targetTr ) {
+ var that = this;
+
+ sourceTr.children().each(function() {
+ $( "<td> </td>", that.document[ 0 ] )
+ .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
+ .appendTo( targetTr );
+ });
+ },
+
+ _contactContainers: function(event) {
+ var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
floating, axis,
+ innermostContainer = null,
+ innermostIndex = null;
+
+ // get innermost container that intersects with item
+ for (i = this.containers.length - 1; i >= 0; i--) {
+
+ // never consider a container that's located within the item itself
+ if($.contains(this.currentItem[0], this.containers[i].element[0])) {
+ continue;
+ }
+
+ if(this._intersectsWith(this.containers[i].containerCache)) {
+
+ // if we've already found a container and it's more "inner" than
this, then continue
+ if(innermostContainer && $.contains(this.containers[i].element[0],
innermostContainer.element[0])) {
+ continue;
+ }
+
+ innermostContainer = this.containers[i];
+ innermostIndex = i;
+
+ } else {
+ // container doesn't intersect. trigger "out" event if necessary
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", event, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ // if no intersecting containers found, return
+ if(!innermostContainer) {
+ return;
+ }
+
+ // move the item into the container if it's not there already
+ if(this.containers.length === 1) {
+ if (!this.containers[innermostIndex].containerCache.over) {
+ this.containers[innermostIndex]._trigger("over", event,
this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+ } else {
+
+ //When entering a new container, we will find the item with the least distance and
append our item near it
+ dist = 10000;
+ itemWithLeastDistance = null;
+ floating = innermostContainer.floating || this._isFloating(this.currentItem);
+ posProperty = floating ? "left" : "top";
+ sizeProperty = floating ? "width" : "height";
+ axis = floating ? "clientX" : "clientY";
+
+ for (j = this.items.length - 1; j >= 0; j--) {
+ if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
+ continue;
+ }
+ if(this.items[j].item[0] === this.currentItem[0]) {
+ continue;
+ }
+
+ cur = this.items[j].item.offset()[posProperty];
+ nearBottom = false;
+ if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
+ nearBottom = true;
+ }
+
+ if ( Math.abs( event[ axis ] - cur ) < dist ) {
+ dist = Math.abs( event[ axis ] - cur );
+ itemWithLeastDistance = this.items[ j ];
+ this.direction = nearBottom ? "up": "down";
+ }
+ }
+
+ //Check if dropOnEmpty is enabled
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
+ return;
+ }
+
+ if(this.currentContainer === this.containers[innermostIndex]) {
+ if ( !this.currentContainer.containerCache.over ) {
+ this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash()
);
+ this.currentContainer.containerCache.over = 1;
+ }
+ return;
+ }
+
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) :
this._rearrange(event, null, this.containers[innermostIndex].element, true);
+ this._trigger("change", event, this._uiHash());
+ this.containers[innermostIndex]._trigger("change", event,
this._uiHash(this));
+ this.currentContainer = this.containers[innermostIndex];
+
+ //Update the placeholder
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+ this.containers[innermostIndex]._trigger("over", event,
this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options,
+ helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event,
this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() :
this.currentItem);
+
+ //Add the helper to the DOM if that didn't happen already
+ if(!helper.parents("body").length) {
+ $(o.appendTo !== "parent" ? o.appendTo :
this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+ }
+
+ if(helper[0] === this.currentItem[0]) {
+ this._storedCSS = { width: this.currentItem[0].style.width, height:
this.currentItem[0].style.height, position: this.currentItem.css("position"),
top: this.currentItem.css("top"), left: this.currentItem.css("left")
};
+ }
+
+ if(!helper[0].style.width || o.forceHelperSize) {
+ helper.width(this.currentItem.width());
+ }
+ if(!helper[0].style.height || o.forceHelperSize) {
+ helper.height(this.currentItem.height());
+ }
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj === "string") {
+ obj = obj.split(" ");
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ("left" in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ("right" in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right +
this.margins.left;
+ }
+ if ("top" in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ("bottom" in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom +
this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since
the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based
on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent
isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent,
and never recalculated upon drag
+ if(this.cssPosition === "absolute" && this.scrollParent[0] !==
this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ // This needs to be actually done for all browsers, since pageX/pageY includes this
information
+ // with an ugly IE fix
+ if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName
&& this.offsetParent[0].tagName.toLowerCase() === "html" &&
$.ui.ie)) {
+ po = { top: 0, left: 0 };
+ }
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) ||
0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition === "relative") {
+ var p = this.currentItem.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) +
this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) +
this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var ce, co, over,
+ o = this.options;
+ if(o.containment === "parent") {
+ o.containment = this.helper[0].parentNode;
+ }
+ if(o.containment === "document" || o.containment === "window") {
+ this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ o.containment === "document" ? this.document.width() : this.window.width()
- this.helperProportions.width - this.margins.left,
+ (o.containment === "document" ? this.document.width() :
this.window.height() || this.document[0].body.parentNode.scrollHeight) -
this.helperProportions.height - this.margins.top
+ ];
+ }
+
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
+ ce = $(o.containment)[0];
+ co = $(o.containment).offset();
+ over = ($(ce).css("overflow") !== "hidden");
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) +
(parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) +
(parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) -
(parseInt($(ce).css("borderLeftWidth"),10) || 0) -
(parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width -
this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) -
(parseInt($(ce).css("borderTopWidth"),10) || 0) -
(parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height -
this.margins.top
+ ];
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) {
+ pos = this.position;
+ }
+ var mod = d === "absolute" ? 1 : -1,
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0]
!== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ?
this.offsetParent : this.scrollParent,
+ scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top + // The absolute mouse position
+ this.offset.relative.top * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.top * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : (
scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left + // The absolute mouse position
+ this.offset.relative.left * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.left * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() :
scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var top, left,
+ o = this.options,
+ pageX = event.pageX,
+ pageY = event.pageY,
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0]
!== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ?
this.offsetParent : this.scrollParent, scrollIsRootNode =
(/(html|body)/i).test(scroll[0].tagName);
+
+ // This is another very weird special case that only happens for relative elements:
+ // 1. If the css position is relative
+ // 2. and the scroll parent is the document or similar to the offset parent
+ // we have to refresh the relative offset during the scroll so there are no jumps
+ if(this.cssPosition === "relative" && !(this.scrollParent[0] !==
this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
+ this.offset.relative = this._getRelativeOffset();
+ }
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for
options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) {
+ pageX = this.containment[0] + this.offset.click.left;
+ }
+ if(event.pageY - this.offset.click.top < this.containment[1]) {
+ pageY = this.containment[1] + this.offset.click.top;
+ }
+ if(event.pageX - this.offset.click.left > this.containment[2]) {
+ pageX = this.containment[2] + this.offset.click.left;
+ }
+ if(event.pageY - this.offset.click.top > this.containment[3]) {
+ pageY = this.containment[3] + this.offset.click.top;
+ }
+ }
+
+ if(o.grid) {
+ top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) *
o.grid[1];
+ pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1]
&& top - this.offset.click.top <= this.containment[3]) ? top : ((top -
this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) :
top;
+
+ left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) *
o.grid[0];
+ pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0]
&& left - this.offset.click.left <= this.containment[2]) ? left : ((left -
this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0]))
: left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY - // The absolute mouse position
+ this.offset.click.top - // Click offset (relative to the element)
+ this.offset.relative.top - // Only for relative positioned nodes: Relative
offset from element to offset parent
+ this.offset.parent.top + // The offsetParent's offset without borders
(offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : (
scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX - // The absolute mouse position
+ this.offset.click.left - // Click offset (relative to the element)
+ this.offset.relative.left - // Only for relative positioned nodes: Relative
offset from element to offset parent
+ this.offset.parent.left + // The offsetParent's offset without borders
(offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() :
scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _rearrange: function(event, i, a, hardRefresh) {
+
+ a ? a[0].appendChild(this.placeholder[0]) :
i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction ===
"down" ? i.item[0] : i.item[0].nextSibling));
+
+ //Various things done here to improve the performance:
+ // 1. we create a setTimeout, that calls refreshPositions
+ // 2. on the instance, we have a counter variable, that get's higher after every
append
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if
it's still the same
+ // 4. this lets only the last addition to the timeout stack through
+ this.counter = this.counter ? ++this.counter : 1;
+ var counter = this.counter;
+
+ this._delay(function() {
+ if(counter === this.counter) {
+ this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on
mousemove
+ }
+ });
+
+ },
+
+ _clear: function(event, noPropagation) {
+
+ this.reverting = false;
+ // We delay all events that have to be triggered to after the point where the
placeholder has been removed and
+ // everything else normalized again
+ var i,
+ delayedTriggers = [];
+
+ // We first have to update the dom position of the actual currentItem
+ // Note: don't do it if the current item is already removed (by a user), or it gets
reappended (see #4088)
+ if(!this._noFinalSort && this.currentItem.parent().length) {
+ this.placeholder.before(this.currentItem);
+ }
+ this._noFinalSort = null;
+
+ if(this.helper[0] === this.currentItem[0]) {
+ for(i in this._storedCSS) {
+ if(this._storedCSS[i] === "auto" || this._storedCSS[i] ===
"static") {
+ this._storedCSS[i] = "";
+ }
+ }
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ if(this.fromOutside && !noPropagation) {
+ delayedTriggers.push(function(event) { this._trigger("receive", event,
this._uiHash(this.fromOutside)); });
+ }
+ if((this.fromOutside || this.domPosition.prev !==
this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent
!== this.currentItem.parent()[0]) && !noPropagation) {
+ delayedTriggers.push(function(event) { this._trigger("update", event,
this._uiHash()); }); //Trigger update callback if the DOM position has changed
+ }
+
+ // Check if the items Container has Changed and trigger appropriate
+ // events.
+ if (this !== this.currentContainer) {
+ if(!noPropagation) {
+ delayedTriggers.push(function(event) { this._trigger("remove", event,
this._uiHash()); });
+ delayedTriggers.push((function(c) { return function(event) {
c._trigger("receive", event, this._uiHash(this)); }; }).call(this,
this.currentContainer));
+ delayedTriggers.push((function(c) { return function(event) {
c._trigger("update", event, this._uiHash(this)); }; }).call(this,
this.currentContainer));
+ }
+ }
+
+
+ //Post events to containers
+ function delayEvent( type, instance, container ) {
+ return function( event ) {
+ container._trigger( type, event, instance._uiHash( instance ) );
+ };
+ }
+ for (i = this.containers.length - 1; i >= 0; i--){
+ if (!noPropagation) {
+ delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ]
) );
+ }
+ if(this.containers[i].containerCache.over) {
+ delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ //Do what was originally in plugins
+ if ( this.storedCursor ) {
+ this.document.find( "body" ).css( "cursor", this.storedCursor );
+ this.storedStylesheet.remove();
+ }
+ if(this._storedOpacity) {
+ this.helper.css("opacity", this._storedOpacity);
+ }
+ if(this._storedZIndex) {
+ this.helper.css("zIndex", this._storedZIndex === "auto" ?
"" : this._storedZIndex);
+ }
+
+ this.dragging = false;
+
+ if(!noPropagation) {
+ this._trigger("beforeStop", event, this._uiHash());
+ }
+
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it
unbinds ALL events from the original node!
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+ if ( !this.cancelHelperRemoval ) {
+ if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
+ this.helper.remove();
+ }
+ this.helper = null;
+ }
+
+ if(!noPropagation) {
+ for (i=0; i < delayedTriggers.length; i++) {
+ delayedTriggers[i].call(this, event);
+ } //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+
+ this.fromOutside = false;
+ return !this.cancelHelperRemoval;
+
+ },
+
+ _trigger: function() {
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+ this.cancel();
+ }
+ },
+
+ _uiHash: function(_inst) {
+ var inst = _inst || this;
+ return {
+ helper: inst.helper,
+ placeholder: inst.placeholder || $([]),
+ position: inst.position,
+ originalPosition: inst.originalPosition,
+ offset: inst.positionAbs,
+ item: inst.currentItem,
+ sender: _inst ? _inst.element : null
+ };
+ }
+
+});
+
+
+/*!
+ * jQuery UI Spinner 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/spinner/
+ */
+
+
+function spinner_modifier( fn ) {
+ return function() {
+ var previous = this.element.val();
+ fn.apply( this, arguments );
+ this._refresh();
+ if ( previous !== this.element.val() ) {
+ this._trigger( "change" );
+ }
+ };
+}
+
+var spinner = $.widget( "ui.spinner", {
+ version: "1.11.4",
+ defaultElement: "<input>",
+ widgetEventPrefix: "spin",
+ options: {
+ culture: null,
+ icons: {
+ down: "ui-icon-triangle-1-s",
+ up: "ui-icon-triangle-1-n"
+ },
+ incremental: true,
+ max: null,
+ min: null,
+ numberFormat: null,
+ page: 10,
+ step: 1,
+
+ change: null,
+ spin: null,
+ start: null,
+ stop: null
+ },
+
+ _create: function() {
+ // handle string values that need to be parsed
+ this._setOption( "max", this.options.max );
+ this._setOption( "min", this.options.min );
+ this._setOption( "step", this.options.step );
+
+ // Only format if there is a value, prevents the field from being marked
+ // as invalid in Firefox, see #9573.
+ if ( this.value() !== "" ) {
+ // Format the value, but don't constrain.
+ this._value( this.element.val(), true );
+ }
+
+ this._draw();
+ this._on( this._events );
+ this._refresh();
+
+ // turning off autocomplete prevents the browser from remembering the
+ // value when navigating through history, so we re-enable autocomplete
+ // if the page is unloaded before the widget is destroyed. #7790
+ this._on( this.window, {
+ beforeunload: function() {
+ this.element.removeAttr( "autocomplete" );
+ }
+ });
+ },
+
+ _getCreateOptions: function() {
+ var options = {},
+ element = this.element;
+
+ $.each( [ "min", "max", "step" ], function( i, option )
{
+ var value = element.attr( option );
+ if ( value !== undefined && value.length ) {
+ options[ option ] = value;
+ }
+ });
+
+ return options;
+ },
+
+ _events: {
+ keydown: function( event ) {
+ if ( this._start( event ) && this._keydown( event ) ) {
+ event.preventDefault();
+ }
+ },
+ keyup: "_stop",
+ focus: function() {
+ this.previous = this.element.val();
+ },
+ blur: function( event ) {
+ if ( this.cancelBlur ) {
+ delete this.cancelBlur;
+ return;
+ }
+
+ this._stop();
+ this._refresh();
+ if ( this.previous !== this.element.val() ) {
+ this._trigger( "change", event );
+ }
+ },
+ mousewheel: function( event, delta ) {
+ if ( !delta ) {
+ return;
+ }
+ if ( !this.spinning && !this._start( event ) ) {
+ return false;
+ }
+
+ this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
+ clearTimeout( this.mousewheelTimer );
+ this.mousewheelTimer = this._delay(function() {
+ if ( this.spinning ) {
+ this._stop( event );
+ }
+ }, 100 );
+ event.preventDefault();
+ },
+ "mousedown .ui-spinner-button": function( event ) {
+ var previous;
+
+ // We never want the buttons to have focus; whenever the user is
+ // interacting with the spinner, the focus should be on the input.
+ // If the input is focused then this.previous is properly set from
+ // when the input first received focus. If the input is not focused
+ // then we need to set this.previous based on the value before spinning.
+ previous = this.element[0] === this.document[0].activeElement ?
+ this.previous : this.element.val();
+ function checkFocus() {
+ var isActive = this.element[0] === this.document[0].activeElement;
+ if ( !isActive ) {
+ this.element.focus();
+ this.previous = previous;
+ // support: IE
+ // IE sets focus asynchronously, so we need to check if focus
+ // moved off of the input because the user clicked on the button.
+ this._delay(function() {
+ this.previous = previous;
+ });
+ }
+ }
+
+ // ensure focus is on (or stays on) the text field
+ event.preventDefault();
+ checkFocus.call( this );
+
+ // support: IE
+ // IE doesn't prevent moving focus even with event.preventDefault()
+ // so we set a flag to know when we should ignore the blur event
+ // and check (again) if focus moved off of the input.
+ this.cancelBlur = true;
+ this._delay(function() {
+ delete this.cancelBlur;
+ checkFocus.call( this );
+ });
+
+ if ( this._start( event ) === false ) {
+ return;
+ }
+
+ this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1
: -1, event );
+ },
+ "mouseup .ui-spinner-button": "_stop",
+ "mouseenter .ui-spinner-button": function( event ) {
+ // button will add ui-state-active if mouse was down while mouseleave and kept down
+ if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
+ return;
+ }
+
+ if ( this._start( event ) === false ) {
+ return false;
+ }
+ this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1
: -1, event );
+ },
+ // TODO: do we really want to consider this a stop?
+ // shouldn't we just stop the repeater and wait until mouseup before
+ // we trigger the stop event?
+ "mouseleave .ui-spinner-button": "_stop"
+ },
+
+ _draw: function() {
+ var uiSpinner = this.uiSpinner = this.element
+ .addClass( "ui-spinner-input" )
+ .attr( "autocomplete", "off" )
+ .wrap( this._uiSpinnerHtml() )
+ .parent()
+ // add buttons
+ .append( this._buttonHtml() );
+
+ this.element.attr( "role", "spinbutton" );
+
+ // button bindings
+ this.buttons = uiSpinner.find( ".ui-spinner-button" )
+ .attr( "tabIndex", -1 )
+ .button()
+ .removeClass( "ui-corner-all" );
+
+ // IE 6 doesn't understand height: 50% for the buttons
+ // unless the wrapper has an explicit height
+ if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
+ uiSpinner.height() > 0 ) {
+ uiSpinner.height( uiSpinner.height() );
+ }
+
+ // disable spinner if element was already disabled
+ if ( this.options.disabled ) {
+ this.disable();
+ }
+ },
+
+ _keydown: function( event ) {
+ var options = this.options,
+ keyCode = $.ui.keyCode;
+
+ switch ( event.keyCode ) {
+ case keyCode.UP:
+ this._repeat( null, 1, event );
+ return true;
+ case keyCode.DOWN:
+ this._repeat( null, -1, event );
+ return true;
+ case keyCode.PAGE_UP:
+ this._repeat( null, options.page, event );
+ return true;
+ case keyCode.PAGE_DOWN:
+ this._repeat( null, -options.page, event );
+ return true;
+ }
+
+ return false;
+ },
+
+ _uiSpinnerHtml: function() {
+ return "<span class='ui-spinner ui-widget ui-widget-content
ui-corner-all'></span>";
+ },
+
+ _buttonHtml: function() {
+ return "" +
+ "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
+ "<span class='ui-icon " + this.options.icons.up +
"'>▲</span>" +
+ "</a>" +
+ "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"
+
+ "<span class='ui-icon " + this.options.icons.down +
"'>▼</span>" +
+ "</a>";
+ },
+
+ _start: function( event ) {
+ if ( !this.spinning && this._trigger( "start", event ) === false ) {
+ return false;
+ }
+
+ if ( !this.counter ) {
+ this.counter = 1;
+ }
+ this.spinning = true;
+ return true;
+ },
+
+ _repeat: function( i, steps, event ) {
+ i = i || 500;
+
+ clearTimeout( this.timer );
+ this.timer = this._delay(function() {
+ this._repeat( 40, steps, event );
+ }, i );
+
+ this._spin( steps * this.options.step, event );
+ },
+
+ _spin: function( step, event ) {
+ var value = this.value() || 0;
+
+ if ( !this.counter ) {
+ this.counter = 1;
+ }
+
+ value = this._adjustValue( value + step * this._increment( this.counter ) );
+
+ if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !==
false) {
+ this._value( value );
+ this.counter++;
+ }
+ },
+
+ _increment: function( i ) {
+ var incremental = this.options.incremental;
+
+ if ( incremental ) {
+ return $.isFunction( incremental ) ?
+ incremental( i ) :
+ Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
+ }
+
+ return 1;
+ },
+
+ _precision: function() {
+ var precision = this._precisionOf( this.options.step );
+ if ( this.options.min !== null ) {
+ precision = Math.max( precision, this._precisionOf( this.options.min ) );
+ }
+ return precision;
+ },
+
+ _precisionOf: function( num ) {
+ var str = num.toString(),
+ decimal = str.indexOf( "." );
+ return decimal === -1 ? 0 : str.length - decimal - 1;
+ },
+
+ _adjustValue: function( value ) {
+ var base, aboveMin,
+ options = this.options;
+
+ // make sure we're at a valid step
+ // - find out where we are relative to the base (min or 0)
+ base = options.min !== null ? options.min : 0;
+ aboveMin = value - base;
+ // - round to the nearest step
+ aboveMin = Math.round(aboveMin / options.step) * options.step;
+ // - rounding is based on 0, so adjust back to our base
+ value = base + aboveMin;
+
+ // fix precision from bad JS floating point math
+ value = parseFloat( value.toFixed( this._precision() ) );
+
+ // clamp the value
+ if ( options.max !== null && value > options.max) {
+ return options.max;
+ }
+ if ( options.min !== null && value < options.min ) {
+ return options.min;
+ }
+
+ return value;
+ },
+
+ _stop: function( event ) {
+ if ( !this.spinning ) {
+ return;
+ }
+
+ clearTimeout( this.timer );
+ clearTimeout( this.mousewheelTimer );
+ this.counter = 0;
+ this.spinning = false;
+ this._trigger( "stop", event );
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "culture" || key === "numberFormat" ) {
+ var prevValue = this._parse( this.element.val() );
+ this.options[ key ] = value;
+ this.element.val( this._format( prevValue ) );
+ return;
+ }
+
+ if ( key === "max" || key === "min" || key === "step" )
{
+ if ( typeof value === "string" ) {
+ value = this._parse( value );
+ }
+ }
+ if ( key === "icons" ) {
+ this.buttons.first().find( ".ui-icon" )
+ .removeClass( this.options.icons.up )
+ .addClass( value.up );
+ this.buttons.last().find( ".ui-icon" )
+ .removeClass( this.options.icons.down )
+ .addClass( value.down );
+ }
+
+ this._super( key, value );
+
+ if ( key === "disabled" ) {
+ this.widget().toggleClass( "ui-state-disabled", !!value );
+ this.element.prop( "disabled", !!value );
+ this.buttons.button( value ? "disable" : "enable" );
+ }
+ },
+
+ _setOptions: spinner_modifier(function( options ) {
+ this._super( options );
+ }),
+
+ _parse: function( val ) {
+ if ( typeof val === "string" && val !== "" ) {
+ val = window.Globalize && this.options.numberFormat ?
+ Globalize.parseFloat( val, 10, this.options.culture ) : +val;
+ }
+ return val === "" || isNaN( val ) ? null : val;
+ },
+
+ _format: function( value ) {
+ if ( value === "" ) {
+ return "";
+ }
+ return window.Globalize && this.options.numberFormat ?
+ Globalize.format( value, this.options.numberFormat, this.options.culture ) :
+ value;
+ },
+
+ _refresh: function() {
+ this.element.attr({
+ "aria-valuemin": this.options.min,
+ "aria-valuemax": this.options.max,
+ // TODO: what should we do with values that can't be parsed?
+ "aria-valuenow": this._parse( this.element.val() )
+ });
+ },
+
+ isValid: function() {
+ var value = this.value();
+
+ // null is invalid
+ if ( value === null ) {
+ return false;
+ }
+
+ // if value gets adjusted, it's invalid
+ return value === this._adjustValue( value );
+ },
+
+ // update the value without triggering change
+ _value: function( value, allowAny ) {
+ var parsed;
+ if ( value !== "" ) {
+ parsed = this._parse( value );
+ if ( parsed !== null ) {
+ if ( !allowAny ) {
+ parsed = this._adjustValue( parsed );
+ }
+ value = this._format( parsed );
+ }
+ }
+ this.element.val( value );
+ this._refresh();
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-spinner-input" )
+ .prop( "disabled", false )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+ this.uiSpinner.replaceWith( this.element );
+ },
+
+ stepUp: spinner_modifier(function( steps ) {
+ this._stepUp( steps );
+ }),
+ _stepUp: function( steps ) {
+ if ( this._start() ) {
+ this._spin( (steps || 1) * this.options.step );
+ this._stop();
+ }
+ },
+
+ stepDown: spinner_modifier(function( steps ) {
+ this._stepDown( steps );
+ }),
+ _stepDown: function( steps ) {
+ if ( this._start() ) {
+ this._spin( (steps || 1) * -this.options.step );
+ this._stop();
+ }
+ },
+
+ pageUp: spinner_modifier(function( pages ) {
+ this._stepUp( (pages || 1) * this.options.page );
+ }),
+
+ pageDown: spinner_modifier(function( pages ) {
+ this._stepDown( (pages || 1) * this.options.page );
+ }),
+
+ value: function( newVal ) {
+ if ( !arguments.length ) {
+ return this._parse( this.element.val() );
+ }
+ spinner_modifier( this._value ).call( this, newVal );
+ },
+
+ widget: function() {
+ return this.uiSpinner;
+ }
+});
+
+
+/*!
+ * jQuery UI Tabs 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/tabs/
+ */
+
+
+var tabs = $.widget( "ui.tabs", {
+ version: "1.11.4",
+ delay: 300,
+ options: {
+ active: null,
+ collapsible: false,
+ event: "click",
+ heightStyle: "content",
+ hide: null,
+ show: null,
+
+ // callbacks
+ activate: null,
+ beforeActivate: null,
+ beforeLoad: null,
+ load: null
+ },
+
+ _isLocal: (function() {
+ var rhash = /#.*$/;
+
+ return function( anchor ) {
+ var anchorUrl, locationUrl;
+
+ // support: IE7
+ // IE7 doesn't normalize the href property when set via script (#9317)
+ anchor = anchor.cloneNode( false );
+
+ anchorUrl = anchor.href.replace( rhash, "" );
+ locationUrl = location.href.replace( rhash, "" );
+
+ // decoding may throw an error if the URL isn't UTF-8 (#9518)
+ try {
+ anchorUrl = decodeURIComponent( anchorUrl );
+ } catch ( error ) {}
+ try {
+ locationUrl = decodeURIComponent( locationUrl );
+ } catch ( error ) {}
+
+ return anchor.hash.length > 1 && anchorUrl === locationUrl;
+ };
+ })(),
+
+ _create: function() {
+ var that = this,
+ options = this.options;
+
+ this.running = false;
+
+ this.element
+ .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
+ .toggleClass( "ui-tabs-collapsible", options.collapsible );
+
+ this._processTabs();
+ options.active = this._initialActive();
+
+ // Take disabling tabs via class attribute from HTML
+ // into account and update option properly.
+ if ( $.isArray( options.disabled ) ) {
+ options.disabled = $.unique( options.disabled.concat(
+ $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
+ return that.tabs.index( li );
+ })
+ ) ).sort();
+ }
+
+ // check for length avoids error when initializing empty list
+ if ( this.options.active !== false && this.anchors.length ) {
+ this.active = this._findActive( options.active );
+ } else {
+ this.active = $();
+ }
+
+ this._refresh();
+
+ if ( this.active.length ) {
+ this.load( options.active );
+ }
+ },
+
+ _initialActive: function() {
+ var active = this.options.active,
+ collapsible = this.options.collapsible,
+ locationHash = location.hash.substring( 1 );
+
+ if ( active === null ) {
+ // check the fragment identifier in the URL
+ if ( locationHash ) {
+ this.tabs.each(function( i, tab ) {
+ if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
+ active = i;
+ return false;
+ }
+ });
+ }
+
+ // check for a tab marked active via a class
+ if ( active === null ) {
+ active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
+ }
+
+ // no active tab, set to false
+ if ( active === null || active === -1 ) {
+ active = this.tabs.length ? 0 : false;
+ }
+ }
+
+ // handle numbers: negative, out of range
+ if ( active !== false ) {
+ active = this.tabs.index( this.tabs.eq( active ) );
+ if ( active === -1 ) {
+ active = collapsible ? false : 0;
+ }
+ }
+
+ // don't allow collapsible: false and active: false
+ if ( !collapsible && active === false && this.anchors.length ) {
+ active = 0;
+ }
+
+ return active;
+ },
+
+ _getCreateEventData: function() {
+ return {
+ tab: this.active,
+ panel: !this.active.length ? $() : this._getPanelForTab( this.active )
+ };
+ },
+
+ _tabKeydown: function( event ) {
+ var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
+ selectedIndex = this.tabs.index( focusedTab ),
+ goingForward = true;
+
+ if ( this._handlePageNav( event ) ) {
+ return;
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ selectedIndex++;
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.LEFT:
+ goingForward = false;
+ selectedIndex--;
+ break;
+ case $.ui.keyCode.END:
+ selectedIndex = this.anchors.length - 1;
+ break;
+ case $.ui.keyCode.HOME:
+ selectedIndex = 0;
+ break;
+ case $.ui.keyCode.SPACE:
+ // Activate only, no collapsing
+ event.preventDefault();
+ clearTimeout( this.activating );
+ this._activate( selectedIndex );
+ return;
+ case $.ui.keyCode.ENTER:
+ // Toggle (cancel delayed activation, allow collapsing)
+ event.preventDefault();
+ clearTimeout( this.activating );
+ // Determine if we should collapse or activate
+ this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+ return;
+ default:
+ return;
+ }
+
+ // Focus the appropriate tab, based on which key was pressed
+ event.preventDefault();
+ clearTimeout( this.activating );
+ selectedIndex = this._focusNextTab( selectedIndex, goingForward );
+
+ // Navigating with control/command key will prevent automatic activation
+ if ( !event.ctrlKey && !event.metaKey ) {
+
+ // Update aria-selected immediately so that AT think the tab is already selected.
+ // Otherwise AT may confuse the user by stating that they need to activate the tab,
+ // but the tab will already be activated by the time the announcement finishes.
+ focusedTab.attr( "aria-selected", "false" );
+ this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
+
+ this.activating = this._delay(function() {
+ this.option( "active", selectedIndex );
+ }, this.delay );
+ }
+ },
+
+ _panelKeydown: function( event ) {
+ if ( this._handlePageNav( event ) ) {
+ return;
+ }
+
+ // Ctrl+up moves focus to the current tab
+ if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
+ event.preventDefault();
+ this.active.focus();
+ }
+ },
+
+ // Alt+page up/down moves focus to the previous/next tab (and activates)
+ _handlePageNav: function( event ) {
+ if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
+ this._activate( this._focusNextTab( this.options.active - 1, false ) );
+ return true;
+ }
+ if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
+ this._activate( this._focusNextTab( this.options.active + 1, true ) );
+ return true;
+ }
+ },
+
+ _findNextTab: function( index, goingForward ) {
+ var lastTabIndex = this.tabs.length - 1;
+
+ function constrain() {
+ if ( index > lastTabIndex ) {
+ index = 0;
+ }
+ if ( index < 0 ) {
+ index = lastTabIndex;
+ }
+ return index;
+ }
+
+ while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
+ index = goingForward ? index + 1 : index - 1;
+ }
+
+ return index;
+ },
+
+ _focusNextTab: function( index, goingForward ) {
+ index = this._findNextTab( index, goingForward );
+ this.tabs.eq( index ).focus();
+ return index;
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "active" ) {
+ // _activate() will handle invalid values and update this.options
+ this._activate( value );
+ return;
+ }
+
+ if ( key === "disabled" ) {
+ // don't use the widget factory's disabled handling
+ this._setupDisabled( value );
+ return;
+ }
+
+ this._super( key, value);
+
+ if ( key === "collapsible" ) {
+ this.element.toggleClass( "ui-tabs-collapsible", value );
+ // Setting collapsible: false while collapsed; open first panel
+ if ( !value && this.options.active === false ) {
+ this._activate( 0 );
+ }
+ }
+
+ if ( key === "event" ) {
+ this._setupEvents( value );
+ }
+
+ if ( key === "heightStyle" ) {
+ this._setupHeightStyle( value );
+ }
+ },
+
+ _sanitizeSelector: function( hash ) {
+ return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,
"\\$&" ) : "";
+ },
+
+ refresh: function() {
+ var options = this.options,
+ lis = this.tablist.children( ":has(a[href])" );
+
+ // get disabled tabs from class attribute from HTML
+ // this will get converted to a boolean if needed in _refresh()
+ options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab )
{
+ return lis.index( tab );
+ });
+
+ this._processTabs();
+
+ // was collapsed or no tabs
+ if ( options.active === false || !this.anchors.length ) {
+ options.active = false;
+ this.active = $();
+ // was active, but active tab is gone
+ } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[
0 ] ) ) {
+ // all remaining tabs are disabled
+ if ( this.tabs.length === options.disabled.length ) {
+ options.active = false;
+ this.active = $();
+ // activate previous tab
+ } else {
+ this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
+ }
+ // was active, active tab still exists
+ } else {
+ // make sure active index is correct
+ options.active = this.tabs.index( this.active );
+ }
+
+ this._refresh();
+ },
+
+ _refresh: function() {
+ this._setupDisabled( this.options.disabled );
+ this._setupEvents( this.options.event );
+ this._setupHeightStyle( this.options.heightStyle );
+
+ this.tabs.not( this.active ).attr({
+ "aria-selected": "false",
+ "aria-expanded": "false",
+ tabIndex: -1
+ });
+ this.panels.not( this._getPanelForTab( this.active ) )
+ .hide()
+ .attr({
+ "aria-hidden": "true"
+ });
+
+ // Make sure one tab is in the tab order
+ if ( !this.active.length ) {
+ this.tabs.eq( 0 ).attr( "tabIndex", 0 );
+ } else {
+ this.active
+ .addClass( "ui-tabs-active ui-state-active" )
+ .attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ this._getPanelForTab( this.active )
+ .show()
+ .attr({
+ "aria-hidden": "false"
+ });
+ }
+ },
+
+ _processTabs: function() {
+ var that = this,
+ prevTabs = this.tabs,
+ prevAnchors = this.anchors,
+ prevPanels = this.panels;
+
+ this.tablist = this._getList()
+ .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header
ui-corner-all" )
+ .attr( "role", "tablist" )
+
+ // Prevent users from focusing disabled tabs via click
+ .delegate( "> li", "mousedown" + this.eventNamespace, function(
event ) {
+ if ( $( this ).is( ".ui-state-disabled" ) ) {
+ event.preventDefault();
+ }
+ })
+
+ // support: IE <9
+ // Preventing the default action in mousedown doesn't prevent IE
+ // from focusing the element, so if the anchor gets focused, blur.
+ // We don't have to worry about focusing the previously focused
+ // element since clicking on a non-focusable element should focus
+ // the body anyway.
+ .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace,
function() {
+ if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+ this.blur();
+ }
+ });
+
+ this.tabs = this.tablist.find( "> li:has(a[href])" )
+ .addClass( "ui-state-default ui-corner-top" )
+ .attr({
+ role: "tab",
+ tabIndex: -1
+ });
+
+ this.anchors = this.tabs.map(function() {
+ return $( "a", this )[ 0 ];
+ })
+ .addClass( "ui-tabs-anchor" )
+ .attr({
+ role: "presentation",
+ tabIndex: -1
+ });
+
+ this.panels = $();
+
+ this.anchors.each(function( i, anchor ) {
+ var selector, panel, panelId,
+ anchorId = $( anchor ).uniqueId().attr( "id" ),
+ tab = $( anchor ).closest( "li" ),
+ originalAriaControls = tab.attr( "aria-controls" );
+
+ // inline tab
+ if ( that._isLocal( anchor ) ) {
+ selector = anchor.hash;
+ panelId = selector.substring( 1 );
+ panel = that.element.find( that._sanitizeSelector( selector ) );
+ // remote tab
+ } else {
+ // If the tab doesn't already have aria-controls,
+ // generate an id by using a throw-away element
+ panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
+ selector = "#" + panelId;
+ panel = that.element.find( selector );
+ if ( !panel.length ) {
+ panel = that._createPanel( panelId );
+ panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
+ }
+ panel.attr( "aria-live", "polite" );
+ }
+
+ if ( panel.length) {
+ that.panels = that.panels.add( panel );
+ }
+ if ( originalAriaControls ) {
+ tab.data( "ui-tabs-aria-controls", originalAriaControls );
+ }
+ tab.attr({
+ "aria-controls": panelId,
+ "aria-labelledby": anchorId
+ });
+ panel.attr( "aria-labelledby", anchorId );
+ });
+
+ this.panels
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .attr( "role", "tabpanel" );
+
+ // Avoid memory leaks (#10056)
+ if ( prevTabs ) {
+ this._off( prevTabs.not( this.tabs ) );
+ this._off( prevAnchors.not( this.anchors ) );
+ this._off( prevPanels.not( this.panels ) );
+ }
+ },
+
+ // allow overriding how to find the list for rare usage scenarios (#7715)
+ _getList: function() {
+ return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
+ },
+
+ _createPanel: function( id ) {
+ return $( "<div>" )
+ .attr( "id", id )
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .data( "ui-tabs-destroy", true );
+ },
+
+ _setupDisabled: function( disabled ) {
+ if ( $.isArray( disabled ) ) {
+ if ( !disabled.length ) {
+ disabled = false;
+ } else if ( disabled.length === this.anchors.length ) {
+ disabled = true;
+ }
+ }
+
+ // disable tabs
+ for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
+ if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+ $( li )
+ .addClass( "ui-state-disabled" )
+ .attr( "aria-disabled", "true" );
+ } else {
+ $( li )
+ .removeClass( "ui-state-disabled" )
+ .removeAttr( "aria-disabled" );
+ }
+ }
+
+ this.options.disabled = disabled;
+ },
+
+ _setupEvents: function( event ) {
+ var events = {};
+ if ( event ) {
+ $.each( event.split(" "), function( index, eventName ) {
+ events[ eventName ] = "_eventHandler";
+ });
+ }
+
+ this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+ // Always prevent the default action, even when disabled
+ this._on( true, this.anchors, {
+ click: function( event ) {
+ event.preventDefault();
+ }
+ });
+ this._on( this.anchors, events );
+ this._on( this.tabs, { keydown: "_tabKeydown" } );
+ this._on( this.panels, { keydown: "_panelKeydown" } );
+
+ this._focusable( this.tabs );
+ this._hoverable( this.tabs );
+ },
+
+ _setupHeightStyle: function( heightStyle ) {
+ var maxHeight,
+ parent = this.element.parent();
+
+ if ( heightStyle === "fill" ) {
+ maxHeight = parent.height();
+ maxHeight -= this.element.outerHeight() - this.element.height();
+
+ this.element.siblings( ":visible" ).each(function() {
+ var elem = $( this ),
+ position = elem.css( "position" );
+
+ if ( position === "absolute" || position === "fixed" ) {
+ return;
+ }
+ maxHeight -= elem.outerHeight( true );
+ });
+
+ this.element.children().not( this.panels ).each(function() {
+ maxHeight -= $( this ).outerHeight( true );
+ });
+
+ this.panels.each(function() {
+ $( this ).height( Math.max( 0, maxHeight -
+ $( this ).innerHeight() + $( this ).height() ) );
+ })
+ .css( "overflow", "auto" );
+ } else if ( heightStyle === "auto" ) {
+ maxHeight = 0;
+ this.panels.each(function() {
+ maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+ }).height( maxHeight );
+ }
+ },
+
+ _eventHandler: function( event ) {
+ var options = this.options,
+ active = this.active,
+ anchor = $( event.currentTarget ),
+ tab = anchor.closest( "li" ),
+ clickedIsActive = tab[ 0 ] === active[ 0 ],
+ collapsing = clickedIsActive && options.collapsible,
+ toShow = collapsing ? $() : this._getPanelForTab( tab ),
+ toHide = !active.length ? $() : this._getPanelForTab( active ),
+ eventData = {
+ oldTab: active,
+ oldPanel: toHide,
+ newTab: collapsing ? $() : tab,
+ newPanel: toShow
+ };
+
+ event.preventDefault();
+
+ if ( tab.hasClass( "ui-state-disabled" ) ||
+ // tab is already loading
+ tab.hasClass( "ui-tabs-loading" ) ||
+ // can't switch durning an animation
+ this.running ||
+ // click on active header, but not collapsible
+ ( clickedIsActive && !options.collapsible ) ||
+ // allow canceling activation
+ ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+ return;
+ }
+
+ options.active = collapsing ? false : this.tabs.index( tab );
+
+ this.active = clickedIsActive ? $() : tab;
+ if ( this.xhr ) {
+ this.xhr.abort();
+ }
+
+ if ( !toHide.length && !toShow.length ) {
+ $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
+ }
+
+ if ( toShow.length ) {
+ this.load( this.tabs.index( tab ), event );
+ }
+ this._toggle( event, eventData );
+ },
+
+ // handles show/hide for selecting tabs
+ _toggle: function( event, eventData ) {
+ var that = this,
+ toShow = eventData.newPanel,
+ toHide = eventData.oldPanel;
+
+ this.running = true;
+
+ function complete() {
+ that.running = false;
+ that._trigger( "activate", event, eventData );
+ }
+
+ function show() {
+ eventData.newTab.closest( "li" ).addClass( "ui-tabs-active
ui-state-active" );
+
+ if ( toShow.length && that.options.show ) {
+ that._show( toShow, that.options.show, complete );
+ } else {
+ toShow.show();
+ complete();
+ }
+ }
+
+ // start out by hiding, then showing, then completing
+ if ( toHide.length && this.options.hide ) {
+ this._hide( toHide, this.options.hide, function() {
+ eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active
ui-state-active" );
+ show();
+ });
+ } else {
+ eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active
ui-state-active" );
+ toHide.hide();
+ show();
+ }
+
+ toHide.attr( "aria-hidden", "true" );
+ eventData.oldTab.attr({
+ "aria-selected": "false",
+ "aria-expanded": "false"
+ });
+ // If we're switching tabs, remove the old tab from the tab order.
+ // If we're opening from collapsed state, remove the previous tab from the tab
order.
+ // If we're collapsing, then keep the collapsing tab in the tab order.
+ if ( toShow.length && toHide.length ) {
+ eventData.oldTab.attr( "tabIndex", -1 );
+ } else if ( toShow.length ) {
+ this.tabs.filter(function() {
+ return $( this ).attr( "tabIndex" ) === 0;
+ })
+ .attr( "tabIndex", -1 );
+ }
+
+ toShow.attr( "aria-hidden", "false" );
+ eventData.newTab.attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ },
+
+ _activate: function( index ) {
+ var anchor,
+ active = this._findActive( index );
+
+ // trying to activate the already active panel
+ if ( active[ 0 ] === this.active[ 0 ] ) {
+ return;
+ }
+
+ // trying to collapse, simulate a click on the current active header
+ if ( !active.length ) {
+ active = this.active;
+ }
+
+ anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
+ this._eventHandler({
+ target: anchor,
+ currentTarget: anchor,
+ preventDefault: $.noop
+ });
+ },
+
+ _findActive: function( index ) {
+ return index === false ? $() : this.tabs.eq( index );
+ },
+
+ _getIndex: function( index ) {
+ // meta-function to give users option to provide a href string instead of a numerical
index.
+ if ( typeof index === "string" ) {
+ index = this.anchors.index( this.anchors.filter( "[href$='" + index +
"']" ) );
+ }
+
+ return index;
+ },
+
+ _destroy: function() {
+ if ( this.xhr ) {
+ this.xhr.abort();
+ }
+
+ this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all
ui-tabs-collapsible" );
+
+ this.tablist
+ .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header
ui-corner-all" )
+ .removeAttr( "role" );
+
+ this.anchors
+ .removeClass( "ui-tabs-anchor" )
+ .removeAttr( "role" )
+ .removeAttr( "tabIndex" )
+ .removeUniqueId();
+
+ this.tablist.unbind( this.eventNamespace );
+
+ this.tabs.add( this.panels ).each(function() {
+ if ( $.data( this, "ui-tabs-destroy" ) ) {
+ $( this ).remove();
+ } else {
+ $( this )
+ .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
+ "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active
ui-tabs-panel" )
+ .removeAttr( "tabIndex" )
+ .removeAttr( "aria-live" )
+ .removeAttr( "aria-busy" )
+ .removeAttr( "aria-selected" )
+ .removeAttr( "aria-labelledby" )
+ .removeAttr( "aria-hidden" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "role" );
+ }
+ });
+
+ this.tabs.each(function() {
+ var li = $( this ),
+ prev = li.data( "ui-tabs-aria-controls" );
+ if ( prev ) {
+ li
+ .attr( "aria-controls", prev )
+ .removeData( "ui-tabs-aria-controls" );
+ } else {
+ li.removeAttr( "aria-controls" );
+ }
+ });
+
+ this.panels.show();
+
+ if ( this.options.heightStyle !== "content" ) {
+ this.panels.css( "height", "" );
+ }
+ },
+
+ enable: function( index ) {
+ var disabled = this.options.disabled;
+ if ( disabled === false ) {
+ return;
+ }
+
+ if ( index === undefined ) {
+ disabled = false;
+ } else {
+ index = this._getIndex( index );
+ if ( $.isArray( disabled ) ) {
+ disabled = $.map( disabled, function( num ) {
+ return num !== index ? num : null;
+ });
+ } else {
+ disabled = $.map( this.tabs, function( li, num ) {
+ return num !== index ? num : null;
+ });
+ }
+ }
+ this._setupDisabled( disabled );
+ },
+
+ disable: function( index ) {
+ var disabled = this.options.disabled;
+ if ( disabled === true ) {
+ return;
+ }
+
+ if ( index === undefined ) {
+ disabled = true;
+ } else {
+ index = this._getIndex( index );
+ if ( $.inArray( index, disabled ) !== -1 ) {
+ return;
+ }
+ if ( $.isArray( disabled ) ) {
+ disabled = $.merge( [ index ], disabled ).sort();
+ } else {
+ disabled = [ index ];
+ }
+ }
+ this._setupDisabled( disabled );
+ },
+
+ load: function( index, event ) {
+ index = this._getIndex( index );
+ var that = this,
+ tab = this.tabs.eq( index ),
+ anchor = tab.find( ".ui-tabs-anchor" ),
+ panel = this._getPanelForTab( tab ),
+ eventData = {
+ tab: tab,
+ panel: panel
+ },
+ complete = function( jqXHR, status ) {
+ if ( status === "abort" ) {
+ that.panels.stop( false, true );
+ }
+
+ tab.removeClass( "ui-tabs-loading" );
+ panel.removeAttr( "aria-busy" );
+
+ if ( jqXHR === that.xhr ) {
+ delete that.xhr;
+ }
+ };
+
+ // not remote
+ if ( this._isLocal( anchor[ 0 ] ) ) {
+ return;
+ }
+
+ this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
+
+ // support: jQuery <1.8
+ // jQuery <1.8 returns false if the request is canceled in beforeSend,
+ // but as of 1.8, $.ajax() always returns a jqXHR object.
+ if ( this.xhr && this.xhr.statusText !== "canceled" ) {
+ tab.addClass( "ui-tabs-loading" );
+ panel.attr( "aria-busy", "true" );
+
+ this.xhr
+ .done(function( response, status, jqXHR ) {
+ // support: jQuery <1.8
+ //
http://bugs.jquery.com/ticket/11778
+ setTimeout(function() {
+ panel.html( response );
+ that._trigger( "load", event, eventData );
+
+ complete( jqXHR, status );
+ }, 1 );
+ })
+ .fail(function( jqXHR, status ) {
+ // support: jQuery <1.8
+ //
http://bugs.jquery.com/ticket/11778
+ setTimeout(function() {
+ complete( jqXHR, status );
+ }, 1 );
+ });
+ }
+ },
+
+ _ajaxSettings: function( anchor, event, eventData ) {
+ var that = this;
+ return {
+ url: anchor.attr( "href" ),
+ beforeSend: function( jqXHR, settings ) {
+ return that._trigger( "beforeLoad", event,
+ $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
+ }
+ };
+ },
+
+ _getPanelForTab: function( tab ) {
+ var id = $( tab ).attr( "aria-controls" );
+ return this.element.find( this._sanitizeSelector( "#" + id ) );
+ }
+});
+
+
+/*!
+ * jQuery UI Tooltip 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/tooltip/
+ */
+
+
+var tooltip = $.widget( "ui.tooltip", {
+ version: "1.11.4",
+ options: {
+ content: function() {
+ // support: IE<9, Opera in jQuery <1.7
+ // .text() can't accept undefined, so coerce to a string
+ var title = $( this ).attr( "title" ) || "";
+ // Escape title, since we're going from an attribute to raw HTML
+ return $( "<a>" ).text( title ).html();
+ },
+ hide: true,
+ // Disabled elements have inconsistent behavior across browsers (#8661)
+ items: "[title]:not([disabled])",
+ position: {
+ my: "left top+15",
+ at: "left bottom",
+ collision: "flipfit flip"
+ },
+ show: true,
+ tooltipClass: null,
+ track: false,
+
+ // callbacks
+ close: null,
+ open: null
+ },
+
+ _addDescribedBy: function( elem, id ) {
+ var describedby = (elem.attr( "aria-describedby" ) || "").split(
/\s+/ );
+ describedby.push( id );
+ elem
+ .data( "ui-tooltip-id", id )
+ .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
+ },
+
+ _removeDescribedBy: function( elem ) {
+ var id = elem.data( "ui-tooltip-id" ),
+ describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/
),
+ index = $.inArray( id, describedby );
+
+ if ( index !== -1 ) {
+ describedby.splice( index, 1 );
+ }
+
+ elem.removeData( "ui-tooltip-id" );
+ describedby = $.trim( describedby.join( " " ) );
+ if ( describedby ) {
+ elem.attr( "aria-describedby", describedby );
+ } else {
+ elem.removeAttr( "aria-describedby" );
+ }
+ },
+
+ _create: function() {
+ this._on({
+ mouseover: "open",
+ focusin: "open"
+ });
+
+ // IDs of generated tooltips, needed for destroy
+ this.tooltips = {};
+
+ // IDs of parent tooltips where we removed the title attribute
+ this.parents = {};
+
+ if ( this.options.disabled ) {
+ this._disable();
+ }
+
+ // Append the aria-live region so tooltips announce correctly
+ this.liveRegion = $( "<div>" )
+ .attr({
+ role: "log",
+ "aria-live": "assertive",
+ "aria-relevant": "additions"
+ })
+ .addClass( "ui-helper-hidden-accessible" )
+ .appendTo( this.document[ 0 ].body );
+ },
+
+ _setOption: function( key, value ) {
+ var that = this;
+
+ if ( key === "disabled" ) {
+ this[ value ? "_disable" : "_enable" ]();
+ this.options[ key ] = value;
+ // disable element style changes
+ return;
+ }
+
+ this._super( key, value );
+
+ if ( key === "content" ) {
+ $.each( this.tooltips, function( id, tooltipData ) {
+ that._updateContent( tooltipData.element );
+ });
+ }
+ },
+
+ _disable: function() {
+ var that = this;
+
+ // close open tooltips
+ $.each( this.tooltips, function( id, tooltipData ) {
+ var event = $.Event( "blur" );
+ event.target = event.currentTarget = tooltipData.element[ 0 ];
+ that.close( event, true );
+ });
+
+ // remove title attributes to prevent native tooltips
+ this.element.find( this.options.items ).addBack().each(function() {
+ var element = $( this );
+ if ( element.is( "[title]" ) ) {
+ element
+ .data( "ui-tooltip-title", element.attr( "title" ) )
+ .removeAttr( "title" );
+ }
+ });
+ },
+
+ _enable: function() {
+ // restore title attributes
+ this.element.find( this.options.items ).addBack().each(function() {
+ var element = $( this );
+ if ( element.data( "ui-tooltip-title" ) ) {
+ element.attr( "title", element.data( "ui-tooltip-title" ) );
+ }
+ });
+ },
+
+ open: function( event ) {
+ var that = this,
+ target = $( event ? event.target : this.element )
+ // we need closest here due to mouseover bubbling,
+ // but always pointing at the same event target
+ .closest( this.options.items );
+
+ // No element to show a tooltip for or the tooltip is already open
+ if ( !target.length || target.data( "ui-tooltip-id" ) ) {
+ return;
+ }
+
+ if ( target.attr( "title" ) ) {
+ target.data( "ui-tooltip-title", target.attr( "title" ) );
+ }
+
+ target.data( "ui-tooltip-open", true );
+
+ // kill parent tooltips, custom or native, for hover
+ if ( event && event.type === "mouseover" ) {
+ target.parents().each(function() {
+ var parent = $( this ),
+ blurEvent;
+ if ( parent.data( "ui-tooltip-open" ) ) {
+ blurEvent = $.Event( "blur" );
+ blurEvent.target = blurEvent.currentTarget = this;
+ that.close( blurEvent, true );
+ }
+ if ( parent.attr( "title" ) ) {
+ parent.uniqueId();
+ that.parents[ this.id ] = {
+ element: this,
+ title: parent.attr( "title" )
+ };
+ parent.attr( "title", "" );
+ }
+ });
+ }
+
+ this._registerCloseHandlers( event, target );
+ this._updateContent( target, event );
+ },
+
+ _updateContent: function( target, event ) {
+ var content,
+ contentOption = this.options.content,
+ that = this,
+ eventType = event ? event.type : null;
+
+ if ( typeof contentOption === "string" ) {
+ return this._open( event, target, contentOption );
+ }
+
+ content = contentOption.call( target[0], function( response ) {
+
+ // IE may instantly serve a cached response for ajax requests
+ // delay this call to _open so the other call to _open runs first
+ that._delay(function() {
+
+ // Ignore async response if tooltip was closed already
+ if ( !target.data( "ui-tooltip-open" ) ) {
+ return;
+ }
+
+ // jQuery creates a special event for focusin when it doesn't
+ // exist natively. To improve performance, the native event
+ // object is reused and the type is changed. Therefore, we can't
+ // rely on the type being correct after the event finished
+ // bubbling, so we set it back to the previous value. (#8740)
+ if ( event ) {
+ event.type = eventType;
+ }
+ this._open( event, target, response );
+ });
+ });
+ if ( content ) {
+ this._open( event, target, content );
+ }
+ },
+
+ _open: function( event, target, content ) {
+ var tooltipData, tooltip, delayedShow, a11yContent,
+ positionOption = $.extend( {}, this.options.position );
+
+ if ( !content ) {
+ return;
+ }
+
+ // Content can be updated multiple times. If the tooltip already
+ // exists, then just update the content and bail.
+ tooltipData = this._find( target );
+ if ( tooltipData ) {
+ tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
+ return;
+ }
+
+ // if we have a title, clear it to prevent the native tooltip
+ // we have to check first to avoid defining a title if none exists
+ // (we don't want to cause an element to start matching [title])
+ //
+ // We use removeAttr only for key events, to allow IE to export the correct
+ // accessible attributes. For mouse events, set to empty string to avoid
+ // native tooltip showing up (happens only when removing inside mouseover).
+ if ( target.is( "[title]" ) ) {
+ if ( event && event.type === "mouseover" ) {
+ target.attr( "title", "" );
+ } else {
+ target.removeAttr( "title" );
+ }
+ }
+
+ tooltipData = this._tooltip( target );
+ tooltip = tooltipData.tooltip;
+ this._addDescribedBy( target, tooltip.attr( "id" ) );
+ tooltip.find( ".ui-tooltip-content" ).html( content );
+
+ // Support: Voiceover on OS X, JAWS on IE <= 9
+ // JAWS announces deletions even when aria-relevant="additions"
+ // Voiceover will sometimes re-read the entire log region's contents from the
beginning
+ this.liveRegion.children().hide();
+ if ( content.clone ) {
+ a11yContent = content.clone();
+ a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr(
"id" );
+ } else {
+ a11yContent = content;
+ }
+ $( "<div>" ).html( a11yContent ).appendTo( this.liveRegion );
+
+ function position( event ) {
+ positionOption.of = event;
+ if ( tooltip.is( ":hidden" ) ) {
+ return;
+ }
+ tooltip.position( positionOption );
+ }
+ if ( this.options.track && event && /^mouse/.test( event.type ) ) {
+ this._on( this.document, {
+ mousemove: position
+ });
+ // trigger once to override element-relative positioning
+ position( event );
+ } else {
+ tooltip.position( $.extend({
+ of: target
+ }, this.options.position ) );
+ }
+
+ tooltip.hide();
+
+ this._show( tooltip, this.options.show );
+ // Handle tracking tooltips that are shown with a delay (#8644). As soon
+ // as the tooltip is visible, position the tooltip using the most recent
+ // event.
+ if ( this.options.show && this.options.show.delay ) {
+ delayedShow = this.delayedShow = setInterval(function() {
+ if ( tooltip.is( ":visible" ) ) {
+ position( positionOption.of );
+ clearInterval( delayedShow );
+ }
+ }, $.fx.interval );
+ }
+
+ this._trigger( "open", event, { tooltip: tooltip } );
+ },
+
+ _registerCloseHandlers: function( event, target ) {
+ var events = {
+ keyup: function( event ) {
+ if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
+ var fakeEvent = $.Event(event);
+ fakeEvent.currentTarget = target[0];
+ this.close( fakeEvent, true );
+ }
+ }
+ };
+
+ // Only bind remove handler for delegated targets. Non-delegated
+ // tooltips will handle this in destroy.
+ if ( target[ 0 ] !== this.element[ 0 ] ) {
+ events.remove = function() {
+ this._removeTooltip( this._find( target ).tooltip );
+ };
+ }
+
+ if ( !event || event.type === "mouseover" ) {
+ events.mouseleave = "close";
+ }
+ if ( !event || event.type === "focusin" ) {
+ events.focusout = "close";
+ }
+ this._on( true, target, events );
+ },
+
+ close: function( event ) {
+ var tooltip,
+ that = this,
+ target = $( event ? event.currentTarget : this.element ),
+ tooltipData = this._find( target );
+
+ // The tooltip may already be closed
+ if ( !tooltipData ) {
+
+ // We set ui-tooltip-open immediately upon open (in open()), but only set the
+ // additional data once there's actually content to show (in _open()). So even if
the
+ // tooltip doesn't have full data, we always remove ui-tooltip-open in case
we're in
+ // the period between open() and _open().
+ target.removeData( "ui-tooltip-open" );
+ return;
+ }
+
+ tooltip = tooltipData.tooltip;
+
+ // disabling closes the tooltip, so we need to track when we're closing
+ // to avoid an infinite loop in case the tooltip becomes disabled on close
+ if ( tooltipData.closing ) {
+ return;
+ }
+
+ // Clear the interval for delayed tracking tooltips
+ clearInterval( this.delayedShow );
+
+ // only set title if we had one before (see comment in _open())
+ // If the title attribute has changed since open(), don't restore
+ if ( target.data( "ui-tooltip-title" ) && !target.attr(
"title" ) ) {
+ target.attr( "title", target.data( "ui-tooltip-title" ) );
+ }
+
+ this._removeDescribedBy( target );
+
+ tooltipData.hiding = true;
+ tooltip.stop( true );
+ this._hide( tooltip, this.options.hide, function() {
+ that._removeTooltip( $( this ) );
+ });
+
+ target.removeData( "ui-tooltip-open" );
+ this._off( target, "mouseleave focusout keyup" );
+
+ // Remove 'remove' binding only on delegated targets
+ if ( target[ 0 ] !== this.element[ 0 ] ) {
+ this._off( target, "remove" );
+ }
+ this._off( this.document, "mousemove" );
+
+ if ( event && event.type === "mouseleave" ) {
+ $.each( this.parents, function( id, parent ) {
+ $( parent.element ).attr( "title", parent.title );
+ delete that.parents[ id ];
+ });
+ }
+
+ tooltipData.closing = true;
+ this._trigger( "close", event, { tooltip: tooltip } );
+ if ( !tooltipData.hiding ) {
+ tooltipData.closing = false;
+ }
+ },
+
+ _tooltip: function( element ) {
+ var tooltip = $( "<div>" )
+ .attr( "role", "tooltip" )
+ .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
+ ( this.options.tooltipClass || "" ) ),
+ id = tooltip.uniqueId().attr( "id" );
+
+ $( "<div>" )
+ .addClass( "ui-tooltip-content" )
+ .appendTo( tooltip );
+
+ tooltip.appendTo( this.document[0].body );
+
+ return this.tooltips[ id ] = {
+ element: element,
+ tooltip: tooltip
+ };
+ },
+
+ _find: function( target ) {
+ var id = target.data( "ui-tooltip-id" );
+ return id ? this.tooltips[ id ] : null;
+ },
+
+ _removeTooltip: function( tooltip ) {
+ tooltip.remove();
+ delete this.tooltips[ tooltip.attr( "id" ) ];
+ },
+
+ _destroy: function() {
+ var that = this;
+
+ // close open tooltips
+ $.each( this.tooltips, function( id, tooltipData ) {
+ // Delegate to close method to handle common cleanup
+ var event = $.Event( "blur" ),
+ element = tooltipData.element;
+ event.target = event.currentTarget = element[ 0 ];
+ that.close( event, true );
+
+ // Remove immediately; destroying an open tooltip doesn't use the
+ // hide animation
+ $( "#" + id ).remove();
+
+ // Restore the title
+ if ( element.data( "ui-tooltip-title" ) ) {
+ // If the title attribute has changed since open(), don't restore
+ if ( !element.attr( "title" ) ) {
+ element.attr( "title", element.data( "ui-tooltip-title" ) );
+ }
+ element.removeData( "ui-tooltip-title" );
+ }
+ });
+ this.liveRegion.remove();
+ }
+});
+
+
+
+}));
\ No newline at end of file
diff --git a/ui/libs/modernizr.js b/ui/libs/modernizr.js
new file mode 100644
index 0000000..3365339
--- /dev/null
+++ b/ui/libs/modernizr.js
@@ -0,0 +1,1406 @@
+/*!
+ * Modernizr v2.8.3
+ *
www.modernizr.com
+ *
+ * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
+ * Available under the BSD and MIT licenses:
www.modernizr.com/license/
+ */
+
+/*
+ * Modernizr tests which native CSS3 and HTML5 features are available in
+ * the current UA and makes the results available to you in two ways:
+ * as properties on a global Modernizr object, and as classes on the
+ * <html> element. This information allows you to progressively enhance
+ * your pages with a granular level of control over the experience.
+ *
+ * Modernizr has an optional (not included) conditional resource loader
+ * called Modernizr.load(), based on Yepnope.js (
yepnopejs.com).
+ * To get a build that includes Modernizr.load(), as well as choosing
+ * which tests to include, go to
www.modernizr.com/download/
+ *
+ * Authors Faruk Ates, Paul Irish, Alex Sexton
+ * Contributors Ryan Seddon, Ben Alman
+ */
+
+window.Modernizr = (function( window, document, undefined ) {
+
+ var version = '2.8.3',
+
+ Modernizr = {},
+
+ /*>>cssclasses*/
+ // option for enabling the HTML classes to be added
+ enableClasses = true,
+ /*>>cssclasses*/
+
+ docElement = document.documentElement,
+
+ /**
+ * Create our "modernizr" element that we do most feature tests on.
+ */
+ mod = 'modernizr',
+ modElem = document.createElement(mod),
+ mStyle = modElem.style,
+
+ /**
+ * Create the input element for various Web Forms feature tests.
+ */
+ inputElem /*>>inputelem*/ = document.createElement('input')
/*>>inputelem*/ ,
+
+ /*>>smile*/
+ smile = ':)',
+ /*>>smile*/
+
+ toString = {}.toString,
+
+ // TODO :: make the prefixes more granular
+ /*>>prefixes*/
+ // List of property values to set for css tests. See ticket #21
+ prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
+ /*>>prefixes*/
+
+ /*>>domprefixes*/
+ // Following spec is to expose vendor-specific style properties as:
+ // elem.style.WebkitBorderRadius
+ // and the following would be incorrect:
+ // elem.style.webkitBorderRadius
+
+ // Webkit ghosts their properties in lowercase but Opera & Moz do not.
+ // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+
+ //
erik.eae.net/archives/2008/03/10/21.48.10/
+
+ // More here:
github.com/Modernizr/Modernizr/issues/issue/21
+ omPrefixes = 'Webkit Moz O ms',
+
+ cssomPrefixes = omPrefixes.split(' '),
+
+ domPrefixes = omPrefixes.toLowerCase().split(' '),
+ /*>>domprefixes*/
+
+ /*>>ns*/
+ ns = {'svg': 'http://www.w3.org/2000/svg'},
+ /*>>ns*/
+
+ tests = {},
+ inputs = {},
+ attrs = {},
+
+ classes = [],
+
+ slice = classes.slice,
+
+ featureName, // used in testing loop
+
+
+ /*>>teststyles*/
+ // Inject element with style element and some CSS rules
+ injectElementWithStyles = function( rule, callback, nodes, testnames ) {
+
+ var style, ret, node, docOverflow,
+ div = document.createElement('div'),
+ // After page load injecting a fake body doesn't work so check if body
exists
+ body = document.body,
+ // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in
the body element, so we fake it.
+ fakeBody = body || document.createElement('body');
+
+ if ( parseInt(nodes, 10) ) {
+ // In order not to give false positives we create a node for each test
+ // This also allows the method to scale for unspecified uses
+ while ( nodes-- ) {
+ node = document.createElement('div');
+ node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
+ div.appendChild(node);
+ }
+ }
+
+ // <style> elements in IE6-9 are considered 'NoScope' elements and
therefore will be removed
+ // when injected with innerHTML. To get around this you need to prepend the
'NoScope' element
+ // with a 'scoped' element, in our case the soft-hyphen entity as it
won't mess with our measurements.
+ //
msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
+ // Documents served as xml will throw if using ­ so use xml friendly
encoded version. See issue #277
+ style = ['­','<style id="s', mod,
'">', rule, '</style>'].join('');
+ div.id = mod;
+ // IE6 will false positive on some tests due to the style element inside the test
div somehow interfering offsetHeight, so insert it into body or fakebody.
+ // Opera will act all quirky when injecting elements in documentElement when page
is served as xml, needs fakebody too. #270
+ (body ? div : fakeBody).innerHTML += style;
+ fakeBody.appendChild(div);
+ if ( !body ) {
+ //avoid crashing IE8, if background image is used
+ fakeBody.style.background = '';
+ //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and
scrollbars are visible
+ fakeBody.style.overflow = 'hidden';
+ docOverflow = docElement.style.overflow;
+ docElement.style.overflow = 'hidden';
+ docElement.appendChild(fakeBody);
+ }
+
+ ret = callback(div, rule);
+ // If this is done after page load we don't want to remove the body so check if
body exists
+ if ( !body ) {
+ fakeBody.parentNode.removeChild(fakeBody);
+ docElement.style.overflow = docOverflow;
+ } else {
+ div.parentNode.removeChild(div);
+ }
+
+ return !!ret;
+
+ },
+ /*>>teststyles*/
+
+ /*>>mq*/
+ // adapted from matchMedia polyfill
+ // by Scott Jehl and Paul Irish
+ //
gist.github.com/786768
+ testMediaQuery = function( mq ) {
+
+ var matchMedia = window.matchMedia || window.msMatchMedia;
+ if ( matchMedia ) {
+ return matchMedia(mq) && matchMedia(mq).matches || false;
+ }
+
+ var bool;
+
+ injectElementWithStyles('@media ' + mq + ' { #' + mod + ' {
position: absolute; } }', function( node ) {
+ bool = (window.getComputedStyle ?
+ getComputedStyle(node, null) :
+ node.currentStyle)['position'] == 'absolute';
+ });
+
+ return bool;
+
+ },
+ /*>>mq*/
+
+
+ /*>>hasevent*/
+ //
+ // isEventSupported determines if a given element supports the given event
+ //
kangax.github.com/iseventsupported/
+ //
+ // The following results are known incorrects:
+ // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative
+ // Modernizr.hasEvent("textInput") // in Webkit.
github.com/Modernizr/Modernizr/issues/333
+ // ...
+ isEventSupported = (function() {
+
+ var TAGNAMES = {
+ 'select': 'input', 'change': 'input',
+ 'submit': 'form', 'reset': 'form',
+ 'error': 'img', 'load': 'img', 'abort':
'img'
+ };
+
+ function isEventSupported( eventName, element ) {
+
+ element = element || document.createElement(TAGNAMES[eventName] ||
'div');
+ eventName = 'on' + eventName;
+
+ // When using `setAttribute`, IE skips "unload", WebKit skips
"unload" and "resize", whereas `in` "catches" those
+ var isSupported = eventName in element;
+
+ if ( !isSupported ) {
+ // If it has no `setAttribute` (i.e. doesn't implement Node interface), try
generic element
+ if ( !element.setAttribute ) {
+ element = document.createElement('div');
+ }
+ if ( element.setAttribute && element.removeAttribute ) {
+ element.setAttribute(eventName, '');
+ isSupported = is(element[eventName], 'function');
+
+ // If property was created, "remove it" (by setting value to
`undefined`)
+ if ( !is(element[eventName], 'undefined') ) {
+ element[eventName] = undefined;
+ }
+ element.removeAttribute(eventName);
+ }
+ }
+
+ element = null;
+ return isSupported;
+ }
+ return isEventSupported;
+ })(),
+ /*>>hasevent*/
+
+ // TODO :: Add flag for hasownprop ? didn't last time
+
+ // hasOwnProperty shim by kangax needed for Safari 2.0 support
+ _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
+
+ if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call,
'undefined') ) {
+ hasOwnProp = function (object, property) {
+ return _hasOwnProperty.call(object, property);
+ };
+ }
+ else {
+ hasOwnProp = function (object, property) { /* yes, this can give false
positives/negatives, but most of the time we don't care about those */
+ return ((property in object) &&
is(object.constructor.prototype[property], 'undefined'));
+ };
+ }
+
+ // Adapted from ES5-shim
https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
+ //
es5.github.com/#x15.3.4.5
+
+ if (!Function.prototype.bind) {
+ Function.prototype.bind = function bind(that) {
+
+ var target = this;
+
+ if (typeof target != "function") {
+ throw new TypeError();
+ }
+
+ var args = slice.call(arguments, 1),
+ bound = function () {
+
+ if (this instanceof bound) {
+
+ var F = function(){};
+ F.prototype = target.prototype;
+ var self = new F();
+
+ var result = target.apply(
+ self,
+ args.concat(slice.call(arguments))
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return self;
+
+ } else {
+
+ return target.apply(
+ that,
+ args.concat(slice.call(arguments))
+ );
+
+ }
+
+ };
+
+ return bound;
+ };
+ }
+
+ /**
+ * setCss applies given styles to the Modernizr DOM node.
+ */
+ function setCss( str ) {
+ mStyle.cssText = str;
+ }
+
+ /**
+ * setCssAll extrapolates all vendor-specific css strings.
+ */
+ function setCssAll( str1, str2 ) {
+ return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
+ }
+
+ /**
+ * is returns a boolean for if typeof obj is exactly type.
+ */
+ function is( obj, type ) {
+ return typeof obj === type;
+ }
+
+ /**
+ * contains returns a boolean for if substr is found within str.
+ */
+ function contains( str, substr ) {
+ return !!~('' + str).indexOf(substr);
+ }
+
+ /*>>testprop*/
+
+ // testProps is a generic CSS / DOM property test.
+
+ // In testing support for a given CSS property, it's legit to test:
+ // `elem.style[styleName] !== undefined`
+ // If the property is supported it will return an empty string,
+ // if unsupported it will return undefined.
+
+ // We'll take advantage of this quick test and skip setting a style
+ // on our modernizr element, but instead just testing undefined vs
+ // empty string.
+
+ // Because the testing of the CSS property names (with "-", as
+ // opposed to the camelCase DOM properties) is non-portable and
+ // non-standard but works in WebKit and IE (but not Gecko or Opera),
+ // we explicitly reject properties with dashes so that authors
+ // developing in WebKit or IE first don't end up with
+ // browser-specific content by accident.
+
+ function testProps( props, prefixed ) {
+ for ( var i in props ) {
+ var prop = props[i];
+ if ( !contains(prop, "-") && mStyle[prop] !== undefined )
{
+ return prefixed == 'pfx' ? prop : true;
+ }
+ }
+ return false;
+ }
+ /*>>testprop*/
+
+ // TODO :: add testDOMProps
+ /**
+ * testDOMProps is a generic DOM property test; if a browser supports
+ * a certain property, it won't return undefined for it.
+ */
+ function testDOMProps( props, obj, elem ) {
+ for ( var i in props ) {
+ var item = obj[props[i]];
+ if ( item !== undefined) {
+
+ // return the property name as a string
+ if (elem === false) return props[i];
+
+ // let's bind a function
+ if (is(item, 'function')){
+ // default to autobind unless override
+ return item.bind(elem || obj);
+ }
+
+ // return the unbound function or obj or value
+ return item;
+ }
+ }
+ return false;
+ }
+
+ /*>>testallprops*/
+ /**
+ * testPropsAll tests a list of DOM properties we want to check against.
+ * We specify literally ALL possible (known and/or likely) properties on
+ * the element including the non-vendor prefixed one, for forward-
+ * compatibility.
+ */
+ function testPropsAll( prop, prefixed, elem ) {
+
+ var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
+ props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') +
ucProp).split(' ');
+
+ // did they call .prefixed('boxSizing') or are we just testing a prop?
+ if(is(prefixed, "string") || is(prefixed, "undefined")) {
+ return testProps(props, prefixed);
+
+ // otherwise, they called .prefixed('requestAnimationFrame', window[,
elem])
+ } else {
+ props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') +
ucProp).split(' ');
+ return testDOMProps(props, prefixed, elem);
+ }
+ }
+ /*>>testallprops*/
+
+
+ /**
+ * Tests
+ * -----
+ */
+
+ // The *new* flexbox
+ //
dev.w3.org/csswg/css3-flexbox
+
+ tests['flexbox'] = function() {
+ return testPropsAll('flexWrap');
+ };
+
+ // The *old* flexbox
+ //
www.w3.org/TR/2009/WD-css3-flexbox-20090723/
+
+ tests['flexboxlegacy'] = function() {
+ return testPropsAll('boxDirection');
+ };
+
+ // On the S60 and BB Storm, getContext exists, but always returns undefined
+ // so we actually have to call getContext() to verify
+ //
github.com/Modernizr/Modernizr/issues/issue/97/
+
+ tests['canvas'] = function() {
+ var elem = document.createElement('canvas');
+ return !!(elem.getContext && elem.getContext('2d'));
+ };
+
+ tests['canvastext'] = function() {
+ return !!(Modernizr['canvas'] &&
is(document.createElement('canvas').getContext('2d').fillText,
'function'));
+ };
+
+ // webk.it/70117 is tracking a legit WebGL feature detect proposal
+
+ // We do a soft detect which may false positive in order to avoid
+ // an expensive context creation: bugzil.la/732441
+
+ tests['webgl'] = function() {
+ return !!window.WebGLRenderingContext;
+ };
+
+ /*
+ * The Modernizr.touch test only indicates if the browser supports
+ * touch events, which does not necessarily reflect a touchscreen
+ * device, as evidenced by tablets running Windows 7 or, alas,
+ * the Palm Pre / WebOS (touch) phones.
+ *
+ * Additionally, Chrome (desktop) used to lie about its support on this,
+ * but that has since been rectified:
crbug.com/36415
+ *
+ * We also test for Firefox 4 Multitouch Support.
+ *
+ * For more info, see:
modernizr.github.com/Modernizr/touch.html
+ */
+
+ tests['touch'] = function() {
+ var bool;
+
+ if(('ontouchstart' in window) || window.DocumentTouch && document
instanceof DocumentTouch) {
+ bool = true;
+ } else {
+ injectElementWithStyles(['@media
(',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''),
function( node ) {
+ bool = node.offsetTop === 9;
+ });
+ }
+
+ return bool;
+ };
+
+
+ // geolocation is often considered a trivial feature detect...
+ // Turns out, it's quite tricky to get right:
+ //
+ // Using !!navigator.geolocation does two things we don't want. It:
+ // 1. Leaks memory in IE9:
github.com/Modernizr/Modernizr/issues/513
+ // 2. Disables page caching in WebKit: webk.it/43956
+ //
+ // Meanwhile, in Firefox < 8, an about:config setting could expose
+ // a false positive that would throw an exception: bugzil.la/688158
+
+ tests['geolocation'] = function() {
+ return 'geolocation' in navigator;
+ };
+
+
+ tests['postmessage'] = function() {
+ return !!window.postMessage;
+ };
+
+
+ // Chrome incognito mode used to throw an exception when using openDatabase
+ // It doesn't anymore.
+ tests['websqldatabase'] = function() {
+ return !!window.openDatabase;
+ };
+
+ // Vendors had inconsistent prefixing with the experimental Indexed DB:
+ // - Webkit's implementation is accessible through webkitIndexedDB
+ // - Firefox shipped moz_indexedDB before FF4b9, but since then has been
mozIndexedDB
+ // For speed, we don't test the legacy (and beta-only) indexedDB
+ tests['indexedDB'] = function() {
+ return !!testPropsAll("indexedDB", window);
+ };
+
+ // documentMode logic from YUI to filter out IE8 Compat Mode
+ // which false positives.
+ tests['hashchange'] = function() {
+ return isEventSupported('hashchange', window) &&
(document.documentMode === undefined || document.documentMode > 7);
+ };
+
+ // Per 1.6:
+ // This used to be Modernizr.historymanagement but the longer
+ // name has been deprecated in favor of a shorter and property-matching one.
+ // The old API is still available in 1.6, but as of 2.0 will throw a warning,
+ // and in the first release thereafter disappear entirely.
+ tests['history'] = function() {
+ return !!(window.history && history.pushState);
+ };
+
+ tests['draganddrop'] = function() {
+ var div = document.createElement('div');
+ return ('draggable' in div) || ('ondragstart' in div &&
'ondrop' in div);
+ };
+
+ // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10
+ // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.
+ // FF10 still uses prefixes, so check for it until then.
+ // for more ESR info, see:
mozilla.org/en-US/firefox/organizations/faq/
+ tests['websockets'] = function() {
+ return 'WebSocket' in window || 'MozWebSocket' in window;
+ };
+
+
+ //
css-tricks.com/rgba-browser-support/
+ tests['rgba'] = function() {
+ // Set an rgba() color and check the returned value
+
+ setCss('background-color:rgba(150,255,150,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba');
+ };
+
+ tests['hsla'] = function() {
+ // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
+ // except IE9 who retains it as hsla
+
+ setCss('background-color:hsla(120,40%,100%,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba') ||
contains(mStyle.backgroundColor, 'hsla');
+ };
+
+ tests['multiplebgs'] = function() {
+ // Setting multiple images AND a color on the background shorthand property
+ // and then querying the style.background property value for the number of
+ // occurrences of "url(" is a reliable method for detecting ACTUAL
support for this!
+
+ setCss('background:url(https://),url(https://),red url(https://)');
+
+ // If the UA supports multiple backgrounds, there should be three occurrences
+ // of the string "url(" in the return value for elemStyle.background
+
+ return (/(url\s*\(.*?){3}/).test(mStyle.background);
+ };
+
+
+
+ // this will false positive in Opera Mini
+ //
github.com/Modernizr/Modernizr/issues/396
+
+ tests['backgroundsize'] = function() {
+ return testPropsAll('backgroundSize');
+ };
+
+ tests['borderimage'] = function() {
+ return testPropsAll('borderImage');
+ };
+
+
+ // Super comprehensive table about all the unique implementations of
+ // border-radius:
muddledramblings.com/table-of-css3-border-radius-compliance
+
+ tests['borderradius'] = function() {
+ return testPropsAll('borderRadius');
+ };
+
+ // WebOS unfortunately false positives on this test.
+ tests['boxshadow'] = function() {
+ return testPropsAll('boxShadow');
+ };
+
+ // FF3.0 will false positive on this test
+ tests['textshadow'] = function() {
+ return document.createElement('div').style.textShadow === '';
+ };
+
+
+ tests['opacity'] = function() {
+ // Browsers that actually have CSS Opacity implemented have done so
+ // according to spec, which means their return values are within the
+ // range of [0.0,1.0] - including the leading zero.
+
+ setCssAll('opacity:.55');
+
+ // The non-literal . in this regex is intentional:
+ // German Chrome returns this value as 0,55
+ //
github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
+ return (/^0.55$/).test(mStyle.opacity);
+ };
+
+
+ // Note, Android < 4 will pass this test, but can only animate
+ // a single property at a time
+ // goo.gl/v3V4Gp
+ tests['cssanimations'] = function() {
+ return testPropsAll('animationName');
+ };
+
+
+ tests['csscolumns'] = function() {
+ return testPropsAll('columnCount');
+ };
+
+
+ tests['cssgradients'] = function() {
+ /**
+ * For CSS Gradients syntax, please see:
+ *
webkit.org/blog/175/introducing-css-gradients/
+ *
developer.mozilla.org/en/CSS/-moz-linear-gradient
+ *
developer.mozilla.org/en/CSS/-moz-radial-gradient
+ *
dev.w3.org/csswg/css3-images/#gradients-
+ */
+
+ var str1 = 'background-image:',
+ str2 = 'gradient(linear,left top,right
bottom,from(#9f9),to(white));',
+ str3 = 'linear-gradient(left top,#9f9, white);';
+
+ setCss(
+ // legacy webkit syntax (FIXME: remove when syntax not in use anymore)
+ (str1 + '-webkit- '.split(' ').join(str2 + str1) +
+ // standard syntax // trailing 'background-image:'
+ prefixes.join(str3 + str1)).slice(0, -str1.length)
+ );
+
+ return contains(mStyle.backgroundImage, 'gradient');
+ };
+
+
+ tests['cssreflections'] = function() {
+ return testPropsAll('boxReflect');
+ };
+
+
+ tests['csstransforms'] = function() {
+ return !!testPropsAll('transform');
+ };
+
+
+ tests['csstransforms3d'] = function() {
+
+ var ret = !!testPropsAll('perspective');
+
+ // Webkit's 3D transforms are passed off to the browser's own graphics
renderer.
+ // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
+ // some conditions. As a result, Webkit typically recognizes the syntax but
+ // will sometimes throw a false positive, thus we must do a more thorough
check:
+ if ( ret && 'webkitPerspective' in docElement.style ) {
+
+ // Webkit allows this media query to succeed only if the feature is enabled.
+ // `@media (transform-3d),(-webkit-transform-3d){ ... }`
+ injectElementWithStyles('@media
(transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}',
function( node, rule ) {
+ ret = node.offsetLeft === 9 && node.offsetHeight === 3;
+ });
+ }
+ return ret;
+ };
+
+
+ tests['csstransitions'] = function() {
+ return testPropsAll('transition');
+ };
+
+
+ /*>>fontface*/
+ // @font-face detection routine by Diego Perini
+ //
javascript.nwbox.com/CSSSupport/
+
+ // false positives:
+ // WebOS
github.com/Modernizr/Modernizr/issues/342
+ // WP7
github.com/Modernizr/Modernizr/issues/538
+ tests['fontface'] = function() {
+ var bool;
+
+ injectElementWithStyles('@font-face
{font-family:"font";src:url("https://")}', function( node, rule )
{
+ var style = document.getElementById('smodernizr'),
+ sheet = style.sheet || style.styleSheet,
+ cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ?
sheet.cssRules[0].cssText : sheet.cssText || '') : '';
+
+ bool = /src/i.test(cssText) && cssText.indexOf(rule.split('
')[0]) === 0;
+ });
+
+ return bool;
+ };
+ /*>>fontface*/
+
+ // CSS generated content detection
+ tests['generatedcontent'] = function() {
+ var bool;
+
+ injectElementWithStyles(['#',mod,'{font:0/0
a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1
a}'].join(''), function( node ) {
+ bool = node.offsetHeight >= 3;
+ });
+
+ return bool;
+ };
+
+
+
+ // These tests evaluate support of the video/audio elements, as well as
+ // testing what types of content they support.
+ //
+ // We're using the Boolean constructor here, so that we can extend the value
+ // e.g. Modernizr.video // true
+ // Modernizr.video.ogg // 'probably'
+ //
+ // Codec values from :
github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
+ // thx to NielsLeenheer and zcorpan
+
+ // Note: in some older browsers, "no" was a return value instead of empty
string.
+ // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2
+ // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5
+
+ tests['video'] = function() {
+ var elem = document.createElement('video'),
+ bool = false;
+
+ // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug
#224
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('video/ogg;
codecs="theora"') .replace(/^no$/,'');
+
+ // Without QuickTime, this value will be `undefined`.
github.com/Modernizr/Modernizr/issues/546
+ bool.h264 = elem.canPlayType('video/mp4;
codecs="avc1.42E01E"') .replace(/^no$/,'');
+
+ bool.webm = elem.canPlayType('video/webm; codecs="vp8,
vorbis"').replace(/^no$/,'');
+ }
+
+ } catch(e) { }
+
+ return bool;
+ };
+
+ tests['audio'] = function() {
+ var elem = document.createElement('audio'),
+ bool = false;
+
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('audio/ogg;
codecs="vorbis"').replace(/^no$/,'');
+ bool.mp3 = elem.canPlayType('audio/mpeg;')
.replace(/^no$/,'');
+
+ // Mimetypes accepted:
+ //
developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_e...
+ // bit.ly/iphoneoscodecs
+ bool.wav = elem.canPlayType('audio/wav; codecs="1"')
.replace(/^no$/,'');
+ bool.m4a = ( elem.canPlayType('audio/x-m4a;') ||
+ elem.canPlayType('audio/aac;'))
.replace(/^no$/,'');
+ }
+ } catch(e) { }
+
+ return bool;
+ };
+
+
+ // In FF4, if disabled, window.localStorage should === null.
+
+ // Normally, we could not test that directly and need to do a
+ // `('localStorage' in window) && ` test first because otherwise
Firefox will
+ // throw bugzil.la/365772 if cookies are disabled
+
+ // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem
+ // will throw the exception:
+ // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
+ // Peculiarly, getItem and removeItem calls do not throw.
+
+ // Because we are forced to try/catch this, we'll go aggressive.
+
+ // Just FWIW: IE8 Compat mode supports these features completely:
+ //
www.quirksmode.org/dom/html5.html
+ // But IE8 doesn't support either with local files
+
+ tests['localstorage'] = function() {
+ try {
+ localStorage.setItem(mod, mod);
+ localStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+ tests['sessionstorage'] = function() {
+ try {
+ sessionStorage.setItem(mod, mod);
+ sessionStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+
+ tests['webworkers'] = function() {
+ return !!window.Worker;
+ };
+
+
+ tests['applicationcache'] = function() {
+ return !!window.applicationCache;
+ };
+
+
+ // Thanks to Erik Dahlstrom
+ tests['svg'] = function() {
+ return !!document.createElementNS && !!document.createElementNS(ns.svg,
'svg').createSVGRect;
+ };
+
+ // specifically for SVG inline in HTML, not within XHTML
+ // test page:
paulirish.com/demo/inline-svg
+ tests['inlinesvg'] = function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<svg/>';
+ return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
+ };
+
+ // SVG SMIL animation
+ tests['smil'] = function() {
+ return !!document.createElementNS &&
/SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));
+ };
+
+ // This test is only for clip paths in SVG proper, not clip paths on HTML content
+ // demo:
srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg
+
+ // However read the comments to dig into applying SVG clippaths to HTML content
here:
+ //
github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491
+ tests['svgclippaths'] = function() {
+ return !!document.createElementNS &&
/SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));
+ };
+
+ /*>>webforms*/
+ // input features and input types go directly onto the ret object, bypassing the
tests loop.
+ // Hold this guy to execute in a moment.
+ function webforms() {
+ /*>>input*/
+ // Run through HTML5's new input attributes to see if the UA understands
any.
+ // We're using f which is the <input> element created early on
+ // Mike Taylr has created a comprehensive resource for testing these attributes
+ // when applied to all input types:
+ //
miketaylr.com/code/input-type-attr.html
+ // spec:
www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.ht...
+
+ // Only input placeholder is tested while textarea's placeholder is not.
+ // Currently Safari 4 and Opera 11 have support only for the input placeholder
+ // Both tests are available in feature-detects/forms-placeholder.js
+ Modernizr['input'] = (function( props ) {
+ for ( var i = 0, len = props.length; i < len; i++ ) {
+ attrs[ props[i] ] = !!(props[i] in inputElem);
+ }
+ if (attrs.list){
+ // safari false positive's on datalist: webk.it/74252
+ // see also
github.com/Modernizr/Modernizr/issues/146
+ attrs.list = !!(document.createElement('datalist') &&
window.HTMLDataListElement);
+ }
+ return attrs;
+ })('autocomplete autofocus list placeholder max min multiple pattern required
step'.split(' '));
+ /*>>input*/
+
+ /*>>inputtypes*/
+ // Run through HTML5's new input types to see if the UA understands any.
+ // This is put behind the tests runloop because it doesn't return a
+ // true/false like all the other tests; instead, it returns an object
+ // containing each input type with its corresponding true/false value
+
+ // Big thanks to @miketaylr for the html5 forms expertise.
miketaylr.com/
+ Modernizr['inputtypes'] = (function(props) {
+
+ for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i <
len; i++ ) {
+
+ inputElem.setAttribute('type', inputElemType = props[i]);
+ bool = inputElem.type !== 'text';
+
+ // We first check to see if the type we give it sticks..
+ // If the type does, we feed it a textual value, which shouldn't be
valid.
+ // If the value doesn't stick, we know there's input sanitization
which infers a custom UI
+ if ( bool ) {
+
+ inputElem.value = smile;
+ inputElem.style.cssText =
'position:absolute;visibility:hidden;';
+
+ if ( /^range$/.test(inputElemType) &&
inputElem.style.WebkitAppearance !== undefined ) {
+
+ docElement.appendChild(inputElem);
+ defaultView = document.defaultView;
+
+ // Safari 2-4 allows the smiley as a value, despite making a
slider
+ bool = defaultView.getComputedStyle &&
+ defaultView.getComputedStyle(inputElem,
null).WebkitAppearance !== 'textfield' &&
+ // Mobile android web browser has false positive, so must
+ // check the height to see if the widget is actually
there.
+ (inputElem.offsetHeight !== 0);
+
+ docElement.removeChild(inputElem);
+
+ } else if ( /^(search|tel)$/.test(inputElemType) ){
+ // Spec doesn't define any special parsing or detectable UI
+ // behaviors so we pass these through as true
+
+ // Interestingly, opera fails the earlier test, so it doesn't
+ // even make it here.
+
+ } else if ( /^(url|email)$/.test(inputElemType) ) {
+ // Real url and email support comes with prebaked validation.
+ bool = inputElem.checkValidity && inputElem.checkValidity()
=== false;
+
+ } else {
+ // If the upgraded input compontent rejects the :) text, we got a
winner
+ bool = inputElem.value != smile;
+ }
+ }
+
+ inputs[ props[i] ] = !!bool;
+ }
+ return inputs;
+ })('search tel url email datetime date month week time datetime-local number
range color'.split(' '));
+ /*>>inputtypes*/
+ }
+ /*>>webforms*/
+
+
+ // End of test definitions
+ // -----------------------
+
+
+
+ // Run through all tests and detect their support in the current UA.
+ // todo: hypothetically we could be doing an array of tests and use a basic loop
here.
+ for ( var feature in tests ) {
+ if ( hasOwnProp(tests, feature) ) {
+ // run the test, throw the return value into the Modernizr,
+ // then based on that boolean, define an appropriate className
+ // and push it into an array of classes we'll join later.
+ featureName = feature.toLowerCase();
+ Modernizr[featureName] = tests[feature]();
+
+ classes.push((Modernizr[featureName] ? '' : 'no-') +
featureName);
+ }
+ }
+
+ /*>>webforms*/
+ // input tests need to run.
+ Modernizr.input || webforms();
+ /*>>webforms*/
+
+
+ /**
+ * addTest allows the user to define their own feature tests
+ * the result will be added onto the Modernizr object,
+ * as well as an appropriate className set on the html element
+ *
+ * @param feature - String naming the feature
+ * @param test - Function returning true if feature is supported, false if not
+ */
+ Modernizr.addTest = function ( feature, test ) {
+ if ( typeof feature == 'object' ) {
+ for ( var key in feature ) {
+ if ( hasOwnProp( feature, key ) ) {
+ Modernizr.addTest( key, feature[ key ] );
+ }
+ }
+ } else {
+
+ feature = feature.toLowerCase();
+
+ if ( Modernizr[feature] !== undefined ) {
+ // we're going to quit if you're trying to overwrite an existing test
+ // if we were to allow it, we'd do this:
+ // var re = new RegExp("\\b(no-)?" + feature + "\\b");
+ // docElement.className = docElement.className.replace( re, '' );
+ // but, no rly, stuff 'em.
+ return Modernizr;
+ }
+
+ test = typeof test == 'function' ? test() : test;
+
+ if (typeof enableClasses !== "undefined" && enableClasses) {
+ docElement.className += ' ' + (test ? '' : 'no-') +
feature;
+ }
+ Modernizr[feature] = test;
+
+ }
+
+ return Modernizr; // allow chaining.
+ };
+
+
+ // Reset modElem.cssText to nothing to reduce memory footprint.
+ setCss('');
+ modElem = inputElem = null;
+
+ /*>>shiv*/
+ /**
+ * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2
Licensed
+ */
+ ;(function(window, document) {
+ /*jshint evil:true */
+ /** version */
+ var version = '3.7.0';
+
+ /** Preset options */
+ var options = window.html5 || {};
+
+ /** Used to skip problem elements */
+ var reSkip =
/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ /** Not all elements can be cloned in IE **/
+ var saveClones =
/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
+
+ /** Detect whether the browser supports default html5 styles */
+ var supportsHtml5Styles;
+
+ /** Name of the expando, to work with multiple documents or to re-shiv one
document */
+ var expando = '_html5shiv';
+
+ /** The id for the the documents expando */
+ var expanID = 0;
+
+ /** Cached data for each document */
+ var expandoData = {};
+
+ /** Detect whether the browser supports unknown elements */
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = '<xyz></xyz>';
+ //if the hidden property is implemented we can assume, that the browser
supports basic HTML5 Styles
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ // assign a false positive if unable to shiv
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ // assign a false positive if detection fails => unable to shiv
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Creates a style sheet with the given CSS text and adds it to the document.
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @param {String} cssText The CSS text.
+ * @returns {StyleSheet} The style element.
+ */
+ function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] ||
ownerDocument.documentElement;
+
+ p.innerHTML = 'x<style>' + cssText + '</style>';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ /**
+ * Returns the value of `html5.elements` as an array.
+ * @private
+ * @returns {Array} An array of shived element node names.
+ */
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') :
elements;
+ }
+
+ /**
+ * Returns the data associated to the given document
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Object} An object of data.
+ */
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ /**
+ * returns a shived element for the given nodeName and document
+ * @memberOf html5
+ * @param {String} nodeName name of the element
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived element.
+ */
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ // Avoid adding some elements to fragments in IE < 9 because
+ // * Attributes like `name` or `type` cannot be set/changed once an element
+ // is inserted into a document/fragment
+ // * Link elements with `src` attributes that are inaccessible, as with
+ // a 403 response, will cause the tab/window to crash
+ // * Script elements appended to fragments will execute when their `src`
+ // or `text` property is set
+ return node.canHaveChildren && !reSkip.test(nodeName) &&
!node.tagUrn ? data.frag.appendChild(node) : node;
+ }
+
+ /**
+ * returns a shived DocumentFragment for the given document
+ * @memberOf html5
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived DocumentFragment.
+ */
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;i<l;i++){
+ clone.createElement(elems[i]);
+ }
+ return clone;
+ }
+
+ /**
+ * Shivs the `createElement` and `createDocumentFragment` methods of the
document.
+ * @private
+ * @param {Document|DocumentFragment} ownerDocument The document.
+ * @param {Object} data of the document.
+ */
+ function shivMethods(ownerDocument, data) {
+ if (!data.cache) {
+ data.cache = {};
+ data.createElem = ownerDocument.createElement;
+ data.createFrag = ownerDocument.createDocumentFragment;
+ data.frag = data.createFrag();
+ }
+
+
+ ownerDocument.createElement = function(nodeName) {
+ //abort shiv
+ if (!html5.shivMethods) {
+ return data.createElem(nodeName);
+ }
+ return createElement(nodeName, ownerDocument, data);
+ };
+
+ ownerDocument.createDocumentFragment = Function('h,f', 'return
function(){' +
+ 'var
n=f.cloneNode(),c=n.createElement;' +
+
'h.shivMethods&&(' +
+ // unroll the `createElement`
calls
+
getElements().join().replace(/[\w\-]+/g, function(nodeName) {
+ data.createElem(nodeName);
+ data.frag.createElement(nodeName);
+ return 'c("' + nodeName + '")';
+ }) +
+ ');return n}'
+ )(html5, data.frag);
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Shivs the given document.
+ * @memberOf html5
+ * @param {Document} ownerDocument The document to shiv.
+ * @returns {Document} The shived document.
+ */
+ function shivDocument(ownerDocument) {
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ var data = getExpandoData(ownerDocument);
+
+ if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
+ data.hasCSS = !!addStyleSheet(ownerDocument,
+ // corrects block display not defined in
IE6/7/8/9
+
'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}'
+
+ // adds styling not present in IE6/7/8/9
+ 'mark{background:#FF0;color:#000}' +
+ // hides non-rendered elements
+ 'template{display:none}'
+ );
+ }
+ if (!supportsUnknownElements) {
+ shivMethods(ownerDocument, data);
+ }
+ return ownerDocument;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * The `html5` object is exposed so that more elements can be shived and
+ * existing shiving can be detected on iframes.
+ * @type Object
+ * @example
+ *
+ * // options can be changed before the script is included
+ * html5 = { 'elements': 'mark section', 'shivCSS':
false, 'shivMethods': false };
+ */
+ var html5 = {
+
+ /**
+ * An array or space separated string of node names of the elements to shiv.
+ * @memberOf html5
+ * @type Array|String
+ */
+ 'elements': options.elements || 'abbr article aside audio bdi
canvas data datalist details dialog figcaption figure footer header hgroup main mark meter
nav output progress section summary template time video',
+
+ /**
+ * current version of html5shiv
+ */
+ 'version': version,
+
+ /**
+ * A flag to indicate that the HTML5 style sheet should be inserted.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivCSS': (options.shivCSS !== false),
+
+ /**
+ * Is equal to true if a browser supports creating unknown/HTML5 elements
+ * @memberOf html5
+ * @type boolean
+ */
+ 'supportsUnknownElements': supportsUnknownElements,
+
+ /**
+ * A flag to indicate that the document's `createElement` and
`createDocumentFragment`
+ * methods should be overwritten.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivMethods': (options.shivMethods !== false),
+
+ /**
+ * A string to describe the type of `html5` object ("default" or
"default print").
+ * @memberOf html5
+ * @type String
+ */
+ 'type': 'default',
+
+ // shivs the document according to the specified `html5` object options
+ 'shivDocument': shivDocument,
+
+ //creates a shived element
+ createElement: createElement,
+
+ //creates a shived documentFragment
+ createDocumentFragment: createDocumentFragment
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ // expose html5
+ window.html5 = html5;
+
+ // shiv the document
+ shivDocument(document);
+
+ }(this, document));
+ /*>>shiv*/
+
+ // Assign private properties to the return object with prefix
+ Modernizr._version = version;
+
+ // expose these for the plugin API. Look in the source for how to join() them against
your input
+ /*>>prefixes*/
+ Modernizr._prefixes = prefixes;
+ /*>>prefixes*/
+ /*>>domprefixes*/
+ Modernizr._domPrefixes = domPrefixes;
+ Modernizr._cssomPrefixes = cssomPrefixes;
+ /*>>domprefixes*/
+
+ /*>>mq*/
+ // Modernizr.mq tests a given media query, live against the current state of the
window
+ // A few important notes:
+ // * If a browser does not support media queries at all (eg. oldIE) the mq() will
always return false
+ // * A max-width or orientation query will be evaluated against the current state,
which may change later.
+ // * You must specify values. Eg. If you are testing support for the min-width
media query use:
+ // Modernizr.mq('(min-width:0)')
+ // usage:
+ // Modernizr.mq('only screen and (max-width:768)')
+ Modernizr.mq = testMediaQuery;
+ /*>>mq*/
+
+ /*>>hasevent*/
+ // Modernizr.hasEvent() detects support for a given event, with an optional element
to test on
+ // Modernizr.hasEvent('gesturestart', elem)
+ Modernizr.hasEvent = isEventSupported;
+ /*>>hasevent*/
+
+ /*>>testprop*/
+ // Modernizr.testProp() investigates whether a given style property is recognized
+ // Note that the property names must be provided in the camelCase variant.
+ // Modernizr.testProp('pointerEvents')
+ Modernizr.testProp = function(prop){
+ return testProps([prop]);
+ };
+ /*>>testprop*/
+
+ /*>>testallprops*/
+ // Modernizr.testAllProps() investigates whether a given style property,
+ // or any of its vendor-prefixed variants, is recognized
+ // Note that the property names must be provided in the camelCase variant.
+ // Modernizr.testAllProps('boxSizing')
+ Modernizr.testAllProps = testPropsAll;
+ /*>>testallprops*/
+
+
+ /*>>teststyles*/
+ // Modernizr.testStyles() allows you to add custom styles to the document and test an
element afterwards
+ // Modernizr.testStyles('#modernizr { position:absolute }', function(elem,
rule){ ... })
+ Modernizr.testStyles = injectElementWithStyles;
+ /*>>teststyles*/
+
+
+ /*>>prefixed*/
+ // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of
your input
+ // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
+
+ // Properties must be passed as dom-style camelcase, rather than `box-sizing`
hypentated style.
+ // Return values will also be the camelCase variant, if you need to translate that to
hypenated style use:
+ //
+ // str.replace(/([A-Z])/g, function(str,m1){ return '-' +
m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
+
+ // If you're trying to ascertain which transition end event to bind to, you might
do something like...
+ //
+ // var transEndEventNames = {
+ // 'WebkitTransition' : 'webkitTransitionEnd',
+ // 'MozTransition' : 'transitionend',
+ // 'OTransition' : 'oTransitionEnd',
+ // 'msTransition' : 'MSTransitionEnd',
+ // 'transition' : 'transitionend'
+ // },
+ // transEndEventName = transEndEventNames[
Modernizr.prefixed('transition') ];
+
+ Modernizr.prefixed = function(prop, obj, elem){
+ if(!obj) {
+ return testPropsAll(prop, 'pfx');
+ } else {
+ // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame',
window) // 'mozRequestAnimationFrame'
+ return testPropsAll(prop, obj, elem);
+ }
+ };
+ /*>>prefixed*/
+
+
+ /*>>cssclasses*/
+ // Remove "no-js" class from <html> element, if it exists:
+ docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/,
'$1$2') +
+
+ // Add the new classes to the <html> element.
+ (enableClasses ? ' js ' + classes.join(' ') :
'');
+ /*>>cssclasses*/
+
+ return Modernizr;
+
+})(this, this.document);
diff --git a/ui/libs/themes/base/bootstrap-official.css
b/ui/libs/themes/base/bootstrap-official.css
new file mode 100644
index 0000000..1ef9125
--- /dev/null
+++ b/ui/libs/themes/base/bootstrap-official.css
@@ -0,0 +1,6842 @@
+/*!
+ * Bootstrap v3.3.5 (
http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License |
github.com/necolas/normalize.css */
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline;
+}
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+[hidden],
+template {
+ display: none;
+}
+
+a {
+ background-color: transparent;
+}
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+b,
+strong {
+ font-weight: bold;
+}
+
+dfn {
+ font-style: italic;
+}
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+img {
+ border: 0;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+figure {
+ margin: 1em 40px;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+}
+
+pre {
+ overflow: auto;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0;
+}
+
+button {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+html input[type="button"], input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+input {
+ line-height: normal;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: textfield;
+ box-sizing: content-box;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+legend {
+ border: 0;
+ padding: 0;
+}
+
+textarea {
+ overflow: auto;
+}
+
+optgroup {
+ font-weight: bold;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
+
+/*! Source:
https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+ *,
+ *:before,
+ *:after {
+ background: transparent !important;
+ color: #000 !important;
+ box-shadow: none !important;
+ text-shadow: none !important;
+ }
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+ a[href^="#"]:after,
+ a[href^="javascript:"]:after {
+ content: "";
+ }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ img {
+ max-width: 100% !important;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ .navbar {
+ display: none;
+ }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+ .label {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+
+* {
+ box-sizing: border-box;
+}
+
+*:before,
+*:after {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 10px;
+ -webkit-tap-highlight-color: transparent;
+}
+
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #333333;
+ background-color: #fff;
+}
+
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+a {
+ color: #337ab7;
+ text-decoration: none;
+}
+
+a:hover,
+a:focus {
+ color: #23527c;
+ text-decoration: underline;
+}
+
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+figure {
+ margin: 0;
+}
+
+img {
+ vertical-align: middle;
+}
+
+.img-responsive {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-rounded {
+ border-radius: 6px;
+}
+
+.img-thumbnail {
+ padding: 4px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ transition: all 0.2s ease-in-out;
+ display: inline-block;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-circle {
+ border-radius: 50%;
+}
+
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #eeeeee;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
+
+[role="button"] {
+ cursor: pointer;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
+h1 small,
+h1 .small, h2 small,
+h2 .small, h3 small,
+h3 .small, h4 small,
+h4 .small, h5 small,
+h5 .small, h6 small,
+h6 .small,
+.h1 small,
+.h1 .small, .h2 small,
+.h2 .small, .h3 small,
+.h3 .small, .h4 small,
+.h4 .small, .h5 small,
+.h5 .small, .h6 small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #777777;
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+
+h1 small,
+h1 .small, .h1 small,
+.h1 .small,
+h2 small,
+h2 .small, .h2 small,
+.h2 .small,
+h3 small,
+h3 .small, .h3 small,
+.h3 .small {
+ font-size: 65%;
+}
+
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+h4 small,
+h4 .small, .h4 small,
+.h4 .small,
+h5 small,
+h5 .small, .h5 small,
+.h5 .small,
+h6 small,
+h6 .small, .h6 small,
+.h6 .small {
+ font-size: 75%;
+}
+
+h1, .h1 {
+ font-size: 36px;
+}
+
+h2, .h2 {
+ font-size: 30px;
+}
+
+h3, .h3 {
+ font-size: 24px;
+}
+
+h4, .h4 {
+ font-size: 18px;
+}
+
+h5, .h5 {
+ font-size: 14px;
+}
+
+h6, .h6 {
+ font-size: 12px;
+}
+
+p {
+ margin: 0 0 10px;
+}
+
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4;
+}
+
+@media (min-width: 768px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+
+small,
+.small {
+ font-size: 85%;
+}
+
+mark,
+.mark {
+ background-color: #fcf8e3;
+ padding: .2em;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-justify {
+ text-align: justify;
+}
+
+.text-nowrap {
+ white-space: nowrap;
+}
+
+.text-lowercase {
+ text-transform: lowercase;
+}
+
+.text-uppercase, .initialism {
+ text-transform: uppercase;
+}
+
+.text-capitalize {
+ text-transform: capitalize;
+}
+
+.text-muted {
+ color: #777777;
+}
+
+.text-primary {
+ color: #337ab7;
+}
+
+a.text-primary:hover,
+a.text-primary:focus {
+ color: #286090;
+}
+
+.text-success {
+ color: #3c763d;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+ color: #2b542c;
+}
+
+.text-info {
+ color: #31708f;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+ color: #245269;
+}
+
+.text-warning {
+ color: #8a6d3b;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+ color: #66512c;
+}
+
+.text-danger {
+ color: #a94442;
+}
+
+a.text-danger:hover,
+a.text-danger:focus {
+ color: #843534;
+}
+
+.bg-primary {
+ color: #fff;
+}
+
+.bg-primary {
+ background-color: #337ab7;
+}
+
+a.bg-primary:hover,
+a.bg-primary:focus {
+ background-color: #286090;
+}
+
+.bg-success {
+ background-color: #dff0d8;
+}
+
+a.bg-success:hover,
+a.bg-success:focus {
+ background-color: #c1e2b3;
+}
+
+.bg-info {
+ background-color: #d9edf7;
+}
+
+a.bg-info:hover,
+a.bg-info:focus {
+ background-color: #afd9ee;
+}
+
+.bg-warning {
+ background-color: #fcf8e3;
+}
+
+a.bg-warning:hover,
+a.bg-warning:focus {
+ background-color: #f7ecb5;
+}
+
+.bg-danger {
+ background-color: #f2dede;
+}
+
+a.bg-danger:hover,
+a.bg-danger:focus {
+ background-color: #e4b9b9;
+}
+
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+ul ul,
+ul ol,
+ol ul,
+ol ol {
+ margin-bottom: 0;
+}
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+ margin-left: -5px;
+}
+
+.list-inline > li {
+ display: inline-block;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+dt,
+dd {
+ line-height: 1.428571429;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 0;
+}
+
+.dl-horizontal dd:before,
+.dl-horizontal dd:after {
+ content: " ";
+ display: table;
+}
+
+.dl-horizontal dd:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ clear: left;
+ text-align: right;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .dl-horizontal dd {
+ margin-left: 180px;
+ }
+}
+
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #777777;
+}
+
+.initialism {
+ font-size: 90%;
+}
+
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #eeeeee;
+}
+
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+ margin-bottom: 0;
+}
+
+blockquote footer,
+blockquote small,
+blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.428571429;
+ color: #777777;
+}
+
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+ content: '\2014 \00A0';
+}
+
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid #eeeeee;
+ border-left: 0;
+ text-align: right;
+}
+
+.blockquote-reverse footer:before,
+.blockquote-reverse small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right footer:before,
+blockquote.pull-right small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+
+.blockquote-reverse footer:after,
+.blockquote-reverse small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right footer:after,
+blockquote.pull-right small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.428571429;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ background-color: #f9f2f4;
+ border-radius: 4px;
+}
+
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+ box-shadow: none;
+}
+
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.428571429;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #333333;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+
+pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.container:before,
+.container:after {
+ content: " ";
+ display: table;
+}
+
+.container:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .container {
+ width: 750px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 970px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px;
+ }
+}
+
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+ content: " ";
+ display: table;
+}
+
+.container-fluid:after {
+ clear: both;
+}
+
+.row {
+ margin-left: -15px;
+ margin-right: -15px;
+}
+
+.row:before,
+.row:after {
+ content: " ";
+ display: table;
+}
+
+.row:after {
+ clear: both;
+}
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2,
.col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4,
.col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6,
.col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8,
.col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10,
.col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12,
.col-md-12, .col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8,
.col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+ float: left;
+}
+
+.col-xs-1 {
+ width: 8.3333333333%;
+}
+
+.col-xs-2 {
+ width: 16.6666666667%;
+}
+
+.col-xs-3 {
+ width: 25%;
+}
+
+.col-xs-4 {
+ width: 33.3333333333%;
+}
+
+.col-xs-5 {
+ width: 41.6666666667%;
+}
+
+.col-xs-6 {
+ width: 50%;
+}
+
+.col-xs-7 {
+ width: 58.3333333333%;
+}
+
+.col-xs-8 {
+ width: 66.6666666667%;
+}
+
+.col-xs-9 {
+ width: 75%;
+}
+
+.col-xs-10 {
+ width: 83.3333333333%;
+}
+
+.col-xs-11 {
+ width: 91.6666666667%;
+}
+
+.col-xs-12 {
+ width: 100%;
+}
+
+.col-xs-pull-0 {
+ right: auto;
+}
+
+.col-xs-pull-1 {
+ right: 8.3333333333%;
+}
+
+.col-xs-pull-2 {
+ right: 16.6666666667%;
+}
+
+.col-xs-pull-3 {
+ right: 25%;
+}
+
+.col-xs-pull-4 {
+ right: 33.3333333333%;
+}
+
+.col-xs-pull-5 {
+ right: 41.6666666667%;
+}
+
+.col-xs-pull-6 {
+ right: 50%;
+}
+
+.col-xs-pull-7 {
+ right: 58.3333333333%;
+}
+
+.col-xs-pull-8 {
+ right: 66.6666666667%;
+}
+
+.col-xs-pull-9 {
+ right: 75%;
+}
+
+.col-xs-pull-10 {
+ right: 83.3333333333%;
+}
+
+.col-xs-pull-11 {
+ right: 91.6666666667%;
+}
+
+.col-xs-pull-12 {
+ right: 100%;
+}
+
+.col-xs-push-0 {
+ left: auto;
+}
+
+.col-xs-push-1 {
+ left: 8.3333333333%;
+}
+
+.col-xs-push-2 {
+ left: 16.6666666667%;
+}
+
+.col-xs-push-3 {
+ left: 25%;
+}
+
+.col-xs-push-4 {
+ left: 33.3333333333%;
+}
+
+.col-xs-push-5 {
+ left: 41.6666666667%;
+}
+
+.col-xs-push-6 {
+ left: 50%;
+}
+
+.col-xs-push-7 {
+ left: 58.3333333333%;
+}
+
+.col-xs-push-8 {
+ left: 66.6666666667%;
+}
+
+.col-xs-push-9 {
+ left: 75%;
+}
+
+.col-xs-push-10 {
+ left: 83.3333333333%;
+}
+
+.col-xs-push-11 {
+ left: 91.6666666667%;
+}
+
+.col-xs-push-12 {
+ left: 100%;
+}
+
+.col-xs-offset-0 {
+ margin-left: 0%;
+}
+
+.col-xs-offset-1 {
+ margin-left: 8.3333333333%;
+}
+
+.col-xs-offset-2 {
+ margin-left: 16.6666666667%;
+}
+
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+
+.col-xs-offset-4 {
+ margin-left: 33.3333333333%;
+}
+
+.col-xs-offset-5 {
+ margin-left: 41.6666666667%;
+}
+
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+
+.col-xs-offset-7 {
+ margin-left: 58.3333333333%;
+}
+
+.col-xs-offset-8 {
+ margin-left: 66.6666666667%;
+}
+
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+
+.col-xs-offset-10 {
+ margin-left: 83.3333333333%;
+}
+
+.col-xs-offset-11 {
+ margin-left: 91.6666666667%;
+}
+
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+
+@media (min-width: 768px) {
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8,
.col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+ float: left;
+ }
+ .col-sm-1 {
+ width: 8.3333333333%;
+ }
+ .col-sm-2 {
+ width: 16.6666666667%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-4 {
+ width: 33.3333333333%;
+ }
+ .col-sm-5 {
+ width: 41.6666666667%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-7 {
+ width: 58.3333333333%;
+ }
+ .col-sm-8 {
+ width: 66.6666666667%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-10 {
+ width: 83.3333333333%;
+ }
+ .col-sm-11 {
+ width: 91.6666666667%;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-pull-0 {
+ right: auto;
+ }
+ .col-sm-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-sm-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-sm-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-sm-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-sm-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-push-0 {
+ left: auto;
+ }
+ .col-sm-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-sm-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-sm-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-sm-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-sm-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+@media (min-width: 992px) {
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8,
.col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+ float: left;
+ }
+ .col-md-1 {
+ width: 8.3333333333%;
+ }
+ .col-md-2 {
+ width: 16.6666666667%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-4 {
+ width: 33.3333333333%;
+ }
+ .col-md-5 {
+ width: 41.6666666667%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-7 {
+ width: 58.3333333333%;
+ }
+ .col-md-8 {
+ width: 66.6666666667%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-10 {
+ width: 83.3333333333%;
+ }
+ .col-md-11 {
+ width: 91.6666666667%;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-pull-0 {
+ right: auto;
+ }
+ .col-md-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-md-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-md-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-md-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-md-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-push-0 {
+ left: auto;
+ }
+ .col-md-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-md-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-md-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-md-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-md-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8,
.col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+ float: left;
+ }
+ .col-lg-1 {
+ width: 8.3333333333%;
+ }
+ .col-lg-2 {
+ width: 16.6666666667%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-4 {
+ width: 33.3333333333%;
+ }
+ .col-lg-5 {
+ width: 41.6666666667%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-7 {
+ width: 58.3333333333%;
+ }
+ .col-lg-8 {
+ width: 66.6666666667%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-10 {
+ width: 83.3333333333%;
+ }
+ .col-lg-11 {
+ width: 91.6666666667%;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-pull-0 {
+ right: auto;
+ }
+ .col-lg-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-lg-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-lg-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-lg-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-lg-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-push-0 {
+ left: auto;
+ }
+ .col-lg-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-lg-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-lg-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-lg-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-lg-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+table {
+ background-color: transparent;
+}
+
+caption {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: #777777;
+ text-align: left;
+}
+
+th {
+ text-align: left;
+}
+
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 20px;
+}
+
+.table > thead > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > th,
+.table > tbody > tr > td,
+.table > tfoot > tr > th,
+.table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.428571429;
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+}
+
+.table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ddd;
+}
+
+.table > caption + thead > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > th,
+.table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+
+.table > tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+
+.table .table {
+ background-color: #fff;
+}
+
+.table-condensed > thead > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > th,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > th,
+.table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+
+.table-bordered {
+ border: 1px solid #ddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > th,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > th,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #ddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) {
+ background-color: #f9f9f9;
+}
+
+.table-hover > tbody > tr:hover {
+ background-color: #f5f5f5;
+}
+
+table col[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-column;
+}
+
+table td[class*="col-"],
+table th[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-cell;
+}
+
+.table > thead > tr > td.active,
+.table > thead > tr > th.active,
+.table > thead > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr > td.active,
+.table > tbody > tr > th.active,
+.table > tbody > tr.active > td,
+.table > tbody > tr.active > th,
+.table > tfoot > tr > td.active,
+.table > tfoot > tr > th.active,
+.table > tfoot > tr.active > td,
+.table > tfoot > tr.active > th {
+ background-color: #f5f5f5;
+}
+
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+ background-color: #e8e8e8;
+}
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success,
+.table > thead > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+ background-color: #dff0d8;
+}
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #d0e9c6;
+}
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info,
+.table > thead > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+ background-color: #d9edf7;
+}
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #c4e3f3;
+}
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+ background-color: #fcf8e3;
+}
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #faf2cc;
+}
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+ background-color: #f2dede;
+}
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #ebcccc;
+}
+
+.table-responsive {
+ overflow-x: auto;
+ min-height: 0.01%;
+}
+
+@media screen and (max-width: 767px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-y: hidden;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #ddd;
+ }
+ .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > th,
+ .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap;
+ }
+ .table-responsive > .table-bordered {
+ border: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+ }
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+ }
+}
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+ min-width: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #333333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+label {
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+
+input[type="search"] {
+ box-sizing: border-box;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ line-height: normal;
+}
+
+input[type="file"] {
+ display: block;
+}
+
+input[type="range"] {
+ display: block;
+ width: 100%;
+}
+
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #555555;
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #555555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+
+.form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+
+.form-control::-moz-placeholder {
+ color: #999;
+ opacity: 1;
+}
+
+.form-control:-ms-input-placeholder {
+ color: #999;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #999;
+}
+
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+ background-color: #eeeeee;
+ opacity: 1;
+}
+
+.form-control[disabled],
+fieldset[disabled] .form-control {
+ cursor: not-allowed;
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: none;
+}
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ input[type="date"].form-control,
+ input[type="time"].form-control,
+ input[type="datetime-local"].form-control,
+ input[type="month"].form-control {
+ line-height: 34px;
+ }
+ input[type="date"].input-sm,
+ .input-group-sm > input[type="date"].form-control,
+ .input-group-sm > input[type="date"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="date"].btn,
+ .input-group-sm input[type="date"],
+ input[type="time"].input-sm,
+ .input-group-sm > input[type="time"].form-control,
+ .input-group-sm > input[type="time"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="time"].btn,
+ .input-group-sm input[type="time"],
+ input[type="datetime-local"].input-sm,
+ .input-group-sm > input[type="datetime-local"].form-control,
+ .input-group-sm > input[type="datetime-local"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-sm input[type="datetime-local"],
+ input[type="month"].input-sm,
+ .input-group-sm > input[type="month"].form-control,
+ .input-group-sm > input[type="month"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="month"].btn,
+ .input-group-sm input[type="month"] {
+ line-height: 30px;
+ }
+ input[type="date"].input-lg,
+ .input-group-lg > input[type="date"].form-control,
+ .input-group-lg > input[type="date"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="date"].btn,
+ .input-group-lg input[type="date"],
+ input[type="time"].input-lg,
+ .input-group-lg > input[type="time"].form-control,
+ .input-group-lg > input[type="time"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="time"].btn,
+ .input-group-lg input[type="time"],
+ input[type="datetime-local"].input-lg,
+ .input-group-lg > input[type="datetime-local"].form-control,
+ .input-group-lg > input[type="datetime-local"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-lg input[type="datetime-local"],
+ input[type="month"].input-lg,
+ .input-group-lg > input[type="month"].form-control,
+ .input-group-lg > input[type="month"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="month"].btn,
+ .input-group-lg input[type="month"] {
+ line-height: 46px;
+ }
+}
+
+.form-group {
+ margin-bottom: 15px;
+}
+
+.radio,
+.checkbox {
+ position: relative;
+ display: block;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.radio label,
+.checkbox label {
+ min-height: 20px;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ position: absolute;
+ margin-left: -20px;
+ margin-top: 4px \9;
+}
+
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px;
+}
+
+.radio-inline,
+.checkbox-inline {
+ position: relative;
+ display: inline-block;
+ padding-left: 20px;
+ margin-bottom: 0;
+ vertical-align: middle;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
+ margin-left: 10px;
+}
+
+input[type="radio"][disabled],
+input[type="radio"].disabled,
+fieldset[disabled] input[type="radio"],
+input[type="checkbox"][disabled],
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="checkbox"] {
+ cursor: not-allowed;
+}
+
+.radio-inline.disabled,
+fieldset[disabled] .radio-inline,
+.checkbox-inline.disabled,
+fieldset[disabled] .checkbox-inline {
+ cursor: not-allowed;
+}
+
+.radio.disabled label,
+fieldset[disabled] .radio label,
+.checkbox.disabled label,
+fieldset[disabled] .checkbox label {
+ cursor: not-allowed;
+}
+
+.form-control-static {
+ padding-top: 7px;
+ padding-bottom: 7px;
+ margin-bottom: 0;
+ min-height: 34px;
+}
+
+.form-control-static.input-lg,
+.input-group-lg > .form-control-static.form-control,
+.input-group-lg > .form-control-static.input-group-addon,
+.input-group-lg > .input-group-btn > .form-control-static.btn,
+.form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
+.input-group-sm > .form-control-static.input-group-addon,
+.input-group-sm > .input-group-btn > .form-control-static.btn {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.input-sm, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+select.input-sm, .input-group-sm > select.form-control,
+.input-group-sm > select.input-group-addon,
+.input-group-sm > .input-group-btn > select.btn {
+ height: 30px;
+ line-height: 30px;
+}
+
+textarea.input-sm,
+.input-group-sm > textarea.form-control,
+.input-group-sm > textarea.input-group-addon,
+.input-group-sm > .input-group-btn > textarea.btn,
+select[multiple].input-sm, .input-group-sm > select[multiple].form-control,
+.input-group-sm > select[multiple].input-group-addon,
+.input-group-sm > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.form-group-sm .form-control {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.form-group-sm select.form-control {
+ height: 30px;
+ line-height: 30px;
+}
+
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+ height: auto;
+}
+
+.form-group-sm .form-control-static {
+ height: 30px;
+ min-height: 32px;
+ padding: 6px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.input-lg, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 6px;
+}
+
+select.input-lg, .input-group-lg > select.form-control,
+.input-group-lg > select.input-group-addon,
+.input-group-lg > .input-group-btn > select.btn {
+ height: 46px;
+ line-height: 46px;
+}
+
+textarea.input-lg,
+.input-group-lg > textarea.form-control,
+.input-group-lg > textarea.input-group-addon,
+.input-group-lg > .input-group-btn > textarea.btn,
+select[multiple].input-lg, .input-group-lg > select[multiple].form-control,
+.input-group-lg > select[multiple].input-group-addon,
+.input-group-lg > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.form-group-lg .form-control {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 6px;
+}
+
+.form-group-lg select.form-control {
+ height: 46px;
+ line-height: 46px;
+}
+
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+ height: auto;
+}
+
+.form-group-lg .form-control-static {
+ height: 46px;
+ min-height: 38px;
+ padding: 11px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+
+.has-feedback {
+ position: relative;
+}
+
+.has-feedback .form-control {
+ padding-right: 42.5px;
+}
+
+.form-control-feedback {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+ pointer-events: none;
+}
+
+.input-lg + .form-control-feedback,
+.input-group-lg > .form-control + .form-control-feedback,
+.input-group-lg > .input-group-addon + .form-control-feedback,
+.input-group-lg > .input-group-btn > .btn + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+ width: 46px;
+ height: 46px;
+ line-height: 46px;
+}
+
+.input-sm + .form-control-feedback,
+.input-group-sm > .form-control + .form-control-feedback,
+.input-group-sm > .input-group-addon + .form-control-feedback,
+.input-group-sm > .input-group-btn > .btn + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+}
+
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+ color: #3c763d;
+}
+
+.has-success .form-control {
+ border-color: #3c763d;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-success .form-control:focus {
+ border-color: #2b542c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+}
+
+.has-success .input-group-addon {
+ color: #3c763d;
+ border-color: #3c763d;
+ background-color: #dff0d8;
+}
+
+.has-success .form-control-feedback {
+ color: #3c763d;
+}
+
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+ color: #8a6d3b;
+}
+
+.has-warning .form-control {
+ border-color: #8a6d3b;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-warning .form-control:focus {
+ border-color: #66512c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+}
+
+.has-warning .input-group-addon {
+ color: #8a6d3b;
+ border-color: #8a6d3b;
+ background-color: #fcf8e3;
+}
+
+.has-warning .form-control-feedback {
+ color: #8a6d3b;
+}
+
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+ color: #a94442;
+}
+
+.has-error .form-control {
+ border-color: #a94442;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-error .form-control:focus {
+ border-color: #843534;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+
+.has-error .input-group-addon {
+ color: #a94442;
+ border-color: #a94442;
+ background-color: #f2dede;
+}
+
+.has-error .form-control-feedback {
+ color: #a94442;
+}
+
+.has-feedback label ~ .form-control-feedback {
+ top: 25px;
+}
+
+.has-feedback label.sr-only ~ .form-control-feedback {
+ top: 0;
+}
+
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #737373;
+}
+
+@media (min-width: 768px) {
+ .form-inline .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-static {
+ display: inline-block;
+ }
+ .form-inline .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .form-inline .input-group .input-group-addon,
+ .form-inline .input-group .input-group-btn,
+ .form-inline .input-group .form-control {
+ width: auto;
+ }
+ .form-inline .input-group > .form-control {
+ width: 100%;
+ }
+ .form-inline .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio label,
+ .form-inline .checkbox label {
+ padding-left: 0;
+ }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-top: 7px;
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px;
+}
+
+.form-horizontal .form-group {
+ margin-left: -15px;
+ margin-right: -15px;
+}
+
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after {
+ content: " ";
+ display: table;
+}
+
+.form-horizontal .form-group:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .form-horizontal .control-label {
+ text-align: right;
+ margin-bottom: 0;
+ padding-top: 7px;
+ }
+}
+
+.form-horizontal .has-feedback .form-control-feedback {
+ right: 15px;
+}
+
+@media (min-width: 768px) {
+ .form-horizontal .form-group-lg .control-label {
+ padding-top: 14.333333px;
+ font-size: 18px;
+ }
+}
+
+@media (min-width: 768px) {
+ .form-horizontal .form-group-sm .control-label {
+ padding-top: 6px;
+ font-size: 12px;
+ }
+}
+
+.btn {
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: normal;
+ text-align: center;
+ vertical-align: middle;
+ touch-action: manipulation;
+ cursor: pointer;
+ background-image: none;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ border-radius: 4px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.btn:focus,
+.btn.focus,
+.btn:active:focus,
+.btn:active.focus,
+.btn.active:focus,
+.btn.active.focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+.btn:hover,
+.btn:focus,
+.btn.focus {
+ color: #333;
+ text-decoration: none;
+}
+
+.btn:active,
+.btn.active {
+ outline: 0;
+ background-image: none;
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+ cursor: not-allowed;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ box-shadow: none;
+}
+
+a.btn.disabled,
+fieldset[disabled] a.btn {
+ pointer-events: none;
+}
+
+.btn-default {
+ color: #333;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.btn-default:focus,
+.btn-default.focus {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #8c8c8c;
+}
+
+.btn-default:hover {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open > .btn-default.dropdown-toggle {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+
+.btn-default:active:hover,
+.btn-default:active:focus,
+.btn-default:active.focus,
+.btn-default.active:hover,
+.btn-default.active:focus,
+.btn-default.active.focus,
+.open > .btn-default.dropdown-toggle:hover,
+.open > .btn-default.dropdown-toggle:focus,
+.open > .btn-default.dropdown-toggle.focus {
+ color: #333;
+ background-color: #d4d4d4;
+ border-color: #8c8c8c;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open > .btn-default.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-default.disabled,
+.btn-default.disabled:hover,
+.btn-default.disabled:focus,
+.btn-default.disabled.focus,
+.btn-default.disabled:active,
+.btn-default.disabled.active,
+.btn-default[disabled],
+.btn-default[disabled]:hover,
+.btn-default[disabled]:focus,
+.btn-default[disabled].focus,
+.btn-default[disabled]:active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-default:hover,
+fieldset[disabled] .btn-default:focus,
+fieldset[disabled] .btn-default.focus,
+fieldset[disabled] .btn-default:active,
+fieldset[disabled] .btn-default.active {
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.btn-default .badge {
+ color: #fff;
+ background-color: #333;
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+
+.btn-primary:focus,
+.btn-primary.focus {
+ color: #fff;
+ background-color: #286090;
+ border-color: #122b40;
+}
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+
+.btn-primary:active:hover,
+.btn-primary:active:focus,
+.btn-primary:active.focus,
+.btn-primary.active:hover,
+.btn-primary.active:focus,
+.btn-primary.active.focus,
+.open > .btn-primary.dropdown-toggle:hover,
+.open > .btn-primary.dropdown-toggle:focus,
+.open > .btn-primary.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #204d74;
+ border-color: #122b40;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open > .btn-primary.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-primary.disabled,
+.btn-primary.disabled:hover,
+.btn-primary.disabled:focus,
+.btn-primary.disabled.focus,
+.btn-primary.disabled:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled],
+.btn-primary[disabled]:hover,
+.btn-primary[disabled]:focus,
+.btn-primary[disabled].focus,
+.btn-primary[disabled]:active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-primary:hover,
+fieldset[disabled] .btn-primary:focus,
+fieldset[disabled] .btn-primary.focus,
+fieldset[disabled] .btn-primary:active,
+fieldset[disabled] .btn-primary.active {
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+
+.btn-primary .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+
+.btn-success:focus,
+.btn-success.focus {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #255625;
+}
+
+.btn-success:hover {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #398439;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #398439;
+}
+
+.btn-success:active:hover,
+.btn-success:active:focus,
+.btn-success:active.focus,
+.btn-success.active:hover,
+.btn-success.active:focus,
+.btn-success.active.focus,
+.open > .btn-success.dropdown-toggle:hover,
+.open > .btn-success.dropdown-toggle:focus,
+.open > .btn-success.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #398439;
+ border-color: #255625;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open > .btn-success.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-success.disabled,
+.btn-success.disabled:hover,
+.btn-success.disabled:focus,
+.btn-success.disabled.focus,
+.btn-success.disabled:active,
+.btn-success.disabled.active,
+.btn-success[disabled],
+.btn-success[disabled]:hover,
+.btn-success[disabled]:focus,
+.btn-success[disabled].focus,
+.btn-success[disabled]:active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-success:hover,
+fieldset[disabled] .btn-success:focus,
+fieldset[disabled] .btn-success.focus,
+fieldset[disabled] .btn-success:active,
+fieldset[disabled] .btn-success.active {
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+
+.btn-info:focus,
+.btn-info.focus {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #1b6d85;
+}
+
+.btn-info:hover {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #269abc;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #269abc;
+}
+
+.btn-info:active:hover,
+.btn-info:active:focus,
+.btn-info:active.focus,
+.btn-info.active:hover,
+.btn-info.active:focus,
+.btn-info.active.focus,
+.open > .btn-info.dropdown-toggle:hover,
+.open > .btn-info.dropdown-toggle:focus,
+.open > .btn-info.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #269abc;
+ border-color: #1b6d85;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open > .btn-info.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-info.disabled,
+.btn-info.disabled:hover,
+.btn-info.disabled:focus,
+.btn-info.disabled.focus,
+.btn-info.disabled:active,
+.btn-info.disabled.active,
+.btn-info[disabled],
+.btn-info[disabled]:hover,
+.btn-info[disabled]:focus,
+.btn-info[disabled].focus,
+.btn-info[disabled]:active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-info:hover,
+fieldset[disabled] .btn-info:focus,
+fieldset[disabled] .btn-info.focus,
+fieldset[disabled] .btn-info:active,
+fieldset[disabled] .btn-info.active {
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+
+.btn-warning:focus,
+.btn-warning.focus {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #985f0d;
+}
+
+.btn-warning:hover {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #d58512;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open > .btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #d58512;
+}
+
+.btn-warning:active:hover,
+.btn-warning:active:focus,
+.btn-warning:active.focus,
+.btn-warning.active:hover,
+.btn-warning.active:focus,
+.btn-warning.active.focus,
+.open > .btn-warning.dropdown-toggle:hover,
+.open > .btn-warning.dropdown-toggle:focus,
+.open > .btn-warning.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #d58512;
+ border-color: #985f0d;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open > .btn-warning.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-warning.disabled,
+.btn-warning.disabled:hover,
+.btn-warning.disabled:focus,
+.btn-warning.disabled.focus,
+.btn-warning.disabled:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled],
+.btn-warning[disabled]:hover,
+.btn-warning[disabled]:focus,
+.btn-warning[disabled].focus,
+.btn-warning[disabled]:active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-warning:hover,
+fieldset[disabled] .btn-warning:focus,
+fieldset[disabled] .btn-warning.focus,
+fieldset[disabled] .btn-warning:active,
+fieldset[disabled] .btn-warning.active {
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+
+.btn-danger:focus,
+.btn-danger.focus {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #761c19;
+}
+
+.btn-danger:hover {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #ac2925;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #ac2925;
+}
+
+.btn-danger:active:hover,
+.btn-danger:active:focus,
+.btn-danger:active.focus,
+.btn-danger.active:hover,
+.btn-danger.active:focus,
+.btn-danger.active.focus,
+.open > .btn-danger.dropdown-toggle:hover,
+.open > .btn-danger.dropdown-toggle:focus,
+.open > .btn-danger.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #ac2925;
+ border-color: #761c19;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open > .btn-danger.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-danger.disabled,
+.btn-danger.disabled:hover,
+.btn-danger.disabled:focus,
+.btn-danger.disabled.focus,
+.btn-danger.disabled:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled],
+.btn-danger[disabled]:hover,
+.btn-danger[disabled]:focus,
+.btn-danger[disabled].focus,
+.btn-danger[disabled]:active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger,
+fieldset[disabled] .btn-danger:hover,
+fieldset[disabled] .btn-danger:focus,
+fieldset[disabled] .btn-danger.focus,
+fieldset[disabled] .btn-danger:active,
+fieldset[disabled] .btn-danger.active {
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+
+.btn-link {
+ color: #337ab7;
+ font-weight: normal;
+ border-radius: 0;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+ background-color: transparent;
+ box-shadow: none;
+}
+
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+ border-color: transparent;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+ color: #23527c;
+ text-decoration: underline;
+ background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:hover,
+fieldset[disabled] .btn-link:focus {
+ color: #777777;
+ text-decoration: none;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 6px;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-xs, .btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+}
+
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.fade {
+ opacity: 0;
+ transition: opacity 0.15s linear;
+}
+
+.fade.in {
+ opacity: 1;
+}
+
+.collapse {
+ display: none;
+}
+
+.collapse.in {
+ display: block;
+}
+
+tr.collapse.in {
+ display: table-row;
+}
+
+tbody.collapse.in {
+ display: table-row-group;
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition-property: height, visibility;
+ transition-duration: 0.35s;
+ transition-timing-function: ease;
+}
+
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px dashed;
+ border-top: 4px solid \9;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+
+.dropup,
+.dropdown {
+ position: relative;
+}
+
+.dropdown-toggle:focus {
+ outline: 0;
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0;
+ list-style: none;
+ font-size: 14px;
+ text-align: left;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 4px;
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+ color: #333333;
+ white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ text-decoration: none;
+ color: #262626;
+ background-color: #f5f5f5;
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ background-color: #337ab7;
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #777777;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ cursor: not-allowed;
+}
+
+.open > .dropdown-menu {
+ display: block;
+}
+
+.open > a {
+ outline: 0;
+}
+
+.dropdown-menu-right {
+ left: auto;
+ right: 0;
+}
+
+.dropdown-menu-left {
+ left: 0;
+ right: auto;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.428571429;
+ color: #777777;
+ white-space: nowrap;
+}
+
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: 990;
+}
+
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ border-top: 0;
+ border-bottom: 4px dashed;
+ border-bottom: 4px solid \9;
+ content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+}
+
+@media (min-width: 768px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .navbar-right .dropdown-menu-left {
+ left: 0;
+ right: auto;
+ }
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ float: left;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+ margin-left: -1px;
+}
+
+.btn-toolbar {
+ margin-left: -5px;
+}
+
+.btn-toolbar:before,
+.btn-toolbar:after {
+ content: " ";
+ display: table;
+}
+
+.btn-toolbar:after {
+ clear: both;
+}
+
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+ float: left;
+}
+
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+ margin-left: 5px;
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+
+.btn-group > .btn:first-child {
+ margin-left: 0;
+}
+
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group > .btn-group {
+ float: left;
+}
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px;
+}
+
+.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn +
.dropdown-toggle {
+ padding-left: 12px;
+ padding-right: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn-group.open .dropdown-toggle.btn-link {
+ box-shadow: none;
+}
+
+.btn .caret {
+ margin-left: 0;
+}
+
+.btn-lg .caret, .btn-group-lg > .btn .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0;
+}
+
+.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {
+ border-width: 0 5px 5px;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+}
+
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+ content: " ";
+ display: table;
+}
+
+.btn-group-vertical > .btn-group:after {
+ clear: both;
+}
+
+.btn-group-vertical > .btn-group > .btn {
+ float: none;
+}
+
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
+}
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-bottom-left-radius: 4px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ border-collapse: separate;
+}
+
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+ float: none;
+ display: table-cell;
+ width: 1%;
+}
+
+.btn-group-justified > .btn-group .btn {
+ width: 100%;
+}
+
+.btn-group-justified > .btn-group .dropdown-menu {
+ left: auto;
+}
+
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn
input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn
input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+
+.input-group[class*="col-"] {
+ float: none;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.input-group .form-control {
+ position: relative;
+ z-index: 2;
+ float: left;
+ width: 100%;
+ margin-bottom: 0;
+}
+
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+}
+
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #555555;
+ text-align: center;
+ background-color: #eeeeee;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+
+.input-group-addon.input-sm, .input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px;
+}
+
+.input-group-addon.input-lg, .input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 6px;
+}
+
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.input-group-addon:first-child {
+ border-right: 0;
+}
+
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.input-group-addon:last-child {
+ border-left: 0;
+}
+
+.input-group-btn {
+ position: relative;
+ font-size: 0;
+ white-space: nowrap;
+}
+
+.input-group-btn > .btn {
+ position: relative;
+}
+
+.input-group-btn > .btn + .btn {
+ margin-left: -1px;
+}
+
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+ z-index: 2;
+}
+
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+ margin-right: -1px;
+}
+
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+ z-index: 2;
+ margin-left: -1px;
+}
+
+.nav {
+ margin-bottom: 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+.nav:before,
+.nav:after {
+ content: " ";
+ display: table;
+}
+
+.nav:after {
+ clear: both;
+}
+
+.nav > li {
+ position: relative;
+ display: block;
+}
+
+.nav > li > a {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee;
+}
+
+.nav > li.disabled > a {
+ color: #777777;
+}
+
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+ color: #777777;
+ text-decoration: none;
+ background-color: transparent;
+ cursor: not-allowed;
+}
+
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background-color: #eeeeee;
+ border-color: #337ab7;
+}
+
+.nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+
+.nav > li > a > img {
+ max-width: none;
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.428571429;
+ border: 1px solid transparent;
+ border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover {
+ border-color: #eeeeee #eeeeee #ddd;
+}
+
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ color: #555555;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default;
+}
+
+.nav-pills > li {
+ float: left;
+}
+
+.nav-pills > li > a {
+ border-radius: 4px;
+}
+
+.nav-pills > li + li {
+ margin-left: 2px;
+}
+
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #337ab7;
+}
+
+.nav-stacked > li {
+ float: none;
+}
+
+.nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0;
+}
+
+.nav-justified, .nav-tabs.nav-justified {
+ width: 100%;
+}
+
+.nav-justified > li, .nav-tabs.nav-justified > li {
+ float: none;
+}
+
+.nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+
+@media (min-width: 768px) {
+ .nav-justified > li, .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+
+.nav-tabs-justified, .nav-tabs.nav-justified {
+ border-bottom: 0;
+}
+
+.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+
+.nav-tabs-justified > .active > a,
+.nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active >
a:hover,
+.nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active >
a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+
+@media (min-width: 768px) {
+ .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs-justified > .active > a,
+ .nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active >
a:hover,
+ .nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active
> a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+
+.tab-content > .active {
+ display: block;
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.navbar {
+ position: relative;
+ min-height: 50px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+}
+
+.navbar:before,
+.navbar:after {
+ content: " ";
+ display: table;
+}
+
+.navbar:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .navbar {
+ border-radius: 4px;
+ }
+}
+
+.navbar-header:before,
+.navbar-header:after {
+ content: " ";
+ display: table;
+}
+
+.navbar-header:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .navbar-header {
+ float: left;
+ }
+}
+
+.navbar-collapse {
+ overflow-x: visible;
+ padding-right: 15px;
+ padding-left: 15px;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ -webkit-overflow-scrolling: touch;
+}
+
+.navbar-collapse:before,
+.navbar-collapse:after {
+ content: " ";
+ display: table;
+}
+
+.navbar-collapse:after {
+ clear: both;
+}
+
+.navbar-collapse.in {
+ overflow-y: auto;
+}
+
+@media (min-width: 768px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ box-shadow: none;
+ }
+ .navbar-collapse.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important;
+ }
+ .navbar-collapse.in {
+ overflow-y: visible;
+ }
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-static-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
+
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+ max-height: 340px;
+}
+
+@media (max-device-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ max-height: 200px;
+ }
+}
+
+.container > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-header,
+.container-fluid > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+
+@media (min-width: 768px) {
+ .container > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-header,
+ .container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+ }
+}
+
+.navbar-static-top {
+ z-index: 1000;
+ border-width: 0 0 1px;
+}
+
+@media (min-width: 768px) {
+ .navbar-static-top {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+@media (min-width: 768px) {
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0;
+ border-width: 1px 0 0;
+}
+
+.navbar-brand {
+ float: left;
+ padding: 15px 15px;
+ font-size: 18px;
+ line-height: 20px;
+ height: 50px;
+}
+
+.navbar-brand:hover,
+.navbar-brand:focus {
+ text-decoration: none;
+}
+
+.navbar-brand > img {
+ display: block;
+}
+
+@media (min-width: 768px) {
+ .navbar > .container .navbar-brand,
+ .navbar > .container-fluid .navbar-brand {
+ margin-left: -15px;
+ }
+}
+
+.navbar-toggle {
+ position: relative;
+ float: right;
+ margin-right: 15px;
+ padding: 9px 10px;
+ margin-top: 8px;
+ margin-bottom: 8px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+
+.navbar-toggle:focus {
+ outline: 0;
+}
+
+.navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+}
+
+.navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px;
+}
+
+@media (min-width: 768px) {
+ .navbar-toggle {
+ display: none;
+ }
+}
+
+.navbar-nav {
+ margin: 7.5px -15px;
+}
+
+.navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 20px;
+}
+
+@media (max-width: 767px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-nav {
+ float: left;
+ margin: 0;
+ }
+ .navbar-nav > li {
+ float: left;
+ }
+ .navbar-nav > li > a {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+}
+
+.navbar-form {
+ margin-left: -15px;
+ margin-right: -15px;
+ padding: 10px 15px;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+
+@media (min-width: 768px) {
+ .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control-static {
+ display: inline-block;
+ }
+ .navbar-form .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .navbar-form .input-group .input-group-addon,
+ .navbar-form .input-group .input-group-btn,
+ .navbar-form .input-group .form-control {
+ width: auto;
+ }
+ .navbar-form .input-group > .form-control {
+ width: 100%;
+ }
+ .navbar-form .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio,
+ .navbar-form .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio label,
+ .navbar-form .checkbox label {
+ padding-left: 0;
+ }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .navbar-form .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+
+@media (max-width: 767px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+ .navbar-form .form-group:last-child {
+ margin-bottom: 0;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-form {
+ width: auto;
+ border: 0;
+ margin-left: 0;
+ margin-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ box-shadow: none;
+ }
+}
+
+.navbar-nav > li > .dropdown-menu {
+ margin-top: 0;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ margin-bottom: 0;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.navbar-btn {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+
+.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
+ margin-top: 14px;
+ margin-bottom: 14px;
+}
+
+.navbar-text {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+@media (min-width: 768px) {
+ .navbar-text {
+ float: left;
+ margin-left: 15px;
+ margin-right: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ margin-right: -15px;
+ }
+ .navbar-right ~ .navbar-right {
+ margin-right: 0;
+ }
+}
+
+.navbar-default {
+ background-color: #f8f8f8;
+ border-color: #e7e7e7;
+}
+
+.navbar-default .navbar-brand {
+ color: #777;
+}
+
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+ color: #5e5e5e;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-text {
+ color: #777;
+}
+
+.navbar-default .navbar-nav > li > a {
+ color: #777;
+}
+
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+ color: #333;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+}
+
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-toggle {
+ border-color: #ddd;
+}
+
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+ background-color: #ddd;
+}
+
+.navbar-default .navbar-toggle .icon-bar {
+ background-color: #888;
+}
+
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+ border-color: #e7e7e7;
+}
+
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+ background-color: #e7e7e7;
+ color: #555;
+}
+
+@media (max-width: 767px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #777;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #333;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+ }
+}
+
+.navbar-default .navbar-link {
+ color: #777;
+}
+
+.navbar-default .navbar-link:hover {
+ color: #333;
+}
+
+.navbar-default .btn-link {
+ color: #777;
+}
+
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+ color: #333;
+}
+
+.navbar-default .btn-link[disabled]:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:hover,
+fieldset[disabled] .navbar-default .btn-link:focus {
+ color: #ccc;
+}
+
+.navbar-inverse {
+ background-color: #222;
+ border-color: #090909;
+}
+
+.navbar-inverse .navbar-brand {
+ color: #9d9d9d;
+}
+
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-text {
+ color: #9d9d9d;
+}
+
+.navbar-inverse .navbar-nav > li > a {
+ color: #9d9d9d;
+}
+
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: #090909;
+}
+
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-toggle {
+ border-color: #333;
+}
+
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+ background-color: #333;
+}
+
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #fff;
+}
+
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #101010;
+}
+
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+ background-color: #090909;
+ color: #fff;
+}
+
+@media (max-width: 767px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #090909;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #090909;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #9d9d9d;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: #090909;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+ }
+}
+
+.navbar-inverse .navbar-link {
+ color: #9d9d9d;
+}
+
+.navbar-inverse .navbar-link:hover {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link {
+ color: #9d9d9d;
+}
+
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link[disabled]:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+ color: #444;
+}
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+}
+
+.breadcrumb > li {
+ display: inline-block;
+}
+
+.breadcrumb > li + li:before {
+ content: "/\\00a0";
+ padding: 0 5px;
+ color: #ccc;
+}
+
+.breadcrumb > .active {
+ color: #777777;
+}
+
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 4px;
+}
+
+.pagination > li {
+ display: inline;
+}
+
+.pagination > li > a,
+.pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ line-height: 1.428571429;
+ text-decoration: none;
+ color: #337ab7;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ margin-left: -1px;
+}
+
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+ margin-left: 0;
+ border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+}
+
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+ border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+}
+
+.pagination > li > a:hover,
+.pagination > li > a:focus,
+.pagination > li > span:hover,
+.pagination > li > span:focus {
+ z-index: 3;
+ color: #23527c;
+ background-color: #eeeeee;
+ border-color: #ddd;
+}
+
+.pagination > .active > a,
+.pagination > .active > a:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span,
+.pagination > .active > span:hover,
+.pagination > .active > span:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+ cursor: default;
+}
+
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+ color: #777777;
+ background-color: #fff;
+ border-color: #ddd;
+ cursor: not-allowed;
+}
+
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+ border-bottom-left-radius: 6px;
+ border-top-left-radius: 6px;
+}
+
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+ border-bottom-right-radius: 6px;
+ border-top-right-radius: 6px;
+}
+
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.pager {
+ padding-left: 0;
+ margin: 20px 0;
+ list-style: none;
+ text-align: center;
+}
+
+.pager:before,
+.pager:after {
+ content: " ";
+ display: table;
+}
+
+.pager:after {
+ clear: both;
+}
+
+.pager li {
+ display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee;
+}
+
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #777777;
+ background-color: #fff;
+ cursor: not-allowed;
+}
+
+.label {
+ display: inline;
+ padding: 0.2em 0.6em 0.3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+
+.label:empty {
+ display: none;
+}
+
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+
+a.label:hover,
+a.label:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.label-default {
+ background-color: #777777;
+}
+
+.label-default[href]:hover,
+.label-default[href]:focus {
+ background-color: #5e5e5e;
+}
+
+.label-primary {
+ background-color: #337ab7;
+}
+
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+ background-color: #286090;
+}
+
+.label-success {
+ background-color: #5cb85c;
+}
+
+.label-success[href]:hover,
+.label-success[href]:focus {
+ background-color: #449d44;
+}
+
+.label-info {
+ background-color: #5bc0de;
+}
+
+.label-info[href]:hover,
+.label-info[href]:focus {
+ background-color: #31b0d5;
+}
+
+.label-warning {
+ background-color: #f0ad4e;
+}
+
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+ background-color: #ec971f;
+}
+
+.label-danger {
+ background-color: #d9534f;
+}
+
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+ background-color: #c9302c;
+}
+
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ color: #fff;
+ line-height: 1;
+ vertical-align: middle;
+ white-space: nowrap;
+ text-align: center;
+ background-color: #777777;
+ border-radius: 10px;
+}
+
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.btn-xs .badge,
+.btn-group-xs > .btn .badge,
+.btn-group-xs > .btn .badge {
+ top: 0;
+ padding: 1px 5px;
+}
+
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+
+.list-group-item > .badge {
+ float: right;
+}
+
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+
+a.badge:hover,
+a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.jumbotron {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ margin-bottom: 30px;
+ color: inherit;
+ background-color: #eeeeee;
+}
+
+.jumbotron h1,
+.jumbotron .h1 {
+ color: inherit;
+}
+
+.jumbotron p {
+ margin-bottom: 15px;
+ font-size: 21px;
+ font-weight: 200;
+}
+
+.jumbotron > hr {
+ border-top-color: #d5d5d5;
+}
+
+.container .jumbotron,
+.container-fluid .jumbotron {
+ border-radius: 6px;
+}
+
+.jumbotron .container {
+ max-width: 100%;
+}
+
+@media screen and (min-width: 768px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px;
+ }
+ .container .jumbotron,
+ .container-fluid .jumbotron {
+ padding-left: 60px;
+ padding-right: 60px;
+ }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px;
+ }
+}
+
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ transition: border 0.2s ease-in-out;
+}
+
+.thumbnail > img,
+.thumbnail a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.thumbnail .caption {
+ padding: 9px;
+ color: #333333;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #337ab7;
+}
+
+.alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+
+.alert h4 {
+ margin-top: 0;
+ color: inherit;
+}
+
+.alert .alert-link {
+ font-weight: bold;
+}
+
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+
+.alert > p + p {
+ margin-top: 5px;
+}
+
+.alert-dismissable, .alert-dismissible {
+ padding-right: 35px;
+}
+
+.alert-dismissable .close, .alert-dismissible .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+}
+
+.alert-success {
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+ color: #3c763d;
+}
+
+.alert-success hr {
+ border-top-color: #c9e2b3;
+}
+
+.alert-success .alert-link {
+ color: #2b542c;
+}
+
+.alert-info {
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+ color: #31708f;
+}
+
+.alert-info hr {
+ border-top-color: #a6e1ec;
+}
+
+.alert-info .alert-link {
+ color: #245269;
+}
+
+.alert-warning {
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+ color: #8a6d3b;
+}
+
+.alert-warning hr {
+ border-top-color: #f7e1b5;
+}
+
+.alert-warning .alert-link {
+ color: #66512c;
+}
+
+.alert-danger {
+ background-color: #f2dede;
+ border-color: #ebccd1;
+ color: #a94442;
+}
+
+.alert-danger hr {
+ border-top-color: #e4b9c0;
+}
+
+.alert-danger .alert-link {
+ color: #843534;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+.progress {
+ overflow: hidden;
+ height: 20px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress-bar {
+ float: left;
+ width: 0%;
+ height: 100%;
+ font-size: 12px;
+ line-height: 20px;
+ color: #fff;
+ text-align: center;
+ background-color: #337ab7;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ transition: width 0.6s ease;
+}
+
+.progress-striped .progress-bar,
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+ background-size: 40px 40px;
+}
+
+.progress.active .progress-bar,
+.progress-bar.active {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-bar-success {
+ background-color: #5cb85c;
+}
+
+.progress-striped .progress-bar-success {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-info {
+ background-color: #5bc0de;
+}
+
+.progress-striped .progress-bar-info {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-warning {
+ background-color: #f0ad4e;
+}
+
+.progress-striped .progress-bar-warning {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-danger {
+ background-color: #d9534f;
+}
+
+.progress-striped .progress-bar-danger {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.media {
+ margin-top: 15px;
+}
+
+.media:first-child {
+ margin-top: 0;
+}
+
+.media,
+.media-body {
+ zoom: 1;
+ overflow: hidden;
+}
+
+.media-body {
+ width: 10000px;
+}
+
+.media-object {
+ display: block;
+}
+
+.media-object.img-thumbnail {
+ max-width: none;
+}
+
+.media-right,
+.media > .pull-right {
+ padding-left: 10px;
+}
+
+.media-left,
+.media > .pull-left {
+ padding-right: 10px;
+}
+
+.media-left,
+.media-right,
+.media-body {
+ display: table-cell;
+ vertical-align: top;
+}
+
+.media-middle {
+ vertical-align: middle;
+}
+
+.media-bottom {
+ vertical-align: bottom;
+}
+
+.media-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.media-list {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-group {
+ margin-bottom: 20px;
+ padding-left: 0;
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+}
+
+.list-group-item:first-child {
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+
+a.list-group-item,
+button.list-group-item {
+ color: #555;
+}
+
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+ color: #333;
+}
+
+a.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:hover,
+button.list-group-item:focus {
+ text-decoration: none;
+ color: #555;
+ background-color: #f5f5f5;
+}
+
+button.list-group-item {
+ width: 100%;
+ text-align: left;
+}
+
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+ background-color: #eeeeee;
+ color: #777777;
+ cursor: not-allowed;
+}
+
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+ color: inherit;
+}
+
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+ color: #777777;
+}
+
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+ color: inherit;
+}
+
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+ color: #c7ddef;
+}
+
+.list-group-item-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+}
+
+a.list-group-item-success,
+button.list-group-item-success {
+ color: #3c763d;
+}
+
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:hover,
+button.list-group-item-success:focus {
+ color: #3c763d;
+ background-color: #d0e9c6;
+}
+
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active,
+button.list-group-item-success.active:hover,
+button.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #3c763d;
+ border-color: #3c763d;
+}
+
+.list-group-item-info {
+ color: #31708f;
+ background-color: #d9edf7;
+}
+
+a.list-group-item-info,
+button.list-group-item-info {
+ color: #31708f;
+}
+
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:hover,
+button.list-group-item-info:focus {
+ color: #31708f;
+ background-color: #c4e3f3;
+}
+
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active,
+button.list-group-item-info.active:hover,
+button.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #31708f;
+ border-color: #31708f;
+}
+
+.list-group-item-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+}
+
+a.list-group-item-warning,
+button.list-group-item-warning {
+ color: #8a6d3b;
+}
+
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:hover,
+button.list-group-item-warning:focus {
+ color: #8a6d3b;
+ background-color: #faf2cc;
+}
+
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active,
+button.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #8a6d3b;
+ border-color: #8a6d3b;
+}
+
+.list-group-item-danger {
+ color: #a94442;
+ background-color: #f2dede;
+}
+
+a.list-group-item-danger,
+button.list-group-item-danger {
+ color: #a94442;
+}
+
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:hover,
+button.list-group-item-danger:focus {
+ color: #a94442;
+ background-color: #ebcccc;
+}
+
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active,
+button.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:focus {
+ color: #fff;
+ background-color: #a94442;
+ border-color: #a94442;
+}
+
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
+
+.panel {
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.panel-body {
+ padding: 15px;
+}
+
+.panel-body:before,
+.panel-body:after {
+ content: " ";
+ display: table;
+}
+
+.panel-body:after {
+ clear: both;
+}
+
+.panel-heading {
+ padding: 10px 15px;
+ border-bottom: 1px solid transparent;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.panel-heading > .dropdown .dropdown-toggle {
+ color: inherit;
+}
+
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 16px;
+ color: inherit;
+}
+
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+ color: inherit;
+}
+
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+ margin-bottom: 0;
+}
+
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+}
+
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+ border-top: 0;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+ border-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+.panel > .panel-heading + .panel-collapse > .list-group
.list-group-item:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0;
+}
+
+.list-group + .panel-footer {
+ border-top-width: 0;
+}
+
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+ margin-bottom: 0;
+}
+
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child {
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child
td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child
th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child
td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child
th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child th:first-child {
+ border-top-left-radius: 3px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child th:last-child {
+ border-top-right-radius: 3px;
+}
+
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child {
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child th:first-child {
+ border-bottom-left-radius: 3px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child th:last-child {
+ border-bottom-right-radius: 3px;
+}
+
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+ border-top: 1px solid #ddd;
+}
+
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+ border-top: 0;
+}
+
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child
{
+ border-left: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child
{
+ border-right: 0;
+}
+
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child >
td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child >
th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child >
td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th
{
+ border-bottom: 0;
+}
+
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child >
td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child >
th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child >
td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th
{
+ border-bottom: 0;
+}
+
+.panel > .table-responsive {
+ border: 0;
+ margin-bottom: 0;
+}
+
+.panel-group {
+ margin-bottom: 20px;
+}
+
+.panel-group .panel {
+ margin-bottom: 0;
+ border-radius: 4px;
+}
+
+.panel-group .panel + .panel {
+ margin-top: 5px;
+}
+
+.panel-group .panel-heading {
+ border-bottom: 0;
+}
+
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+ border-top: 1px solid #ddd;
+}
+
+.panel-group .panel-footer {
+ border-top: 0;
+}
+
+.panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd;
+}
+
+.panel-default {
+ border-color: #ddd;
+}
+
+.panel-default > .panel-heading {
+ color: #333333;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ddd;
+}
+
+.panel-default > .panel-heading .badge {
+ color: #f5f5f5;
+ background-color: #333333;
+}
+
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ddd;
+}
+
+.panel-primary {
+ border-color: #337ab7;
+}
+
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #337ab7;
+}
+
+.panel-primary > .panel-heading .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #337ab7;
+}
+
+.panel-success {
+ border-color: #d6e9c6;
+}
+
+.panel-success > .panel-heading {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #d6e9c6;
+}
+
+.panel-success > .panel-heading .badge {
+ color: #dff0d8;
+ background-color: #3c763d;
+}
+
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #d6e9c6;
+}
+
+.panel-info {
+ border-color: #bce8f1;
+}
+
+.panel-info > .panel-heading {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #bce8f1;
+}
+
+.panel-info > .panel-heading .badge {
+ color: #d9edf7;
+ background-color: #31708f;
+}
+
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #bce8f1;
+}
+
+.panel-warning {
+ border-color: #faebcc;
+}
+
+.panel-warning > .panel-heading {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #faebcc;
+}
+
+.panel-warning > .panel-heading .badge {
+ color: #fcf8e3;
+ background-color: #8a6d3b;
+}
+
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #faebcc;
+}
+
+.panel-danger {
+ border-color: #ebccd1;
+}
+
+.panel-danger > .panel-heading {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ebccd1;
+}
+
+.panel-danger > .panel-heading .badge {
+ color: #f2dede;
+ background-color: #a94442;
+}
+
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ebccd1;
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden;
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ height: 100%;
+ width: 100%;
+ border: 0;
+}
+
+.embed-responsive-16by9 {
+ padding-bottom: 56.25%;
+}
+
+.embed-responsive-4by3 {
+ padding-bottom: 75%;
+}
+
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-lg {
+ padding: 24px;
+ border-radius: 6px;
+}
+
+.well-sm {
+ padding: 9px;
+ border-radius: 3px;
+}
+
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+
+.modal-open {
+ overflow: hidden;
+}
+
+.modal {
+ display: none;
+ overflow: hidden;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1050;
+ -webkit-overflow-scrolling: touch;
+ outline: 0;
+}
+
+.modal.fade .modal-dialog {
+ -webkit-transform: translate(0, -25%);
+ -ms-transform: translate(0, -25%);
+ transform: translate(0, -25%);
+ transition: -webkit-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+}
+
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+}
+
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ border: 1px solid #999;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ background-clip: padding-box;
+ outline: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #000;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.modal-backdrop.in {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+.modal-header {
+ padding: 15px;
+ border-bottom: 1px solid #e5e5e5;
+ min-height: 16.428571429px;
+}
+
+.modal-header .close {
+ margin-top: -2px;
+}
+
+.modal-title {
+ margin: 0;
+ line-height: 1.428571429;
+}
+
+.modal-body {
+ position: relative;
+ padding: 15px;
+}
+
+.modal-footer {
+ padding: 15px;
+ text-align: right;
+ border-top: 1px solid #e5e5e5;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+ content: " ";
+ display: table;
+}
+
+.modal-footer:after {
+ clear: both;
+}
+
+.modal-footer .btn + .btn {
+ margin-left: 5px;
+ margin-bottom: 0;
+}
+
+.modal-footer .btn-group .btn + .btn {
+ margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+ margin-left: 0;
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+@media (min-width: 768px) {
+ .modal-dialog {
+ width: 600px;
+ margin: 30px auto;
+ }
+ .modal-content {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+ }
+ .modal-sm {
+ width: 300px;
+ }
+}
+
+@media (min-width: 992px) {
+ .modal-lg {
+ width: 900px;
+ }
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.428571429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 12px;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.tooltip.in {
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.tooltip.top {
+ margin-top: -3px;
+ padding: 5px 0;
+}
+
+.tooltip.right {
+ margin-left: 3px;
+ padding: 0 5px;
+}
+
+.tooltip.bottom {
+ margin-top: 3px;
+ padding: 5px 0;
+}
+
+.tooltip.left {
+ margin-left: -3px;
+ padding: 0 5px;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 4px;
+}
+
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.top-left .tooltip-arrow {
+ bottom: 0;
+ right: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.top-right .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000;
+}
+
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.428571429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 14px;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+
+.popover.top {
+ margin-top: -10px;
+}
+
+.popover.right {
+ margin-left: 10px;
+}
+
+.popover.bottom {
+ margin-top: 10px;
+}
+
+.popover.left {
+ margin-left: -10px;
+}
+
+.popover-title {
+ margin: 0;
+ padding: 8px 14px;
+ font-size: 14px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 5px 5px 0 0;
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+.popover > .arrow,
+.popover > .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.popover > .arrow {
+ border-width: 11px;
+}
+
+.popover > .arrow:after {
+ border-width: 10px;
+ content: "";
+}
+
+.popover.top > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-bottom-width: 0;
+ border-top-color: #999999;
+ border-top-color: rgba(0, 0, 0, 0.25);
+ bottom: -11px;
+}
+
+.popover.top > .arrow:after {
+ content: " ";
+ bottom: 1px;
+ margin-left: -10px;
+ border-bottom-width: 0;
+ border-top-color: #fff;
+}
+
+.popover.right > .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-left-width: 0;
+ border-right-color: #999999;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.right > .arrow:after {
+ content: " ";
+ left: 1px;
+ bottom: -10px;
+ border-left-width: 0;
+ border-right-color: #fff;
+}
+
+.popover.bottom > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-top-width: 0;
+ border-bottom-color: #999999;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+ top: -11px;
+}
+
+.popover.bottom > .arrow:after {
+ content: " ";
+ top: 1px;
+ margin-left: -10px;
+ border-top-width: 0;
+ border-bottom-color: #fff;
+}
+
+.popover.left > .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-right-width: 0;
+ border-left-color: #999999;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.left > .arrow:after {
+ content: " ";
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: #fff;
+ bottom: -10px;
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel-inner {
+ position: relative;
+ overflow: hidden;
+ width: 100%;
+}
+
+.carousel-inner > .item {
+ display: none;
+ position: relative;
+ transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ line-height: 1;
+}
+
+@media all and (transform-3d), (-webkit-transform-3d) {
+ .carousel-inner > .item {
+ transition: -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000px;
+ perspective: 1000px;
+ }
+ .carousel-inner > .item.next,
+ .carousel-inner > .item.active.right {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ left: 0;
+ }
+ .carousel-inner > .item.prev,
+ .carousel-inner > .item.active.left {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ left: 0;
+ }
+ .carousel-inner > .item.next.left,
+ .carousel-inner > .item.prev.right,
+ .carousel-inner > .item.active {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ left: 0;
+ }
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ display: block;
+}
+
+.carousel-inner > .active {
+ left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+.carousel-inner > .next {
+ left: 100%;
+}
+
+.carousel-inner > .prev {
+ left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+ left: 0;
+}
+
+.carousel-inner > .active.left {
+ left: -100%;
+}
+
+.carousel-inner > .active.right {
+ left: 100%;
+}
+
+.carousel-control {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 15%;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ font-size: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+
+.carousel-control.left {
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0,
0.0001) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',
endColorstr='#00000000', GradientType=1);
+}
+
+.carousel-control.right {
+ left: auto;
+ right: 0;
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0,
0.5) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',
endColorstr='#80000000', GradientType=1);
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+ outline: 0;
+ color: #fff;
+ text-decoration: none;
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ margin-top: -10px;
+ z-index: 5;
+ display: inline-block;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+ left: 50%;
+ margin-left: -10px;
+}
+
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+ right: 50%;
+ margin-right: -10px;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ line-height: 1;
+ font-family: serif;
+}
+
+.carousel-control .icon-prev:before {
+ content: '\2039';
+}
+
+.carousel-control .icon-next:before {
+ content: '\203a';
+}
+
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ margin-left: -30%;
+ padding-left: 0;
+ list-style: none;
+ text-align: center;
+}
+
+.carousel-indicators li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ border: 1px solid #fff;
+ border-radius: 10px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: transparent;
+}
+
+.carousel-indicators .active {
+ margin: 0;
+ width: 12px;
+ height: 12px;
+ background-color: #fff;
+}
+
+.carousel-caption {
+ position: absolute;
+ left: 15%;
+ right: 15%;
+ bottom: 20px;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+
+.carousel-caption .btn {
+ text-shadow: none;
+}
+
+@media screen and (min-width: 768px) {
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ font-size: 30px;
+ }
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .icon-prev {
+ margin-left: -15px;
+ }
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-next {
+ margin-right: -15px;
+ }
+ .carousel-caption {
+ left: 20%;
+ right: 20%;
+ padding-bottom: 30px;
+ }
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+
+.clearfix:before,
+.clearfix:after {
+ content: " ";
+ display: table;
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+.pull-left {
+ float: left !important;
+}
+
+.hide {
+ display: none !important;
+}
+
+.show {
+ display: block !important;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.hidden {
+ display: none !important;
+}
+
+.affix {
+ position: fixed;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+.visible-xs {
+ display: none !important;
+}
+
+.visible-sm {
+ display: none !important;
+}
+
+.visible-md {
+ display: none !important;
+}
+
+.visible-lg {
+ display: none !important;
+}
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table !important;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .visible-xs-block {
+ display: block !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .visible-xs-inline {
+ display: inline !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table !important;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table !important;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table !important;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-lg-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-lg-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-lg-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .hidden-xs {
+ display: none !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-sm {
+ display: none !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-md {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .hidden-lg {
+ display: none !important;
+ }
+}
+
+.visible-print {
+ display: none !important;
+}
+
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table !important;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+}
+
+.visible-print-block {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-block {
+ display: block !important;
+ }
+}
+
+.visible-print-inline {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-inline {
+ display: inline !important;
+ }
+}
+
+.visible-print-inline-block {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media print {
+ .hidden-print {
+ display: none !important;
+ }
+}
+
+/*#
sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb3RzdHJhcC1vZmZpY2lhbC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19ub3JtYWxpemUuc2NzcyIsImJvb3RzdHJhcC1vZmZpY2lhbC5jc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3ByaW50LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3NjYWZmb2xkaW5nLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL192ZW5kb3ItcHJlZml4ZXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fdmFyaWFibGVzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL190YWItZm9jdXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2ltYWdlLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3R5cGUuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3RleHQtZW1waGFzaXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2JhY2tncm91bmQtdmFyaWFudC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fY2xlYXJmaXguc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3RleHQtb3ZlcmZsb3cuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fY29kZS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19ncmlkLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19ncmlkLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19ncmlkLWZyYW1ld29yay5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL190YWJsZXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3RhYmxlLXJvdy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19mb3Jtcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fZm9ybXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fYnV0dG9ucy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fYnV0dG9ucy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fb3BhY2l0eS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19jb21wb25lbnQtYW5pbWF0aW9ucy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19kcm9wZG93bnMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX25hdi1kaXZpZGVyLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19yZXNldC1maWx0ZXIuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fYnV0dG9uLWdyb3Vwcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fYm9yZGVyLXJhZGl1cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19pbnB1dC1ncm91cHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fbmF2cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19uYXZiYXIuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX25hdi12ZXJ0aWNhbC1hbGlnbi5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19icmVhZGNydW1icy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19wYWdpbmF0aW9uLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19wYWdpbmF0aW9uLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3BhZ2VyLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2xhYmVscy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fbGFiZWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2JhZGdlcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19qdW1ib3Ryb24uc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fdGh1bWJuYWlscy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19hbGVydHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2FsZXJ0cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19wcm9ncmVzcy1iYXJzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19ncmFkaWVudHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3Byb2dyZXNzLWJhci5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19tZWRpYS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19saXN0LWdyb3VwLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19saXN0LWdyb3VwLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3BhbmVscy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fcGFuZWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3Jlc3BvbnNpdmUtZW1iZWQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fd2VsbHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fY2xvc2Uuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fbW9kYWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3Rvb2x0aXAuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3Jlc2V0LXRleHQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcG9wb3ZlcnMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fY2Fyb3VzZWwuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fdXRpbGl0aWVzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19jZW50ZXItYmxvY2suc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2hpZGUtdGV4dC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19yZXNwb25zaXZlLXV0aWxpdGllcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fcmVzcG9uc2l2ZS12aXNpYmlsaXR5LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQ0pILDRFQUE0RTtBQVE1RTtFQUNFLHdCQUF3QjtFQUN4QiwyQkFBMkI7RUFDM0IsK0JBQStCO0NBSDNCOztBQVVOO0VBQ0UsVUFBVTtDQUROOztBQTBCTjs7Ozs7Ozs7Ozs7OztFQUNFLGVBQWU7Q0FEUjs7QUFZVDs7OztFQUNFLHNCQUFzQjtFQUN0Qix5QkFBeUI7Q0FGcEI7O0FBVWE7RUFDbEIsY0FBYztFQUNkLFVBQVU7Q0FGVzs7QUNyQnZCOztFRGlDRSxjQUFjO0NBRE47O0FBV1Y7RUFDRSw4QkFBOEI7Q0FEN0I7O0FBVUY7O0VBQ0MsV0FBVztDQURKOztBQVdDO0VBQ1IsMEJBQTBCO0NBRGY7O0FBU2I7O0VBQ0Usa0JBQWtCO0NBRFo7O0FBUVI7RUFDRSxtQkFBbUI7Q0FEaEI7O0FBU0w7RUFDRSxlQUFlO0VBQ2YsaUJBQWlCO0NBRmY7O0FBU0o7RUFDRSxpQkFBaUI7RUFDakIsWUFBWTtDQUZSOztBQVNOO0VBQ0UsZUFBZTtDQURWOztBQVNQOztFQUNFLGVBQWU7RUFDZixlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLHlCQUF5QjtDQUp0Qjs7QUFPTDtFQUNFLFlBQVk7Q0FEVDs7QUFJTDtFQUNFLGdCQUFnQjtDQURiOztBQVdMO0VBQ0UsVUFBVTtDQURQOztBQVFRO0VBQ1gsaUJBQWlCO0NBREg7O0FBV2hCO0VBQ0UsaUJBQWdCO0NBRFY7O0FBUVI7RUFDRSx3QkFBd0I7RUFDeEIsVUFBVTtDQUZSOztBQVNKO0VBQ0UsZUFBZTtDQURaOztBQVdMOzs7O0VBQ0Usa0NBQWtDO0VBQ2xDLGVBQWU7Q0FGWDs7QUF3Qk47Ozs7O0VBQ0UsZUFBZTtFQUNmLGNBQWM7RUFDZCxVQUFVO0NBSEY7O0FBVVY7RUFDRSxrQkFBa0I7Q0FEWjs7QUFZUjs7RUFDRSxxQkFB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QURiOztBRG1QRjtFQUNFLGFkOUdtQztFYytHbkMsa0Jkbk80QjtFY29PNUIsZ0JkcFIwQjtFY3FSMUIsaUJkL04yQjtFY2dPM0IsbUJkNU4yQjtDY3VOZDs7QUFPVDtFQUNKLGFkckhtQztFY3NIbkMsa0JkdEhtQztDY29IaEI7O0FBS0w7O0VBQ2QsYUFBYTtDQURnQjs7QUFHL0I7RUFDRSxhZDdIbUM7RWM4SG5DLGlCQUFrQztFQUNsQyxrQmRuUDRCO0Vjb1A1QixnQmRwUzBCO0VjcVMxQixpQmQvTzJCO0NjME9QOztBQ2hScUc7OztFQUV6SCxhZmdKa0M7RWUvSWxDLG1CZjBCNEI7RWV6QjVCLGdCZnJCMEI7RWVzQjFCLHVCZmdDaUM7RWUvQmpDLG1CZm1DMkI7Q2V4QzNCOztBQU1EOzs7RUFHQyxhZndJa0M7RWV2SWxDLGtCZnVJa0M7Q2V6SWxDOztBQUdEOzs7Ozs7O0VBR0MsYUFBYTtDQURiOztBRDZRRjtFQUNFLGFkMUlrQztFYzJJbEMsbUJkaFE0QjtFY2lRNUIsZ0JkL1MwQjtFY2dUMUIsdUJkMVBpQztFYzJQakMsbUJkdlAyQjtDY2tQZDs7QUFPVDtFQUNKLGFkakprQztFY2tKbEMsa0JkbEprQztDY2dKZjs7QUFLTDs7RUFDZCxhQUFhO0NBRGdCOztBQUcvQjtFQUNFLGFkekprQztFYzBKbEMsaUJBQWtDO0VBQ2xDLG1CZGhSNEI7RWNpUjVCLGdCZC9UMEI7RWNnVTFCLHVCZDFRaUM7Q2NxUWI7O0FBY3hCO0VBRUUsbUJBQW1CO0NBRk47O0FBS2I7RUFDRSxzQkFBa0M7Q0FEckI7O0FBS2pCO0VBQ0UsbUJBQW1CO0VBQ25CLE9BQU87RUFDUCxTQUFTO0VBQ1QsV0FBVztFQUNYLGVBQWU7RUFDZixZZHhMcUQ7RWN5THJELGFkekxxRDtFYzBMckQsa0JkMUxxRDtFYzJMckQsbUJBQW1CO0VBQ25CLHFCQUFxQjtDQVZDOztBQWNPOzs7Ozs7RUFDN0IsWWQvTG9DO0VjZ01wQyxhZGhNb0M7RWNpTXBDLGtCZGpNb0M7Q2M4TGlCOztBQU94Qjs7Ozs7O0VBQzdCLFlkcE1xQztFY3FNckMsYWRy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akM7O0FBSVA7O0VBQ0MsWTNCMUN1QztFMkIyQ3ZDLDhCM0IxQzhDO0MyQndDdkM7O0FBUVI7OztFQUNDLFkzQmhEdUM7RTJCaUR2QywwQjNCaER5QztDMkI4Q2xDOztBQVFSOzs7RUFDQyxZM0J0RHVDO0UyQnVEdkMsOEIzQnREOEM7QzJCb0R2Qzs7QUFPYjtFQUNFLG1CM0JsRDJDO0MyQmlEN0I7O0FBR2I7O0VBQ0MsdUIzQnZEeUM7QzJCc0RsQzs7QUFHVDtFQUNFLHVCM0J6RHlDO0MyQndEaEM7O0FBTWI7O0VBQ0Usc0IzQmpGcUM7QzJCZ0Z6Qjs7QUFVVDs7O0VBQ0MsMEIzQnBGeUM7RTJCcUZ6QyxZM0J0RnVDO0MyQm9GaEM7O0FBTVg7RUFHVztJQUNMLFkzQmpHcUM7RzJCZ0c3QjtFQUdQOztJQUNDLFkzQm5HbUM7STJCb0duQyw4QjNCbkcwQztHMkJpR25DO0VBUVI7OztJQUNDLFkzQnpHbUM7STJCMEduQywwQjNCekdxQztHMkJ1RzlCO0VBUVI7OztJQUNDLFkzQi9HbUM7STJCZ0huQyw4QjNCL0cwQztHMkI2R25DO0MvQit4SGxCOztBK0JqeEhDO0VBQ0UsWTNCbEkyQztDMkJpSS9COztBQUVYO0VBQ0MsWTNCbkl5QztDMkJrSWxDOztBQUtYO0VBQ0UsWTNCekkyQztDMkJ3SWxDOztBQUdSOztFQUNDLFkzQjNJeUM7QzJCMElsQzs7QUFNTjs7OztFQUNDLFkzQjdJdUM7QzJCNEloQzs7QUFTZjtFQUNFLHVCM0JySThDO0UyQnNJOUMsc0IzQnJJZ0Q7QzJCbUlqQzs7QUFJZjtFQUNFLGUzQnJJK0M7QzJCb0lsQzs7QUFHWjs7RUFDQyxZM0I5SDBDO0UyQitIMUMsOEIzQjlIaUQ7QzJCNEgxQzs7QUFNWDtFQUNFLGUzQm5KK0M7QzJCa0puQzs7QUFLTDtFQUNMLGUzQm5KNkM7QzJCa0pyQzs7QUFJUDs7RUFDQyxZM0J0SndDO0UyQnVKeEMsOEIzQnRKK0M7QzJCb0p4Qzs7QUFRUjs7O0VBQ0MsWTNCOUp3QztFMkIrSnhDLDBCM0I1SjBDO0MyQjBKbkM7O0FBUVI7OztFQUNDLFkzQmxLd0M7RTJCbUt4Qyw4QjNCbEsrQztDMkJnS3hDOztBQVFiO0VBQ0UsbUIzQi9KNEM7QzJCOEo5Qjs7QUFHYjs7RUFDQyx1QjNCcEswQztDMkJtS25DOztBQUdUO0VBQ0UsdUIzQnRLMEM7QzJCcUtqQzs7QUFNYjs7RUFDRSxzQkFBb0I7Q0FEUjs7QUFTVDs7O0VBQ0MsMEIzQmhNMEM7RTJCaU0xQyxZM0JwTXdDO0MyQmtNakM7O0FBTVg7RUFHTTtJQUNBLHNCM0JoTndDO0cyQitNdEI7RUFHcEI7SUFDRSwwQjNCbk53QztHMkJrTmhDO0VBR0g7SUFDTCxlM0JuTnlDO0cyQmtOakM7RUFHUDs7SUFDQyxZM0JyTm9DO0kyQnNOcEMsOEIzQnJOMkM7RzJCbU5wQztFQVFSOzs7SUFDQyxZM0I3Tm9DO0kyQjhOcEMsMEIzQjNOc0M7RzJCeU4vQjtFQVFSOzs7SUFDQyxZM0JqT29DO0kyQmtPcEMsOEIzQmpPMkM7RzJCK05wQztDL0I0d0hsQjs7QStCbndIQztFQUNFLGUzQi9PK0M7QzJCOE9uQzs7QUFFWDtFQUNDLFkzQmhQMEM7QzJCK09uQzs7QUFLWDtFQUNFLGUzQnRQK0M7QzJCcVB0Qzs7QUFHUjs7RUFDQyxZM0J4UDBDO0MyQnVQbkM7O0FBTU47Ozs7RUFDQyxZM0IxUHdDO0MyQnlQakM7O0FFM29CZjtFQUNFLGtCN0JxeEJrQztFNkJweEJsQyxvQjdCMEQ2QjtFNkJ6RDdCLGlCQUFpQjtFQUNqQiwwQjdCb3hCcUM7RTZCbnhCckMsbUI3Qm1HNkI7QzZCeEdsQjs7QUFPVDtFQUNBLHNCQUFzQjtDQURsQjs7QUFHQTtFQUNGLG1CQUF3QztFQUN4QyxlQUFjO0VBQ2QsWTdCNndCOEI7QzZCaHhCbkI7O0FBT2I7RUFDQSxlN0JUNEI7QzZCUW5COztBQ25CYjtFQUNFLHNCQUFzQjtFQUN0QixnQkFBZ0I7RUFDaEIsZUFBK0I7RUFDL0IsbUI5QnNHNkI7QzhCMUdsQjs7QUFNVDtFQUNBLGdCQUFnQjtDQURaOztBQUdGOztFQUNBLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osa0I5QmdGMEI7RThCL0UxQix5QjlCK0MrQjtFOEI5Qy9CLHNCQUFzQjtFQUN0QixlOUJEd0I7RThCRXhCLHVCOUJvYnFDO0U4Qm5ickMsdUI5Qm9icUM7RThCbmJyQyxrQkFBa0I7Q0FUWjs7QUFhSjs7RUFDQSxlQUFlO0VOWHJCLCtCeEI4RjZCO0V3QjdGMUIsNEJ4QjZGMEI7QzhCcEZqQjs7QUFPTjs7RU56Qk4sZ0N4QnNHNkI7RXdCckcxQiw2QnhCcUcwQjtDOEI3RWpCOztBQVNUOzs7O0VBQ0MsV0FBVztFQUNYLGU5QlB3QjtFOEJReEIsMEI5QjdCMEI7RThCOEIxQixtQjlCK1pxQztDOEJuYTlCOztBQVlSOzs7Ozs7RUFDQyxXQUFXO0VBQ1gsWTlCdVpxQztFOEJ0WnJDLDBCOUJ2Q3dCO0U4QndDeEIsc0I5QnhDd0I7RThCeUN4QixnQkFBZ0I7Q0FMVDs7QUFlTjs7Ozs7O0VBQ0QsZTlCdkQwQjtFOEJ3RDFCLHVCOUI2WXFDO0U4QjVZckMsbUI5QjZZcUM7RThCNVlyQyxvQjlCK0pzQztDOEJuSzdCOztBQy9EVDs7RUFDQSxtQi9CNEYwQjtFK0IzRjFCLGdCL0I2Q3dCO0UrQjVDeEIsdUIvQmtHK0I7QytCckd6Qjs7QUFPSjs7RVBHTiwrQnhCK0Y2QjtFd0I5RjFCLDRCeEI4RjBCO0MrQmxHakI7O0FBTU47O0VQWE4sZ0N4QnVHNkI7RXdCdEcxQiw2QnhCc0cwQjtDK0I1RmpCOztBQWJSOztFQUNBLGtCL0IrRjBCO0UrQjlGMUIsZ0IvQjhDd0I7RStCN0N4QixpQi9CbUd5QjtDK0J0R25COztBQU9KOztFUEdOLCtCeEJnRzZCO0V3Qi9GMUIsNEJ4QitGMEI7QytCbkdqQjs7QUFNTjs7RVBYTixnQ3hCd0c2QjtFd0J2RzFCLDZCeEJ1RzBCO0MrQjdGakI7O0FDYmQ7RUFDRSxnQkFBZ0I7RUFDaEIsZUFBK0I7RUFDL0IsaUJBQWlCO0VBQ2pCLG1CQUFtQjtDQUpiOztBMUJTTDs7RUFDQyxhQUFhO0VBQ2IsZUFBZTtDQUZSOztBQUlSO0VBQ0MsWUFBWTtDQURMOztBMEJQVDtFQUNFLGdCQUFnQjtDQURkOztBQUdBOztFQUNBLHNCQUFzQjtFQUN0QixrQkFBaUI7RUFDakIsdUJoQ3NicUM7RWdDcmJyQyx1QmhDc2JxQztFZ0NyYnJDLG9CaEMwY3FDO0NnQy9jL0I7O0FBU0w7O0VBQ0Qsc0JBQXNCO0VBQ3RCLDBCaENWMEI7Q2dDUWpCOztBQVFUOztFQUNBLGFBQWE7Q0FEUDs7QUFPTjs7RUFDQSxZQUFZO0NBRE47O0FBU047Ozs7RUFDQSxlaENsQzBCO0VnQ21DMUIsdUJoQ3NacUM7RWdDclpyQyxvQmhDcUxzQztDZ0N4TGhDOztBQzNDWjtFQUNFLGdCQUFnQjtFQUNoQiwyQkFBdUI7RUFDdkIsZUFBZTtFQUNmLGtCQUFrQjtFQUNsQixlQUFlO0VBQ2YsWWpDK2pCZ0M7RWlDOWpCaEMsbUJBQW1CO0VBQ25CLG9CQUFvQjtFQUNwQix5QkFBeUI7RUFDekIscUJBQXFCO0NBVmY7O0FBZUw7RUFDQyxjQUFjO0NBRFA7O0FBS0o7RUFDSCxtQkFBbUI7RUFDbkIsVUFBVTtDQUZKOztBQVNQOztFQUNDLFlqQ3lpQjhCO0VpQ3hpQjlCLHNCQUFzQjtFQUN0QixnQkFBZ0I7Q0FIVDs7QUFVWDtFQ3hDRSwwQmxDVzhCO0NpQzZCaEI7O0FDcENYOztFQUNDLDBCQUF3QjtDQURqQjs7QUR3Q2I7RUM1Q0UsMEJsQ2M0QjtDaUM4QmQ7O0FDeENYOztFQUNDLDBCQUF3QjtDQURqQjs7QUQ0Q2I7RUNoREUsMEJsQ2U2QjtDaUNpQ2Y7O0FDNUNYOztFQUNDLDBCQUF3QjtDQURqQjs7QURnRGI7RUNwREUsMEJsQ2dCNkI7Q2lDb0NsQjs7QUNoRFI7O0VBQ0MsMEJBQXdCO0NBRGpCOztBRG9EYjtFQ3hERSwwQmxDaUI2QjtDaUN1Q2Y7O0FDcERYOztFQUNDLDBCQUF3QjtDQURqQjs7QUR3RGI7RUM1REUsMEJsQ2tCNkI7Q2lDMENoQjs7QUN4RFY7O0VBQ0MsMEJBQXdCO0NBRGpCOztBQ0RiO0VBQ0Usc0JBQXNCO0VBQ3RCLGdCQUFnQjtFQUNoQixpQkFBZ0I7RUFDaEIsZ0JuQzJDNEI7RW1DMUM1QixrQm5Dc3dCZ0M7RW1DcndCaEMsWW5DMnZCZ0M7RW1DMXZCaEMsZW5DcXdCNkI7RW1DcHdCN0IsdUJBQXVCO0VBQ3ZCLG9CQUFvQjtFQUNwQixtQkFBbUI7RUFDbkIsMEJuQ0g4QjtFbUNJOUIsb0JuQ2l3QmdDO0NtQzd3QjFCOztBQWVMO0VBQ0MsY0FBYztDQURQOztBQUtKO0VBQ0gsbUJBQW1CO0VBQ25CLFVBQVU7Q0FGSjs7QUFNYTs7O0VBQ25CLE9BQU87RUFDUCxpQkFBZ0I7Q0FGTTs7QUFTRzs7RUFDekIsZW5DekIwQjtFbUMwQjFCLHVCbkNvdUI4QjtDbUN0dUJGOztBQUtYO0VBQ2pCLGFBQWE7Q0FETzs7QUFJQztFQUNyQixrQkFBa0I7Q0FETTs7QUFJSjtFQUNwQixpQkFBaUI7Q0FETTs7QUFReEI7O0VBQ0MsWW5DMHNCOEI7RW1DenNCOUIsc0JBQXNCO0VBQ3RCLGdCQUFnQjtDQUhUOztBQ3pEWDtFQUNFLGtCcENxZW1DO0VvQ3BlbkMscUJwQ29lbUM7RW9DbmVuQyxvQnBDbWVtQztFb0NsZW5DLGVwQ21lc0M7RW9DbGV0QywwQnBDSzhCO0NvQ1ZwQjs7QUFRVjs7RUFDRSxlcENnZW9DO0NvQ2plakM7O0FBSUw7RUFDRSxvQkFBa0M7RUFDbEMsZ0JwQzRkaUM7RW9DM2RqQyxpQkFBaUI7Q0FIaEI7O0FBTUQ7RUFDQSwwQkFBd0I7Q0FEcEI7O0FBS1c7O0VBQ2YsbUJwQ2lGMkI7Q29DbEZUOztBQUlwQjtFQUNFLGdCQUFnQjtDQUROOztBQUlaO0VBL0JGO0lBZ0NJLGtCQUFtQztJQUNuQyxxQkFBbUM7R0FqQzNCO0VBb0NTOztJQUNmLG1CQUFrQztJQUNsQyxvQkFBa0M7R0FGaEI7RUFNcEI7O0lBQ0UsZ0JwQ2djK0I7R29DamM1QjtDeENrdUpSOztBeUMzd0pEO0VBQ0UsZUFBZTtFQUNmLGFyQ3F1QitCO0VxQ3B1Qi9CLG9CckN3RDZCO0VxQ3ZEN0IseUJyQ3FEbUM7RXFDcERuQyx1QnJDa0IwQjtFcUNqQjFCLHVCckNxdUJnQztFcUNwdUJoQyxtQnJDZ0c2QjtFRDhFckIsb0NzQzdLa0M7Q0FSaEM7O0FBV047O0VuQ1JKLGVBRG1DO0VBRW5DLGdCQUFnQjtFQUNoQixhQUFhO0VtQ1FYLGtCQUFrQjtFQUNsQixtQkFBbUI7Q0FIWjs7QUFTVDtFQUNFLGFyQzZ0QjZCO0VxQzV0QjdCLGVyQ2hCNEI7Q3FDY3BCOztBQVNEOzs7RUFDVCxzQnJDbkI0QjtDcUNrQlY7O0FDM0JwQjtFQUNFLGN0QzBtQmdDO0VzQ3ptQmhDLG9CdEN1RDZCO0VzQ3REN0IsOEJBQThCO0VBQzlCLG1CdENpRzZCO0NzQ3JHdkI7O0FBT047RUFDRSxjQUFjO0VBRWQsZUFBZTtDQUhiOztBQU9KO0VBQ0Usa0J0QzhsQjhCO0NzQy9sQm5COztBQU1YOztFQUNBLGlCQUFpQjtDQURiOztBQUlBO0VBQ0osZ0JBQWdCO0NBRFQ7O0FBVVg7RUFDRSxvQkFBOEI7Q0FEWjs7QUFJbEI7RUFDRSxtQkFBbUI7RUFDbkIsVUFBVTtFQUNWLGFBQWE7RUFDYixlQUFlO0NBSlQ7O0FBWVY7RUN2REUsMEJ2Q3Fmc0M7RXVDcGZ0QyxzQnZDcWZxQztFdUNwZnJDLGV2Q2tmc0M7Q3NDN2J4Qjs7QUNuRGQ7RUFDRSwwQkFBd0I7Q0FEdEI7O0FBR0o7RUFDRSxlQUFhO0NBREY7O0FEb0RmO0VDM0RFLDBCdkN5ZnNDO0V1Q3hmdEMsc0J2Q3lmcUM7RXVDeGZyQyxldkNzZnNDO0NzQzdiM0I7O0FDdkRYO0VBQ0UsMEJBQXdCO0NBRHRCOztBQUdKO0VBQ0UsZUFBYTtDQURGOztBRHdEZjtFQy9ERSwwQnZDNmZzQztFdUM1ZnRDLHNCdkM2ZnFDO0V1QzVmckMsZXZDMGZzQztDc0M3YnhCOztBQzNEZDtFQUNFLDBCQUF3QjtDQUR0Qjs7QUFHSjtFQUNFLGVBQWE7Q0FERjs7QUQ0RGY7RUNuRUUsMEJ2Q2lnQnNDO0V1Q2hnQnRDLHNCdkNpZ0JxQztFdUNoZ0JyQyxldkM4ZnNDO0NzQzdiekI7O0FDL0RiO0VBQ0UsMEJBQXdCO0NBRHRCOztBQUdKO0VBQ0UsZUFBYTtDQURGOztBQ0RmO0VBQ0U7SUFBUSw0QkFBNEI7RzVDeTRKbkM7RTRDeDRKRDtJQUFRLHlCQUF5QjtHNUMyNEpoQztDQUNGOztBNEN4NEpEO0VBQ0U7SUFBUSw0QkFBNEI7RzVDNDRKbkM7RTRDMzRKRDtJQUFRLHlCQUF5QjtHNUM4NEpoQztDQUNGOztBNEN2NEpEO0VBQ0UsaUJBQWlCO0VBQ2pCLGF4Q3NDNkI7RXdDckM3QixvQnhDcUM2QjtFd0NwQzdCLDBCeENnbkJtQztFd0MvbUJuQyxtQnhDK0U2QjtFRHhDckIsK0N5Q3RDZ0M7Q0FOL0I7O0FBVVg7RUFDRSxZQUFZO0VBQ1osVUFBVTtFQUNWLGFBQWE7RUFDYixnQnhDYzRCO0V3Q2I1QixrQnhDeUI2QjtFd0N4QjdCLFl4Q3NtQmdDO0V3Q3JtQmhDLG1CQUFtQjtFQUNuQiwwQnhDMUI0QjtFRG9EcEIsK0N5Q3pCK0I7RXpDK0kvQiw0QnlDOUkwQjtDQVZyQjs7QUFtQmY7O0VDRUUsc01BQWlDO0VEQWpDLDJCQUEwQjtDQUZMOztBQVVWOztFekM3Q1gsMkR5QzhDMEQ7RXpDNUNsRCxtRHlDNENrRDtDQUR0Qzs7QUFRdEI7RUVyRUUsMEIxQ2U2QjtDd0NzRFI7O0FFbEVIO0VEa0RsQixzTUFBaUM7Q0NsRFo7O0FGc0V2QjtFRXpFRSwwQjFDZ0I2QjtDd0N5RFg7O0FFdEVBO0VEa0RsQixzTUFBaUM7Q0NsRFo7O0FGMEV2QjtFRTdFRSwwQjFDaUI2QjtDd0M0RFI7O0FFMUVIO0VEa0RsQixzTUFBaUM7Q0NsRFo7O0FGOEV2QjtFRWpGRSwwQjFDa0I2QjtDd0MrRFQ7O0FFOUVGO0VEa0RsQixzTUFBaUM7Q0NsRFo7O0FDTnZCO0VBRUUsaUJBQWlCO0NBRlg7O0FBSUw7RUFDQyxjQUFjO0NBREQ7O0FBTWpCOztFQUNFLFFBQVE7RUFDUixpQkFBaUI7Q0FGTjs7QUFLYjtFQUNFLGVBQWU7Q0FESjs7QUFJYjtFQUNFLGVBQWU7Q0FERjs7QUFJWjtFQUNDLGdCQUFnQjtDQUREOztBQU1WOztFQUNQLG1CQUFtQjtDQURDOztBQUtiOztFQUNQLG9CQUFvQjtDQUREOztBQU1yQjs7O0VBQ0Usb0JBQW9CO0VBQ3BCLG9CQUFvQjtDQUZUOztBQUtiO0VBQ0UsdUJBQXVCO0NBRFY7O0FBSWY7RUFDRSx1QkFBdUI7Q0FEVjs7QUFLZjtFQUNFLGNBQWM7RUFDZCxtQkFBbUI7Q0FGTDs7QUFRaEI7RUFDRSxnQkFBZ0I7RUFDaEIsaUJBQWlCO0NBRk47O0FDckRiO0VBRUUsb0JBQW9CO0VBQ3BCLGdCQUFnQjtDQUhMOztBQVdiO0VBQ0UsbUJBQW1CO0VBQ25CLGVBQWU7RUFDZixtQkFBa0I7RUFFbEIsb0JBQW9CO0VBQ3BCLHVCNUMwb0JrQztFNEN6b0JsQyx1QjVDMm9Ca0M7QzRDbHBCbEI7O0FBVWY7RXBCM0JELDZCeEIwRzZCO0V3QnpHNUIsNEJ4QnlHNEI7QzRDL0VkOztBQUdkO0VBQ0MsaUJBQWlCO0VwQnZCbkIsZ0N4QmtHNkI7RXdCakc1QiwrQnhCaUc0QjtDNEM1RWY7O0FBYVY7O0VBQ0osWTVDNm9Ca0M7QzRDOW9CWjs7QUFHdEI7O0VBQ0UsWTVDNG9CZ0M7QzRDN29CUjs7QUFNekI7Ozs7RUFDQyxzQkFBc0I7RUFDdEIsWTVDbW9CZ0M7RTRDbG9CaEMsMEI1Q2luQm1DO0M0Q3BuQjVCOztBQU9MO0VBQ0osWUFBWTtFQUNaLGlCQUFpQjtDQUZLOztBQVNaOzs7RUFDUiwwQjVDekQ0QjtFNEMwRDVCLGU1QzNENEI7RTRDNEQ1QixvQjVDNkp3QztDNENoS3hCOztBQU1oQjs7O0VBQ0UsZUFBZTtDQURTOztBQUcxQjs7O0VBQ0UsZTVDbkUwQjtDNENrRUw7O0FBUWpCOzs7RUFDTixXQUFXO0VBQ1gsWTVDd0I0QjtFNEN2QjVCLDBCNUMxRTBCO0U0QzJFMUIsc0I1QzNFMEI7QzRDdUVaOztBQVNhOzs7Ozs7Ozs7RUFDekIsZUFBZTtDQURrQjs7QUFHbkM7OztFQUNFLGU1QzhrQmlDO0M0Qy9rQlo7O0FDbEdrQztFQUV6RCxlN0NtZm9DO0U2Q2xmcEMsMEI3Q21mb0M7QzZDcmZwQzs7QUFLRDs7RUFHQyxlN0M0ZW9DO0M2QzdlcEM7O0FBR0E7O0VBQ0UsZUFBZTtDQURTOztBQUt6Qjs7OztFQUNDLGU3Q29la0M7RTZDbmVsQywwQkFBd0I7Q0FGakI7O0FBTUQ7Ozs7OztFQUNOLFlBQVk7RUFDWiwwQjdDNmRrQztFNkM1ZGxDLHNCN0M0ZGtDO0M2Qy9kcEI7O0FBdEJ5QztFQUV6RCxlN0N1Zm9DO0U2Q3RmcEMsMEI3Q3Vmb0M7QzZDemZwQzs7QUFLRDs7RUFHQyxlN0NnZm9DO0M2Q2pmcEM7O0FBR0E7O0VBQ0UsZUFBZTtDQURTOztBQUt6Qjs7OztFQUNDLGU3Q3dla0M7RTZDdmVsQywwQkFBd0I7Q0FGakI7O0FBTUQ7Ozs7OztFQUNOLFlBQVk7RUFDWiwwQjdDaWVrQztFNkNoZWxDLHNCN0NnZWtDO0M2Q25lcEI7O0FBdEJ5QztFQUV6RCxlN0MyZm9DO0U2QzFmcEMsMEI3QzJmb0M7QzZDN2ZwQzs7QUFLRDs7RUFHQyxlN0NvZm9DO0M2Q3JmcEM7O0FBR0E7O0VBQ0UsZUFBZTtDQURTOztBQUt6Qjs7OztFQUNDLGU3QzRla0M7RTZDM2VsQywwQkFBd0I7Q0FGakI7O0FBTUQ7Ozs7OztFQUNOLFlBQVk7RUFDWiwwQjdDcWVrQztFNkNwZWxDLHNCN0NvZWtDO0M2Q3ZlcEI7O0FBdEJ5QztFQUV6RCxlN0MrZm9DO0U2QzlmcEMsMEI3Qytmb0M7QzZDamdCcEM7O0FBS0Q7O0VBR0MsZTdDd2ZvQztDNkN6ZnBDOztBQUdBOztFQUNFLGVBQWU7Q0FEUzs7QUFLekI7Ozs7RUFDQyxlN0NnZmtDO0U2Qy9lbEMsMEJBQXdCO0NBRmpCOztBQU1EOzs7Ozs7RUFDTixZQUFZO0VBQ1osMEI3Q3lla0M7RTZDeGVsQyxzQjdDd2VrQztDNkMzZXBCOztBRGtHcEI7RUFDRSxjQUFjO0VBQ2QsbUJBQW1CO0NBRks7O0FBSTFCO0VBQ0UsaUJBQWlCO0VBQ2pCLGlCQUFpQjtDQUZJOztBRXhIdkI7RUFDRSxvQjlDMEQ2QjtFOEN6RDdCLHVCOUM2ckJnQztFOEM1ckJoQyw4QkFBOEI7RUFDOUIsbUI5Q21HNkI7RUR4Q3JCLDBDK0MxRDBCO0NBTDVCOztBQVNSO0VBQ0UsYzlDc3JCZ0M7QzhDdnJCckI7O0F4Q0RWOztFQUNDLGFBQWE7RUFDYixlQUFlO0NBRlI7O0FBSVI7RUFDQyxZQUFZO0NBREw7O0F3Q0dYO0VBQ0UsbUI5Q2lyQnFDO0U4Q2hyQnJDLHFDQUFxQztFdEJwQnJDLDZCc0JxQmdEO0V0QnBCL0MsNEJzQm9CK0M7Q0FIbEM7O0FBS0Y7RUFDVixlQUFlO0NBRGE7O0FBTWhDO0VBQ0UsY0FBYztFQUNkLGlCQUFpQjtFQUNqQixnQkFBZTtFQUNmLGVBQWU7Q0FKSDs7QUFVRDs7Ozs7RUFDVCxlQUFlO0NBREg7O0FBTWhCO0VBQ0UsbUI5Q3NwQnFDO0U4Q3JwQnJDLDBCOUMycEJtQztFOEMxcEJuQywyQjlDeXBCZ0M7RXdCanNCaEMsZ0NzQnlDbUQ7RXRCeENsRCwrQnNCd0NrRDtDQUp0Qzs7QUFlTzs7RUFDbEIsaUJBQWlCO0NBRGM7O0FBRy9COztFQUNFLG9CQUFvQjtFQUNwQixpQkFBaUI7Q0FGRDs7QUFPQTs7RUFDZCxjQUFjO0V0QnZFcEIsNkJzQndFc0Q7RXRCdkVyRCw0QnNCdUVxRDtDQUZwQjs7QUFRZDs7RUFDZCxpQkFBaUI7RXRCdkV2QixnQ3NCd0V5RDtFdEJ2RXhELCtCc0J1RXdEO0NBRnhCOztBQU9mO0V0QnJGbEIsMkJzQnNGZ0M7RXRCckYvQiwwQnNCcUYrQjtDQURBOztBQU9oQjtFQUNkLG9CQUFvQjtDQURROztBQUlsQjtFQUNaLG9CQUFvQjtDQURPOztBQVlQOzs7RUFDbEIsaUJBQWlCO0NBRFM7O0FBRzFCOzs7RUFDRSxtQjlDbWxCNEI7RThDbGxCNUIsb0I5Q2tsQjRCO0M4Q3BsQnJCOztBQU82Qjs7RXRCdEh4Qyw2QnNCdUhrRDtFdEJ0SGpELDRCc0JzSGlEO0NBREk7O0FBSzlDOzs7O0VBQ0YsNEJBQTZDO0VBQzdDLDZCQUE4QztDQUY5Qjs7QUFLZDs7Ozs7Ozs7RUFDQSw0QkFBNkM7Q0FEL0I7O0FBSWQ7Ozs7Ozs7O0VBQ0EsNkJBQThDO0NBRGpDOztBQVFrQjs7RXRCcEl2QyxnQ3NCcUlxRDtFdEJwSXBELCtCc0JvSW9EO0NBREQ7O0FBSzVDOzs7O0VBQ0YsK0JBQWdEO0VBQ2hELGdDQUFpRDtDQUZsQzs7QUFLYjs7Ozs7Ozs7RUFDQSwrQkFBZ0Q7Q0FEbEM7O0FBSWQ7Ozs7Ozs7O0VBQ0EsZ0NBQWlEO0NBRHBDOztBQVNDOzs7O0VBQ3BCLDJCOUN6QmdDO0M4Q3dCQzs7QUFJVzs7RUFDNUMsY0FBYztDQURrQzs7QUFJNUI7O0VBQ3BCLFVBQVU7Q0FEMkI7O0FBTzdCOzs7Ozs7Ozs7Ozs7RUFDRixlQUFlO0NBREM7O0FBSWQ7Ozs7Ozs7Ozs7OztFQUNGLGdCQUFnQjtDQUREOztBQVNmOzs7Ozs7OztFQUNBLGlCQUFpQjtDQURiOztBQVNKOzs7Ozs7OztFQUNBLGlCQUFpQjtDQURiOztBQU1WO0VBQ0EsVUFBVTtFQUNWLGlCQUFpQjtDQUZFOztBQVl2QjtFQUNFLG9COUM3SjZCO0M4QzRKakI7O0FBSVo7RUFDRSxpQkFBaUI7RUFDakIsbUI5Q3RIMkI7QzhDb0hyQjs7QUFJSjtFQUNBLGdCQUFnQjtDQURSOztBQUtaO0VBQ0UsaUJBQWlCO0NBREg7O0FBSU07O0VBQ2xCLDJCOUM2ZDRCO0M4QzlkRzs7QUFLbkM7RUFDRSxjQUFjO0NBREQ7O0FBRUs7RUFDaEIsOEI5Q3NkNEI7QzhDdmRDOztBQVFuQztFQzFQRSxtQi9DNnNCZ0M7QzhDbmRsQjs7QUN4UFY7RUFDRixlL0NNNEI7RStDTDVCLDBCL0Mwc0JpQztFK0N6c0JqQyxtQi9Dd3NCOEI7QytDM3NCWjs7QUFLRTtFQUNsQix1Qi9DcXNCNEI7QytDdHNCRzs7QUFHakM7RUFDRSxlL0Ntc0IrQjtFK0Nsc0IvQiwwQi9DSDBCO0MrQ0NwQjs7QUFNWTtFQUNsQiwwQi9DNHJCNEI7QytDN3JCRzs7QUQ2T3JDO0VDN1BFLHNCL0NjNEI7QzhDK09kOztBQzNQVjtFQUNGLFkvQzZzQjhCO0UrQzVzQjlCLDBCL0NVMEI7RStDVDFCLHNCL0NTMEI7QytDWlI7O0FBS0U7RUFDbEIsMEIvQ013QjtDK0NQTzs7QUFHakM7RUFDRSxlL0NHd0I7RStDRnhCLHVCL0Nvc0I0QjtDK0N0c0J0Qjs7QUFNWTtFQUNsQiw2Qi9DSHdCO0MrQ0VPOztBRGdQckM7RUNoUUUsc0IvQ3NmcUM7QzhDdFB2Qjs7QUM5UFY7RUFDRixlL0NpZm9DO0UrQ2hmcEMsMEIvQ2lmb0M7RStDaGZwQyxzQi9DaWZtQztDK0NwZmpCOztBQUtFO0VBQ2xCLDBCL0M4ZWlDO0MrQy9lRjs7QUFHakM7RUFDRSxlL0MwZWtDO0UrQ3plbEMsMEIvQ3dla0M7QytDMWU1Qjs7QUFNWTtFQUNsQiw2Qi9DcWVpQztDK0N0ZUY7O0FEbVByQztFQ25RRSxzQi9DMGZxQztDOEN2UDFCOztBQ2pRUDtFQUNGLGUvQ3Fmb0M7RStDcGZwQywwQi9DcWZvQztFK0NwZnBDLHNCL0NxZm1DO0MrQ3hmakI7O0FBS0U7RUFDbEIsMEIvQ2tmaUM7QytDbmZGOztBQUdqQztFQUNFLGUvQzhla0M7RStDN2VsQywwQi9DNGVrQztDK0M5ZTVCOztBQU1ZO0VBQ2xCLDZCL0N5ZWlDO0MrQzFlRjs7QURzUHJDO0VDdFFFLHNCL0M4ZnFDO0M4Q3hQdkI7O0FDcFFWO0VBQ0YsZS9DeWZvQztFK0N4ZnBDLDBCL0N5Zm9DO0UrQ3hmcEMsc0IvQ3lmbUM7QytDNWZqQjs7QUFLRTtFQUNsQiwwQi9Dc2ZpQztDK0N2ZkY7O0FBR2pDO0VBQ0UsZS9Da2ZrQztFK0NqZmxDLDBCL0NnZmtDO0MrQ2xmNUI7O0FBTVk7RUFDbEIsNkIvQzZlaUM7QytDOWVGOztBRHlQckM7RUN6UUUsc0IvQ2tnQnFDO0M4Q3pQeEI7O0FDdlFUO0VBQ0YsZS9DNmZvQztFK0M1ZnBDLDBCL0M2Zm9DO0UrQzVmcEMsc0IvQzZmbUM7QytDaGdCakI7O0FBS0U7RUFDbEIsMEIvQzBmaUM7QytDM2ZGOztBQUdqQztFQUNFLGUvQ3Nma0M7RStDcmZsQywwQi9Db2ZrQztDK0N0ZjVCOztBQU1ZO0VBQ2xCLDZCL0NpZmlDO0MrQ2xmRjs7QUNmckM7RUFDRSxtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLFVBQVU7RUFDVixXQUFXO0VBQ1gsaUJBQWlCO0NBTEE7O0FBV2pCOzs7OztFQUNFLG1CQUFtQjtFQUNuQixPQUFPO0VBQ1AsUUFBUTtFQUNSLFVBQVU7RUFDVixhQUFhO0VBQ2IsWUFBWTtFQUNaLFVBQVU7Q0FQTDs7QUFZVDtFQUNFLHVCQUF1QjtDQURBOztBQUt6QjtFQUNFLG9CQUFv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QjtHQUR6QjtDaEVzcU5IOztBK0Roak5EO0VDdkh5QztJQUVyQyx5QkFBeUI7R0FEekI7Q2hFNHFOSDs7QStEbGpORDtFQzNIeUM7SUFFckMseUJBQXlCO0dBRHpCO0NoRWtyTkg7O0FnRW5yTndDO0VBRXJDLHlCQUF5QjtDQUR6Qjs7QUR1SUo7RUNsSnVDO0lBRW5DLDBCQUEwQjtHQUQxQjtFQUVEO0lBQ0csMEJBQTBCO0dBQTNCO0VBQThCO0lBQzFCLDhCQUE4QjtHQUEvQjtFQUFrQzs7SUFDakMsK0JBQStCO0dBQWhDO0NoRTJzTlA7O0ErRDVqTkQ7RUFDRSx5QkFBeUI7Q0FETDs7QUFHcEI7RUFIRjtJQUlJLDBCQUEwQjtHQUpSO0MvRHNrTnJCOztBK0Qvak5EO0VBQ0UseUJBQXlCO0NBREo7O0FBR3JCO0VBSEY7SUFJSSwyQkFBMkI7R0FKUjtDL0R5a050Qjs7QStEbGtORDtFQUNFLHlCQUF5QjtDQURFOztBQUczQjtFQUhGO0lBSUksaUNBQWlDO0dBSlI7Qy9ENGtONUI7O0ErRHBrTkQ7RUNqS3lDO0lBRXJDLHlCQUF5QjtHQUR6QjtDaEUwdU5IIiwiZmlsZSI6ImJvb3RzdHJhcC1vZmZpY2lhbC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNSBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG5cbi8vIENvcmUgdmFyaWFibGVzIGFuZCBtaXhpbnNcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvdmFyaWFibGVzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGluc1wiO1xuXG4vLyBSZXNldCBhbmQgZGVwZW5kZW5jaWVzXG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL25vcm1hbGl6ZVwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9wcmludFwiO1xuLy9AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2dseXBoaWNvbnNcIjtcblxuLy8gQ29yZSBDU1NcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvc2NhZmZvbGRpbmdcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvdHlwZVwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9jb2RlXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2dyaWRcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvdGFibGVzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2Zvcm1zXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2J1dHRvbnNcIjtcblxuLy8gQ29tcG9uZW50c1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9jb21wb25lbnQtYW5pbWF0aW9uc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9kcm9wZG93bnNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvYnV0dG9uLWdyb3Vwc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9pbnB1dC1ncm91cHNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbmF2c1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9uYXZiYXJcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvYnJlYWRjcnVtYnNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcGFnaW5hdGlvblwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9wYWdlclwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9sYWJlbHNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvYmFkZ2VzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2p1bWJvdHJvblwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC90aHVtYm5haWxzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2FsZXJ0c1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9wcm9ncmVzcy1iYXJzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21lZGlhXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2xpc3QtZ3JvdXBcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcGFuZWxzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3Jlc3BvbnNpdmUtZW1iZWRcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvd2VsbHNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvY2xvc2VcIjtcblxuLy8gQ29tcG9uZW50cyB3LyBKYXZhU2NyaXB0XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21vZGFsc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC90b29sdGlwXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3BvcG92ZXJzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2Nhcm91c2VsXCI7XG5cbi8vIFV0aWxpdHkgY2xhc3Nlc1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC91dGlsaXRpZXNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcmVzcG9uc2l2ZS11dGlsaXRpZXNcIjtcbiIsIi8qISBub3JtYWxpemUuY3NzIHYzLjAuMyB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9cblxuLy9cbi8vIDEuIFNldCBkZWZhdWx0IGZvbnQgZmFtaWx5IHRvIHNhbnMtc2VyaWYuXG4vLyAyLiBQcmV2ZW50IGlPUyBhbmQgSUUgdGV4dCBzaXplIGFkanVzdCBhZnRlciBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLFxuLy8gICAgd2l0aG91dCBkaXNhYmxpbmcgdXNlciB6b29tLlxuLy9cblxuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyAvLyAxXG4gIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvLyAyXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLy8gMlxufVxuXG4vL1xuLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luLlxuLy9cblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbn1cblxuLy8gSFRNTDUgZGlzcGxheSBkZWZpbml0aW9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBhbnkgSFRNTDUgZWxlbWVudCBpbiBJRSA4LzkuXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYGRldGFpbHNgIG9yIGBzdW1tYXJ5YCBpbiBJRSAxMC8xMVxuLy8gYW5kIEZpcmVmb3guXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYG1haW5gIGluIElFIDExLlxuLy9cblxuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5oZ3JvdXAsXG5tYWluLFxubWVudSxcbm5hdixcbnNlY3Rpb24sXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8vXG4vLyAxLiBDb3JyZWN0IGBpbmxpbmUtYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgaW4gSUUgOC85LlxuLy8gMi4gTm9ybWFsaXplIHZlcnRpY2FsIGFsaWdubWVudCBvZiBgcHJvZ3Jlc3NgIGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLlxuLy9cblxuYXVkaW8sXG5jYW52YXMsXG5wcm9ncmVzcyxcbnZpZGVvIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvLyAxXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgLy8gMlxufVxuXG4vL1xuLy8gUHJldmVudCBtb2Rlcm4gYnJvd3NlcnMgZnJvbSBkaXNwbGF5aW5nIGBhdWRpb2Agd2l0aG91dCBjb250cm9scy5cbi8vIFJlbW92ZSBleGNlc3MgaGVpZ2h0IGluIGlPUyA1IGRldmljZXMuXG4vL1xuXG5hdWRpbzpub3QoW2NvbnRyb2xzXSkge1xuICBkaXNwbGF5OiBub25lO1xuICBoZWlnaHQ6IDA7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGBbaGlkZGVuXWAgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAuXG4vLyBIaWRlIHRoZSBgdGVtcGxhdGVgIGVsZW1lbnQgaW4gSUUgOC85LzEwLzExLCBTYWZhcmksIGFuZCBGaXJlZm94IDwgMjIuXG4vL1xuXG5baGlkZGVuXSxcbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLy8gTGlua3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgdGhlIGdyYXkgYmFja2dyb3VuZCBjb2xvciBmcm9tIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbi8vXG5cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLy9cbi8vIEltcHJvdmUgcmVhZGFiaWxpdHkgb2YgZm9jdXNlZCBlbGVtZW50cyB3aGVuIHRoZXkgYXJlIGFsc28gaW4gYW5cbi8vIGFjdGl2ZS9ob3ZlciBzdGF0ZS5cbi8vXG5cbmE6YWN0aXZlLFxuYTpob3ZlciB7XG4gIG91dGxpbmU6IDA7XG59XG5cbi8vIFRleHQtbGV2ZWwgc2VtYW50aWNzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS8xMC8xMSwgU2FmYXJpLCBhbmQgQ2hyb21lLlxuLy9cblxuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBzdHlsZSBzZXQgdG8gYGJvbGRlcmAgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuLy9cblxuYixcbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIFNhZmFyaSBhbmQgQ2hyb21lLlxuLy9cblxuZGZuIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4vL1xuLy8gQWRkcmVzcyB2YXJpYWJsZSBgaDFgIGZvbnQtc2l6ZSBhbmQgbWFyZ2luIHdpdGhpbiBgc2VjdGlvbmAgYW5kIGBhcnRpY2xlYFxuLy8gY29udGV4dHMgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuLy9cblxuaDEge1xuICBmb250LXNpemU6IDJlbTtcbiAgbWFyZ2luOiAwLjY3ZW0gMDtcbn1cblxuLy9cbi8vIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkuXG4vL1xuXG5tYXJrIHtcbiAgYmFja2dyb3VuZDogI2ZmMDtcbiAgY29sb3I6ICMwMDA7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGluY29uc2lzdGVudCBhbmQgdmFyaWFibGUgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbi8vXG5cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbi8vXG4vLyBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBhZmZlY3RpbmcgYGxpbmUtaGVpZ2h0YCBpbiBhbGwgYnJvd3NlcnMuXG4vL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdXAge1xuICB0b3A6IC0wLjVlbTtcbn1cblxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuXG4vLyBFbWJlZGRlZCBjb250ZW50XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gUmVtb3ZlIGJvcmRlciB3aGVuIGluc2lkZSBgYWAgZWxlbWVudCBpbiBJRSA4LzkvMTAuXG4vL1xuXG5pbWcge1xuICBib3JkZXI6IDA7XG59XG5cbi8vXG4vLyBDb3JyZWN0IG92ZXJmbG93IG5vdCBoaWRkZW4gaW4gSUUgOS8xMC8xMS5cbi8vXG5cbnN2Zzpub3QoOnJvb3QpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLy8gR3JvdXBpbmcgY29udGVudFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIEFkZHJlc3MgbWFyZ2luIG5vdCBwcmVzZW50IGluIElFIDgvOSBhbmQgU2FmYXJpLlxuLy9cblxuZmlndXJlIHtcbiAgbWFyZ2luOiAxZW0gNDBweDtcbn1cblxuLy9cbi8vIEFkZHJlc3MgZGlmZmVyZW5jZXMgYmV0d2VlbiBGaXJlZm94IGFuZCBvdGhlciBicm93c2Vycy5cbi8vXG5cbmhyIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIGhlaWdodDogMDtcbn1cblxuLy9cbi8vIENvbnRhaW4gb3ZlcmZsb3cgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxucHJlIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi8vXG4vLyBBZGRyZXNzIG9kZCBgZW1gLXVuaXQgZm9udCBzaXplIHJlbmRlcmluZyBpbiBhbGwgYnJvd3NlcnMuXG4vL1xuXG5jb2RlLFxua2JkLFxucHJlLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxZW07XG59XG5cbi8vIEZvcm1zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gS25vd24gbGltaXRhdGlvbjogYnkgZGVmYXVsdCwgQ2hyb21lIGFuZCBTYWZhcmkgb24gT1MgWCBhbGxvdyB2ZXJ5IGxpbWl0ZWRcbi8vIHN0eWxpbmcgb2YgYHNlbGVjdGAsIHVubGVzcyBhIGBib3JkZXJgIHByb3BlcnR5IGlzIHNldC5cbi8vXG5cbi8vXG4vLyAxLiBDb3JyZWN0IGNvbG9yIG5vdCBiZWluZyBpbmhlcml0ZWQuXG4vLyAgICBLbm93biBpc3N1ZTogYWZmZWN0cyBjb2xvciBvZiBkaXNhYmxlZCBlbGVtZW50cy5cbi8vIDIuIENvcnJlY3QgZm9udCBwcm9wZXJ0aWVzIG5vdCBiZWluZyBpbmhlcml0ZWQuXG4vLyAzLiBBZGRyZXNzIG1hcmdpbnMgc2V0IGRpZmZlcmVudGx5IGluIEZpcmVmb3ggNCssIFNhZmFyaSwgYW5kIENocm9tZS5cbi8vXG5cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGNvbG9yOiBpbmhlcml0OyAvLyAxXG4gIGZvbnQ6IGluaGVyaXQ7IC8vIDJcbiAgbWFyZ2luOiAwOyAvLyAzXG59XG5cbi8vXG4vLyBBZGRyZXNzIGBvdmVyZmxvd2Agc2V0IHRvIGBoaWRkZW5gIGluIElFIDgvOS8xMC8xMS5cbi8vXG5cbmJ1dHRvbiB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBpbmNvbnNpc3RlbnQgYHRleHQtdHJhbnNmb3JtYCBpbmhlcml0YW5jZSBmb3IgYGJ1dHRvbmAgYW5kIGBzZWxlY3RgLlxuLy8gQWxsIG90aGVyIGZvcm0gY29udHJvbCBlbGVtZW50cyBkbyBub3QgaW5oZXJpdCBgdGV4dC10cmFuc2Zvcm1gIHZhbHVlcy5cbi8vIENvcnJlY3QgYGJ1dHRvbmAgc3R5bGUgaW5oZXJpdGFuY2UgaW4gRmlyZWZveCwgSUUgOC85LzEwLzExLCBhbmQgT3BlcmEuXG4vLyBDb3JyZWN0IGBzZWxlY3RgIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3guXG4vL1xuXG5idXR0b24sXG5zZWxlY3Qge1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbn1cblxuLy9cbi8vIDEuIEF2b2lkIHRoZSBXZWJLaXQgYnVnIGluIEFuZHJvaWQgNC4wLiogd2hlcmUgKDIpIGRlc3Ryb3lzIG5hdGl2ZSBgYXVkaW9gXG4vLyAgICBhbmQgYHZpZGVvYCBjb250cm9scy5cbi8vIDIuIENvcnJlY3QgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSBgaW5wdXRgIHR5cGVzIGluIGlPUy5cbi8vIDMuIEltcHJvdmUgdXNhYmlsaXR5IGFuZCBjb25zaXN0ZW5jeSBvZiBjdXJzb3Igc3R5bGUgYmV0d2VlbiBpbWFnZS10eXBlXG4vLyAgICBgaW5wdXRgIGFuZCBvdGhlcnMuXG4vL1xuXG5idXR0b24sXG5odG1sIGlucHV0W3R5cGU9XCJidXR0b25cIl0sIC8vIDFcbmlucHV0W3R5cGU9XCJyZXNldFwiXSxcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLy8gMlxuICBjdXJzb3I6IHBvaW50ZXI7IC8vIDNcbn1cblxuLy9cbi8vIFJlLXNldCBkZWZhdWx0IGN1cnNvciBmb3IgZGlzYWJsZWQgZWxlbWVudHMuXG4vL1xuXG5idXR0b25bZGlzYWJsZWRdLFxuaHRtbCBpbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi8vXG4vLyBSZW1vdmUgaW5uZXIgcGFkZGluZyBhbmQgYm9yZGVyIGluIEZpcmVmb3ggNCsuXG4vL1xuXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5pbnB1dDo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlcjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuLy9cbi8vIEFkZHJlc3MgRmlyZWZveCA0KyBzZXR0aW5nIGBsaW5lLWhlaWdodGAgb24gYGlucHV0YCB1c2luZyBgIWltcG9ydGFudGAgaW5cbi8vIHRoZSBVQSBzdHlsZXNoZWV0LlxuLy9cblxuaW5wdXQge1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xufVxuXG4vL1xuLy8gSXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkb24ndCBhdHRlbXB0IHRvIHN0eWxlIHRoZXNlIGVsZW1lbnRzLlxuLy8gRmlyZWZveCdzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgcmVzcGVjdCBib3gtc2l6aW5nLCBwYWRkaW5nLCBvciB3aWR0aC5cbi8vXG4vLyAxLiBBZGRyZXNzIGJveCBzaXppbmcgc2V0IHRvIGBjb250ZW50LWJveGAgaW4gSUUgOC85LzEwLlxuLy8gMi4gUmVtb3ZlIGV4Y2VzcyBwYWRkaW5nIGluIElFIDgvOS8xMC5cbi8vXG5cbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8vIDFcbiAgcGFkZGluZzogMDsgLy8gMlxufVxuXG4vL1xuLy8gRml4IHRoZSBjdXJzb3Igc3R5bGUgZm9yIENocm9tZSdzIGluY3JlbWVudC9kZWNyZW1lbnQgYnV0dG9ucy4gRm9yIGNlcnRhaW5cbi8vIGBmb250LXNpemVgIHZhbHVlcyBvZiB0aGUgYGlucHV0YCwgaXQgY2F1c2VzIHRoZSBjdXJzb3Igc3R5bGUgb2YgdGhlXG4vLyBkZWNyZW1lbnQgYnV0dG9uIHRvIGNoYW5nZSBmcm9tIGBkZWZhdWx0YCB0byBgdGV4dGAuXG4vL1xuXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLy9cbi8vIDEuIEFkZHJlc3MgYGFwcGVhcmFuY2VgIHNldCB0byBgc2VhcmNoZmllbGRgIGluIFNhZmFyaSBhbmQgQ2hyb21lLlxuLy8gMi4gQWRkcmVzcyBgYm94LXNpemluZ2Agc2V0IHRvIGBib3JkZXItYm94YCBpbiBTYWZhcmkgYW5kIENocm9tZS5cbi8vXG5cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLy8gMVxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLy8yXG59XG5cbi8vXG4vLyBSZW1vdmUgaW5uZXIgcGFkZGluZyBhbmQgc2VhcmNoIGNhbmNlbCBidXR0b24gaW4gU2FmYXJpIGFuZCBDaHJvbWUgb24gT1MgWC5cbi8vIFNhZmFyaSAoYnV0IG5vdCBDaHJvbWUpIGNsaXBzIHRoZSBjYW5jZWwgYnV0dG9uIHdoZW4gdGhlIHNlYXJjaCBpbnB1dCBoYXNcbi8vIHBhZGRpbmcgKGFuZCBgdGV4dGZpZWxkYCBhcHBlYXJhbmNlKS5cbi8vXG5cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG4vL1xuLy8gRGVmaW5lIGNvbnNpc3RlbnQgYm9yZGVyLCBtYXJnaW4sIGFuZCBwYWRkaW5nLlxuLy9cblxuZmllbGRzZXQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICBtYXJnaW46IDAgMnB4O1xuICBwYWRkaW5nOiAwLjM1ZW0gMC42MjVlbSAwLjc1ZW07XG59XG5cbi8vXG4vLyAxLiBDb3JyZWN0IGBjb2xvcmAgbm90IGJlaW5nIGluaGVyaXRlZCBpbiBJRSA4LzkvMTAvMTEuXG4vLyAyLiBSZW1vdmUgcGFkZGluZyBzbyBwZW9wbGUgYXJlbid0IGNhdWdodCBvdXQgaWYgdGhleSB6ZXJvIG91dCBmaWVsZHNldHMuXG4vL1xuXG5sZWdlbmQge1xuICBib3JkZXI6IDA7IC8vIDFcbiAgcGFkZGluZzogMDsgLy8gMlxufVxuXG4vL1xuLy8gUmVtb3ZlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDgvOS8xMC8xMS5cbi8vXG5cbnRleHRhcmVhIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi8vXG4vLyBEb24ndCBpbmhlcml0IHRoZSBgZm9udC13ZWlnaHRgIChhcHBsaWVkIGJ5IGEgcnVsZSBhYm92ZSkuXG4vLyBOT1RFOiB0aGUgZGVmYXVsdCBjYW5ub3Qgc2FmZWx5IGJlIGNoYW5nZWQgaW4gQ2hyb21lIGFuZCBTYWZhcmkgb24gT1MgWC5cbi8vXG5cbm9wdGdyb3VwIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi8vIFRhYmxlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIFJlbW92ZSBtb3N0IHNwYWNpbmcgYmV0d2VlbiB0YWJsZSBjZWxscy5cbi8vXG5cbnRhYmxlIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgYm9yZGVyLXNwYWNpbmc6IDA7XG59XG5cbnRkLFxudGgge1xuICBwYWRkaW5nOiAwO1xufVxuIiwiLyohXG4gKiBCb290c3RyYXAgdjMuMy41IChodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbSlcbiAqIENvcHlyaWdodCAyMDExLTIwMTUgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuLyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4zIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xufVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuXG5hcnRpY2xlLFxuYXNpZGUsXG5kZXRhaWxzLFxuZmlnY2FwdGlvbixcbmZpZ3VyZSxcbmZvb3RlcixcbmhlYWRlcixcbmhncm91cCxcbm1haW4sXG5tZW51LFxubmF2LFxuc2VjdGlvbixcbnN1bW1hcnkge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuYXVkaW8sXG5jYW52YXMsXG5wcm9ncmVzcyxcbnZpZGVvIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbmF1ZGlvOm5vdChbY29udHJvbHNdKSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGhlaWdodDogMDtcbn1cblxuW2hpZGRlbl0sXG50ZW1wbGF0ZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuYTphY3RpdmUsXG5hOmhvdmVyIHtcbiAgb3V0bGluZTogMDtcbn1cblxuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkO1xufVxuXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbmRmbiB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuaDEge1xuICBmb250LXNpemU6IDJlbTtcbiAgbWFyZ2luOiAwLjY3ZW0gMDtcbn1cblxubWFyayB7XG4gIGJhY2tncm91bmQ6ICNmZjA7XG4gIGNvbG9yOiAjMDAwO1xufVxuXG5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogODAlO1xufVxuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdXAge1xuICB0b3A6IC0wLjVlbTtcbn1cblxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuXG5pbWcge1xuICBib3JkZXI6IDA7XG59XG5cbnN2Zzpub3QoOnJvb3QpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuZmlndXJlIHtcbiAgbWFyZ2luOiAxZW0gNDBweDtcbn1cblxuaHIge1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgaGVpZ2h0OiAwO1xufVxuXG5wcmUge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuY29kZSxcbmtiZCxcbnByZSxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIGZvbnQtc2l6ZTogMWVtO1xufVxuXG5idXR0b24sXG5pbnB1dCxcbm9wdGdyb3VwLFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBjb2xvcjogaW5oZXJpdDtcbiAgZm9udDogaW5oZXJpdDtcbiAgbWFyZ2luOiAwO1xufVxuXG5idXR0b24ge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuYnV0dG9uLFxuc2VsZWN0IHtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG59XG5cbmJ1dHRvbixcbmh0bWwgaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxuaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbmJ1dHRvbltkaXNhYmxlZF0sXG5odG1sIGlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxuaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXIge1xuICBib3JkZXI6IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbmlucHV0IHtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogMDtcbn1cblxuaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG59XG5cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5maWVsZHNldCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIG1hcmdpbjogMCAycHg7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjYyNWVtIDAuNzVlbTtcbn1cblxubGVnZW5kIHtcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG5vcHRncm91cCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG50YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG50ZCxcbnRoIHtcbiAgcGFkZGluZzogMDtcbn1cblxuLyohIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2g1YnAvaHRtbDUtYm9pbGVycGxhdGUvYmxvYi9tYXN0ZXIvc3JjL2Nzcy9tYWluLmNzcyAqL1xuQG1lZGlhIHByaW50IHtcbiAgKixcbiAgKjpiZWZvcmUsXG4gICo6YWZ0ZXIge1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMwMDAgIWltcG9ydGFudDtcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICBhLFxuICBhOnZpc2l0ZWQge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICB9XG4gIGFbaHJlZl06YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIChcIiBhdHRyKGhyZWYpIFwiKVwiO1xuICB9XG4gIGFiYnJbdGl0bGVdOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIiAoXCIgYXR0cih0aXRsZSkgXCIpXCI7XG4gIH1cbiAgYVtocmVmXj1cIiNcIl06YWZ0ZXIsXG4gIGFbaHJlZl49XCJqYXZhc2NyaXB0OlwiXTphZnRlciB7XG4gICAgY29udGVudDogXCJcIjtcbiAgfVxuICBwcmUsXG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7XG4gICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICB9XG4gIHRoZWFkIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXA7XG4gIH1cbiAgdHIsXG4gIGltZyB7XG4gICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICB9XG4gIGltZyB7XG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG4gIH1cbiAgcCxcbiAgaDIsXG4gIGgzIHtcbiAgICBvcnBoYW5zOiAzO1xuICAgIHdpZG93czogMztcbiAgfVxuICBoMixcbiAgaDMge1xuICAgIHBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkO1xuICB9XG4gIC5uYXZiYXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgLmJ0biA+IC5jYXJldCxcbiAgLmRyb3B1cCA+IC5idG4gPiAuY2FyZXQge1xuICAgIGJvcmRlci10b3AtY29sb3I6ICMwMDAgIWltcG9ydGFudDtcbiAgfVxuICAubGFiZWwge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gIH1cbiAgLnRhYmxlIHtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7XG4gIH1cbiAgLnRhYmxlIHRkLFxuICAudGFibGUgdGgge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgfVxuICAudGFibGUtYm9yZGVyZWQgdGgsXG4gIC50YWJsZS1ib3JkZXJlZCB0ZCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZCAhaW1wb3J0YW50O1xuICB9XG59XG5cbioge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuKjpiZWZvcmUsXG4qOmFmdGVyIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbmh0bWwge1xuICBmb250LXNpemU6IDEwcHg7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbmJvZHkge1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICMzMzMzMzM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbmlucHV0LFxuYnV0dG9uLFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbn1cblxuYSB7XG4gIGNvbG9yOiAjMzM3YWI3O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbmE6aG92ZXIsXG5hOmZvY3VzIHtcbiAgY29sb3I6ICMyMzUyN2M7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG5hOmZvY3VzIHtcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIG91dGxpbmU6IDVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG59XG5cbmZpZ3VyZSB7XG4gIG1hcmdpbjogMDtcbn1cblxuaW1nIHtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmltZy1yZXNwb25zaXZlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4uaW1nLXJvdW5kZWQge1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG59XG5cbi5pbWctdGh1bWJuYWlsIHtcbiAgcGFkZGluZzogNHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbiAgLW8tdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4uaW1nLWNpcmNsZSB7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cblxuaHIge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWVlZWVlO1xufVxuXG4uc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbiAgYm9yZGVyOiAwO1xufVxuXG4uc3Itb25seS1mb2N1c2FibGU6YWN0aXZlLFxuLnNyLW9ubHktZm9jdXNhYmxlOmZvY3VzIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbiAgd2lkdGg6IGF1dG87XG4gIGhlaWdodDogYXV0bztcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgY2xpcDogYXV0bztcbn1cblxuW3JvbGU9XCJidXR0b25cIl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsXG4uaDEsIC5oMiwgLmgzLCAuaDQsIC5oNSwgLmg2IHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjE7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG5oMSBzbWFsbCxcbmgxIC5zbWFsbCwgaDIgc21hbGwsXG5oMiAuc21hbGwsIGgzIHNtYWxsLFxuaDMgLnNtYWxsLCBoNCBzbWFsbCxcbmg0IC5zbWFsbCwgaDUgc21hbGwsXG5oNSAuc21hbGwsIGg2IHNtYWxsLFxuaDYgLnNtYWxsLFxuLmgxIHNtYWxsLFxuLmgxIC5zbWFsbCwgLmgyIHNtYWxsLFxuLmgyIC5zbWFsbCwgLmgzIHNtYWxsLFxuLmgzIC5zbWFsbCwgLmg0IHNtYWxsLFxuLmg0IC5zbWFsbCwgLmg1IHNtYWxsLFxuLmg1IC5zbWFsbCwgLmg2IHNtYWxsLFxuLmg2IC5zbWFsbCB7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogIzc3Nzc3Nztcbn1cblxuaDEsIC5oMSxcbmgyLCAuaDIsXG5oMywgLmgzIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuaDEgc21hbGwsXG5oMSAuc21hbGwsIC5oMSBzbWFsbCxcbi5oMSAuc21hbGwsXG5oMiBzbWFsbCxcbmgyIC5zbWFsbCwgLmgyIHNtYWxsLFxuLmgyIC5zbWFsbCxcbmgzIHNtYWxsLFxuaDMgLnNtYWxsLCAuaDMgc21hbGwsXG4uaDMgLnNtYWxsIHtcbiAgZm9udC1zaXplOiA2NSU7XG59XG5cbmg0LCAuaDQsXG5oNSwgLmg1LFxuaDYsIC5oNiB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbmg0IHNtYWxsLFxuaDQgLnNtYWxsLCAuaDQgc21hbGwsXG4uaDQgLnNtYWxsLFxuaDUgc21hbGwsXG5oNSAuc21hbGwsIC5oNSBzbWFsbCxcbi5oNSAuc21hbGwsXG5oNiBzbWFsbCxcbmg2IC5zbWFsbCwgLmg2IHNtYWxsLFxuLmg2IC5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xufVxuXG5oMSwgLmgxIHtcbiAgZm9udC1zaXplOiAzNnB4O1xufVxuXG5oMiwgLmgyIHtcbiAgZm9udC1zaXplOiAzMHB4O1xufVxuXG5oMywgLmgzIHtcbiAgZm9udC1zaXplOiAyNHB4O1xufVxuXG5oNCwgLmg0IHtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxuXG5oNSwgLmg1IHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG5oNiwgLmg2IHtcbiAgZm9udC1zaXplOiAxMnB4O1xufVxuXG5wIHtcbiAgbWFyZ2luOiAwIDAgMTBweDtcbn1cblxuLmxlYWQge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjQ7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAubGVhZCB7XG4gICAgZm9udC1zaXplOiAyMXB4O1xuICB9XG59XG5cbnNtYWxsLFxuLnNtYWxsIHtcbiAgZm9udC1zaXplOiA4NSU7XG59XG5cbm1hcmssXG4ubWFyayB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XG4gIHBhZGRpbmc6IC4yZW07XG59XG5cbi50ZXh0LWxlZnQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4udGV4dC1yaWdodCB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4udGV4dC1jZW50ZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi50ZXh0LWp1c3RpZnkge1xuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xufVxuXG4udGV4dC1ub3dyYXAge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udGV4dC1sb3dlcmNhc2Uge1xuICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlO1xufVxuXG4udGV4dC11cHBlcmNhc2UsIC5pbml0aWFsaXNtIHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cblxuLnRleHQtY2FwaXRhbGl6ZSB7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xufVxuXG4udGV4dC1tdXRlZCB7XG4gIGNvbG9yOiAjNzc3Nzc3O1xufVxuXG4udGV4dC1wcmltYXJ5IHtcbiAgY29sb3I6ICMzMzdhYjc7XG59XG5cbmEudGV4dC1wcmltYXJ5OmhvdmVyLFxuYS50ZXh0LXByaW1hcnk6Zm9jdXMge1xuICBjb2xvcjogIzI4NjA5MDtcbn1cblxuLnRleHQtc3VjY2VzcyB7XG4gIGNvbG9yOiAjM2M3NjNkO1xufVxuXG5hLnRleHQtc3VjY2Vzczpob3ZlcixcbmEudGV4dC1zdWNjZXNzOmZvY3VzIHtcbiAgY29sb3I6ICMyYjU0MmM7XG59XG5cbi50ZXh0LWluZm8ge1xuICBjb2xvcjogIzMxNzA4Zjtcbn1cblxuYS50ZXh0LWluZm86aG92ZXIsXG5hLnRleHQtaW5mbzpmb2N1cyB7XG4gIGNvbG9yOiAjMjQ1MjY5O1xufVxuXG4udGV4dC13YXJuaW5nIHtcbiAgY29sb3I6ICM4YTZkM2I7XG59XG5cbmEudGV4dC13YXJuaW5nOmhvdmVyLFxuYS50ZXh0LXdhcm5pbmc6Zm9jdXMge1xuICBjb2xvcjogIzY2NTEyYztcbn1cblxuLnRleHQtZGFuZ2VyIHtcbiAgY29sb3I6ICNhOTQ0NDI7XG59XG5cbmEudGV4dC1kYW5nZXI6aG92ZXIsXG5hLnRleHQtZGFuZ2VyOmZvY3VzIHtcbiAgY29sb3I6ICM4NDM1MzQ7XG59XG5cbi5iZy1wcmltYXJ5IHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5iZy1wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzN2FiNztcbn1cblxuYS5iZy1wcmltYXJ5OmhvdmVyLFxuYS5iZy1wcmltYXJ5OmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzI4NjA5MDtcbn1cblxuLmJnLXN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xufVxuXG5hLmJnLXN1Y2Nlc3M6aG92ZXIsXG5hLmJnLXN1Y2Nlc3M6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzFlMmIzO1xufVxuXG4uYmctaW5mbyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XG59XG5cbmEuYmctaW5mbzpob3ZlcixcbmEuYmctaW5mbzpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNhZmQ5ZWU7XG59XG5cbi5iZy13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcbn1cblxuYS5iZy13YXJuaW5nOmhvdmVyLFxuYS5iZy13YXJuaW5nOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZWNiNTtcbn1cblxuLmJnLWRhbmdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XG59XG5cbmEuYmctZGFuZ2VyOmhvdmVyLFxuYS5iZy1kYW5nZXI6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTRiOWI5O1xufVxuXG4ucGFnZS1oZWFkZXIge1xuICBwYWRkaW5nLWJvdHRvbTogOXB4O1xuICBtYXJnaW46IDQwcHggMCAyMHB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZWVlZTtcbn1cblxudWwsXG5vbCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbnVsIHVsLFxudWwgb2wsXG5vbCB1bCxcbm9sIG9sIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmxpc3QtdW5zdHlsZWQge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5saXN0LWlubGluZSB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgbWFyZ2luLWxlZnQ6IC01cHg7XG59XG5cbi5saXN0LWlubGluZSA+IGxpIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgcGFkZGluZy1yaWdodDogNXB4O1xufVxuXG5kbCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbmR0LFxuZGQge1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG59XG5cbmR0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbmRkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5kbC1ob3Jpem9udGFsIGRkOmJlZm9yZSxcbi5kbC1ob3Jpem9udGFsIGRkOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4uZGwtaG9yaXpvbnRhbCBkZDphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLmRsLWhvcml6b250YWwgZHQge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIHdpZHRoOiAxNjBweDtcbiAgICBjbGVhcjogbGVmdDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbiAgLmRsLWhvcml6b250YWwgZGQge1xuICAgIG1hcmdpbi1sZWZ0OiAxODBweDtcbiAgfVxufVxuXG5hYmJyW3RpdGxlXSxcbmFiYnJbZGF0YS1vcmlnaW5hbC10aXRsZV0ge1xuICBjdXJzb3I6IGhlbHA7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgIzc3Nzc3Nztcbn1cblxuLmluaXRpYWxpc20ge1xuICBmb250LXNpemU6IDkwJTtcbn1cblxuYmxvY2txdW90ZSB7XG4gIHBhZGRpbmc6IDEwcHggMjBweDtcbiAgbWFyZ2luOiAwIDAgMjBweDtcbiAgZm9udC1zaXplOiAxNy41cHg7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2VlZWVlZTtcbn1cblxuYmxvY2txdW90ZSBwOmxhc3QtY2hpbGQsXG5ibG9ja3F1b3RlIHVsOmxhc3QtY2hpbGQsXG5ibG9ja3F1b3RlIG9sOmxhc3QtY2hpbGQge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG5ibG9ja3F1b3RlIGZvb3RlcixcbmJsb2NrcXVvdGUgc21hbGwsXG5ibG9ja3F1b3RlIC5zbWFsbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LXNpemU6IDgwJTtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBjb2xvcjogIzc3Nzc3Nztcbn1cblxuYmxvY2txdW90ZSBmb290ZXI6YmVmb3JlLFxuYmxvY2txdW90ZSBzbWFsbDpiZWZvcmUsXG5ibG9ja3F1b3RlIC5zbWFsbDpiZWZvcmUge1xuICBjb250ZW50OiAnXFwyMDE0IFxcMDBBMCc7XG59XG5cbi5ibG9ja3F1b3RlLXJldmVyc2UsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQge1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGJvcmRlci1yaWdodDogNXB4IHNvbGlkICNlZWVlZWU7XG4gIGJvcmRlci1sZWZ0OiAwO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmJsb2NrcXVvdGUtcmV2ZXJzZSBmb290ZXI6YmVmb3JlLFxuLmJsb2NrcXVvdGUtcmV2ZXJzZSBzbWFsbDpiZWZvcmUsXG4uYmxvY2txdW90ZS1yZXZlcnNlIC5zbWFsbDpiZWZvcmUsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgZm9vdGVyOmJlZm9yZSxcbmJsb2NrcXVvdGUucHVsbC1yaWdodCBzbWFsbDpiZWZvcmUsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgLnNtYWxsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICcnO1xufVxuXG4uYmxvY2txdW90ZS1yZXZlcnNlIGZvb3RlcjphZnRlcixcbi5ibG9ja3F1b3RlLXJldmVyc2Ugc21hbGw6YWZ0ZXIsXG4uYmxvY2txdW90ZS1yZXZlcnNlIC5zbWFsbDphZnRlcixcbmJsb2NrcXVvdGUucHVsbC1yaWdodCBmb290ZXI6YWZ0ZXIsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgc21hbGw6YWZ0ZXIsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgLnNtYWxsOmFmdGVyIHtcbiAgY29udGVudDogJ1xcMDBBMCBcXDIwMTQnO1xufVxuXG5hZGRyZXNzIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG59XG5cbmNvZGUsXG5rYmQsXG5wcmUsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTtcbn1cblxuY29kZSB7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBjb2xvcjogI2M3MjU0ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjJmNDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG5rYmQge1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBmb250LXNpemU6IDkwJTtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTtcbn1cblxua2JkIGtiZCB7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbnByZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiA5LjVweDtcbiAgbWFyZ2luOiAwIDAgMTBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBjb2xvcjogIzMzMzMzMztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG5wcmUgY29kZSB7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5wcmUtc2Nyb2xsYWJsZSB7XG4gIG1heC1oZWlnaHQ6IDM0MHB4O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG5cbi5jb250YWluZXIge1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG59XG5cbi5jb250YWluZXI6YmVmb3JlLFxuLmNvbnRhaW5lcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmNvbnRhaW5lcjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLmNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDc1MHB4O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogOTcwcHg7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkge1xuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTE3MHB4O1xuICB9XG59XG5cbi5jb250YWluZXItZmx1aWQge1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG59XG5cbi5jb250YWluZXItZmx1aWQ6YmVmb3JlLFxuLmNvbnRhaW5lci1mbHVpZDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmNvbnRhaW5lci1mbHVpZDphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4ucm93IHtcbiAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xufVxuXG4ucm93OmJlZm9yZSxcbi5yb3c6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5yb3c6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLmNvbC14cy0xLCAuY29sLXNtLTEsIC5jb2wtbWQtMSwgLmNvbC1sZy0xLCAuY29sLXhzLTIsIC5jb2wtc20tMiwgLmNvbC1tZC0yLCAuY29sLWxnLTIsIC5jb2wteHMtMywgLmNvbC1zbS0zLCAuY29sLW1kLTMsIC5jb2wtbGctMywgLmNvbC14cy00LCAuY29sLXNtLTQsIC5jb2wtbWQtNCwgLmNvbC1sZy00LCAuY29sLXhzLTUsIC5jb2wtc20tNSwgLmNvbC1tZC01LCAuY29sLWxnLTUsIC5jb2wteHMtNiwgLmNvbC1zbS02LCAuY29sLW1kLTYsIC5jb2wtbGctNiwgLmNvbC14cy03LCAuY29sLXNtLTcsIC5jb2wtbWQtNywgLmNvbC1sZy03LCAuY29sLXhzLTgsIC5jb2wtc20tOCwgLmNvbC1tZC04LCAuY29sLWxnLTgsIC5jb2wteHMtOSwgLmNvbC1zbS05LCAuY29sLW1kLTksIC5jb2wtbGctOSwgLmNvbC14cy0xMCwgLmNvbC1zbS0xMCwgLmNvbC1tZC0xMCwgLmNvbC1sZy0xMCwgLmNvbC14cy0xMSwgLmNvbC1zbS0xMSwgLmNvbC1tZC0xMSwgLmNvbC1sZy0xMSwgLmNvbC14cy0xMiwgLmNvbC1zbS0xMiwgLmNvbC1tZC0xMiwgLmNvbC1sZy0xMiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogMXB4O1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG59XG5cbi5jb2wteHMtMSwgLmNvbC14cy0yLCAuY29sLXhzLTMsIC5jb2wteHMtNCwgLmNvbC14cy01LCAuY29sLXhzLTYsIC5jb2wteHMtNywgLmNvbC14cy04LCAuY29sLXhzLTksIC5jb2wteHMtMTAsIC5jb2wteHMtMTEsIC5jb2wteHMtMTIge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLmNvbC14cy0xIHtcbiAgd2lkdGg6IDguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtMiB7XG4gIHdpZHRoOiAxNi42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy0zIHtcbiAgd2lkdGg6IDI1JTtcbn1cblxuLmNvbC14cy00IHtcbiAgd2lkdGg6IDMzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLTUge1xuICB3aWR0aDogNDEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtNiB7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi5jb2wteHMtNyB7XG4gIHdpZHRoOiA1OC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy04IHtcbiAgd2lkdGg6IDY2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLTkge1xuICB3aWR0aDogNzUlO1xufVxuXG4uY29sLXhzLTEwIHtcbiAgd2lkdGg6IDgzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLTExIHtcbiAgd2lkdGg6IDkxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLTEyIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5jb2wteHMtcHVsbC0wIHtcbiAgcmlnaHQ6IGF1dG87XG59XG5cbi5jb2wteHMtcHVsbC0xIHtcbiAgcmlnaHQ6IDguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVsbC0yIHtcbiAgcmlnaHQ6IDE2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1bGwtMyB7XG4gIHJpZ2h0OiAyNSU7XG59XG5cbi5jb2wteHMtcHVsbC00IHtcbiAgcmlnaHQ6IDMzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1bGwtNSB7XG4gIHJpZ2h0OiA0MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdWxsLTYge1xuICByaWdodDogNTAlO1xufVxuXG4uY29sLXhzLXB1bGwtNyB7XG4gIHJpZ2h0OiA1OC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdWxsLTgge1xuICByaWdodDogNjYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVsbC05IHtcbiAgcmlnaHQ6IDc1JTtcbn1cblxuLmNvbC14cy1wdWxsLTEwIHtcbiAgcmlnaHQ6IDgzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1bGwtMTEge1xuICByaWdodDogOTEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVsbC0xMiB7XG4gIHJpZ2h0OiAxMDAlO1xufVxuXG4uY29sLXhzLXB1c2gtMCB7XG4gIGxlZnQ6IGF1dG87XG59XG5cbi5jb2wteHMtcHVzaC0xIHtcbiAgbGVmdDogOC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdXNoLTIge1xuICBsZWZ0OiAxNi42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdXNoLTMge1xuICBsZWZ0OiAyNSU7XG59XG5cbi5jb2wteHMtcHVzaC00IHtcbiAgbGVmdDogMzMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVzaC01IHtcbiAgbGVmdDogNDEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVzaC02IHtcbiAgbGVmdDogNTAlO1xufVxuXG4uY29sLXhzLXB1c2gtNyB7XG4gIGxlZnQ6IDU4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1c2gtOCB7XG4gIGxlZnQ6IDY2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1c2gtOSB7XG4gIGxlZnQ6IDc1JTtcbn1cblxuLmNvbC14cy1wdXNoLTEwIHtcbiAgbGVmdDogODMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVzaC0xMSB7XG4gIGxlZnQ6IDkxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1c2gtMTIge1xuICBsZWZ0OiAxMDAlO1xufVxuXG4uY29sLXhzLW9mZnNldC0wIHtcbiAgbWFyZ2luLWxlZnQ6IDAlO1xufVxuXG4uY29sLXhzLW9mZnNldC0xIHtcbiAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTIge1xuICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTMge1xuICBtYXJnaW4tbGVmdDogMjUlO1xufVxuXG4uY29sLXhzLW9mZnNldC00IHtcbiAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLW9mZnNldC01IHtcbiAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLW9mZnNldC02IHtcbiAgbWFyZ2luLWxlZnQ6IDUwJTtcbn1cblxuLmNvbC14cy1vZmZzZXQtNyB7XG4gIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1vZmZzZXQtOCB7XG4gIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1vZmZzZXQtOSB7XG4gIG1hcmdpbi1sZWZ0OiA3NSU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTEwIHtcbiAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLW9mZnNldC0xMSB7XG4gIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1vZmZzZXQtMTIge1xuICBtYXJnaW4tbGVmdDogMTAwJTtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5jb2wtc20tMSwgLmNvbC1zbS0yLCAuY29sLXNtLTMsIC5jb2wtc20tNCwgLmNvbC1zbS01LCAuY29sLXNtLTYsIC5jb2wtc20tNywgLmNvbC1zbS04LCAuY29sLXNtLTksIC5jb2wtc20tMTAsIC5jb2wtc20tMTEsIC5jb2wtc20tMTIge1xuICAgIGZsb2F0OiBsZWZ0O1xuICB9XG4gIC5jb2wtc20tMSB7XG4gICAgd2lkdGg6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS0yIHtcbiAgICB3aWR0aDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS0zIHtcbiAgICB3aWR0aDogMjUlO1xuICB9XG4gIC5jb2wtc20tNCB7XG4gICAgd2lkdGg6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tNSB7XG4gICAgd2lkdGg6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tNiB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxuICAuY29sLXNtLTcge1xuICAgIHdpZHRoOiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLTgge1xuICAgIHdpZHRoOiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLTkge1xuICAgIHdpZHRoOiA3NSU7XG4gIH1cbiAgLmNvbC1zbS0xMCB7XG4gICAgd2lkdGg6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tMTEge1xuICAgIHdpZHRoOiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLTEyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICAuY29sLXNtLXB1bGwtMCB7XG4gICAgcmlnaHQ6IGF1dG87XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTEge1xuICAgIHJpZ2h0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVsbC0yIHtcbiAgICByaWdodDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTMge1xuICAgIHJpZ2h0OiAyNSU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTQge1xuICAgIHJpZ2h0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1bGwtNSB7XG4gICAgcmlnaHQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVsbC02IHtcbiAgICByaWdodDogNTAlO1xuICB9XG4gIC5jb2wtc20tcHVsbC03IHtcbiAgICByaWdodDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTgge1xuICAgIHJpZ2h0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1bGwtOSB7XG4gICAgcmlnaHQ6IDc1JTtcbiAgfVxuICAuY29sLXNtLXB1bGwtMTAge1xuICAgIHJpZ2h0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1bGwtMTEge1xuICAgIHJpZ2h0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1bGwtMTIge1xuICAgIHJpZ2h0OiAxMDAlO1xuICB9XG4gIC5jb2wtc20tcHVzaC0wIHtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG4gIC5jb2wtc20tcHVzaC0xIHtcbiAgICBsZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVzaC0yIHtcbiAgICBsZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1c2gtMyB7XG4gICAgbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtc20tcHVzaC00IHtcbiAgICBsZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1c2gtNSB7XG4gICAgbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTYge1xuICAgIGxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLXNtLXB1c2gtNyB7XG4gICAgbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTgge1xuICAgIGxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVzaC05IHtcbiAgICBsZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTEwIHtcbiAgICBsZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1c2gtMTEge1xuICAgIGxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVzaC0xMiB7XG4gICAgbGVmdDogMTAwJTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC0wIHtcbiAgICBtYXJnaW4tbGVmdDogMCU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtMiB7XG4gICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTMge1xuICAgIG1hcmdpbi1sZWZ0OiAyNSU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtNCB7XG4gICAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTUge1xuICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC02IHtcbiAgICBtYXJnaW4tbGVmdDogNTAlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTcge1xuICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC04IHtcbiAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtOSB7XG4gICAgbWFyZ2luLWxlZnQ6IDc1JTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC0xMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTExIHtcbiAgICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtMTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxMDAlO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY29sLW1kLTEsIC5jb2wtbWQtMiwgLmNvbC1tZC0zLCAuY29sLW1kLTQsIC5jb2wtbWQtNSwgLmNvbC1tZC02LCAuY29sLW1kLTcsIC5jb2wtbWQtOCwgLmNvbC1tZC05LCAuY29sLW1kLTEwLCAuY29sLW1kLTExLCAuY29sLW1kLTEyIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxuICAuY29sLW1kLTEge1xuICAgIHdpZHRoOiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtMiB7XG4gICAgd2lkdGg6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtMyB7XG4gICAgd2lkdGg6IDI1JTtcbiAgfVxuICAuY29sLW1kLTQge1xuICAgIHdpZHRoOiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLTUge1xuICAgIHdpZHRoOiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLTYge1xuICAgIHdpZHRoOiA1MCU7XG4gIH1cbiAgLmNvbC1tZC03IHtcbiAgICB3aWR0aDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC04IHtcbiAgICB3aWR0aDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC05IHtcbiAgICB3aWR0aDogNzUlO1xuICB9XG4gIC5jb2wtbWQtMTAge1xuICAgIHdpZHRoOiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLTExIHtcbiAgICB3aWR0aDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC0xMiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTAge1xuICAgIHJpZ2h0OiBhdXRvO1xuICB9XG4gIC5jb2wtbWQtcHVsbC0xIHtcbiAgICByaWdodDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1bGwtMiB7XG4gICAgcmlnaHQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtcHVsbC0zIHtcbiAgICByaWdodDogMjUlO1xuICB9XG4gIC5jb2wtbWQtcHVsbC00IHtcbiAgICByaWdodDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTUge1xuICAgIHJpZ2h0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1bGwtNiB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgfVxuICAuY29sLW1kLXB1bGwtNyB7XG4gICAgcmlnaHQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtcHVsbC04IHtcbiAgICByaWdodDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTkge1xuICAgIHJpZ2h0OiA3NSU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTEwIHtcbiAgICByaWdodDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTExIHtcbiAgICByaWdodDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTEyIHtcbiAgICByaWdodDogMTAwJTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMCB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxuICAuY29sLW1kLXB1c2gtMSB7XG4gICAgbGVmdDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMiB7XG4gICAgbGVmdDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTMge1xuICAgIGxlZnQ6IDI1JTtcbiAgfVxuICAuY29sLW1kLXB1c2gtNCB7XG4gICAgbGVmdDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTUge1xuICAgIGxlZnQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtcHVzaC02IHtcbiAgICBsZWZ0OiA1MCU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTcge1xuICAgIGxlZnQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtcHVzaC04IHtcbiAgICBsZWZ0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1c2gtOSB7XG4gICAgbGVmdDogNzUlO1xuICB9XG4gIC5jb2wtbWQtcHVzaC0xMCB7XG4gICAgbGVmdDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTExIHtcbiAgICBsZWZ0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMTIge1xuICAgIGxlZnQ6IDEwMCU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDAlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTEge1xuICAgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC0zIHtcbiAgICBtYXJnaW4tbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTQge1xuICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC01IHtcbiAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtNiB7XG4gICAgbWFyZ2luLWxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC03IHtcbiAgICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtOCB7XG4gICAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTkge1xuICAgIG1hcmdpbi1sZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtMTAge1xuICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC0xMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTEyIHtcbiAgICBtYXJnaW4tbGVmdDogMTAwJTtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XG4gIC5jb2wtbGctMSwgLmNvbC1sZy0yLCAuY29sLWxnLTMsIC5jb2wtbGctNCwgLmNvbC1sZy01LCAuY29sLWxnLTYsIC5jb2wtbGctNywgLmNvbC1sZy04LCAuY29sLWxnLTksIC5jb2wtbGctMTAsIC5jb2wtbGctMTEsIC5jb2wtbGctMTIge1xuICAgIGZsb2F0OiBsZWZ0O1xuICB9XG4gIC5jb2wtbGctMSB7XG4gICAgd2lkdGg6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy0yIHtcbiAgICB3aWR0aDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy0zIHtcbiAgICB3aWR0aDogMjUlO1xuICB9XG4gIC5jb2wtbGctNCB7XG4gICAgd2lkdGg6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctNSB7XG4gICAgd2lkdGg6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctNiB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxuICAuY29sLWxnLTcge1xuICAgIHdpZHRoOiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLTgge1xuICAgIHdpZHRoOiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLTkge1xuICAgIHdpZHRoOiA3NSU7XG4gIH1cbiAgLmNvbC1sZy0xMCB7XG4gICAgd2lkdGg6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctMTEge1xuICAgIHdpZHRoOiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLTEyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMCB7XG4gICAgcmlnaHQ6IGF1dG87XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTEge1xuICAgIHJpZ2h0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctcHVsbC0yIHtcbiAgICByaWdodDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTMge1xuICAgIHJpZ2h0OiAyNSU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTQge1xuICAgIHJpZ2h0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtNSB7XG4gICAgcmlnaHQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVsbC02IHtcbiAgICByaWdodDogNTAlO1xuICB9XG4gIC5jb2wtbGctcHVsbC03IHtcbiAgICByaWdodDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTgge1xuICAgIHJpZ2h0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1bGwtOSB7XG4gICAgcmlnaHQ6IDc1JTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMTAge1xuICAgIHJpZ2h0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMTEge1xuICAgIHJpZ2h0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMTIge1xuICAgIHJpZ2h0OiAxMDAlO1xuICB9XG4gIC5jb2wtbGctcHVzaC0wIHtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG4gIC5jb2wtbGctcHVzaC0xIHtcbiAgICBsZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctcHVzaC0yIHtcbiAgICBsZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1c2gtMyB7XG4gICAgbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtbGctcHVzaC00IHtcbiAgICBsZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtNSB7XG4gICAgbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTYge1xuICAgIGxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtNyB7XG4gICAgbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTgge1xuICAgIGxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVzaC05IHtcbiAgICBsZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTEwIHtcbiAgICBsZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtMTEge1xuICAgIGxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVzaC0xMiB7XG4gICAgbGVmdDogMTAwJTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC0wIHtcbiAgICBtYXJnaW4tbGVmdDogMCU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMiB7XG4gICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTMge1xuICAgIG1hcmdpbi1sZWZ0OiAyNSU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtNCB7XG4gICAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTUge1xuICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC02IHtcbiAgICBtYXJnaW4tbGVmdDogNTAlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTcge1xuICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC04IHtcbiAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtOSB7XG4gICAgbWFyZ2luLWxlZnQ6IDc1JTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC0xMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTExIHtcbiAgICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxMDAlO1xuICB9XG59XG5cbnRhYmxlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbmNhcHRpb24ge1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICBjb2xvcjogIzc3Nzc3NztcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxudGgge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4udGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGgsXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGgsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGQsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGgsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGQge1xuICBwYWRkaW5nOiA4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0aCB7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZGRkO1xufVxuXG4udGFibGUgPiBjYXB0aW9uICsgdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnRhYmxlID4gY2FwdGlvbiArIHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0ZCxcbi50YWJsZSA+IGNvbGdyb3VwICsgdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnRhYmxlID4gY29sZ3JvdXAgKyB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkID4gdGQsXG4udGFibGUgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkID4gdGgsXG4udGFibGUgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkID4gdGQge1xuICBib3JkZXItdG9wOiAwO1xufVxuXG4udGFibGUgPiB0Ym9keSArIHRib2R5IHtcbiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZSAudGFibGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4udGFibGUtY29uZGVuc2VkID4gdGhlYWQgPiB0ciA+IHRoLFxuLnRhYmxlLWNvbmRlbnNlZCA+IHRoZWFkID4gdHIgPiB0ZCxcbi50YWJsZS1jb25kZW5zZWQgPiB0Ym9keSA+IHRyID4gdGgsXG4udGFibGUtY29uZGVuc2VkID4gdGJvZHkgPiB0ciA+IHRkLFxuLnRhYmxlLWNvbmRlbnNlZCA+IHRmb290ID4gdHIgPiB0aCxcbi50YWJsZS1jb25kZW5zZWQgPiB0Zm9vdCA+IHRyID4gdGQge1xuICBwYWRkaW5nOiA1cHg7XG59XG5cbi50YWJsZS1ib3JkZXJlZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZCxcbi50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0ZCxcbi50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZCB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDJweDtcbn1cblxuLnRhYmxlLXN0cmlwZWQgPiB0Ym9keSA+IHRyOm50aC1vZi10eXBlKG9kZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cblxudGFibGUgY29sW2NsYXNzKj1cImNvbC1cIl0ge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICBmbG9hdDogbm9uZTtcbiAgZGlzcGxheTogdGFibGUtY29sdW1uO1xufVxuXG50YWJsZSB0ZFtjbGFzcyo9XCJjb2wtXCJdLFxudGFibGUgdGhbY2xhc3MqPVwiY29sLVwiXSB7XG4gIHBvc2l0aW9uOiBzdGF0aWM7XG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQuYWN0aXZlLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLmFjdGl2ZSxcbi50YWJsZSA+IHRoZWFkID4gdHIuYWN0aXZlID4gdGQsXG4udGFibGUgPiB0aGVhZCA+IHRyLmFjdGl2ZSA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLmFjdGl2ZSxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0aC5hY3RpdmUsXG4udGFibGUgPiB0Ym9keSA+IHRyLmFjdGl2ZSA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5hY3RpdmUgPiB0aCxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0ZC5hY3RpdmUsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGguYWN0aXZlLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5hY3RpdmUgPiB0ZCxcbi50YWJsZSA+IHRmb290ID4gdHIuYWN0aXZlID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGQuYWN0aXZlOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRoLmFjdGl2ZTpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuYWN0aXZlOmhvdmVyID4gdGQsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyID4gLmFjdGl2ZSxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuYWN0aXZlOmhvdmVyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlOGU4O1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQuc3VjY2Vzcyxcbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0aC5zdWNjZXNzLFxuLnRhYmxlID4gdGhlYWQgPiB0ci5zdWNjZXNzID4gdGQsXG4udGFibGUgPiB0aGVhZCA+IHRyLnN1Y2Nlc3MgPiB0aCxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0ZC5zdWNjZXNzLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRoLnN1Y2Nlc3MsXG4udGFibGUgPiB0Ym9keSA+IHRyLnN1Y2Nlc3MgPiB0ZCxcbi50YWJsZSA+IHRib2R5ID4gdHIuc3VjY2VzcyA+IHRoLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRkLnN1Y2Nlc3MsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGguc3VjY2Vzcyxcbi50YWJsZSA+IHRmb290ID4gdHIuc3VjY2VzcyA+IHRkLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5zdWNjZXNzID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGQuc3VjY2Vzczpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0aC5zdWNjZXNzOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ci5zdWNjZXNzOmhvdmVyID4gdGQsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyID4gLnN1Y2Nlc3MsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLnN1Y2Nlc3M6aG92ZXIgPiB0aCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkMGU5YzY7XG59XG5cbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0ZC5pbmZvLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLmluZm8sXG4udGFibGUgPiB0aGVhZCA+IHRyLmluZm8gPiB0ZCxcbi50YWJsZSA+IHRoZWFkID4gdHIuaW5mbyA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLmluZm8sXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGguaW5mbyxcbi50YWJsZSA+IHRib2R5ID4gdHIuaW5mbyA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5pbmZvID4gdGgsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGQuaW5mbyxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0aC5pbmZvLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5pbmZvID4gdGQsXG4udGFibGUgPiB0Zm9vdCA+IHRyLmluZm8gPiB0aCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XG59XG5cbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0ZC5pbmZvOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRoLmluZm86aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLmluZm86aG92ZXIgPiB0ZCxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHI6aG92ZXIgPiAuaW5mbyxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuaW5mbzpob3ZlciA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0ZTNmMztcbn1cblxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRkLndhcm5pbmcsXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGgud2FybmluZyxcbi50YWJsZSA+IHRoZWFkID4gdHIud2FybmluZyA+IHRkLFxuLnRhYmxlID4gdGhlYWQgPiB0ci53YXJuaW5nID4gdGgsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGQud2FybmluZyxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0aC53YXJuaW5nLFxuLnRhYmxlID4gdGJvZHkgPiB0ci53YXJuaW5nID4gdGQsXG4udGFibGUgPiB0Ym9keSA+IHRyLndhcm5pbmcgPiB0aCxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0ZC53YXJuaW5nLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRoLndhcm5pbmcsXG4udGFibGUgPiB0Zm9vdCA+IHRyLndhcm5pbmcgPiB0ZCxcbi50YWJsZSA+IHRmb290ID4gdHIud2FybmluZyA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcbn1cblxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRkLndhcm5pbmc6aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGgud2FybmluZzpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIud2FybmluZzpob3ZlciA+IHRkLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0cjpob3ZlciA+IC53YXJuaW5nLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ci53YXJuaW5nOmhvdmVyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmMmNjO1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQuZGFuZ2VyLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLmRhbmdlcixcbi50YWJsZSA+IHRoZWFkID4gdHIuZGFuZ2VyID4gdGQsXG4udGFibGUgPiB0aGVhZCA+IHRyLmRhbmdlciA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLmRhbmdlcixcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0aC5kYW5nZXIsXG4udGFibGUgPiB0Ym9keSA+IHRyLmRhbmdlciA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5kYW5nZXIgPiB0aCxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0ZC5kYW5nZXIsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGguZGFuZ2VyLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5kYW5nZXIgPiB0ZCxcbi50YWJsZSA+IHRmb290ID4gdHIuZGFuZ2VyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGQuZGFuZ2VyOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRoLmRhbmdlcjpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuZGFuZ2VyOmhvdmVyID4gdGQsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyID4gLmRhbmdlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuZGFuZ2VyOmhvdmVyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJjY2NjO1xufVxuXG4udGFibGUtcmVzcG9uc2l2ZSB7XG4gIG92ZXJmbG93LXg6IGF1dG87XG4gIG1pbi1oZWlnaHQ6IDAuMDElO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkge1xuICAudGFibGUtcmVzcG9uc2l2ZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgLW1zLW92ZXJmbG93LXN0eWxlOiAtbXMtYXV0b2hpZGluZy1zY3JvbGxiYXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgfVxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSA+IHRoZWFkID4gdHIgPiB0aCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUgPiB0aGVhZCA+IHRyID4gdGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRoLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSA+IHRib2R5ID4gdHIgPiB0ZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUgPiB0Zm9vdCA+IHRyID4gdGgsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRkIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICBib3JkZXI6IDA7XG4gIH1cbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLWxlZnQ6IDA7XG4gIH1cbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQ6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGgsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGgsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGQge1xuICAgIGJvcmRlci1ib3R0b206IDA7XG4gIH1cbn1cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlcjogMDtcbiAgbWluLXdpZHRoOiAwO1xufVxuXG5sZWdlbmQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGZvbnQtc2l6ZTogMjFweDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gIGNvbG9yOiAjMzMzMzMzO1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1O1xufVxuXG5sYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbmlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIG1hcmdpbjogNHB4IDAgMDtcbiAgbWFyZ2luLXRvcDogMXB4IFxcOTtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuaW5wdXRbdHlwZT1cImZpbGVcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuaW5wdXRbdHlwZT1cInJhbmdlXCJdIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG5zZWxlY3RbbXVsdGlwbGVdLFxuc2VsZWN0W3NpemVdIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG5pbnB1dFt0eXBlPVwiZmlsZVwiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpmb2N1cyB7XG4gIG91dGxpbmU6IHRoaW4gZG90dGVkO1xuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuXG5vdXRwdXQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZy10b3A6IDdweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGNvbG9yOiAjNTU1NTU1O1xufVxuXG4uZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDM0cHg7XG4gIHBhZGRpbmc6IDZweCAxMnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICM1NTU1NTU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgMC4xNXMsIGJveC1zaGFkb3cgZWFzZS1pbi1vdXQgMC4xNXM7XG4gIC1vLXRyYW5zaXRpb246IGJvcmRlci1jb2xvciBlYXNlLWluLW91dCAwLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAwLjE1cztcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIGVhc2UtaW4tb3V0IDAuMTVzLCBib3gtc2hhZG93IGVhc2UtaW4tb3V0IDAuMTVzO1xufVxuXG4uZm9ybS1jb250cm9sOmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjNjZhZmU5O1xuICBvdXRsaW5lOiAwO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDhweCByZ2JhKDEwMiwgMTc1LCAyMzMsIDAuNik7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDhweCByZ2JhKDEwMiwgMTc1LCAyMzMsIDAuNik7XG59XG5cbi5mb3JtLWNvbnRyb2w6Oi1tb3otcGxhY2Vob2xkZXIge1xuICBjb2xvcjogIzk5OTtcbiAgb3BhY2l0eTogMTtcbn1cblxuLmZvcm0tY29udHJvbDotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLmZvcm0tY29udHJvbDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4uZm9ybS1jb250cm9sW2Rpc2FibGVkXSxcbi5mb3JtLWNvbnRyb2xbcmVhZG9ubHldLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5mb3JtLWNvbnRyb2wge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlO1xuICBvcGFjaXR5OiAxO1xufVxuXG4uZm9ybS1jb250cm9sW2Rpc2FibGVkXSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuZm9ybS1jb250cm9sIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxudGV4dGFyZWEuZm9ybS1jb250cm9sIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAwKSB7XG4gIGlucHV0W3R5cGU9XCJkYXRlXCJdLmZvcm0tY29udHJvbCxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0uZm9ybS1jb250cm9sLFxuICBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uZm9ybS1jb250cm9sLFxuICBpbnB1dFt0eXBlPVwibW9udGhcIl0uZm9ybS1jb250cm9sIHtcbiAgICBsaW5lLWhlaWdodDogMzRweDtcbiAgfVxuICBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5pbnB1dC1zbSxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cImRhdGVcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtc20gPiBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJkYXRlXCJdLmJ0bixcbiAgLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9XCJkYXRlXCJdLFxuICBpbnB1dFt0eXBlPVwidGltZVwiXS5pbnB1dC1zbSxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cInRpbWVcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtc20gPiBpbnB1dFt0eXBlPVwidGltZVwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJ0aW1lXCJdLmJ0bixcbiAgLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9XCJ0aW1lXCJdLFxuICBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uaW5wdXQtc20sXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXS5mb3JtLWNvbnRyb2wsXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1zbSBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0sXG4gIGlucHV0W3R5cGU9XCJtb250aFwiXS5pbnB1dC1zbSxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmlucHV0LWdyb3VwLWFkZG9uLFxuICAuaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmJ0bixcbiAgLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9XCJtb250aFwiXSB7XG4gICAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIH1cbiAgaW5wdXRbdHlwZT1cImRhdGVcIl0uaW5wdXQtbGcsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJkYXRlXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLWxnID4gaW5wdXRbdHlwZT1cImRhdGVcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0uaW5wdXQtbGcsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJ0aW1lXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLWxnID4gaW5wdXRbdHlwZT1cInRpbWVcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwidGltZVwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPVwidGltZVwiXSxcbiAgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLmlucHV0LWxnLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uYnRuLFxuICAuaW5wdXQtZ3JvdXAtbGcgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLFxuICBpbnB1dFt0eXBlPVwibW9udGhcIl0uaW5wdXQtbGcsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5mb3JtLWNvbnRyb2wsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPVwibW9udGhcIl0ge1xuICAgIGxpbmUtaGVpZ2h0OiA0NnB4O1xuICB9XG59XG5cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnJhZGlvLFxuLmNoZWNrYm94IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLnJhZGlvIGxhYmVsLFxuLmNoZWNrYm94IGxhYmVsIHtcbiAgbWluLWhlaWdodDogMjBweDtcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4ucmFkaW8taW5saW5lIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbi5jaGVja2JveCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sXG4uY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbWFyZ2luLWxlZnQ6IC0yMHB4O1xuICBtYXJnaW4tdG9wOiA0cHggXFw5O1xufVxuXG4ucmFkaW8gKyAucmFkaW8sXG4uY2hlY2tib3ggKyAuY2hlY2tib3gge1xuICBtYXJnaW4tdG9wOiAtNXB4O1xufVxuXG4ucmFkaW8taW5saW5lLFxuLmNoZWNrYm94LWlubGluZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnJhZGlvLWlubGluZSArIC5yYWRpby1pbmxpbmUsXG4uY2hlY2tib3gtaW5saW5lICsgLmNoZWNrYm94LWlubGluZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG5pbnB1dFt0eXBlPVwicmFkaW9cIl1bZGlzYWJsZWRdLFxuaW5wdXRbdHlwZT1cInJhZGlvXCJdLmRpc2FibGVkLFxuZmllbGRzZXRbZGlzYWJsZWRdIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXVtkaXNhYmxlZF0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uZGlzYWJsZWQsXG5maWVsZHNldFtkaXNhYmxlZF0gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLnJhZGlvLWlubGluZS5kaXNhYmxlZCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAucmFkaW8taW5saW5lLFxuLmNoZWNrYm94LWlubGluZS5kaXNhYmxlZCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuY2hlY2tib3gtaW5saW5lIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLnJhZGlvLmRpc2FibGVkIGxhYmVsLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5yYWRpbyBsYWJlbCxcbi5jaGVja2JveC5kaXNhYmxlZCBsYWJlbCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuY2hlY2tib3ggbGFiZWwge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4uZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG4gIHBhZGRpbmctYm90dG9tOiA3cHg7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIG1pbi1oZWlnaHQ6IDM0cHg7XG59XG5cbi5mb3JtLWNvbnRyb2wtc3RhdGljLmlucHV0LWxnLFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tY29udHJvbC1zdGF0aWMuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tY29udHJvbC1zdGF0aWMuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmZvcm0tY29udHJvbC1zdGF0aWMuYnRuLFxuLmZvcm0tY29udHJvbC1zdGF0aWMuaW5wdXQtc20sIC5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmJ0biB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgcGFkZGluZy1yaWdodDogMDtcbn1cblxuLmlucHV0LXNtLCAuaW5wdXQtZ3JvdXAtc20gPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuc2VsZWN0LmlucHV0LXNtLCAuaW5wdXQtZ3JvdXAtc20gPiBzZWxlY3QuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLXNtID4gc2VsZWN0LmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IHNlbGVjdC5idG4ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xufVxuXG50ZXh0YXJlYS5pbnB1dC1zbSxcbi5pbnB1dC1ncm91cC1zbSA+IHRleHRhcmVhLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1zbSA+IHRleHRhcmVhLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IHRleHRhcmVhLmJ0bixcbnNlbGVjdFttdWx0aXBsZV0uaW5wdXQtc20sIC5pbnB1dC1ncm91cC1zbSA+IHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLXNtID4gc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiBzZWxlY3RbbXVsdGlwbGVdLmJ0biB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLmZvcm0tZ3JvdXAtc20gLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogMzBweDtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uZm9ybS1ncm91cC1zbSBzZWxlY3QuZm9ybS1jb250cm9sIHtcbiAgaGVpZ2h0OiAzMHB4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbn1cblxuLmZvcm0tZ3JvdXAtc20gdGV4dGFyZWEuZm9ybS1jb250cm9sLFxuLmZvcm0tZ3JvdXAtc20gc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgaGVpZ2h0OiAzMHB4O1xuICBtaW4taGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiA2cHggMTBweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xufVxuXG4uaW5wdXQtbGcsIC5pbnB1dC1ncm91cC1sZyA+IC5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIGhlaWdodDogNDZweDtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cblxuc2VsZWN0LmlucHV0LWxnLCAuaW5wdXQtZ3JvdXAtbGcgPiBzZWxlY3QuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gc2VsZWN0LmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IHNlbGVjdC5idG4ge1xuICBoZWlnaHQ6IDQ2cHg7XG4gIGxpbmUtaGVpZ2h0OiA0NnB4O1xufVxuXG50ZXh0YXJlYS5pbnB1dC1sZyxcbi5pbnB1dC1ncm91cC1sZyA+IHRleHRhcmVhLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1sZyA+IHRleHRhcmVhLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IHRleHRhcmVhLmJ0bixcbnNlbGVjdFttdWx0aXBsZV0uaW5wdXQtbGcsIC5pbnB1dC1ncm91cC1sZyA+IHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBzZWxlY3RbbXVsdGlwbGVdLmJ0biB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLmZvcm0tZ3JvdXAtbGcgLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogNDZweDtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cblxuLmZvcm0tZ3JvdXAtbGcgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogNDZweDtcbiAgbGluZS1oZWlnaHQ6IDQ2cHg7XG59XG5cbi5mb3JtLWdyb3VwLWxnIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbi5mb3JtLWdyb3VwLWxnIHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gIGhlaWdodDogNDZweDtcbiAgbWluLWhlaWdodDogMzhweDtcbiAgcGFkZGluZzogMTFweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG59XG5cbi5oYXMtZmVlZGJhY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5oYXMtZmVlZGJhY2sgLmZvcm0tY29udHJvbCB7XG4gIHBhZGRpbmctcmlnaHQ6IDQyLjVweDtcbn1cblxuLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgei1pbmRleDogMjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAzNHB4O1xuICBoZWlnaHQ6IDM0cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uaW5wdXQtbGcgKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tY29udHJvbCArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYWRkb24gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLWxnICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5mb3JtLWdyb3VwLWxnIC5mb3JtLWNvbnRyb2wgKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgd2lkdGg6IDQ2cHg7XG4gIGhlaWdodDogNDZweDtcbiAgbGluZS1oZWlnaHQ6IDQ2cHg7XG59XG5cbi5pbnB1dC1zbSArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtc20gPiAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1hZGRvbiArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtc20gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmZvcm0tZ3JvdXAtc20gLmZvcm0tY29udHJvbCArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB3aWR0aDogMzBweDtcbiAgaGVpZ2h0OiAzMHB4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbn1cblxuLmhhcy1zdWNjZXNzIC5oZWxwLWJsb2NrLFxuLmhhcy1zdWNjZXNzIC5jb250cm9sLWxhYmVsLFxuLmhhcy1zdWNjZXNzIC5yYWRpbyxcbi5oYXMtc3VjY2VzcyAuY2hlY2tib3gsXG4uaGFzLXN1Y2Nlc3MgLnJhZGlvLWlubGluZSxcbi5oYXMtc3VjY2VzcyAuY2hlY2tib3gtaW5saW5lLFxuLmhhcy1zdWNjZXNzLnJhZGlvIGxhYmVsLFxuLmhhcy1zdWNjZXNzLmNoZWNrYm94IGxhYmVsLFxuLmhhcy1zdWNjZXNzLnJhZGlvLWlubGluZSBsYWJlbCxcbi5oYXMtc3VjY2Vzcy5jaGVja2JveC1pbmxpbmUgbGFiZWwge1xuICBjb2xvcjogIzNjNzYzZDtcbn1cblxuLmhhcy1zdWNjZXNzIC5mb3JtLWNvbnRyb2wge1xuICBib3JkZXItY29sb3I6ICMzYzc2M2Q7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7XG59XG5cbi5oYXMtc3VjY2VzcyAuZm9ybS1jb250cm9sOmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjMmI1NDJjO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjNjdiMTY4O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggIzY3YjE2ODtcbn1cblxuLmhhcy1zdWNjZXNzIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gIGNvbG9yOiAjM2M3NjNkO1xuICBib3JkZXItY29sb3I6ICMzYzc2M2Q7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7XG59XG5cbi5oYXMtc3VjY2VzcyAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgY29sb3I6ICMzYzc2M2Q7XG59XG5cbi5oYXMtd2FybmluZyAuaGVscC1ibG9jayxcbi5oYXMtd2FybmluZyAuY29udHJvbC1sYWJlbCxcbi5oYXMtd2FybmluZyAucmFkaW8sXG4uaGFzLXdhcm5pbmcgLmNoZWNrYm94LFxuLmhhcy13YXJuaW5nIC5yYWRpby1pbmxpbmUsXG4uaGFzLXdhcm5pbmcgLmNoZWNrYm94LWlubGluZSxcbi5oYXMtd2FybmluZy5yYWRpbyBsYWJlbCxcbi5oYXMtd2FybmluZy5jaGVja2JveCBsYWJlbCxcbi5oYXMtd2FybmluZy5yYWRpby1pbmxpbmUgbGFiZWwsXG4uaGFzLXdhcm5pbmcuY2hlY2tib3gtaW5saW5lIGxhYmVsIHtcbiAgY29sb3I6ICM4YTZkM2I7XG59XG5cbi5oYXMtd2FybmluZyAuZm9ybS1jb250cm9sIHtcbiAgYm9yZGVyLWNvbG9yOiAjOGE2ZDNiO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xufVxuXG4uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogIzY2NTEyYztcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggI2MwYTE2YjtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpLCAwIDAgNnB4ICNjMGExNmI7XG59XG5cbi5oYXMtd2FybmluZyAuaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBjb2xvcjogIzhhNmQzYjtcbiAgYm9yZGVyLWNvbG9yOiAjOGE2ZDNiO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xufVxuXG4uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIGNvbG9yOiAjOGE2ZDNiO1xufVxuXG4uaGFzLWVycm9yIC5oZWxwLWJsb2NrLFxuLmhhcy1lcnJvciAuY29udHJvbC1sYWJlbCxcbi5oYXMtZXJyb3IgLnJhZGlvLFxuLmhhcy1lcnJvciAuY2hlY2tib3gsXG4uaGFzLWVycm9yIC5yYWRpby1pbmxpbmUsXG4uaGFzLWVycm9yIC5jaGVja2JveC1pbmxpbmUsXG4uaGFzLWVycm9yLnJhZGlvIGxhYmVsLFxuLmhhcy1lcnJvci5jaGVja2JveCBsYWJlbCxcbi5oYXMtZXJyb3IucmFkaW8taW5saW5lIGxhYmVsLFxuLmhhcy1lcnJvci5jaGVja2JveC1pbmxpbmUgbGFiZWwge1xuICBjb2xvcjogI2E5NDQ0Mjtcbn1cblxuLmhhcy1lcnJvciAuZm9ybS1jb250cm9sIHtcbiAgYm9yZGVyLWNvbG9yOiAjYTk0NDQyO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xufVxuXG4uaGFzLWVycm9yIC5mb3JtLWNvbnRyb2w6Zm9jdXMge1xuICBib3JkZXItY29sb3I6ICM4NDM1MzQ7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpLCAwIDAgNnB4ICNjZTg0ODM7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjY2U4NDgzO1xufVxuXG4uaGFzLWVycm9yIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gIGNvbG9yOiAjYTk0NDQyO1xuICBib3JkZXItY29sb3I6ICNhOTQ0NDI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XG59XG5cbi5oYXMtZXJyb3IgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIGNvbG9yOiAjYTk0NDQyO1xufVxuXG4uaGFzLWZlZWRiYWNrIGxhYmVsIH4gLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHRvcDogMjVweDtcbn1cblxuLmhhcy1mZWVkYmFjayBsYWJlbC5zci1vbmx5IH4gLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHRvcDogMDtcbn1cblxuLmhlbHAtYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLXRvcDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICBjb2xvcjogIzczNzM3Mztcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5mb3JtLWlubGluZSAuZm9ybS1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuICAuZm9ybS1pbmxpbmUgLmZvcm0tY29udHJvbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXAgLmlucHV0LWdyb3VwLWJ0bixcbiAgLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgICB3aWR0aDogYXV0bztcbiAgfVxuICAuZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwID4gLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5jb250cm9sLWxhYmVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5yYWRpbyxcbiAgLmZvcm0taW5saW5lIC5jaGVja2JveCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5mb3JtLWlubGluZSAucmFkaW8gbGFiZWwsXG4gIC5mb3JtLWlubGluZSAuY2hlY2tib3ggbGFiZWwge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgfVxuICAuZm9ybS1pbmxpbmUgLnJhZGlvIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgLmZvcm0taW5saW5lIC5jaGVja2JveCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxuICAuZm9ybS1pbmxpbmUgLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLmZvcm0taG9yaXpvbnRhbCAucmFkaW8sXG4uZm9ybS1ob3Jpem9udGFsIC5jaGVja2JveCxcbi5mb3JtLWhvcml6b250YWwgLnJhZGlvLWlubGluZSxcbi5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94LWlubGluZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG59XG5cbi5mb3JtLWhvcml6b250YWwgLnJhZGlvLFxuLmZvcm0taG9yaXpvbnRhbCAuY2hlY2tib3gge1xuICBtaW4taGVpZ2h0OiAyN3B4O1xufVxuXG4uZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xufVxuXG4uZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwOmJlZm9yZSxcbi5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXA6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXA6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5mb3JtLWhvcml6b250YWwgLmNvbnRyb2wtbGFiZWwge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgcGFkZGluZy10b3A6IDdweDtcbiAgfVxufVxuXG4uZm9ybS1ob3Jpem9udGFsIC5oYXMtZmVlZGJhY2sgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHJpZ2h0OiAxNXB4O1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cC1sZyAuY29udHJvbC1sYWJlbCB7XG4gICAgcGFkZGluZy10b3A6IDE0LjMzMzMzM3B4O1xuICAgIGZvbnQtc2l6ZTogMThweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cC1zbSAuY29udHJvbC1sYWJlbCB7XG4gICAgcGFkZGluZy10b3A6IDZweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gIH1cbn1cblxuLmJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgcGFkZGluZzogNnB4IDEycHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5idG46Zm9jdXMsXG4uYnRuLmZvY3VzLFxuLmJ0bjphY3RpdmU6Zm9jdXMsXG4uYnRuOmFjdGl2ZS5mb2N1cyxcbi5idG4uYWN0aXZlOmZvY3VzLFxuLmJ0bi5hY3RpdmUuZm9jdXMge1xuICBvdXRsaW5lOiB0aGluIGRvdHRlZDtcbiAgb3V0bGluZTogNXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO1xuICBvdXRsaW5lLW9mZnNldDogLTJweDtcbn1cblxuLmJ0bjpob3Zlcixcbi5idG46Zm9jdXMsXG4uYnRuLmZvY3VzIHtcbiAgY29sb3I6ICMzMzM7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmJ0bjphY3RpdmUsXG4uYnRuLmFjdGl2ZSB7XG4gIG91dGxpbmU6IDA7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMjUpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDNweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyNSk7XG59XG5cbi5idG4uZGlzYWJsZWQsXG4uYnRuW2Rpc2FibGVkXSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgb3BhY2l0eTogMC42NTtcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG5hLmJ0bi5kaXNhYmxlZCxcbmZpZWxkc2V0W2Rpc2FibGVkXSBhLmJ0biB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uYnRuLWRlZmF1bHQge1xuICBjb2xvcjogIzMzMztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiAjY2NjO1xufVxuXG4uYnRuLWRlZmF1bHQ6Zm9jdXMsXG4uYnRuLWRlZmF1bHQuZm9jdXMge1xuICBjb2xvcjogIzMzMztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgYm9yZGVyLWNvbG9yOiAjOGM4YzhjO1xufVxuXG4uYnRuLWRlZmF1bHQ6aG92ZXIge1xuICBjb2xvcjogIzMzMztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgYm9yZGVyLWNvbG9yOiAjYWRhZGFkO1xufVxuXG4uYnRuLWRlZmF1bHQ6YWN0aXZlLFxuLmJ0bi1kZWZhdWx0LmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1kZWZhdWx0LmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGNvbG9yOiAjMzMzO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2O1xuICBib3JkZXItY29sb3I6ICNhZGFkYWQ7XG59XG5cbi5idG4tZGVmYXVsdDphY3RpdmU6aG92ZXIsXG4uYnRuLWRlZmF1bHQ6YWN0aXZlOmZvY3VzLFxuLmJ0bi1kZWZhdWx0OmFjdGl2ZS5mb2N1cyxcbi5idG4tZGVmYXVsdC5hY3RpdmU6aG92ZXIsXG4uYnRuLWRlZmF1bHQuYWN0aXZlOmZvY3VzLFxuLmJ0bi1kZWZhdWx0LmFjdGl2ZS5mb2N1cyxcbi5vcGVuID4gLmJ0bi1kZWZhdWx0LmRyb3Bkb3duLXRvZ2dsZTpob3Zlcixcbi5vcGVuID4gLmJ0bi1kZWZhdWx0LmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyxcbi5vcGVuID4gLmJ0bi1kZWZhdWx0LmRyb3Bkb3duLXRvZ2dsZS5mb2N1cyB7XG4gIGNvbG9yOiAjMzMzO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDRkNGQ0O1xuICBib3JkZXItY29sb3I6ICM4YzhjOGM7XG59XG5cbi5idG4tZGVmYXVsdDphY3RpdmUsXG4uYnRuLWRlZmF1bHQuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLWRlZmF1bHQuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLmJ0bi1kZWZhdWx0LmRpc2FibGVkLFxuLmJ0bi1kZWZhdWx0LmRpc2FibGVkOmhvdmVyLFxuLmJ0bi1kZWZhdWx0LmRpc2FibGVkOmZvY3VzLFxuLmJ0bi1kZWZhdWx0LmRpc2FibGVkLmZvY3VzLFxuLmJ0bi1kZWZhdWx0LmRpc2FibGVkOmFjdGl2ZSxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZC5hY3RpdmUsXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdLFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTpob3Zlcixcbi5idG4tZGVmYXVsdFtkaXNhYmxlZF06Zm9jdXMsXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdLmZvY3VzLFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTphY3RpdmUsXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdLmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdDpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQuZm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQuYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiAjY2NjO1xufVxuXG4uYnRuLWRlZmF1bHQgLmJhZGdlIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG59XG5cbi5idG4tcHJpbWFyeSB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzM3YWI3O1xuICBib3JkZXItY29sb3I6ICMyZTZkYTQ7XG59XG5cbi5idG4tcHJpbWFyeTpmb2N1cyxcbi5idG4tcHJpbWFyeS5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjg2MDkwO1xuICBib3JkZXItY29sb3I6ICMxMjJiNDA7XG59XG5cbi5idG4tcHJpbWFyeTpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjg2MDkwO1xuICBib3JkZXItY29sb3I6ICMyMDRkNzQ7XG59XG5cbi5idG4tcHJpbWFyeTphY3RpdmUsXG4uYnRuLXByaW1hcnkuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyODYwOTA7XG4gIGJvcmRlci1jb2xvcjogIzIwNGQ3NDtcbn1cblxuLmJ0bi1wcmltYXJ5OmFjdGl2ZTpob3Zlcixcbi5idG4tcHJpbWFyeTphY3RpdmU6Zm9jdXMsXG4uYnRuLXByaW1hcnk6YWN0aXZlLmZvY3VzLFxuLmJ0bi1wcmltYXJ5LmFjdGl2ZTpob3Zlcixcbi5idG4tcHJpbWFyeS5hY3RpdmU6Zm9jdXMsXG4uYnRuLXByaW1hcnkuYWN0aXZlLmZvY3VzLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlOmZvY3VzLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMDRkNzQ7XG4gIGJvcmRlci1jb2xvcjogIzEyMmI0MDtcbn1cblxuLmJ0bi1wcmltYXJ5OmFjdGl2ZSxcbi5idG4tcHJpbWFyeS5hY3RpdmUsXG4ub3BlbiA+IC5idG4tcHJpbWFyeS5kcm9wZG93bi10b2dnbGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xufVxuXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQ6aG92ZXIsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQ6Zm9jdXMsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQ6YWN0aXZlLFxuLmJ0bi1wcmltYXJ5LmRpc2FibGVkLmFjdGl2ZSxcbi5idG4tcHJpbWFyeVtkaXNhYmxlZF0sXG4uYnRuLXByaW1hcnlbZGlzYWJsZWRdOmhvdmVyLFxuLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXTpmb2N1cyxcbi5idG4tcHJpbWFyeVtkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLXByaW1hcnlbZGlzYWJsZWRdOmFjdGl2ZSxcbi5idG4tcHJpbWFyeVtkaXNhYmxlZF0uYWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5OmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeS5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6YWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeS5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzM3YWI3O1xuICBib3JkZXItY29sb3I6ICMyZTZkYTQ7XG59XG5cbi5idG4tcHJpbWFyeSAuYmFkZ2Uge1xuICBjb2xvcjogIzMzN2FiNztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1zdWNjZXNzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1Y2I4NWM7XG4gIGJvcmRlci1jb2xvcjogIzRjYWU0Yztcbn1cblxuLmJ0bi1zdWNjZXNzOmZvY3VzLFxuLmJ0bi1zdWNjZXNzLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0NDlkNDQ7XG4gIGJvcmRlci1jb2xvcjogIzI1NTYyNTtcbn1cblxuLmJ0bi1zdWNjZXNzOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0NDlkNDQ7XG4gIGJvcmRlci1jb2xvcjogIzM5ODQzOTtcbn1cblxuLmJ0bi1zdWNjZXNzOmFjdGl2ZSxcbi5idG4tc3VjY2Vzcy5hY3RpdmUsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0OWQ0NDtcbiAgYm9yZGVyLWNvbG9yOiAjMzk4NDM5O1xufVxuXG4uYnRuLXN1Y2Nlc3M6YWN0aXZlOmhvdmVyLFxuLmJ0bi1zdWNjZXNzOmFjdGl2ZTpmb2N1cyxcbi5idG4tc3VjY2VzczphY3RpdmUuZm9jdXMsXG4uYnRuLXN1Y2Nlc3MuYWN0aXZlOmhvdmVyLFxuLmJ0bi1zdWNjZXNzLmFjdGl2ZTpmb2N1cyxcbi5idG4tc3VjY2Vzcy5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGU6aG92ZXIsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGU6Zm9jdXMsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzM5ODQzOTtcbiAgYm9yZGVyLWNvbG9yOiAjMjU1NjI1O1xufVxuXG4uYnRuLXN1Y2Nlc3M6YWN0aXZlLFxuLmJ0bi1zdWNjZXNzLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1zdWNjZXNzLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5idG4tc3VjY2Vzcy5kaXNhYmxlZCxcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZDpob3Zlcixcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZDpmb2N1cyxcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZC5mb2N1cyxcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZDphY3RpdmUsXG4uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQuYWN0aXZlLFxuLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXSxcbi5idG4tc3VjY2Vzc1tkaXNhYmxlZF06aG92ZXIsXG4uYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdOmZvY3VzLFxuLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXS5mb2N1cyxcbi5idG4tc3VjY2Vzc1tkaXNhYmxlZF06YWN0aXZlLFxuLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXS5hY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2Vzczpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3M6Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2VzczphY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1Y2I4NWM7XG4gIGJvcmRlci1jb2xvcjogIzRjYWU0Yztcbn1cblxuLmJ0bi1zdWNjZXNzIC5iYWRnZSB7XG4gIGNvbG9yOiAjNWNiODVjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4uYnRuLWluZm8ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzViYzBkZTtcbiAgYm9yZGVyLWNvbG9yOiAjNDZiOGRhO1xufVxuXG4uYnRuLWluZm86Zm9jdXMsXG4uYnRuLWluZm8uZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMxYjBkNTtcbiAgYm9yZGVyLWNvbG9yOiAjMWI2ZDg1O1xufVxuXG4uYnRuLWluZm86aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMxYjBkNTtcbiAgYm9yZGVyLWNvbG9yOiAjMjY5YWJjO1xufVxuXG4uYnRuLWluZm86YWN0aXZlLFxuLmJ0bi1pbmZvLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzFiMGQ1O1xuICBib3JkZXItY29sb3I6ICMyNjlhYmM7XG59XG5cbi5idG4taW5mbzphY3RpdmU6aG92ZXIsXG4uYnRuLWluZm86YWN0aXZlOmZvY3VzLFxuLmJ0bi1pbmZvOmFjdGl2ZS5mb2N1cyxcbi5idG4taW5mby5hY3RpdmU6aG92ZXIsXG4uYnRuLWluZm8uYWN0aXZlOmZvY3VzLFxuLmJ0bi1pbmZvLmFjdGl2ZS5mb2N1cyxcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZTpob3Zlcixcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyxcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZS5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjY5YWJjO1xuICBib3JkZXItY29sb3I6ICMxYjZkODU7XG59XG5cbi5idG4taW5mbzphY3RpdmUsXG4uYnRuLWluZm8uYWN0aXZlLFxuLm9wZW4gPiAuYnRuLWluZm8uZHJvcGRvd24tdG9nZ2xlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLmJ0bi1pbmZvLmRpc2FibGVkLFxuLmJ0bi1pbmZvLmRpc2FibGVkOmhvdmVyLFxuLmJ0bi1pbmZvLmRpc2FibGVkOmZvY3VzLFxuLmJ0bi1pbmZvLmRpc2FibGVkLmZvY3VzLFxuLmJ0bi1pbmZvLmRpc2FibGVkOmFjdGl2ZSxcbi5idG4taW5mby5kaXNhYmxlZC5hY3RpdmUsXG4uYnRuLWluZm9bZGlzYWJsZWRdLFxuLmJ0bi1pbmZvW2Rpc2FibGVkXTpob3Zlcixcbi5idG4taW5mb1tkaXNhYmxlZF06Zm9jdXMsXG4uYnRuLWluZm9bZGlzYWJsZWRdLmZvY3VzLFxuLmJ0bi1pbmZvW2Rpc2FibGVkXTphY3RpdmUsXG4uYnRuLWluZm9bZGlzYWJsZWRdLmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8sXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mbzpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8uZm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8uYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzViYzBkZTtcbiAgYm9yZGVyLWNvbG9yOiAjNDZiOGRhO1xufVxuXG4uYnRuLWluZm8gLmJhZGdlIHtcbiAgY29sb3I6ICM1YmMwZGU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5idG4td2FybmluZyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBhZDRlO1xuICBib3JkZXItY29sb3I6ICNlZWEyMzY7XG59XG5cbi5idG4td2FybmluZzpmb2N1cyxcbi5idG4td2FybmluZy5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmO1xuICBib3JkZXItY29sb3I6ICM5ODVmMGQ7XG59XG5cbi5idG4td2FybmluZzpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmO1xuICBib3JkZXItY29sb3I6ICNkNTg1MTI7XG59XG5cbi5idG4td2FybmluZzphY3RpdmUsXG4uYnRuLXdhcm5pbmcuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYzk3MWY7XG4gIGJvcmRlci1jb2xvcjogI2Q1ODUxMjtcbn1cblxuLmJ0bi13YXJuaW5nOmFjdGl2ZTpob3Zlcixcbi5idG4td2FybmluZzphY3RpdmU6Zm9jdXMsXG4uYnRuLXdhcm5pbmc6YWN0aXZlLmZvY3VzLFxuLmJ0bi13YXJuaW5nLmFjdGl2ZTpob3Zlcixcbi5idG4td2FybmluZy5hY3RpdmU6Zm9jdXMsXG4uYnRuLXdhcm5pbmcuYWN0aXZlLmZvY3VzLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlOmZvY3VzLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkNTg1MTI7XG4gIGJvcmRlci1jb2xvcjogIzk4NWYwZDtcbn1cblxuLmJ0bi13YXJuaW5nOmFjdGl2ZSxcbi5idG4td2FybmluZy5hY3RpdmUsXG4ub3BlbiA+IC5idG4td2FybmluZy5kcm9wZG93bi10b2dnbGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xufVxuXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQ6aG92ZXIsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQ6Zm9jdXMsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQ6YWN0aXZlLFxuLmJ0bi13YXJuaW5nLmRpc2FibGVkLmFjdGl2ZSxcbi5idG4td2FybmluZ1tkaXNhYmxlZF0sXG4uYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmhvdmVyLFxuLmJ0bi13YXJuaW5nW2Rpc2FibGVkXTpmb2N1cyxcbi5idG4td2FybmluZ1tkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmFjdGl2ZSxcbi5idG4td2FybmluZ1tkaXNhYmxlZF0uYWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nOmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZy5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6YWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZy5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBhZDRlO1xuICBib3JkZXItY29sb3I6ICNlZWEyMzY7XG59XG5cbi5idG4td2FybmluZyAuYmFkZ2Uge1xuICBjb2xvcjogI2YwYWQ0ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1kYW5nZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5NTM0ZjtcbiAgYm9yZGVyLWNvbG9yOiAjZDQzZjNhO1xufVxuXG4uYnRuLWRhbmdlcjpmb2N1cyxcbi5idG4tZGFuZ2VyLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjOTMwMmM7XG4gIGJvcmRlci1jb2xvcjogIzc2MWMxOTtcbn1cblxuLmJ0bi1kYW5nZXI6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M5MzAyYztcbiAgYm9yZGVyLWNvbG9yOiAjYWMyOTI1O1xufVxuXG4uYnRuLWRhbmdlcjphY3RpdmUsXG4uYnRuLWRhbmdlci5hY3RpdmUsXG4ub3BlbiA+IC5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzkzMDJjO1xuICBib3JkZXItY29sb3I6ICNhYzI5MjU7XG59XG5cbi5idG4tZGFuZ2VyOmFjdGl2ZTpob3Zlcixcbi5idG4tZGFuZ2VyOmFjdGl2ZTpmb2N1cyxcbi5idG4tZGFuZ2VyOmFjdGl2ZS5mb2N1cyxcbi5idG4tZGFuZ2VyLmFjdGl2ZTpob3Zlcixcbi5idG4tZGFuZ2VyLmFjdGl2ZTpmb2N1cyxcbi5idG4tZGFuZ2VyLmFjdGl2ZS5mb2N1cyxcbi5vcGVuID4gLmJ0bi1kYW5nZXIuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLWRhbmdlci5kcm9wZG93bi10b2dnbGU6Zm9jdXMsXG4ub3BlbiA+IC5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZS5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWMyOTI1O1xuICBib3JkZXItY29sb3I6ICM3NjFjMTk7XG59XG5cbi5idG4tZGFuZ2VyOmFjdGl2ZSxcbi5idG4tZGFuZ2VyLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1kYW5nZXIuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLmJ0bi1kYW5nZXIuZGlzYWJsZWQsXG4uYnRuLWRhbmdlci5kaXNhYmxlZDpob3Zlcixcbi5idG4tZGFuZ2VyLmRpc2FibGVkOmZvY3VzLFxuLmJ0bi1kYW5nZXIuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLWRhbmdlci5kaXNhYmxlZDphY3RpdmUsXG4uYnRuLWRhbmdlci5kaXNhYmxlZC5hY3RpdmUsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF0sXG4uYnRuLWRhbmdlcltkaXNhYmxlZF06aG92ZXIsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF06Zm9jdXMsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF06YWN0aXZlLFxuLmJ0bi1kYW5nZXJbZGlzYWJsZWRdLmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlci5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjphY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXIuYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5NTM0ZjtcbiAgYm9yZGVyLWNvbG9yOiAjZDQzZjNhO1xufVxuXG4uYnRuLWRhbmdlciAuYmFkZ2Uge1xuICBjb2xvcjogI2Q5NTM0ZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1saW5rIHtcbiAgY29sb3I6ICMzMzdhYjc7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5idG4tbGluayxcbi5idG4tbGluazphY3RpdmUsXG4uYnRuLWxpbmsuYWN0aXZlLFxuLmJ0bi1saW5rW2Rpc2FibGVkXSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxpbmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uYnRuLWxpbmssXG4uYnRuLWxpbms6aG92ZXIsXG4uYnRuLWxpbms6Zm9jdXMsXG4uYnRuLWxpbms6YWN0aXZlIHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmJ0bi1saW5rOmhvdmVyLFxuLmJ0bi1saW5rOmZvY3VzIHtcbiAgY29sb3I6ICMyMzUyN2M7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmJ0bi1saW5rW2Rpc2FibGVkXTpob3Zlcixcbi5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1saW5rOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbGluazpmb2N1cyB7XG4gIGNvbG9yOiAjNzc3Nzc3O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5idG4tbGcsIC5idG4tZ3JvdXAtbGcgPiAuYnRuIHtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cblxuLmJ0bi1zbSwgLmJ0bi1ncm91cC1zbSA+IC5idG4ge1xuICBwYWRkaW5nOiA1cHggMTBweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5idG4teHMsIC5idG4tZ3JvdXAteHMgPiAuYnRuIHtcbiAgcGFkZGluZzogMXB4IDVweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5idG4tYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5idG4tYmxvY2sgKyAuYnRuLWJsb2NrIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG5pbnB1dFt0eXBlPVwic3VibWl0XCJdLmJ0bi1ibG9jayxcbmlucHV0W3R5cGU9XCJyZXNldFwiXS5idG4tYmxvY2ssXG5pbnB1dFt0eXBlPVwiYnV0dG9uXCJdLmJ0bi1ibG9jayB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uZmFkZSB7XG4gIG9wYWNpdHk6IDA7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBsaW5lYXI7XG4gIC1vLXRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgbGluZWFyO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGxpbmVhcjtcbn1cblxuLmZhZGUuaW4ge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uY29sbGFwc2Uge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uY29sbGFwc2UuaW4ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxudHIuY29sbGFwc2UuaW4ge1xuICBkaXNwbGF5OiB0YWJsZS1yb3c7XG59XG5cbnRib2R5LmNvbGxhcHNlLmluIHtcbiAgZGlzcGxheTogdGFibGUtcm93LWdyb3VwO1xufVxuXG4uY29sbGFwc2luZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGhlaWdodCwgdmlzaWJpbGl0eTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogaGVpZ2h0LCB2aXNpYmlsaXR5O1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMzVzO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjM1cztcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7XG59XG5cbi5jYXJldCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDA7XG4gIGhlaWdodDogMDtcbiAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcbiAgYm9yZGVyLXRvcDogNHB4IHNvbGlkIFxcOTtcbiAgYm9yZGVyLXJpZ2h0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi5kcm9wdXAsXG4uZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4uZHJvcGRvd24tbWVudSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBub25lO1xuICBmbG9hdDogbGVmdDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIG1hcmdpbjogMnB4IDAgMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCA2cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTc1KTtcbiAgYm94LXNoYWRvdzogMCA2cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTc1KTtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbn1cblxuLmRyb3Bkb3duLW1lbnUucHVsbC1yaWdodCB7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiBhdXRvO1xufVxuXG4uZHJvcGRvd24tbWVudSAuZGl2aWRlciB7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IDlweCAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlNWU1O1xufVxuXG4uZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAzcHggMjBweDtcbiAgY2xlYXI6IGJvdGg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICMzMzMzMzM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjMjYyNjI2O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuXG4uZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhLFxuLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYTpob3Zlcixcbi5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBvdXRsaW5lOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzM3YWI3O1xufVxuXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGEsXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzc3Nzc3Nztcbn1cblxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZCA9IGZhbHNlKTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLm9wZW4gPiAuZHJvcGRvd24tbWVudSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ub3BlbiA+IGEge1xuICBvdXRsaW5lOiAwO1xufVxuXG4uZHJvcGRvd24tbWVudS1yaWdodCB7XG4gIGxlZnQ6IGF1dG87XG4gIHJpZ2h0OiAwO1xufVxuXG4uZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IGF1dG87XG59XG5cbi5kcm9wZG93bi1oZWFkZXIge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogM3B4IDIwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBjb2xvcjogIzc3Nzc3NztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmRyb3Bkb3duLWJhY2tkcm9wIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICB0b3A6IDA7XG4gIHotaW5kZXg6IDk5MDtcbn1cblxuLnB1bGwtcmlnaHQgPiAuZHJvcGRvd24tbWVudSB7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiBhdXRvO1xufVxuXG4uZHJvcHVwIC5jYXJldCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuY2FyZXQge1xuICBib3JkZXItdG9wOiAwO1xuICBib3JkZXItYm90dG9tOiA0cHggZGFzaGVkO1xuICBib3JkZXItYm90dG9tOiA0cHggc29saWQgXFw5O1xuICBjb250ZW50OiBcIlwiO1xufVxuXG4uZHJvcHVwIC5kcm9wZG93bi1tZW51LFxuLm5hdmJhci1maXhlZC1ib3R0b20gLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IHtcbiAgdG9wOiBhdXRvO1xuICBib3R0b206IDEwMCU7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5uYXZiYXItcmlnaHQgLmRyb3Bkb3duLW1lbnUge1xuICAgIHJpZ2h0OiAwO1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cbiAgLm5hdmJhci1yaWdodCAuZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiBhdXRvO1xuICB9XG59XG5cbi5idG4tZ3JvdXAsXG4uYnRuLWdyb3VwLXZlcnRpY2FsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bjpob3Zlcixcbi5idG4tZ3JvdXAgPiAuYnRuOmZvY3VzLFxuLmJ0bi1ncm91cCA+IC5idG46YWN0aXZlLFxuLmJ0bi1ncm91cCA+IC5idG4uYWN0aXZlLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46aG92ZXIsXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjpmb2N1cyxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuOmFjdGl2ZSxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLmFjdGl2ZSB7XG4gIHotaW5kZXg6IDI7XG59XG5cbi5idG4tZ3JvdXAgLmJ0biArIC5idG4sXG4uYnRuLWdyb3VwIC5idG4gKyAuYnRuLWdyb3VwLFxuLmJ0bi1ncm91cCAuYnRuLWdyb3VwICsgLmJ0bixcbi5idG4tZ3JvdXAgLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLmJ0bi10b29sYmFyIHtcbiAgbWFyZ2luLWxlZnQ6IC01cHg7XG59XG5cbi5idG4tdG9vbGJhcjpiZWZvcmUsXG4uYnRuLXRvb2xiYXI6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5idG4tdG9vbGJhcjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4uYnRuLXRvb2xiYXIgLmJ0bixcbi5idG4tdG9vbGJhciAuYnRuLWdyb3VwLFxuLmJ0bi10b29sYmFyIC5pbnB1dC1ncm91cCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4uYnRuLXRvb2xiYXIgPiAuYnRuLFxuLmJ0bi10b29sYmFyID4gLmJ0bi1ncm91cCxcbi5idG4tdG9vbGJhciA+IC5pbnB1dC1ncm91cCB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBtYXJnaW4tbGVmdDogMDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG46Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSkge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4uYnRuLWdyb3VwID4gLmRyb3Bkb3duLXRvZ2dsZTpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgPiAuYnRuIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSA+IC5idG46bGFzdC1jaGlsZCxcbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgPiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmJ0bjpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgLmRyb3Bkb3duLXRvZ2dsZTphY3RpdmUsXG4uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuICsgLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIHBhZGRpbmctbGVmdDogOHB4O1xuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLWxnICsgLmRyb3Bkb3duLXRvZ2dsZSwgLmJ0bi1ncm91cC1sZy5idG4tZ3JvdXAgPiAuYnRuICsgLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIHBhZGRpbmctbGVmdDogMTJweDtcbiAgcGFkZGluZy1yaWdodDogMTJweDtcbn1cblxuLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgM3B4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTI1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMjUpO1xufVxuXG4uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5idG4tbGluayB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLmJ0biAuY2FyZXQge1xuICBtYXJnaW4tbGVmdDogMDtcbn1cblxuLmJ0bi1sZyAuY2FyZXQsIC5idG4tZ3JvdXAtbGcgPiAuYnRuIC5jYXJldCB7XG4gIGJvcmRlci13aWR0aDogNXB4IDVweCAwO1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xufVxuXG4uZHJvcHVwIC5idG4tbGcgLmNhcmV0LCAuZHJvcHVwIC5idG4tZ3JvdXAtbGcgPiAuYnRuIC5jYXJldCB7XG4gIGJvcmRlci13aWR0aDogMCA1cHggNXB4O1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bixcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXAgPiAuYnRuIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiBub25lO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpiZWZvcmUsXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXAgPiAuYnRuIHtcbiAgZmxvYXQ6IG5vbmU7XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuICsgLmJ0bixcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuICsgLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwICsgLmJ0bixcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwICsgLmJ0bi1ncm91cCB7XG4gIG1hcmdpbi10b3A6IC0xcHg7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpID4gLmJ0bjpsYXN0LWNoaWxkLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSA+IC5kcm9wZG93bi10b2dnbGUge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC1qdXN0aWZpZWQge1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgd2lkdGg6IDEwMCU7XG4gIHRhYmxlLWxheW91dDogZml4ZWQ7XG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG59XG5cbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bixcbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bi1ncm91cCB7XG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB3aWR0aDogMSU7XG59XG5cbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bi1ncm91cCAuYnRuIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gIGxlZnQ6IGF1dG87XG59XG5cbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0gPiAuYnRuIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0gPiAuYnRuIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSxcbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0gPiAuYnRuLWdyb3VwID4gLmJ0biBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5bZGF0YS10b2dnbGU9XCJidXR0b25zXCJdID4gLmJ0bi1ncm91cCA+IC5idG4gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBjbGlwOiByZWN0KDAsIDAsIDAsIDApO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmlucHV0LWdyb3VwIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbn1cblxuLmlucHV0LWdyb3VwW2NsYXNzKj1cImNvbC1cIl0ge1xuICBmbG9hdDogbm9uZTtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBwYWRkaW5nLXJpZ2h0OiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuLFxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2wge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb246bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSxcbi5pbnB1dC1ncm91cC1idG46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSxcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgd2lkdGg6IDElO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBwYWRkaW5nOiA2cHggMTJweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICM1NTU1NTU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24uaW5wdXQtc20sIC5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiAuaW5wdXQtZ3JvdXAtYWRkb24uYnRuIHtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24uaW5wdXQtbGcsIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiAuaW5wdXQtZ3JvdXAtYWRkb24uYnRuIHtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbi5pbnB1dC1ncm91cC1hZGRvbiBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpmaXJzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXAgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5kcm9wZG93bi10b2dnbGUsXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bi1ncm91cDpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpsYXN0LWNoaWxkLFxuLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bi1ncm91cCA+IC5idG4sXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG46bm90KDpmaXJzdC1jaGlsZCksXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmb250LXNpemU6IDA7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5pbnB1dC1ncm91cC1idG4gPiAuYnRuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biArIC5idG4ge1xuICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLmlucHV0LWdyb3VwLWJ0biA+IC5idG46aG92ZXIsXG4uaW5wdXQtZ3JvdXAtYnRuID4gLmJ0bjpmb2N1cyxcbi5pbnB1dC1ncm91cC1idG4gPiAuYnRuOmFjdGl2ZSB7XG4gIHotaW5kZXg6IDI7XG59XG5cbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXAge1xuICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG59XG5cbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4sXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuLWdyb3VwIHtcbiAgei1pbmRleDogMjtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5uYXYge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5uYXY6YmVmb3JlLFxuLm5hdjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLm5hdjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4ubmF2ID4gbGkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ubmF2ID4gbGkgPiBhIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMTBweCAxNXB4O1xufVxuXG4ubmF2ID4gbGkgPiBhOmhvdmVyLFxuLm5hdiA+IGxpID4gYTpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbn1cblxuLm5hdiA+IGxpLmRpc2FibGVkID4gYSB7XG4gIGNvbG9yOiAjNzc3Nzc3O1xufVxuXG4ubmF2ID4gbGkuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLm5hdiA+IGxpLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjNzc3Nzc3O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4ubmF2IC5vcGVuID4gYSxcbi5uYXYgLm9wZW4gPiBhOmhvdmVyLFxuLm5hdiAub3BlbiA+IGE6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlO1xuICBib3JkZXItY29sb3I6ICMzMzdhYjc7XG59XG5cbi5uYXYgLm5hdi1kaXZpZGVyIHtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogOXB4IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7XG59XG5cbi5uYXYgPiBsaSA+IGEgPiBpbWcge1xuICBtYXgtd2lkdGg6IG5vbmU7XG59XG5cbi5uYXYtdGFicyB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ubmF2LXRhYnMgPiBsaSB7XG4gIGZsb2F0OiBsZWZ0O1xuICBtYXJnaW4tYm90dG9tOiAtMXB4O1xufVxuXG4ubmF2LXRhYnMgPiBsaSA+IGEge1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XG59XG5cbi5uYXYtdGFicyA+IGxpID4gYTpob3ZlciB7XG4gIGJvcmRlci1jb2xvcjogI2VlZWVlZSAjZWVlZWVlICNkZGQ7XG59XG5cbi5uYXYtdGFicyA+IGxpLmFjdGl2ZSA+IGEsXG4ubmF2LXRhYnMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLFxuLm5hdi10YWJzID4gbGkuYWN0aXZlID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjNTU1NTU1O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4ubmF2LXBpbGxzID4gbGkge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLm5hdi1waWxscyA+IGxpID4gYSB7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLm5hdi1waWxscyA+IGxpICsgbGkge1xuICBtYXJnaW4tbGVmdDogMnB4O1xufVxuXG4ubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYSxcbi5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLFxuLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzN2FiNztcbn1cblxuLm5hdi1zdGFja2VkID4gbGkge1xuICBmbG9hdDogbm9uZTtcbn1cblxuLm5hdi1zdGFja2VkID4gbGkgKyBsaSB7XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5uYXYtanVzdGlmaWVkLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4ubmF2LWp1c3RpZmllZCA+IGxpLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpIHtcbiAgZmxvYXQ6IG5vbmU7XG59XG5cbi5uYXYtanVzdGlmaWVkID4gbGkgPiBhLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpID4gYSB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4ubmF2LWp1c3RpZmllZCA+IC5kcm9wZG93biAuZHJvcGRvd24tbWVudSB7XG4gIHRvcDogYXV0bztcbiAgbGVmdDogYXV0bztcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5uYXYtanVzdGlmaWVkID4gbGksIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gbGkge1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgd2lkdGg6IDElO1xuICB9XG4gIC5uYXYtanVzdGlmaWVkID4gbGkgPiBhLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpID4gYSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG4ubmF2LXRhYnMtanVzdGlmaWVkLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG59XG5cbi5uYXYtdGFicy1qdXN0aWZpZWQgPiBsaSA+IGEsIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gbGkgPiBhIHtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYSxcbi5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGEsIC5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpob3Zlcixcbi5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cywgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAubmF2LXRhYnMtanVzdGlmaWVkID4gbGkgPiBhLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpID4gYSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XG4gIH1cbiAgLm5hdi10YWJzLWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhLFxuICAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhLCAubmF2LXRhYnMtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4gIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cywgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2ZmZjtcbiAgfVxufVxuXG4udGFiLWNvbnRlbnQgPiAudGFiLXBhbmUge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4udGFiLWNvbnRlbnQgPiAuYWN0aXZlIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5uYXYtdGFicyAuZHJvcGRvd24tbWVudSB7XG4gIG1hcmdpbi10b3A6IC0xcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4ubmF2YmFyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiA1MHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhcjpiZWZvcmUsXG4ubmF2YmFyOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4ubmF2YmFyOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAubmF2YmFyIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIH1cbn1cblxuLm5hdmJhci1oZWFkZXI6YmVmb3JlLFxuLm5hdmJhci1oZWFkZXI6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5uYXZiYXItaGVhZGVyOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAubmF2YmFyLWhlYWRlciB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuLm5hdmJhci1jb2xsYXBzZSB7XG4gIG92ZXJmbG93LXg6IHZpc2libGU7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gIHBhZGRpbmctbGVmdDogMTVweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xufVxuXG4ubmF2YmFyLWNvbGxhcHNlOmJlZm9yZSxcbi5uYXZiYXItY29sbGFwc2U6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5uYXZiYXItY29sbGFwc2U6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLm5hdmJhci1jb2xsYXBzZS5pbiB7XG4gIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm5hdmJhci1jb2xsYXBzZS5jb2xsYXBzZSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xuICB9XG4gIC5uYXZiYXItY29sbGFwc2UuaW4ge1xuICAgIG92ZXJmbG93LXk6IHZpc2libGU7XG4gIH1cbiAgLm5hdmJhci1maXhlZC10b3AgLm5hdmJhci1jb2xsYXBzZSxcbiAgLm5hdmJhci1zdGF0aWMtdG9wIC5uYXZiYXItY29sbGFwc2UsXG4gIC5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItY29sbGFwc2Uge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG59XG5cbi5uYXZiYXItZml4ZWQtdG9wIC5uYXZiYXItY29sbGFwc2UsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2YmFyLWNvbGxhcHNlIHtcbiAgbWF4LWhlaWdodDogMzQwcHg7XG59XG5cbkBtZWRpYSAobWF4LWRldmljZS13aWR0aDogNDgwcHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkge1xuICAubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNlLFxuICAubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICBtYXgtaGVpZ2h0OiAyMDBweDtcbiAgfVxufVxuXG4uY29udGFpbmVyID4gLm5hdmJhci1oZWFkZXIsXG4uY29udGFpbmVyID4gLm5hdmJhci1jb2xsYXBzZSxcbi5jb250YWluZXItZmx1aWQgPiAubmF2YmFyLWhlYWRlcixcbi5jb250YWluZXItZmx1aWQgPiAubmF2YmFyLWNvbGxhcHNlIHtcbiAgbWFyZ2luLXJpZ2h0OiAtMTVweDtcbiAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLmNvbnRhaW5lciA+IC5uYXZiYXItaGVhZGVyLFxuICAuY29udGFpbmVyID4gLm5hdmJhci1jb2xsYXBzZSxcbiAgLmNvbnRhaW5lci1mbHVpZCA+IC5uYXZiYXItaGVhZGVyLFxuICAuY29udGFpbmVyLWZsdWlkID4gLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi5uYXZiYXItc3RhdGljLXRvcCB7XG4gIHotaW5kZXg6IDEwMDA7XG4gIGJvcmRlci13aWR0aDogMCAwIDFweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5uYXZiYXItc3RhdGljLXRvcCB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4ubmF2YmFyLWZpeGVkLXRvcCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICByaWdodDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTAzMDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5uYXZiYXItZml4ZWQtdG9wLFxuICAubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4ubmF2YmFyLWZpeGVkLXRvcCB7XG4gIHRvcDogMDtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4O1xufVxuXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gIGJvdHRvbTogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgYm9yZGVyLXdpZHRoOiAxcHggMCAwO1xufVxuXG4ubmF2YmFyLWJyYW5kIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHBhZGRpbmc6IDE1cHggMTVweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgaGVpZ2h0OiA1MHB4O1xufVxuXG4ubmF2YmFyLWJyYW5kOmhvdmVyLFxuLm5hdmJhci1icmFuZDpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLm5hdmJhci1icmFuZCA+IGltZyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLm5hdmJhciA+IC5jb250YWluZXIgLm5hdmJhci1icmFuZCxcbiAgLm5hdmJhciA+IC5jb250YWluZXItZmx1aWQgLm5hdmJhci1icmFuZCB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICB9XG59XG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbG9hdDogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogMTVweDtcbiAgcGFkZGluZzogOXB4IDEwcHg7XG4gIG1hcmdpbi10b3A6IDhweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLm5hdmJhci10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4ubmF2YmFyLXRvZ2dsZSAuaWNvbi1iYXIge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDIycHg7XG4gIGhlaWdodDogMnB4O1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG59XG5cbi5uYXZiYXItdG9nZ2xlIC5pY29uLWJhciArIC5pY29uLWJhciB7XG4gIG1hcmdpbi10b3A6IDRweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5uYXZiYXItdG9nZ2xlIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi5uYXZiYXItbmF2IHtcbiAgbWFyZ2luOiA3LjVweCAtMTVweDtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IGEge1xuICBwYWRkaW5nLXRvcDogMTBweDtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHtcbiAgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDA7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYSxcbiAgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgcGFkZGluZzogNXB4IDE1cHggNXB4IDI1cHg7XG4gIH1cbiAgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICB9XG4gIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuICAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYTpmb2N1cyB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLm5hdmJhci1uYXYge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAubmF2YmFyLW5hdiA+IGxpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxuICAubmF2YmFyLW5hdiA+IGxpID4gYSB7XG4gICAgcGFkZGluZy10b3A6IDE1cHg7XG4gICAgcGFkZGluZy1ib3R0b206IDE1cHg7XG4gIH1cbn1cblxuLm5hdmJhci1mb3JtIHtcbiAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xuICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIG1hcmdpbi1ib3R0b206IDhweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5uYXZiYXItZm9ybSAuZm9ybS1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuICAubmF2YmFyLWZvcm0gLmZvcm0tY29udHJvbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5uYXZiYXItZm9ybSAuaW5wdXQtZ3JvdXAgLmlucHV0LWdyb3VwLWJ0bixcbiAgLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgICB3aWR0aDogYXV0bztcbiAgfVxuICAubmF2YmFyLWZvcm0gLmlucHV0LWdyb3VwID4gLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5jb250cm9sLWxhYmVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5yYWRpbyxcbiAgLm5hdmJhci1mb3JtIC5jaGVja2JveCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5uYXZiYXItZm9ybSAucmFkaW8gbGFiZWwsXG4gIC5uYXZiYXItZm9ybSAuY2hlY2tib3ggbGFiZWwge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgfVxuICAubmF2YmFyLWZvcm0gLnJhZGlvIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgLm5hdmJhci1mb3JtIC5jaGVja2JveCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxuICAubmF2YmFyLWZvcm0gLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gIC5uYXZiYXItZm9ybSAuZm9ybS1ncm91cCB7XG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICB9XG4gIC5uYXZiYXItZm9ybSAuZm9ybS1ncm91cDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAubmF2YmFyLWZvcm0ge1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgcGFkZGluZy10b3A6IDA7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51IHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5uYXZiYXItYnRuIHtcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG5cbi5uYXZiYXItYnRuLmJ0bi1zbSwgLmJ0bi1ncm91cC1zbSA+IC5uYXZiYXItYnRuLmJ0biB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbi5uYXZiYXItYnRuLmJ0bi14cywgLmJ0bi1ncm91cC14cyA+IC5uYXZiYXItYnRuLmJ0biB7XG4gIG1hcmdpbi10b3A6IDE0cHg7XG4gIG1hcmdpbi1ib3R0b206IDE0cHg7XG59XG5cbi5uYXZiYXItdGV4dCB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAubmF2YmFyLXRleHQge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgIG1hcmdpbi1yaWdodDogMTVweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLm5hdmJhci1sZWZ0IHtcbiAgICBmbG9hdDogbGVmdCAhaW1wb3J0YW50O1xuICB9XG4gIC5uYXZiYXItcmlnaHQge1xuICAgIGZsb2F0OiByaWdodCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi1yaWdodDogLTE1cHg7XG4gIH1cbiAgLm5hdmJhci1yaWdodCB+IC5uYXZiYXItcmlnaHQge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG4ubmF2YmFyLWRlZmF1bHQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xuICBib3JkZXItY29sb3I6ICNlN2U3ZTc7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kIHtcbiAgY29sb3I6ICM3Nzc7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItYnJhbmQ6Zm9jdXMge1xuICBjb2xvcjogIzVlNWU1ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRleHQge1xuICBjb2xvcjogIzc3Nztcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gbGkgPiBhIHtcbiAgY29sb3I6ICM3Nzc7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IGxpID4gYTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IGxpID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjMzMzO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICM1NTU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlN2U3ZTc7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5kaXNhYmxlZCA+IGEsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjY2NjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItdG9nZ2xlIHtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGU6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGU6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGUgLmljb24tYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4ODtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItY29sbGFwc2UsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1mb3JtIHtcbiAgYm9yZGVyLWNvbG9yOiAjZTdlN2U3O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAub3BlbiA+IGEsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAub3BlbiA+IGE6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAub3BlbiA+IGE6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1xuICBjb2xvcjogIzU1NTtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gICAgY29sb3I6ICM3Nzc7XG4gIH1cbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhLFxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYTpob3ZlcixcbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjNTU1O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlN2U3ZTc7XG4gIH1cbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYSxcbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpob3ZlcixcbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gICAgY29sb3I6ICNjY2M7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbGluayB7XG4gIGNvbG9yOiAjNzc3O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1saW5rOmhvdmVyIHtcbiAgY29sb3I6ICMzMzM7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbmsge1xuICBjb2xvcjogIzc3Nztcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5idG4tbGluazpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbms6Zm9jdXMge1xuICBjb2xvcjogIzMzMztcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5idG4tbGlua1tkaXNhYmxlZF06aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rW2Rpc2FibGVkXTpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbms6Zm9jdXMge1xuICBjb2xvcjogI2NjYztcbn1cblxuLm5hdmJhci1pbnZlcnNlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIyMjtcbiAgYm9yZGVyLWNvbG9yOiAjMDkwOTA5O1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1icmFuZCB7XG4gIGNvbG9yOiAjOWQ5ZDlkO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1icmFuZDpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci10ZXh0IHtcbiAgY29sb3I6ICM5ZDlkOWQ7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IGxpID4gYSB7XG4gIGNvbG9yOiAjOWQ5ZDlkO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiBsaSA+IGE6aG92ZXIsXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiBsaSA+IGE6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDkwOTA5O1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiAuZGlzYWJsZWQgPiBhLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLmRpc2FibGVkID4gYTpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzQ0NDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXRvZ2dsZSB7XG4gIGJvcmRlci1jb2xvcjogIzMzMztcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlIC5pY29uLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWNvbGxhcHNlLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItZm9ybSB7XG4gIGJvcmRlci1jb2xvcjogIzEwMTAxMDtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLm9wZW4gPiBhLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLm9wZW4gPiBhOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLm9wZW4gPiBhOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA5MDkwOTtcbiAgY29sb3I6ICNmZmY7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkge1xuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuZHJvcGRvd24taGVhZGVyIHtcbiAgICBib3JkZXItY29sb3I6ICMwOTA5MDk7XG4gIH1cbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51IC5kaXZpZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDkwOTA5O1xuICB9XG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gICAgY29sb3I6ICM5ZDlkOWQ7XG4gIH1cbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhLFxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYTpob3ZlcixcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMwOTA5MDk7XG4gIH1cbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYSxcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpob3ZlcixcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gICAgY29sb3I6ICM0NDQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGluayB7XG4gIGNvbG9yOiAjOWQ5ZDlkO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1saW5rOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbmsge1xuICBjb2xvcjogIzlkOWQ5ZDtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5idG4tbGluazpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5idG4tbGlua1tkaXNhYmxlZF06aG92ZXIsXG4ubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rW2Rpc2FibGVkXTpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6Zm9jdXMge1xuICBjb2xvcjogIzQ0NDtcbn1cblxuLmJyZWFkY3J1bWIge1xuICBwYWRkaW5nOiA4cHggMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uYnJlYWRjcnVtYiA+IGxpIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uYnJlYWRjcnVtYiA+IGxpICsgbGk6YmVmb3JlIHtcbiAgY29udGVudDogXCIvXFxcXDAwYTBcIjtcbiAgcGFkZGluZzogMCA1cHg7XG4gIGNvbG9yOiAjY2NjO1xufVxuXG4uYnJlYWRjcnVtYiA+IC5hY3RpdmUge1xuICBjb2xvcjogIzc3Nzc3Nztcbn1cblxuLnBhZ2luYXRpb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbWFyZ2luOiAyMHB4IDA7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLnBhZ2luYXRpb24gPiBsaSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cblxuLnBhZ2luYXRpb24gPiBsaSA+IGEsXG4ucGFnaW5hdGlvbiA+IGxpID4gc3BhbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHBhZGRpbmc6IDZweCAxMnB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICMzMzdhYjc7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ucGFnaW5hdGlvbiA+IGxpOmZpcnN0LWNoaWxkID4gYSxcbi5wYWdpbmF0aW9uID4gbGk6Zmlyc3QtY2hpbGQgPiBzcGFuIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xufVxuXG4ucGFnaW5hdGlvbiA+IGxpOmxhc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24gPiBsaTpsYXN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG59XG5cbi5wYWdpbmF0aW9uID4gbGkgPiBhOmhvdmVyLFxuLnBhZ2luYXRpb24gPiBsaSA+IGE6Zm9jdXMsXG4ucGFnaW5hdGlvbiA+IGxpID4gc3Bhbjpob3Zlcixcbi5wYWdpbmF0aW9uID4gbGkgPiBzcGFuOmZvY3VzIHtcbiAgei1pbmRleDogMztcbiAgY29sb3I6ICMyMzUyN2M7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XG4gIGJvcmRlci1jb2xvcjogI2RkZDtcbn1cblxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gYSxcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBhOmZvY3VzLFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gc3Bhbixcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IHNwYW46aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBzcGFuOmZvY3VzIHtcbiAgei1pbmRleDogMjtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzdhYjc7XG4gIGJvcmRlci1jb2xvcjogIzMzN2FiNztcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IHNwYW4sXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IHNwYW46aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IHNwYW46Zm9jdXMsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IGEsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzc3Nzc3NztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4ucGFnaW5hdGlvbi1sZyA+IGxpID4gYSxcbi5wYWdpbmF0aW9uLWxnID4gbGkgPiBzcGFuIHtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG59XG5cbi5wYWdpbmF0aW9uLWxnID4gbGk6Zmlyc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24tbGcgPiBsaTpmaXJzdC1jaGlsZCA+IHNwYW4ge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA2cHg7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDZweDtcbn1cblxuLnBhZ2luYXRpb24tbGcgPiBsaTpsYXN0LWNoaWxkID4gYSxcbi5wYWdpbmF0aW9uLWxnID4gbGk6bGFzdC1jaGlsZCA+IHNwYW4ge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNnB4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNnB4O1xufVxuXG4ucGFnaW5hdGlvbi1zbSA+IGxpID4gYSxcbi5wYWdpbmF0aW9uLXNtID4gbGkgPiBzcGFuIHtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbn1cblxuLnBhZ2luYXRpb24tc20gPiBsaTpmaXJzdC1jaGlsZCA+IGEsXG4ucGFnaW5hdGlvbi1zbSA+IGxpOmZpcnN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG4ucGFnaW5hdGlvbi1zbSA+IGxpOmxhc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24tc20gPiBsaTpsYXN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYWdlciB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbWFyZ2luOiAyMHB4IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnBhZ2VyOmJlZm9yZSxcbi5wYWdlcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLnBhZ2VyOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5wYWdlciBsaSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cblxuLnBhZ2VyIGxpID4gYSxcbi5wYWdlciBsaSA+IHNwYW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDVweCAxNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiAxNXB4O1xufVxuXG4ucGFnZXIgbGkgPiBhOmhvdmVyLFxuLnBhZ2VyIGxpID4gYTpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbn1cblxuLnBhZ2VyIC5uZXh0ID4gYSxcbi5wYWdlciAubmV4dCA+IHNwYW4ge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5wYWdlciAucHJldmlvdXMgPiBhLFxuLnBhZ2VyIC5wcmV2aW91cyA+IHNwYW4ge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLnBhZ2VyIC5kaXNhYmxlZCA+IGEsXG4ucGFnZXIgLmRpc2FibGVkID4gYTpob3Zlcixcbi5wYWdlciAuZGlzYWJsZWQgPiBhOmZvY3VzLFxuLnBhZ2VyIC5kaXNhYmxlZCA+IHNwYW4ge1xuICBjb2xvcjogIzc3Nzc3NztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLmxhYmVsIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBwYWRkaW5nOiAwLjJlbSAwLjZlbSAwLjNlbTtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICBib3JkZXItcmFkaXVzOiAuMjVlbTtcbn1cblxuLmxhYmVsOmVtcHR5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJ0biAubGFiZWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTFweDtcbn1cblxuYS5sYWJlbDpob3ZlcixcbmEubGFiZWw6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5sYWJlbC1kZWZhdWx0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzc3Nzc3Nztcbn1cblxuLmxhYmVsLWRlZmF1bHRbaHJlZl06aG92ZXIsXG4ubGFiZWwtZGVmYXVsdFtocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTVlNWU7XG59XG5cbi5sYWJlbC1wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzN2FiNztcbn1cblxuLmxhYmVsLXByaW1hcnlbaHJlZl06aG92ZXIsXG4ubGFiZWwtcHJpbWFyeVtocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyODYwOTA7XG59XG5cbi5sYWJlbC1zdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1Yztcbn1cblxuLmxhYmVsLXN1Y2Nlc3NbaHJlZl06aG92ZXIsXG4ubGFiZWwtc3VjY2Vzc1tocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0NDlkNDQ7XG59XG5cbi5sYWJlbC1pbmZvIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzViYzBkZTtcbn1cblxuLmxhYmVsLWluZm9baHJlZl06aG92ZXIsXG4ubGFiZWwtaW5mb1tocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMWIwZDU7XG59XG5cbi5sYWJlbC13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwYWQ0ZTtcbn1cblxuLmxhYmVsLXdhcm5pbmdbaHJlZl06aG92ZXIsXG4ubGFiZWwtd2FybmluZ1tocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYzk3MWY7XG59XG5cbi5sYWJlbC1kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDk1MzRmO1xufVxuXG4ubGFiZWwtZGFuZ2VyW2hyZWZdOmhvdmVyLFxuLmxhYmVsLWRhbmdlcltocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjOTMwMmM7XG59XG5cbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAxMHB4O1xuICBwYWRkaW5nOiAzcHggN3B4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogI2ZmZjtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzc3Nzc3NztcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbn1cblxuLmJhZGdlOmVtcHR5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJ0biAuYmFkZ2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTFweDtcbn1cblxuLmJ0bi14cyAuYmFkZ2UsXG4uYnRuLWdyb3VwLXhzID4gLmJ0biAuYmFkZ2UsXG4uYnRuLWdyb3VwLXhzID4gLmJ0biAuYmFkZ2Uge1xuICB0b3A6IDA7XG4gIHBhZGRpbmc6IDFweCA1cHg7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlID4gLmJhZGdlLFxuLm5hdi1waWxscyA+IC5hY3RpdmUgPiBhID4gLmJhZGdlIHtcbiAgY29sb3I6ICMzMzdhYjc7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0gPiAuYmFkZ2Uge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0gPiAuYmFkZ2UgKyAuYmFkZ2Uge1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cblxuLm5hdi1waWxscyA+IGxpID4gYSA+IC5iYWRnZSB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG59XG5cbmEuYmFkZ2U6aG92ZXIsXG5hLmJhZGdlOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uanVtYm90cm9uIHtcbiAgcGFkZGluZy10b3A6IDMwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAzMHB4O1xuICBtYXJnaW4tYm90dG9tOiAzMHB4O1xuICBjb2xvcjogaW5oZXJpdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbn1cblxuLmp1bWJvdHJvbiBoMSxcbi5qdW1ib3Ryb24gLmgxIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5qdW1ib3Ryb24gcCB7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG4gIGZvbnQtc2l6ZTogMjFweDtcbiAgZm9udC13ZWlnaHQ6IDIwMDtcbn1cblxuLmp1bWJvdHJvbiA+IGhyIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2Q1ZDVkNTtcbn1cblxuLmNvbnRhaW5lciAuanVtYm90cm9uLFxuLmNvbnRhaW5lci1mbHVpZCAuanVtYm90cm9uIHtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xufVxuXG4uanVtYm90cm9uIC5jb250YWluZXIge1xuICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5qdW1ib3Ryb24ge1xuICAgIHBhZGRpbmctdG9wOiA0OHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiA0OHB4O1xuICB9XG4gIC5jb250YWluZXIgLmp1bWJvdHJvbixcbiAgLmNvbnRhaW5lci1mbHVpZCAuanVtYm90cm9uIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDYwcHg7XG4gICAgcGFkZGluZy1yaWdodDogNjBweDtcbiAgfVxuICAuanVtYm90cm9uIGgxLFxuICAuanVtYm90cm9uIC5oMSB7XG4gICAgZm9udC1zaXplOiA2M3B4O1xuICB9XG59XG5cbi50aHVtYm5haWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogNHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBib3JkZXIgMC4ycyBlYXNlLWluLW91dDtcbiAgLW8tdHJhbnNpdGlvbjogYm9yZGVyIDAuMnMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGJvcmRlciAwLjJzIGVhc2UtaW4tb3V0O1xufVxuXG4udGh1bWJuYWlsID4gaW1nLFxuLnRodW1ibmFpbCBhID4gaW1nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuXG4udGh1bWJuYWlsIC5jYXB0aW9uIHtcbiAgcGFkZGluZzogOXB4O1xuICBjb2xvcjogIzMzMzMzMztcbn1cblxuYS50aHVtYm5haWw6aG92ZXIsXG5hLnRodW1ibmFpbDpmb2N1cyxcbmEudGh1bWJuYWlsLmFjdGl2ZSB7XG4gIGJvcmRlci1jb2xvcjogIzMzN2FiNztcbn1cblxuLmFsZXJ0IHtcbiAgcGFkZGluZzogMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmFsZXJ0IGg0IHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5hbGVydCAuYWxlcnQtbGluayB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uYWxlcnQgPiBwLFxuLmFsZXJ0ID4gdWwge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uYWxlcnQgPiBwICsgcCB7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLmFsZXJ0LWRpc21pc3NhYmxlLCAuYWxlcnQtZGlzbWlzc2libGUge1xuICBwYWRkaW5nLXJpZ2h0OiAzNXB4O1xufVxuXG4uYWxlcnQtZGlzbWlzc2FibGUgLmNsb3NlLCAuYWxlcnQtZGlzbWlzc2libGUgLmNsb3NlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IC0ycHg7XG4gIHJpZ2h0OiAtMjFweDtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5hbGVydC1zdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcbiAgYm9yZGVyLWNvbG9yOiAjZDZlOWM2O1xuICBjb2xvcjogIzNjNzYzZDtcbn1cblxuLmFsZXJ0LXN1Y2Nlc3MgaHIge1xuICBib3JkZXItdG9wLWNvbG9yOiAjYzllMmIzO1xufVxuXG4uYWxlcnQtc3VjY2VzcyAuYWxlcnQtbGluayB7XG4gIGNvbG9yOiAjMmI1NDJjO1xufVxuXG4uYWxlcnQtaW5mbyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XG4gIGJvcmRlci1jb2xvcjogI2JjZThmMTtcbiAgY29sb3I6ICMzMTcwOGY7XG59XG5cbi5hbGVydC1pbmZvIGhyIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2E2ZTFlYztcbn1cblxuLmFsZXJ0LWluZm8gLmFsZXJ0LWxpbmsge1xuICBjb2xvcjogIzI0NTI2OTtcbn1cblxuLmFsZXJ0LXdhcm5pbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xuICBib3JkZXItY29sb3I6ICNmYWViY2M7XG4gIGNvbG9yOiAjOGE2ZDNiO1xufVxuXG4uYWxlcnQtd2FybmluZyBociB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNmN2UxYjU7XG59XG5cbi5hbGVydC13YXJuaW5nIC5hbGVydC1saW5rIHtcbiAgY29sb3I6ICM2NjUxMmM7XG59XG5cbi5hbGVydC1kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xuICBib3JkZXItY29sb3I6ICNlYmNjZDE7XG4gIGNvbG9yOiAjYTk0NDQyO1xufVxuXG4uYWxlcnQtZGFuZ2VyIGhyIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2U0YjljMDtcbn1cblxuLmFsZXJ0LWRhbmdlciAuYWxlcnQtbGluayB7XG4gIGNvbG9yOiAjODQzNTM0O1xufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXMge1xuICBmcm9tIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7XG4gIH1cbiAgdG8ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVzIHtcbiAgZnJvbSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogNDBweCAwO1xuICB9XG4gIHRvIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7XG4gIH1cbn1cblxuLnByb2dyZXNzIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgaGVpZ2h0OiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cblxuLnByb2dyZXNzLWJhciB7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzN2FiNztcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDAuNnMgZWFzZTtcbiAgLW8tdHJhbnNpdGlvbjogd2lkdGggMC42cyBlYXNlO1xuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjZzIGVhc2U7XG59XG5cbi5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXIsXG4ucHJvZ3Jlc3MtYmFyLXN0cmlwZWQge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtc2l6ZTogNDBweCA0MHB4O1xufVxuXG4ucHJvZ3Jlc3MuYWN0aXZlIC5wcm9ncmVzcy1iYXIsXG4ucHJvZ3Jlc3MtYmFyLmFjdGl2ZSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGU7XG4gIC1vLWFuaW1hdGlvbjogcHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlO1xuICBhbmltYXRpb246IHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTtcbn1cblxuLnByb2dyZXNzLWJhci1zdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1Yztcbn1cblxuLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci1zdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWluZm8ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWJjMGRlO1xufVxuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLWluZm8ge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG59XG5cbi5wcm9ncmVzcy1iYXItd2FybmluZyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGFkNGU7XG59XG5cbi5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItd2FybmluZyB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbn1cblxuLnByb2dyZXNzLWJhci1kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDk1MzRmO1xufVxuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLWRhbmdlciB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbn1cblxuLm1lZGlhIHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbn1cblxuLm1lZGlhOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLXRvcDogMDtcbn1cblxuLm1lZGlhLFxuLm1lZGlhLWJvZHkge1xuICB6b29tOiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ubWVkaWEtYm9keSB7XG4gIHdpZHRoOiAxMDAwMHB4O1xufVxuXG4ubWVkaWEtb2JqZWN0IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5tZWRpYS1vYmplY3QuaW1nLXRodW1ibmFpbCB7XG4gIG1heC13aWR0aDogbm9uZTtcbn1cblxuLm1lZGlhLXJpZ2h0LFxuLm1lZGlhID4gLnB1bGwtcmlnaHQge1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5tZWRpYS1sZWZ0LFxuLm1lZGlhID4gLnB1bGwtbGVmdCB7XG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG59XG5cbi5tZWRpYS1sZWZ0LFxuLm1lZGlhLXJpZ2h0LFxuLm1lZGlhLWJvZHkge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuXG4ubWVkaWEtbWlkZGxlIHtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLm1lZGlhLWJvdHRvbSB7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG59XG5cbi5tZWRpYS1oZWFkaW5nIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4ubWVkaWEtbGlzdCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLmxpc3QtZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gIG1hcmdpbi1ib3R0b206IC0xcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0sXG5idXR0b24ubGlzdC1ncm91cC1pdGVtIHtcbiAgY29sb3I6ICM1NTU7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgY29sb3I6ICMzMzM7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW06Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbTpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG5cbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0ge1xuICB3aWR0aDogMTAwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZCxcbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6aG92ZXIsXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbiAgY29sb3I6ICM3Nzc3Nzc7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpob3ZlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCxcbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LFxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpmb2N1cyAubGlzdC1ncm91cC1pdGVtLXRleHQge1xuICBjb2xvcjogIzc3Nzc3Nztcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3Zlcixcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIHtcbiAgei1pbmRleDogMjtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzdhYjc7XG4gIGJvcmRlci1jb2xvcjogIzMzN2FiNztcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nID4gc21hbGwsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcgPiAuc21hbGwsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcgPiBzbWFsbCxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nID4gLnNtYWxsIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCB7XG4gIGNvbG9yOiAjYzdkZGVmO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3Mge1xuICBjb2xvcjogIzNjNzYzZDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2VzcyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2VzcyB7XG4gIGNvbG9yOiAjM2M3NjNkO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2VzcyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3M6Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3M6aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3M6Zm9jdXMge1xuICBjb2xvcjogIzNjNzYzZDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2QwZTljNjtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmUsXG5hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZSxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYzc2M2Q7XG4gIGJvcmRlci1jb2xvcjogIzNjNzYzZDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS1pbmZvIHtcbiAgY29sb3I6ICMzMTcwOGY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWluZm8sXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8ge1xuICBjb2xvcjogIzMxNzA4Zjtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0taW5mbyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWluZm86aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvOmZvY3VzIHtcbiAgY29sb3I6ICMzMTcwOGY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjNGUzZjM7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlLFxuYS5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmU6aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZTpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmUsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzE3MDhmO1xuICBib3JkZXItY29sb3I6ICMzMTcwOGY7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZyB7XG4gIGNvbG9yOiAjOGE2ZDNiO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nIHtcbiAgY29sb3I6ICM4YTZkM2I7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZzpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZzpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZzpmb2N1cyB7XG4gIGNvbG9yOiAjOGE2ZDNiO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmMmNjO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZSxcbmEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmU6Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmU6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzhhNmQzYjtcbiAgYm9yZGVyLWNvbG9yOiAjOGE2ZDNiO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLWRhbmdlciB7XG4gIGNvbG9yOiAjYTk0NDQyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlciB7XG4gIGNvbG9yOiAjYTk0NDQyO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6Zm9jdXMge1xuICBjb2xvcjogI2E5NDQ0MjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ViY2NjYztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZSxcbmEubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNhOTQ0NDI7XG4gIGJvcmRlci1jb2xvcjogI2E5NDQ0Mjtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLXRleHQge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBsaW5lLWhlaWdodDogMS4zO1xufVxuXG4ucGFuZWwge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLnBhbmVsLWJvZHkge1xuICBwYWRkaW5nOiAxNXB4O1xufVxuXG4ucGFuZWwtYm9keTpiZWZvcmUsXG4ucGFuZWwtYm9keTphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLnBhbmVsLWJvZHk6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLnBhbmVsLWhlYWRpbmcge1xuICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG4ucGFuZWwtaGVhZGluZyA+IC5kcm9wZG93biAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5wYW5lbC10aXRsZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5wYW5lbC10aXRsZSA+IGEsXG4ucGFuZWwtdGl0bGUgPiBzbWFsbCxcbi5wYW5lbC10aXRsZSA+IC5zbWFsbCxcbi5wYW5lbC10aXRsZSA+IHNtYWxsID4gYSxcbi5wYW5lbC10aXRsZSA+IC5zbWFsbCA+IGEge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLnBhbmVsLWZvb3RlciB7XG4gIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDtcbn1cblxuLnBhbmVsID4gLmxpc3QtZ3JvdXAsXG4ucGFuZWwgPiAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5wYW5lbCA+IC5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW0sXG4ucGFuZWwgPiAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVtIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHggMDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLnBhbmVsID4gLmxpc3QtZ3JvdXA6Zmlyc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC5wYW5lbC1jb2xsYXBzZSA+IC5saXN0LWdyb3VwOmZpcnN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wOiAwO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYW5lbCA+IC5saXN0LWdyb3VwOmxhc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXA6bGFzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tOiAwO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYW5lbCA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4ucGFuZWwtaGVhZGluZyArIC5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLXdpZHRoOiAwO1xufVxuXG4ubGlzdC1ncm91cCArIC5wYW5lbC1mb290ZXIge1xuICBib3JkZXItdG9wLXdpZHRoOiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSxcbi5wYW5lbCA+IC5wYW5lbC1jb2xsYXBzZSA+IC50YWJsZSB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZSBjYXB0aW9uLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUgY2FwdGlvbixcbi5wYW5lbCA+IC5wYW5lbC1jb2xsYXBzZSA+IC50YWJsZSBjYXB0aW9uIHtcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDNweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDtcbn1cblxuLnBhbmVsID4gLnBhbmVsLWJvZHkgKyAudGFibGUsXG4ucGFuZWwgPiAucGFuZWwtYm9keSArIC50YWJsZS1yZXNwb25zaXZlLFxuLnBhbmVsID4gLnRhYmxlICsgLnBhbmVsLWJvZHksXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSArIC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi5wYW5lbCA+IC50YWJsZSA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGgsXG4ucGFuZWwgPiAudGFibGUgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkIHtcbiAgYm9yZGVyLXRvcDogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQge1xuICBib3JkZXI6IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRkOmxhc3QtY2hpbGQge1xuICBib3JkZXItcmlnaHQ6IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0aCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6Zmlyc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6Zmlyc3QtY2hpbGQgPiB0aCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkID4gdGgsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6Zmlyc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpmaXJzdC1jaGlsZCA+IHRoIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmxhc3QtY2hpbGQgPiB0aCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHI6bGFzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGgsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmxhc3QtY2hpbGQgPiB0aCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHI6bGFzdC1jaGlsZCA+IHRoIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUge1xuICBib3JkZXI6IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5wYW5lbC1ncm91cCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbi5wYW5lbC1ncm91cCAucGFuZWwge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi5wYW5lbC1ncm91cCAucGFuZWwgKyAucGFuZWwge1xuICBtYXJnaW4tdG9wOiA1cHg7XG59XG5cbi5wYW5lbC1ncm91cCAucGFuZWwtaGVhZGluZyB7XG4gIGJvcmRlci1ib3R0b206IDA7XG59XG5cbi5wYW5lbC1ncm91cCAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5LFxuLnBhbmVsLWdyb3VwIC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbn1cblxuLnBhbmVsLWdyb3VwIC5wYW5lbC1mb290ZXIge1xuICBib3JkZXItdG9wOiAwO1xufVxuXG4ucGFuZWwtZ3JvdXAgLnBhbmVsLWZvb3RlciArIC5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ucGFuZWwtZGVmYXVsdCB7XG4gIGJvcmRlci1jb2xvcjogI2RkZDtcbn1cblxuLnBhbmVsLWRlZmF1bHQgPiAucGFuZWwtaGVhZGluZyB7XG4gIGNvbG9yOiAjMzMzMzMzO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICBib3JkZXItY29sb3I6ICNkZGQ7XG59XG5cbi5wYW5lbC1kZWZhdWx0ID4gLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNkZGQ7XG59XG5cbi5wYW5lbC1kZWZhdWx0ID4gLnBhbmVsLWhlYWRpbmcgLmJhZGdlIHtcbiAgY29sb3I6ICNmNWY1ZjU7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7XG59XG5cbi5wYW5lbC1kZWZhdWx0ID4gLnBhbmVsLWZvb3RlciArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2RkZDtcbn1cblxuLnBhbmVsLXByaW1hcnkge1xuICBib3JkZXItY29sb3I6ICMzMzdhYjc7XG59XG5cbi5wYW5lbC1wcmltYXJ5ID4gLnBhbmVsLWhlYWRpbmcge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzN2FiNztcbiAgYm9yZGVyLWNvbG9yOiAjMzM3YWI3O1xufVxuXG4ucGFuZWwtcHJpbWFyeSA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItdG9wLWNvbG9yOiAjMzM3YWI3O1xufVxuXG4ucGFuZWwtcHJpbWFyeSA+IC5wYW5lbC1oZWFkaW5nIC5iYWRnZSB7XG4gIGNvbG9yOiAjMzM3YWI3O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4ucGFuZWwtcHJpbWFyeSA+IC5wYW5lbC1mb290ZXIgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICMzMzdhYjc7XG59XG5cbi5wYW5lbC1zdWNjZXNzIHtcbiAgYm9yZGVyLWNvbG9yOiAjZDZlOWM2O1xufVxuXG4ucGFuZWwtc3VjY2VzcyA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgY29sb3I6ICMzYzc2M2Q7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7XG4gIGJvcmRlci1jb2xvcjogI2Q2ZTljNjtcbn1cblxuLnBhbmVsLXN1Y2Nlc3MgPiAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2Q2ZTljNjtcbn1cblxuLnBhbmVsLXN1Y2Nlc3MgPiAucGFuZWwtaGVhZGluZyAuYmFkZ2Uge1xuICBjb2xvcjogI2RmZjBkODtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNjNzYzZDtcbn1cblxuLnBhbmVsLXN1Y2Nlc3MgPiAucGFuZWwtZm9vdGVyICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjZDZlOWM2O1xufVxuXG4ucGFuZWwtaW5mbyB7XG4gIGJvcmRlci1jb2xvcjogI2JjZThmMTtcbn1cblxuLnBhbmVsLWluZm8gPiAucGFuZWwtaGVhZGluZyB7XG4gIGNvbG9yOiAjMzE3MDhmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xuICBib3JkZXItY29sb3I6ICNiY2U4ZjE7XG59XG5cbi5wYW5lbC1pbmZvID4gLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNiY2U4ZjE7XG59XG5cbi5wYW5lbC1pbmZvID4gLnBhbmVsLWhlYWRpbmcgLmJhZGdlIHtcbiAgY29sb3I6ICNkOWVkZjc7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMTcwOGY7XG59XG5cbi5wYW5lbC1pbmZvID4gLnBhbmVsLWZvb3RlciArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2JjZThmMTtcbn1cblxuLnBhbmVsLXdhcm5pbmcge1xuICBib3JkZXItY29sb3I6ICNmYWViY2M7XG59XG5cbi5wYW5lbC13YXJuaW5nID4gLnBhbmVsLWhlYWRpbmcge1xuICBjb2xvcjogIzhhNmQzYjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcbiAgYm9yZGVyLWNvbG9yOiAjZmFlYmNjO1xufVxuXG4ucGFuZWwtd2FybmluZyA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItdG9wLWNvbG9yOiAjZmFlYmNjO1xufVxuXG4ucGFuZWwtd2FybmluZyA+IC5wYW5lbC1oZWFkaW5nIC5iYWRnZSB7XG4gIGNvbG9yOiAjZmNmOGUzO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOGE2ZDNiO1xufVxuXG4ucGFuZWwtd2FybmluZyA+IC5wYW5lbC1mb290ZXIgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNmYWViY2M7XG59XG5cbi5wYW5lbC1kYW5nZXIge1xuICBib3JkZXItY29sb3I6ICNlYmNjZDE7XG59XG5cbi5wYW5lbC1kYW5nZXIgPiAucGFuZWwtaGVhZGluZyB7XG4gIGNvbG9yOiAjYTk0NDQyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xuICBib3JkZXItY29sb3I6ICNlYmNjZDE7XG59XG5cbi5wYW5lbC1kYW5nZXIgPiAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2ViY2NkMTtcbn1cblxuLnBhbmVsLWRhbmdlciA+IC5wYW5lbC1oZWFkaW5nIC5iYWRnZSB7XG4gIGNvbG9yOiAjZjJkZWRlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTk0NDQyO1xufVxuXG4ucGFuZWwtZGFuZ2VyID4gLnBhbmVsLWZvb3RlciArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2ViY2NkMTtcbn1cblxuLmVtYmVkLXJlc3BvbnNpdmUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5lbWJlZC1yZXNwb25zaXZlIC5lbWJlZC1yZXNwb25zaXZlLWl0ZW0sXG4uZW1iZWQtcmVzcG9uc2l2ZSBpZnJhbWUsXG4uZW1iZWQtcmVzcG9uc2l2ZSBlbWJlZCxcbi5lbWJlZC1yZXNwb25zaXZlIG9iamVjdCxcbi5lbWJlZC1yZXNwb25zaXZlIHZpZGVvIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyOiAwO1xufVxuXG4uZW1iZWQtcmVzcG9uc2l2ZS0xNmJ5OSB7XG4gIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG59XG5cbi5lbWJlZC1yZXNwb25zaXZlLTRieTMge1xuICBwYWRkaW5nLWJvdHRvbTogNzUlO1xufVxuXG4ud2VsbCB7XG4gIG1pbi1oZWlnaHQ6IDIwcHg7XG4gIHBhZGRpbmc6IDE5cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlM2UzZTM7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG59XG5cbi53ZWxsIGJsb2NrcXVvdGUge1xuICBib3JkZXItY29sb3I6ICNkZGQ7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cblxuLndlbGwtbGcge1xuICBwYWRkaW5nOiAyNHB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG59XG5cbi53ZWxsLXNtIHtcbiAgcGFkZGluZzogOXB4O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5jbG9zZSB7XG4gIGZsb2F0OiByaWdodDtcbiAgZm9udC1zaXplOiAyMXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGNvbG9yOiAjMDAwO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjZmZmO1xuICBvcGFjaXR5OiAwLjI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0yMCk7XG59XG5cbi5jbG9zZTpob3Zlcixcbi5jbG9zZTpmb2N1cyB7XG4gIGNvbG9yOiAjMDAwO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgb3BhY2l0eTogMC41O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xufVxuXG5idXR0b24uY2xvc2Uge1xuICBwYWRkaW5nOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDA7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLm1vZGFsLW9wZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ubW9kYWwge1xuICBkaXNwbGF5OiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTA1MDtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuICBvdXRsaW5lOiAwO1xufVxuXG4ubW9kYWwuZmFkZSAubW9kYWwtZGlhbG9nIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjUlKTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0yNSUpO1xuICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjUlKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTI1JSk7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4zcyBlYXNlLW91dDtcbiAgLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0O1xuICAtby10cmFuc2l0aW9uOiAtby10cmFuc2Zvcm0gMC4zcyBlYXNlLW91dDtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZS1vdXQ7XG59XG5cbi5tb2RhbC5pbiAubW9kYWwtZGlhbG9nIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG59XG5cbi5tb2RhbC1vcGVuIC5tb2RhbCB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLm1vZGFsLWRpYWxvZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IGF1dG87XG4gIG1hcmdpbjogMTBweDtcbn1cblxuLm1vZGFsLWNvbnRlbnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgM3B4IDlweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIGJveC1zaGFkb3c6IDAgM3B4IDlweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5tb2RhbC1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDQwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xufVxuXG4ubW9kYWwtYmFja2Ryb3AuZmFkZSB7XG4gIG9wYWNpdHk6IDA7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0wKTtcbn1cblxuLm1vZGFsLWJhY2tkcm9wLmluIHtcbiAgb3BhY2l0eTogMC41O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xufVxuXG4ubW9kYWwtaGVhZGVyIHtcbiAgcGFkZGluZzogMTVweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XG4gIG1pbi1oZWlnaHQ6IDE2LjQyODU3MTQyOXB4O1xufVxuXG4ubW9kYWwtaGVhZGVyIC5jbG9zZSB7XG4gIG1hcmdpbi10b3A6IC0ycHg7XG59XG5cbi5tb2RhbC10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xufVxuXG4ubW9kYWwtYm9keSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogMTVweDtcbn1cblxuLm1vZGFsLWZvb3RlciB7XG4gIHBhZGRpbmc6IDE1cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTVlNTtcbn1cblxuLm1vZGFsLWZvb3RlcjpiZWZvcmUsXG4ubW9kYWwtZm9vdGVyOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4ubW9kYWwtZm9vdGVyOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5tb2RhbC1mb290ZXIgLmJ0biArIC5idG4ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ubW9kYWwtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0biArIC5idG4ge1xuICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLm1vZGFsLWZvb3RlciAuYnRuLWJsb2NrICsgLmJ0bi1ibG9jayB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4ubW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTk5OTlweDtcbiAgd2lkdGg6IDUwcHg7XG4gIGhlaWdodDogNTBweDtcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5tb2RhbC1kaWFsb2cge1xuICAgIHdpZHRoOiA2MDBweDtcbiAgICBtYXJnaW46IDMwcHggYXV0bztcbiAgfVxuICAubW9kYWwtY29udGVudCB7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgfVxuICAubW9kYWwtc20ge1xuICAgIHdpZHRoOiAzMDBweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm1vZGFsLWxnIHtcbiAgICB3aWR0aDogOTAwcHg7XG4gIH1cbn1cblxuLnRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwNzA7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gIGxpbmUtYnJlYWs6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgdGV4dC1hbGlnbjogc3RhcnQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gIHdvcmQtc3BhY2luZzogbm9ybWFsO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBvcGFjaXR5OiAwO1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7XG59XG5cbi50b29sdGlwLmluIHtcbiAgb3BhY2l0eTogMC45O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9OTApO1xufVxuXG4udG9vbHRpcC50b3Age1xuICBtYXJnaW4tdG9wOiAtM3B4O1xuICBwYWRkaW5nOiA1cHggMDtcbn1cblxuLnRvb2x0aXAucmlnaHQge1xuICBtYXJnaW4tbGVmdDogM3B4O1xuICBwYWRkaW5nOiAwIDVweDtcbn1cblxuLnRvb2x0aXAuYm90dG9tIHtcbiAgbWFyZ2luLXRvcDogM3B4O1xuICBwYWRkaW5nOiA1cHggMDtcbn1cblxuLnRvb2x0aXAubGVmdCB7XG4gIG1hcmdpbi1sZWZ0OiAtM3B4O1xuICBwYWRkaW5nOiAwIDVweDtcbn1cblxuLnRvb2x0aXAtaW5uZXIge1xuICBtYXgtd2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAzcHggOHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi50b29sdGlwLWFycm93IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xufVxuXG4udG9vbHRpcC50b3AgLnRvb2x0aXAtYXJyb3cge1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDUwJTtcbiAgbWFyZ2luLWxlZnQ6IC01cHg7XG4gIGJvcmRlci13aWR0aDogNXB4IDVweCAwO1xuICBib3JkZXItdG9wLWNvbG9yOiAjMDAwO1xufVxuXG4udG9vbHRpcC50b3AtbGVmdCAudG9vbHRpcC1hcnJvdyB7XG4gIGJvdHRvbTogMDtcbiAgcmlnaHQ6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiA1cHggNXB4IDA7XG4gIGJvcmRlci10b3AtY29sb3I6ICMwMDA7XG59XG5cbi50b29sdGlwLnRvcC1yaWdodCAudG9vbHRpcC1hcnJvdyB7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDVweCA1cHggMDtcbiAgYm9yZGVyLXRvcC1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAucmlnaHQgLnRvb2x0aXAtYXJyb3cge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMDtcbiAgbWFyZ2luLXRvcDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiA1cHggNXB4IDVweCAwO1xuICBib3JkZXItcmlnaHQtY29sb3I6ICMwMDA7XG59XG5cbi50b29sdGlwLmxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDA7XG4gIG1hcmdpbi10b3A6IC01cHg7XG4gIGJvcmRlci13aWR0aDogNXB4IDAgNXB4IDVweDtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICMwMDA7XG59XG5cbi50b29sdGlwLmJvdHRvbSAudG9vbHRpcC1hcnJvdyB7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiAwIDVweCA1cHg7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDA7XG59XG5cbi50b29sdGlwLmJvdHRvbS1sZWZ0IC50b29sdGlwLWFycm93IHtcbiAgdG9wOiAwO1xuICByaWdodDogNXB4O1xuICBtYXJnaW4tdG9wOiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDAgNXB4IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAuYm90dG9tLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgdG9wOiAwO1xuICBsZWZ0OiA1cHg7XG4gIG1hcmdpbi10b3A6IC01cHg7XG4gIGJvcmRlci13aWR0aDogMCA1cHggNXB4O1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwO1xufVxuXG4ucG9wb3ZlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDYwO1xuICBkaXNwbGF5OiBub25lO1xuICBtYXgtd2lkdGg6IDI3NnB4O1xuICBwYWRkaW5nOiAxcHg7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgbGluZS1icmVhazogYXV0bztcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIHdvcmQtYnJlYWs6IG5vcm1hbDtcbiAgd29yZC1zcGFjaW5nOiBub3JtYWw7XG4gIHdvcmQtd3JhcDogbm9ybWFsO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xuICBib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuLnBvcG92ZXIudG9wIHtcbiAgbWFyZ2luLXRvcDogLTEwcHg7XG59XG5cbi5wb3BvdmVyLnJpZ2h0IHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG59XG5cbi5wb3BvdmVyLmJvdHRvbSB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbi5wb3BvdmVyLmxlZnQge1xuICBtYXJnaW4tbGVmdDogLTEwcHg7XG59XG5cbi5wb3BvdmVyLXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiA4cHggMTRweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ViZWJlYjtcbiAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7XG59XG5cbi5wb3BvdmVyLWNvbnRlbnQge1xuICBwYWRkaW5nOiA5cHggMTRweDtcbn1cblxuLnBvcG92ZXIgPiAuYXJyb3csXG4ucG9wb3ZlciA+IC5hcnJvdzphZnRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG59XG5cbi5wb3BvdmVyID4gLmFycm93IHtcbiAgYm9yZGVyLXdpZHRoOiAxMXB4O1xufVxuXG4ucG9wb3ZlciA+IC5hcnJvdzphZnRlciB7XG4gIGJvcmRlci13aWR0aDogMTBweDtcbiAgY29udGVudDogXCJcIjtcbn1cblxuLnBvcG92ZXIudG9wID4gLmFycm93IHtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTExcHg7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gIGJvcmRlci10b3AtY29sb3I6ICM5OTk5OTk7XG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIGJvdHRvbTogLTExcHg7XG59XG5cbi5wb3BvdmVyLnRvcCA+IC5hcnJvdzphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBib3R0b206IDFweDtcbiAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuICBib3JkZXItdG9wLWNvbG9yOiAjZmZmO1xufVxuXG4ucG9wb3Zlci5yaWdodCA+IC5hcnJvdyB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAtMTFweDtcbiAgbWFyZ2luLXRvcDogLTExcHg7XG4gIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICBib3JkZXItcmlnaHQtY29sb3I6ICM5OTk5OTk7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbn1cblxuLnBvcG92ZXIucmlnaHQgPiAuYXJyb3c6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgbGVmdDogMXB4O1xuICBib3R0b206IC0xMHB4O1xuICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZmZmO1xufVxuXG4ucG9wb3Zlci5ib3R0b20gPiAuYXJyb3cge1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMTFweDtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzk5OTk5OTtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgdG9wOiAtMTFweDtcbn1cblxuLnBvcG92ZXIuYm90dG9tID4gLmFycm93OmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIHRvcDogMXB4O1xuICBtYXJnaW4tbGVmdDogLTEwcHg7XG4gIGJvcmRlci10b3Atd2lkdGg6IDA7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNmZmY7XG59XG5cbi5wb3BvdmVyLmxlZnQgPiAuYXJyb3cge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IC0xMXB4O1xuICBtYXJnaW4tdG9wOiAtMTFweDtcbiAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICBib3JkZXItbGVmdC1jb2xvcjogIzk5OTk5OTtcbiAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG59XG5cbi5wb3BvdmVyLmxlZnQgPiAuYXJyb3c6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgcmlnaHQ6IDFweDtcbiAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICBib3JkZXItbGVmdC1jb2xvcjogI2ZmZjtcbiAgYm90dG9tOiAtMTBweDtcbn1cblxuLmNhcm91c2VsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uY2Fyb3VzZWwtaW5uZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiAwLjZzIGVhc2UtaW4tb3V0IGxlZnQ7XG4gIC1vLXRyYW5zaXRpb246IDAuNnMgZWFzZS1pbi1vdXQgbGVmdDtcbiAgdHJhbnNpdGlvbjogMC42cyBlYXNlLWluLW91dCBsZWZ0O1xufVxuXG4uY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbSA+IGltZyxcbi5jYXJvdXNlbC1pbm5lciA+IC5pdGVtID4gYSA+IGltZyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogYXV0bztcbiAgbGluZS1oZWlnaHQ6IDE7XG59XG5cbkBtZWRpYSBhbGwgYW5kICh0cmFuc2Zvcm0tM2QpLCAoLXdlYmtpdC10cmFuc2Zvcm0tM2QpIHtcbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0ge1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC42cyBlYXNlLWluLW91dDtcbiAgICAtbW96LXRyYW5zaXRpb246IC1tb3otdHJhbnNmb3JtIDAuNnMgZWFzZS1pbi1vdXQ7XG4gICAgLW8tdHJhbnNpdGlvbjogLW8tdHJhbnNmb3JtIDAuNnMgZWFzZS1pbi1vdXQ7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuNnMgZWFzZS1pbi1vdXQ7XG4gICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgLW1vei1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIC13ZWJraXQtcGVyc3BlY3RpdmU6IDEwMDBweDtcbiAgICAtbW96LXBlcnNwZWN0aXZlOiAxMDAwcHg7XG4gICAgcGVyc3BlY3RpdmU6IDEwMDBweDtcbiAgfVxuICAuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbS5uZXh0LFxuICAuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbS5hY3RpdmUucmlnaHQge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApO1xuICAgIGxlZnQ6IDA7XG4gIH1cbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0ucHJldixcbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0uYWN0aXZlLmxlZnQge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCk7XG4gICAgbGVmdDogMDtcbiAgfVxuICAuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbS5uZXh0LmxlZnQsXG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtLnByZXYucmlnaHQsXG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtLmFjdGl2ZSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgbGVmdDogMDtcbiAgfVxufVxuXG4uY2Fyb3VzZWwtaW5uZXIgPiAuYWN0aXZlLFxuLmNhcm91c2VsLWlubmVyID4gLm5leHQsXG4uY2Fyb3VzZWwtaW5uZXIgPiAucHJldiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uY2Fyb3VzZWwtaW5uZXIgPiAuYWN0aXZlIHtcbiAgbGVmdDogMDtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLm5leHQsXG4uY2Fyb3VzZWwtaW5uZXIgPiAucHJldiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLm5leHQge1xuICBsZWZ0OiAxMDAlO1xufVxuXG4uY2Fyb3VzZWwtaW5uZXIgPiAucHJldiB7XG4gIGxlZnQ6IC0xMDAlO1xufVxuXG4uY2Fyb3VzZWwtaW5uZXIgPiAubmV4dC5sZWZ0LFxuLmNhcm91c2VsLWlubmVyID4gLnByZXYucmlnaHQge1xuICBsZWZ0OiAwO1xufVxuXG4uY2Fyb3VzZWwtaW5uZXIgPiAuYWN0aXZlLmxlZnQge1xuICBsZWZ0OiAtMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZS5yaWdodCB7XG4gIGxlZnQ6IDEwMCU7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgd2lkdGg6IDE1JTtcbiAgb3BhY2l0eTogMC41O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xuICBmb250LXNpemU6IDIwcHg7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRleHQtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjYpO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbC5sZWZ0IHtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLCAwLCAwLCAwLjUpIDAlLCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMTAwJSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsIDAsIDAsIDAuNSkgMCUsIHJnYmEoMCwgMCwgMCwgMC4wMDAxKSAxMDAlKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNSkgMCUsIHJnYmEoMCwgMCwgMCwgMC4wMDAxKSAxMDAlKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjODAwMDAwMDAnLCBlbmRDb2xvcnN0cj0nIzAwMDAwMDAwJywgR3JhZGllbnRUeXBlPTEpO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbC5yaWdodCB7XG4gIGxlZnQ6IGF1dG87XG4gIHJpZ2h0OiAwO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMCUsIHJnYmEoMCwgMCwgMCwgMC41KSAxMDAlKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoMCwgMCwgMCwgMC4wMDAxKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjUpIDEwMCUpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC4wMDAxKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjUpIDEwMCUpO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XG4gIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyMwMDAwMDAwMCcsIGVuZENvbG9yc3RyPScjODAwMDAwMDAnLCBHcmFkaWVudFR5cGU9MSk7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sOmhvdmVyLFxuLmNhcm91c2VsLWNvbnRyb2w6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBvcGFjaXR5OiAwLjk7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT05MCk7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXYsXG4uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0LFxuLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4uY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBtYXJnaW4tdG9wOiAtMTBweDtcbiAgei1pbmRleDogNTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LFxuLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQge1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMTBweDtcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dCxcbi5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gIHJpZ2h0OiA1MCU7XG4gIG1hcmdpbi1yaWdodDogLTEwcHg7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXYsXG4uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0IHtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGZvbnQtZmFtaWx5OiBzZXJpZjtcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tcHJldjpiZWZvcmUge1xuICBjb250ZW50OiAnXFwyMDM5Jztcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dDpiZWZvcmUge1xuICBjb250ZW50OiAnXFwyMDNhJztcbn1cblxuLmNhcm91c2VsLWluZGljYXRvcnMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMTBweDtcbiAgbGVmdDogNTAlO1xuICB6LWluZGV4OiAxNTtcbiAgd2lkdGg6IDYwJTtcbiAgbWFyZ2luLWxlZnQ6IC0zMCU7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uY2Fyb3VzZWwtaW5kaWNhdG9ycyBsaSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEwcHg7XG4gIGhlaWdodDogMTBweDtcbiAgbWFyZ2luOiAxcHg7XG4gIHRleHQtaW5kZW50OiAtOTk5cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMCBcXDk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4uY2Fyb3VzZWwtaW5kaWNhdG9ycyAuYWN0aXZlIHtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTJweDtcbiAgaGVpZ2h0OiAxMnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4uY2Fyb3VzZWwtY2FwdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMTUlO1xuICByaWdodDogMTUlO1xuICBib3R0b206IDIwcHg7XG4gIHotaW5kZXg6IDEwO1xuICBwYWRkaW5nLXRvcDogMjBweDtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRleHQtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjYpO1xufVxuXG4uY2Fyb3VzZWwtY2FwdGlvbiAuYnRuIHtcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gIC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXYsXG4gIC5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQge1xuICAgIHdpZHRoOiAzMHB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBtYXJnaW4tdG9wOiAtMTVweDtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cbiAgLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gIC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXYge1xuICAgIG1hcmdpbi1sZWZ0OiAtMTVweDtcbiAgfVxuICAuY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gIC5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQge1xuICAgIG1hcmdpbi1yaWdodDogLTE1cHg7XG4gIH1cbiAgLmNhcm91c2VsLWNhcHRpb24ge1xuICAgIGxlZnQ6IDIwJTtcbiAgICByaWdodDogMjAlO1xuICAgIHBhZGRpbmctYm90dG9tOiAzMHB4O1xuICB9XG4gIC5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgICBib3R0b206IDIwcHg7XG4gIH1cbn1cblxuLmNsZWFyZml4OmJlZm9yZSxcbi5jbGVhcmZpeDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmNsZWFyZml4OmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5jZW50ZXItYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbn1cblxuLnB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQgIWltcG9ydGFudDtcbn1cblxuLnB1bGwtbGVmdCB7XG4gIGZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7XG59XG5cbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uc2hvdyB7XG4gIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG59XG5cbi5pbnZpc2libGUge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi50ZXh0LWhpZGUge1xuICBmb250OiAwLzAgYTtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogMDtcbn1cblxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLmFmZml4IHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuXG5ALW1zLXZpZXdwb3J0IHtcbiAgd2lkdGg6IGRldmljZS13aWR0aDtcbn1cblxuLnZpc2libGUteHMge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi52aXNpYmxlLXNtIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4udmlzaWJsZS1tZCB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLnZpc2libGUtbGcge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi52aXNpYmxlLXhzLWJsb2NrLFxuLnZpc2libGUteHMtaW5saW5lLFxuLnZpc2libGUteHMtaW5saW5lLWJsb2NrLFxuLnZpc2libGUtc20tYmxvY2ssXG4udmlzaWJsZS1zbS1pbmxpbmUsXG4udmlzaWJsZS1zbS1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1tZC1ibG9jayxcbi52aXNpYmxlLW1kLWlubGluZSxcbi52aXNpYmxlLW1kLWlubGluZS1ibG9jayxcbi52aXNpYmxlLWxnLWJsb2NrLFxuLnZpc2libGUtbGctaW5saW5lLFxuLnZpc2libGUtbGctaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHtcbiAgLnZpc2libGUteHMge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGFibGUudmlzaWJsZS14cyB7XG4gICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDtcbiAgfVxuICB0ci52aXNpYmxlLXhzIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDtcbiAgfVxuICB0aC52aXNpYmxlLXhzLFxuICB0ZC52aXNpYmxlLXhzIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gIC52aXNpYmxlLXhzLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkge1xuICAudmlzaWJsZS14cy1pbmxpbmUge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkge1xuICAudmlzaWJsZS14cy1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgYW5kIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC52aXNpYmxlLXNtIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUtc20ge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS1zbSB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS1zbSxcbiAgdGQudmlzaWJsZS1zbSB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgYW5kIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC52aXNpYmxlLXNtLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgYW5kIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC52aXNpYmxlLXNtLWlubGluZSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSBhbmQgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLnZpc2libGUtc20taW5saW5lLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpIHtcbiAgLnZpc2libGUtbWQge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGFibGUudmlzaWJsZS1tZCB7XG4gICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDtcbiAgfVxuICB0ci52aXNpYmxlLW1kIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDtcbiAgfVxuICB0aC52aXNpYmxlLW1kLFxuICB0ZC52aXNpYmxlLW1kIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSBhbmQgKG1heC13aWR0aDogMTE5OXB4KSB7XG4gIC52aXNpYmxlLW1kLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgYW5kIChtYXgtd2lkdGg6IDExOTlweCkge1xuICAudmlzaWJsZS1tZC1pbmxpbmUge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgYW5kIChtYXgtd2lkdGg6IDExOTlweCkge1xuICAudmlzaWJsZS1tZC1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcbiAgLnZpc2libGUtbGcge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGFibGUudmlzaWJsZS1sZyB7XG4gICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDtcbiAgfVxuICB0ci52aXNpYmxlLWxnIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDtcbiAgfVxuICB0aC52aXNpYmxlLWxnLFxuICB0ZC52aXNpYmxlLWxnIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkge1xuICAudmlzaWJsZS1sZy1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XG4gIC52aXNpYmxlLWxnLWlubGluZSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkge1xuICAudmlzaWJsZS1sZy1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkge1xuICAuaGlkZGVuLXhzIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSBhbmQgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLmhpZGRlbi1zbSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgYW5kIChtYXgtd2lkdGg6IDExOTlweCkge1xuICAuaGlkZGVuLW1kIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkge1xuICAuaGlkZGVuLWxnIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtcHJpbnQge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC52aXNpYmxlLXByaW50IHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUtcHJpbnQge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS1wcmludCxcbiAgdGQudmlzaWJsZS1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbi52aXNpYmxlLXByaW50LWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5AbWVkaWEgcHJpbnQge1xuICAudmlzaWJsZS1wcmludC1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG4udmlzaWJsZS1wcmludC1pbmxpbmUge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC52aXNpYmxlLXByaW50LWlubGluZSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtcHJpbnQtaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5AbWVkaWEgcHJpbnQge1xuICAudmlzaWJsZS1wcmludC1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC5oaWRkZW4tcHJpbnQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuIiwiLyohIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2g1YnAvaHRtbDUtYm9pbGVycGxhdGUvYmxvYi9tYXN0ZXIvc3JjL2Nzcy9tYWluLmNzcyAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUHJpbnQgc3R5bGVzLlxuLy8gSW5saW5lZCB0byBhdm9pZCB0aGUgYWRkaXRpb25hbCBIVFRQIHJlcXVlc3Q6IGg1YnAuY29tL3Jcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkBtZWRpYSBwcmludCB7XG4gICAgKixcbiAgICAqOmJlZm9yZSxcbiAgICAqOmFmdGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgICAgY29sb3I6ICMwMDAgIWltcG9ydGFudDsgLy8gQmxhY2sgcHJpbnRzIGZhc3RlcjogaDVicC5jb20vc1xuICAgICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIHRleHQtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgYSxcbiAgICBhOnZpc2l0ZWQge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICB9XG5cbiAgICBhW2hyZWZdOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCIgKFwiIGF0dHIoaHJlZikgXCIpXCI7XG4gICAgfVxuXG4gICAgYWJiclt0aXRsZV06YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiBcIiAoXCIgYXR0cih0aXRsZSkgXCIpXCI7XG4gICAgfVxuXG4gICAgLy8gRG9uJ3Qgc2hvdyBsaW5rcyB0aGF0IGFyZSBmcmFnbWVudCBpZGVudGlmaWVycyxcbiAgICAvLyBvciB1c2UgdGhlIGBqYXZhc2NyaXB0OmAgcHNldWRvIHByb3RvY29sXG4gICAgYVtocmVmXj1cIiNcIl06YWZ0ZXIsXG4gICAgYVtocmVmXj1cImphdmFzY3JpcHQ6XCJdOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCJcIjtcbiAgICB9XG5cbiAgICBwcmUsXG4gICAgYmxvY2txdW90ZSB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7XG4gICAgICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICB9XG5cbiAgICB0aGVhZCB7XG4gICAgICAgIGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cDsgLy8gaDVicC5jb20vdFxuICAgIH1cblxuICAgIHRyLFxuICAgIGltZyB7XG4gICAgICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICB9XG5cbiAgICBpbWcge1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICBwLFxuICAgIGgyLFxuICAgIGgzIHtcbiAgICAgICAgb3JwaGFuczogMztcbiAgICAgICAgd2lkb3dzOiAzO1xuICAgIH1cblxuICAgIGgyLFxuICAgIGgzIHtcbiAgICAgICAgcGFnZS1icmVhay1hZnRlcjogYXZvaWQ7XG4gICAgfVxuXG4gICAgLy8gQm9vdHN0cmFwIHNwZWNpZmljIGNoYW5nZXMgc3RhcnRcblxuICAgIC8vIEJvb3RzdHJhcCBjb21wb25lbnRzXG4gICAgLm5hdmJhciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5idG4sXG4gICAgLmRyb3B1cCA+IC5idG4ge1xuICAgICAgICA+IC5jYXJldCB7XG4gICAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmxhYmVsIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcbiAgICB9XG5cbiAgICAudGFibGUge1xuICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7XG5cbiAgICAgICAgdGQsXG4gICAgICAgIHRoIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFibGUtYm9yZGVyZWQge1xuICAgICAgICB0aCxcbiAgICAgICAgdGQge1xuICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZCAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm9vdHN0cmFwIHNwZWNpZmljIGNoYW5nZXMgZW5kXG59XG4iLCIvL1xuLy8gU2NhZmZvbGRpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gUmVzZXQgdGhlIGJveC1zaXppbmdcbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyByZXNldCBtYXkgY2F1c2UgY29uZmxpY3RzIHdpdGggc29tZSB0aGlyZC1wYXJ0eSB3aWRnZXRzLlxuLy8gRm9yIHJlY29tbWVuZGF0aW9ucyBvbiByZXNvbHZpbmcgc3VjaCBjb25mbGljdHMsIHNlZVxuLy8gaHR0cDovL2dldGJvb3RzdHJhcC5jb20vZ2V0dGluZy1zdGFydGVkLyN0aGlyZC1ib3gtc2l6aW5nXG4qIHtcbiAgQGluY2x1ZGUgYm94LXNpemluZyhib3JkZXItYm94KTtcbn1cbio6YmVmb3JlLFxuKjphZnRlciB7XG4gIEBpbmNsdWRlIGJveC1zaXppbmcoYm9yZGVyLWJveCk7XG59XG5cblxuLy8gQm9keSByZXNldFxuXG5odG1sIHtcbiAgZm9udC1zaXplOiAxMHB4O1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG59XG5cbmJvZHkge1xuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWJhc2U7XG4gIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1iYXNlO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiAkdGV4dC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmc7XG59XG5cbi8vIFJlc2V0IGZvbnRzIGZvciByZWxldmFudCBlbGVtZW50c1xuaW5wdXQsXG5idXR0b24sXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xufVxuXG5cbi8vIExpbmtzXG5cbmEge1xuICBjb2xvcjogJGxpbmstY29sb3I7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBjb2xvcjogJGxpbmstaG92ZXItY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiAkbGluay1ob3Zlci1kZWNvcmF0aW9uO1xuICB9XG5cbiAgJjpmb2N1cyB7XG4gICAgQGluY2x1ZGUgdGFiLWZvY3VzO1xuICB9XG59XG5cblxuLy8gRmlndXJlc1xuLy9cbi8vIFdlIHJlc2V0IHRoaXMgaGVyZSBiZWNhdXNlIHByZXZpb3VzbHkgTm9ybWFsaXplIGhhZCBubyBgZmlndXJlYCBtYXJnaW5zLiBUaGlzXG4vLyBlbnN1cmVzIHdlIGRvbid0IGJyZWFrIGFueW9uZSdzIHVzZSBvZiB0aGUgZWxlbWVudC5cblxuZmlndXJlIHtcbiAgbWFyZ2luOiAwO1xufVxuXG5cbi8vIEltYWdlc1xuXG5pbWcge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4vLyBSZXNwb25zaXZlIGltYWdlcyAoZW5zdXJlIGltYWdlcyBkb24ndCBzY2FsZSBiZXlvbmQgdGhlaXIgcGFyZW50cylcbi5pbWctcmVzcG9uc2l2ZSB7XG4gIEBpbmNsdWRlIGltZy1yZXNwb25zaXZlO1xufVxuXG4vLyBSb3VuZGVkIGNvcm5lcnNcbi5pbWctcm91bmRlZCB7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWxhcmdlO1xufVxuXG4vLyBJbWFnZSB0aHVtYm5haWxzXG4vL1xuLy8gSGVhZHMgdXAhIFRoaXMgaXMgbWl4aW4tZWQgaW50byB0aHVtYm5haWxzLmxlc3MgZm9yIGAudGh1bWJuYWlsYC5cbi5pbWctdGh1bWJuYWlsIHtcbiAgcGFkZGluZzogJHRodW1ibmFpbC1wYWRkaW5nO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGJhY2tncm91bmQtY29sb3I6ICR0aHVtYm5haWwtYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkICR0aHVtYm5haWwtYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiAkdGh1bWJuYWlsLWJvcmRlci1yYWRpdXM7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24oYWxsIC4ycyBlYXNlLWluLW91dCk7XG5cbiAgLy8gS2VlcCB0aGVtIGF0IG1vc3QgMTAwJSB3aWRlXG4gIEBpbmNsdWRlIGltZy1yZXNwb25zaXZlKGlubGluZS1ibG9jayk7XG59XG5cbi8vIFBlcmZlY3QgY2lyY2xlXG4uaW1nLWNpcmNsZSB7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTsgLy8gc2V0IHJhZGl1cyBpbiBwZXJjZW50c1xufVxuXG5cbi8vIEhvcml6b250YWwgcnVsZXNcblxuaHIge1xuICBtYXJnaW4tdG9wOiAgICAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgYm9yZGVyOiAwO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgJGhyLWJvcmRlcjtcbn1cblxuXG4vLyBPbmx5IGRpc3BsYXkgY29udGVudCB0byBzY3JlZW4gcmVhZGVyc1xuLy9cbi8vIFNlZTogaHR0cDovL2ExMXlwcm9qZWN0LmNvbS9wb3N0cy9ob3ctdG8taGlkZS1jb250ZW50L1xuXG4uc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwLDAsMCwwKTtcbiAgYm9yZGVyOiAwO1xufVxuXG4vLyBVc2UgaW4gY29uanVuY3Rpb24gd2l0aCAuc3Itb25seSB0byBvbmx5IGRpc3BsYXkgY29udGVudCB3aGVuIGl0J3MgZm9jdXNlZC5cbi8vIFVzZWZ1bCBmb3IgXCJTa2lwIHRvIG1haW4gY29udGVudFwiIGxpbmtzOyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9OT1RFLVdDQUcyMC1URUNIUy0yMDEzMDkwNS9HMVxuLy8gQ3JlZGl0OiBIVE1MNSBCb2lsZXJwbGF0ZVxuXG4uc3Itb25seS1mb2N1c2FibGUge1xuICAmOmFjdGl2ZSxcbiAgJjpmb2N1cyB7XG4gICAgcG9zaXRpb246IHN0YXRpYztcbiAgICB3aWR0aDogYXV0bztcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgbWFyZ2luOiAwO1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIGNsaXA6IGF1dG87XG4gIH1cbn1cblxuXG4vLyBpT1MgXCJjbGlja2FibGUgZWxlbWVudHNcIiBmaXggZm9yIHJvbGU9XCJidXR0b25cIlxuLy9cbi8vIEZpeGVzIFwiY2xpY2thYmlsaXR5XCIgaXNzdWUgKGFuZCBtb3JlIGdlbmVyYWxseSwgdGhlIGZpcmluZyBvZiBldmVudHMgc3VjaCBhcyBmb2N1cyBhcyB3ZWxsKVxuLy8gZm9yIHRyYWRpdGlvbmFsbHkgbm9uLWZvY3VzYWJsZSBlbGVtZW50cyB3aXRoIHJvbGU9XCJidXR0b25cIlxuLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9jbGljayNTYWZhcmlfTW9iaWxlXG5cbltyb2xlPVwiYnV0dG9uXCJdIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuIiwiLy8gVmVuZG9yIFByZWZpeGVzXG4vL1xuLy8gQWxsIHZlbmRvciBtaXhpbnMgYXJlIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMi4wIGR1ZSB0byB0aGUgaW50cm9kdWN0aW9uIG9mXG4vLyBBdXRvcHJlZml4ZXIgaW4gb3VyIEdydW50ZmlsZS4gVGhleSB3aWxsIGJlIHJlbW92ZWQgaW4gdjQuXG5cbi8vIC0gQW5pbWF0aW9uc1xuLy8gLSBCYWNrZmFjZSB2aXNpYmlsaXR5XG4vLyAtIEJveCBzaGFkb3dcbi8vIC0gQm94IHNpemluZ1xuLy8gLSBDb250ZW50IGNvbHVtbnNcbi8vIC0gSHlwaGVuc1xuLy8gLSBQbGFjZWhvbGRlciB0ZXh0XG4vLyAtIFRyYW5zZm9ybWF0aW9uc1xuLy8gLSBUcmFuc2l0aW9uc1xuLy8gLSBVc2VyIFNlbGVjdFxuXG5cbi8vIEFuaW1hdGlvbnNcbkBtaXhpbiBhbmltYXRpb24oJGFuaW1hdGlvbikge1xuICAtd2Via2l0LWFuaW1hdGlvbjogJGFuaW1hdGlvbjtcbiAgICAgICAtby1hbmltYXRpb246ICRhbmltYXRpb247XG4gICAgICAgICAgYW5pbWF0aW9uOiAkYW5pbWF0aW9uO1xufVxuQG1peGluIGFuaW1hdGlvbi1uYW1lKCRuYW1lKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ICRuYW1lO1xuICAgICAgICAgIGFuaW1hdGlvbi1uYW1lOiAkbmFtZTtcbn1cbkBtaXhpbiBhbmltYXRpb24tZHVyYXRpb24oJGR1cmF0aW9uKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAkZHVyYXRpb247XG4gICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAkZHVyYXRpb247XG59XG5AbWl4aW4gYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbigkdGltaW5nLWZ1bmN0aW9uKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogJHRpbWluZy1mdW5jdGlvbjtcbiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdGltaW5nLWZ1bmN0aW9uO1xufVxuQG1peGluIGFuaW1hdGlvbi1kZWxheSgkZGVsYXkpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6ICRkZWxheTtcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6ICRkZWxheTtcbn1cbkBtaXhpbiBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50KCRpdGVyYXRpb24tY291bnQpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAkaXRlcmF0aW9uLWNvdW50O1xuICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6ICRpdGVyYXRpb24tY291bnQ7XG59XG5AbWl4aW4gYW5pbWF0aW9uLWRpcmVjdGlvbigkZGlyZWN0aW9uKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogJGRpcmVjdGlvbjtcbiAgICAgICAgICBhbmltYXRpb24tZGlyZWN0aW9uOiAkZGlyZWN0aW9uO1xufVxuQG1peGluIGFuaW1hdGlvbi1maWxsLW1vZGUoJGZpbGwtbW9kZSkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6ICRmaWxsLW1vZGU7XG4gICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogJGZpbGwtbW9kZTtcbn1cblxuLy8gQmFja2ZhY2UgdmlzaWJpbGl0eVxuLy8gUHJldmVudCBicm93c2VycyBmcm9tIGZsaWNrZXJpbmcgd2hlbiB1c2luZyBDU1MgM0QgdHJhbnNmb3Jtcy5cbi8vIERlZmF1bHQgdmFsdWUgaXMgYHZpc2libGVgLCBidXQgY2FuIGJlIGNoYW5nZWQgdG8gYGhpZGRlbmBcblxuQG1peGluIGJhY2tmYWNlLXZpc2liaWxpdHkoJHZpc2liaWxpdHkpe1xuICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6ICR2aXNpYmlsaXR5O1xuICAgICAtbW96LWJhY2tmYWNlLXZpc2liaWxpdHk6ICR2aXNpYmlsaXR5O1xuICAgICAgICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6ICR2aXNpYmlsaXR5O1xufVxuXG4vLyBEcm9wIHNoYWRvd3Ncbi8vXG4vLyBOb3RlOiBEZXByZWNhdGVkIGAuYm94LXNoYWRvdygpYCBhcyBvZiB2My4xLjAgc2luY2UgYWxsIG9mIEJvb3RzdHJhcCdzXG4vLyBzdXBwb3J0ZWQgYnJvd3NlcnMgdGhhdCBoYXZlIGJveCBzaGFkb3cgY2FwYWJpbGl0aWVzIG5vdyBzdXBwb3J0IGl0LlxuXG5AbWl4aW4gYm94LXNoYWRvdygkc2hhZG93Li4uKSB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogJHNoYWRvdzsgLy8gaU9TIDw0LjMgJiBBbmRyb2lkIDw0LjFcbiAgICAgICAgICBib3gtc2hhZG93OiAkc2hhZG93O1xufVxuXG4vLyBCb3ggc2l6aW5nXG5AbWl4aW4gYm94LXNpemluZygkYm94bW9kZWwpIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiAkYm94bW9kZWw7XG4gICAgIC1tb3otYm94LXNpemluZzogJGJveG1vZGVsO1xuICAgICAgICAgIGJveC1zaXppbmc6ICRib3htb2RlbDtcbn1cblxuLy8gQ1NTMyBDb250ZW50IENvbHVtbnNcbkBtaXhpbiBjb250ZW50LWNvbHVtbnMoJGNvbHVtbi1jb3VudCwgJGNvbHVtbi1nYXA6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICAtd2Via2l0LWNvbHVtbi1jb3VudDogJGNvbHVtbi1jb3VudDtcbiAgICAgLW1vei1jb2x1bW4tY291bnQ6ICRjb2x1bW4tY291bnQ7XG4gICAgICAgICAgY29sdW1uLWNvdW50OiAkY29sdW1uLWNvdW50O1xuICAtd2Via2l0LWNvbHVtbi1nYXA6ICRjb2x1bW4tZ2FwO1xuICAgICAtbW96LWNvbHVtbi1nYXA6ICRjb2x1bW4tZ2FwO1xuICAgICAgICAgIGNvbHVtbi1nYXA6ICRjb2x1bW4tZ2FwO1xufVxuXG4vLyBPcHRpb25hbCBoeXBoZW5hdGlvblxuQG1peGluIGh5cGhlbnMoJG1vZGU6IGF1dG8pIHtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAtd2Via2l0LWh5cGhlbnM6ICRtb2RlO1xuICAgICAtbW96LWh5cGhlbnM6ICRtb2RlO1xuICAgICAgLW1zLWh5cGhlbnM6ICRtb2RlOyAvLyBJRTEwK1xuICAgICAgIC1vLWh5cGhlbnM6ICRtb2RlO1xuICAgICAgICAgIGh5cGhlbnM6ICRtb2RlO1xufVxuXG4vLyBQbGFjZWhvbGRlciB0ZXh0XG5AbWl4aW4gcGxhY2Vob2xkZXIoJGNvbG9yOiAkaW5wdXQtY29sb3ItcGxhY2Vob2xkZXIpIHtcbiAgLy8gRmlyZWZveFxuICAmOjotbW96LXBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogJGNvbG9yO1xuICAgIG9wYWNpdHk6IDE7IC8vIE92ZXJyaWRlIEZpcmVmb3gncyB1bnVzdWFsIGRlZmF1bHQgb3BhY2l0eTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzExNTI2XG4gIH1cbiAgJjotbXMtaW5wdXQtcGxhY2Vob2xkZXIgeyBjb2xvcjogJGNvbG9yOyB9IC8vIEludGVybmV0IEV4cGxvcmVyIDEwK1xuICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyICB7IGNvbG9yOiAkY29sb3I7IH0gLy8gU2FmYXJpIGFuZCBDaHJvbWVcbn1cblxuLy8gVHJhbnNmb3JtYXRpb25zXG5AbWl4aW4gc2NhbGUoJHJhdGlvLi4uKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgkcmF0aW8pO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoJHJhdGlvKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHNjYWxlKCRyYXRpbyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgkcmF0aW8pO1xufVxuXG5AbWl4aW4gc2NhbGVYKCRyYXRpbykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKCRyYXRpbyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiBzY2FsZVgoJHJhdGlvKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHNjYWxlWCgkcmF0aW8pO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKCRyYXRpbyk7XG59XG5AbWl4aW4gc2NhbGVZKCRyYXRpbykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKCRyYXRpbyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiBzY2FsZVkoJHJhdGlvKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHNjYWxlWSgkcmF0aW8pO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVZKCRyYXRpbyk7XG59XG5AbWl4aW4gc2tldygkeCwgJHkpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKCR4KSBza2V3WSgkeSk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiBza2V3WCgkeCkgc2tld1koJHkpOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy80ODg1OyBJRTkrXG4gICAgICAgLW8tdHJhbnNmb3JtOiBza2V3WCgkeCkgc2tld1koJHkpO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2tld1goJHgpIHNrZXdZKCR5KTtcbn1cbkBtaXhpbiB0cmFuc2xhdGUoJHgsICR5KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoJHgsICR5KTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZSgkeCwgJHkpOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogdHJhbnNsYXRlKCR4LCAkeSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoJHgsICR5KTtcbn1cbkBtaXhpbiB0cmFuc2xhdGUzZCgkeCwgJHksICR6KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgkeCwgJHksICR6KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCR4LCAkeSwgJHopO1xufVxuQG1peGluIHJvdGF0ZSgkZGVncmVlcykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKCRkZWdyZWVzKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgkZGVncmVlcyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiByb3RhdGUoJGRlZ3JlZXMpO1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKCRkZWdyZWVzKTtcbn1cbkBtaXhpbiByb3RhdGVYKCRkZWdyZWVzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGVYKCRkZWdyZWVzKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZVgoJGRlZ3JlZXMpOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogcm90YXRlWCgkZGVncmVlcyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGVYKCRkZWdyZWVzKTtcbn1cbkBtaXhpbiByb3RhdGVZKCRkZWdyZWVzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGVZKCRkZWdyZWVzKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZVkoJGRlZ3JlZXMpOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogcm90YXRlWSgkZGVncmVlcyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGVZKCRkZWdyZWVzKTtcbn1cbkBtaXhpbiBwZXJzcGVjdGl2ZSgkcGVyc3BlY3RpdmUpIHtcbiAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogJHBlcnNwZWN0aXZlO1xuICAgICAtbW96LXBlcnNwZWN0aXZlOiAkcGVyc3BlY3RpdmU7XG4gICAgICAgICAgcGVyc3BlY3RpdmU6ICRwZXJzcGVjdGl2ZTtcbn1cbkBtaXhpbiBwZXJzcGVjdGl2ZS1vcmlnaW4oJHBlcnNwZWN0aXZlKSB7XG4gIC13ZWJraXQtcGVyc3BlY3RpdmUtb3JpZ2luOiAkcGVyc3BlY3RpdmU7XG4gICAgIC1tb3otcGVyc3BlY3RpdmUtb3JpZ2luOiAkcGVyc3BlY3RpdmU7XG4gICAgICAgICAgcGVyc3BlY3RpdmUtb3JpZ2luOiAkcGVyc3BlY3RpdmU7XG59XG5AbWl4aW4gdHJhbnNmb3JtLW9yaWdpbigkb3JpZ2luKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogJG9yaWdpbjtcbiAgICAgLW1vei10cmFuc2Zvcm0tb3JpZ2luOiAkb3JpZ2luO1xuICAgICAgLW1zLXRyYW5zZm9ybS1vcmlnaW46ICRvcmlnaW47IC8vIElFOSBvbmx5XG4gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogJG9yaWdpbjtcbn1cblxuXG4vLyBUcmFuc2l0aW9uc1xuXG5AbWl4aW4gdHJhbnNpdGlvbigkdHJhbnNpdGlvbi4uLikge1xuICAtd2Via2l0LXRyYW5zaXRpb246ICR0cmFuc2l0aW9uO1xuICAgICAgIC1vLXRyYW5zaXRpb246ICR0cmFuc2l0aW9uO1xuICAgICAgICAgIHRyYW5zaXRpb246ICR0cmFuc2l0aW9uO1xufVxuQG1peGluIHRyYW5zaXRpb24tcHJvcGVydHkoJHRyYW5zaXRpb24tcHJvcGVydHkuLi4pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAkdHJhbnNpdGlvbi1wcm9wZXJ0eTtcbiAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiAkdHJhbnNpdGlvbi1wcm9wZXJ0eTtcbn1cbkBtaXhpbiB0cmFuc2l0aW9uLWRlbGF5KCR0cmFuc2l0aW9uLWRlbGF5KSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTogJHRyYW5zaXRpb24tZGVsYXk7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogJHRyYW5zaXRpb24tZGVsYXk7XG59XG5AbWl4aW4gdHJhbnNpdGlvbi1kdXJhdGlvbigkdHJhbnNpdGlvbi1kdXJhdGlvbi4uLikge1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246ICR0cmFuc2l0aW9uLWR1cmF0aW9uO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246ICR0cmFuc2l0aW9uLWR1cmF0aW9uO1xufVxuQG1peGluIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uKCR0aW1pbmctZnVuY3Rpb24pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogJHRpbWluZy1mdW5jdGlvbjtcbiAgICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogJHRpbWluZy1mdW5jdGlvbjtcbn1cbkBtaXhpbiB0cmFuc2l0aW9uLXRyYW5zZm9ybSgkdHJhbnNpdGlvbi4uLikge1xuICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtICR0cmFuc2l0aW9uO1xuICAgICAtbW96LXRyYW5zaXRpb246IC1tb3otdHJhbnNmb3JtICR0cmFuc2l0aW9uO1xuICAgICAgIC1vLXRyYW5zaXRpb246IC1vLXRyYW5zZm9ybSAkdHJhbnNpdGlvbjtcbiAgICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gJHRyYW5zaXRpb247XG59XG5cblxuLy8gVXNlciBzZWxlY3Rcbi8vIEZvciBzZWxlY3RpbmcgdGV4dCBvbiB0aGUgcGFnZVxuXG5AbWl4aW4gdXNlci1zZWxlY3QoJHNlbGVjdCkge1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiAkc2VsZWN0O1xuICAgICAtbW96LXVzZXItc2VsZWN0OiAkc2VsZWN0O1xuICAgICAgLW1zLXVzZXItc2VsZWN0OiAkc2VsZWN0OyAvLyBJRTEwK1xuICAgICAgICAgIHVzZXItc2VsZWN0OiAkc2VsZWN0O1xufVxuIiwiJGJvb3RzdHJhcC1zYXNzLWFzc2V0LWhlbHBlcjogZmFsc2UgIWRlZmF1bHQ7XG4vL1xuLy8gVmFyaWFibGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vPT0gQ29sb3JzXG4vL1xuLy8jIyBHcmF5IGFuZCBicmFuZCBjb2xvcnMgZm9yIHVzZSBhY3Jvc3MgQm9vdHN0cmFwLlxuXG4kZ3JheS1iYXNlOiAgICAgICAgICAgICAgIzAwMCAhZGVmYXVsdDtcbiRncmF5LWRhcmtlcjogICAgICAgICAgICBsaWdodGVuKCRncmF5LWJhc2UsIDEzLjUlKSAhZGVmYXVsdDsgLy8gIzIyMlxuJGdyYXktZGFyazogICAgICAgICAgICAgIGxpZ2h0ZW4oJGdyYXktYmFzZSwgMjAlKSAhZGVmYXVsdDsgICAvLyAjMzMzXG4kZ3JheTogICAgICAgICAgICAgICAgICAgbGlnaHRlbigkZ3JheS1iYXNlLCAzMy41JSkgIWRlZmF1bHQ7IC8vICM1NTVcbiRncmF5LWxpZ2h0OiAgICAgICAgICAgICBsaWdodGVuKCRncmF5LWJhc2UsIDQ2LjclKSAhZGVmYXVsdDsgLy8gIzc3N1xuJGdyYXktbGlnaHRlcjogICAgICAgICAgIGxpZ2h0ZW4oJGdyYXktYmFzZSwgOTMuNSUpICFkZWZhdWx0OyAvLyAjZWVlXG5cbiRicmFuZC1wcmltYXJ5OiAgICAgICAgIGRhcmtlbigjNDI4YmNhLCA2LjUlKSAhZGVmYXVsdDsgLy8gIzMzN2FiN1xuJGJyYW5kLXN1Y2Nlc3M6ICAgICAgICAgIzVjYjg1YyAhZGVmYXVsdDtcbiRicmFuZC1pbmZvOiAgICAgICAgICAgICM1YmMwZGUgIWRlZmF1bHQ7XG4kYnJhbmQtd2FybmluZzogICAgICAgICAjZjBhZDRlICFkZWZhdWx0O1xuJGJyYW5kLWRhbmdlcjogICAgICAgICAgI2Q5NTM0ZiAhZGVmYXVsdDtcblxuXG4vLz09IFNjYWZmb2xkaW5nXG4vL1xuLy8jIyBTZXR0aW5ncyBmb3Igc29tZSBvZiB0aGUgbW9zdCBnbG9iYWwgc3R5bGVzLlxuXG4vLyoqIEJhY2tncm91bmQgY29sb3IgZm9yIGA8Ym9keT5gLlxuJGJvZHktYmc6ICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogR2xvYmFsIHRleHQgY29sb3Igb24gYDxib2R5PmAuXG4kdGV4dC1jb2xvcjogICAgICAgICAgICAkZ3JheS1kYXJrICFkZWZhdWx0O1xuXG4vLyoqIEdsb2JhbCB0ZXh0dWFsIGxpbmsgY29sb3IuXG4kbGluay1jb2xvcjogICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogTGluayBob3ZlciBjb2xvciBzZXQgdmlhIGBkYXJrZW4oKWAgZnVuY3Rpb24uXG4kbGluay1ob3Zlci1jb2xvcjogICAgICBkYXJrZW4oJGxpbmstY29sb3IsIDE1JSkgIWRlZmF1bHQ7XG4vLyoqIExpbmsgaG92ZXIgZGVjb3JhdGlvbi5cbiRsaW5rLWhvdmVyLWRlY29yYXRpb246IHVuZGVybGluZSAhZGVmYXVsdDtcblxuXG4vLz09IFR5cG9ncmFwaHlcbi8vXG4vLyMjIEZvbnQsIGxpbmUtaGVpZ2h0LCBhbmQgY29sb3IgZm9yIGJvZHkgdGV4dCwgaGVhZGluZ3MsIGFuZCBtb3JlLlxuXG4kZm9udC1mYW1pbHktc2Fucy1zZXJpZjogIFwiSGVsdmV0aWNhIE5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiAhZGVmYXVsdDtcbiRmb250LWZhbWlseS1zZXJpZjogICAgICAgR2VvcmdpYSwgXCJUaW1lcyBOZXcgUm9tYW5cIiwgVGltZXMsIHNlcmlmICFkZWZhdWx0O1xuLy8qKiBEZWZhdWx0IG1vbm9zcGFjZSBmb250cyBmb3IgYDxjb2RlPmAsIGA8a2JkPmAsIGFuZCBgPHByZT5gLlxuJGZvbnQtZmFtaWx5LW1vbm9zcGFjZTogICBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgXCJDb3VyaWVyIE5ld1wiLCBtb25vc3BhY2UgIWRlZmF1bHQ7XG4kZm9udC1mYW1pbHktYmFzZTogICAgICAgICRmb250LWZhbWlseS1zYW5zLXNlcmlmICFkZWZhdWx0O1xuXG4kZm9udC1zaXplLWJhc2U6ICAgICAgICAgIDE0cHggIWRlZmF1bHQ7XG4kZm9udC1zaXplLWxhcmdlOiAgICAgICAgIGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDEuMjUpKSAhZGVmYXVsdDsgLy8gfjE4cHhcbiRmb250LXNpemUtc21hbGw6ICAgICAgICAgY2VpbCgoJGZvbnQtc2l6ZS1iYXNlICogMC44NSkpICFkZWZhdWx0OyAvLyB+MTJweFxuXG4kZm9udC1zaXplLWgxOiAgICAgICAgICAgIGZsb29yKCgkZm9udC1zaXplLWJhc2UgKiAyLjYpKSAhZGVmYXVsdDsgLy8gfjM2cHhcbiRmb250LXNpemUtaDI6ICAgICAgICAgICAgZmxvb3IoKCRmb250LXNpemUtYmFzZSAqIDIuMTUpKSAhZGVmYXVsdDsgLy8gfjMwcHhcbiRmb250LXNpemUtaDM6ICAgICAgICAgICAgY2VpbCgoJGZvbnQtc2l6ZS1iYXNlICogMS43KSkgIWRlZmF1bHQ7IC8vIH4yNHB4XG4kZm9udC1zaXplLWg0OiAgICAgICAgICAgIGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDEuMjUpKSAhZGVmYXVsdDsgLy8gfjE4cHhcbiRmb250LXNpemUtaDU6ICAgICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICFkZWZhdWx0O1xuJGZvbnQtc2l6ZS1oNjogICAgICAgICAgICBjZWlsKCgkZm9udC1zaXplLWJhc2UgKiAwLjg1KSkgIWRlZmF1bHQ7IC8vIH4xMnB4XG5cbi8vKiogVW5pdC1sZXNzIGBsaW5lLWhlaWdodGAgZm9yIHVzZSBpbiBjb21wb25lbnRzIGxpa2UgYnV0dG9ucy5cbiRsaW5lLWhlaWdodC1iYXNlOiAgICAgICAgMS40Mjg1NzE0MjkgIWRlZmF1bHQ7IC8vIDIwLzE0XG4vLyoqIENvbXB1dGVkIFwibGluZS1oZWlnaHRcIiAoYGZvbnQtc2l6ZWAgKiBgbGluZS1oZWlnaHRgKSBmb3IgdXNlIHdpdGggYG1hcmdpbmAsIGBwYWRkaW5nYCwgZXRjLlxuJGxpbmUtaGVpZ2h0LWNvbXB1dGVkOiAgICBmbG9vcigoJGZvbnQtc2l6ZS1iYXNlICogJGxpbmUtaGVpZ2h0LWJhc2UpKSAhZGVmYXVsdDsgLy8gfjIwcHhcblxuLy8qKiBCeSBkZWZhdWx0LCB0aGlzIGluaGVyaXRzIGZyb20gdGhlIGA8Ym9keT5gLlxuJGhlYWRpbmdzLWZvbnQtZmFtaWx5OiAgICBpbmhlcml0ICFkZWZhdWx0O1xuJGhlYWRpbmdzLWZvbnQtd2VpZ2h0OiAgICA1MDAgIWRlZmF1bHQ7XG4kaGVhZGluZ3MtbGluZS1oZWlnaHQ6ICAgIDEuMSAhZGVmYXVsdDtcbiRoZWFkaW5ncy1jb2xvcjogICAgICAgICAgaW5oZXJpdCAhZGVmYXVsdDtcblxuXG4vLz09IEljb25vZ3JhcGh5XG4vL1xuLy8jIyBTcGVjaWZ5IGN1c3RvbSBsb2NhdGlvbiBhbmQgZmlsZW5hbWUgb2YgdGhlIGluY2x1ZGVkIEdseXBoaWNvbnMgaWNvbiBmb250LiBVc2VmdWwgZm9yIHRob3NlIGluY2x1ZGluZyBCb290c3RyYXAgdmlhIEJvd2VyLlxuXG4vLyoqIExvYWQgZm9udHMgZnJvbSB0aGlzIGRpcmVjdG9yeS5cblxuLy8gW2NvbnZlcnRlcl0gSWYgJGJvb3RzdHJhcC1zYXNzLWFzc2V0LWhlbHBlciBpZiB1c2VkLCBwcm92aWRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGFzc2V0cyBsb2FkIHBhdGguXG4vLyBbY29udmVydGVyXSBUaGlzIGlzIGJlY2F1c2Ugc29tZSBhc3NldCBoZWxwZXJzLCBzdWNoIGFzIFNwcm9ja2V0cywgZG8gbm90IHdvcmsgd2l0aCBmaWxlLXJlbGF0aXZlIHBhdGhzLlxuJGljb24tZm9udC1wYXRoOiBpZigkYm9vdHN0cmFwLXNhc3MtYXNzZXQtaGVscGVyLCBcImJvb3RzdHJhcC9cIiwgXCIuLi9mb250cy9ib290c3RyYXAvXCIpICFkZWZhdWx0O1xuXG4vLyoqIEZpbGUgbmFtZSBmb3IgYWxsIGZvbnQgZmlsZXMuXG4kaWNvbi1mb250LW5hbWU6ICAgICAgICAgIFwiZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhclwiICFkZWZhdWx0O1xuLy8qKiBFbGVtZW50IElEIHdpdGhpbiBTVkcgaWNvbiBmaWxlLlxuJGljb24tZm9udC1zdmctaWQ6ICAgICAgICBcImdseXBoaWNvbnNfaGFsZmxpbmdzcmVndWxhclwiICFkZWZhdWx0O1xuXG5cbi8vPT0gQ29tcG9uZW50c1xuLy9cbi8vIyMgRGVmaW5lIGNvbW1vbiBwYWRkaW5nIGFuZCBib3JkZXIgcmFkaXVzIHNpemVzIGFuZCBtb3JlLiBWYWx1ZXMgYmFzZWQgb24gMTRweCB0ZXh0IGFuZCAxLjQyOCBsaW5lLWhlaWdodCAofjIwcHggdG8gc3RhcnQpLlxuXG4kcGFkZGluZy1iYXNlLXZlcnRpY2FsOiAgICAgNnB4ICFkZWZhdWx0O1xuJHBhZGRpbmctYmFzZS1ob3Jpem9udGFsOiAgIDEycHggIWRlZmF1bHQ7XG5cbiRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsOiAgICAxMHB4ICFkZWZhdWx0O1xuJHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDogIDE2cHggIWRlZmF1bHQ7XG5cbiRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsOiAgICA1cHggIWRlZmF1bHQ7XG4kcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsOiAgMTBweCAhZGVmYXVsdDtcblxuJHBhZGRpbmcteHMtdmVydGljYWw6ICAgICAgIDFweCAhZGVmYXVsdDtcbiRwYWRkaW5nLXhzLWhvcml6b250YWw6ICAgICA1cHggIWRlZmF1bHQ7XG5cbiRsaW5lLWhlaWdodC1sYXJnZTogICAgICAgICAxLjMzMzMzMzMgIWRlZmF1bHQ7IC8vIGV4dHJhIGRlY2ltYWxzIGZvciBXaW4gOC4xIENocm9tZVxuJGxpbmUtaGVpZ2h0LXNtYWxsOiAgICAgICAgIDEuNSAhZGVmYXVsdDtcblxuJGJvcmRlci1yYWRpdXMtYmFzZTogICAgICAgIDRweCAhZGVmYXVsdDtcbiRib3JkZXItcmFkaXVzLWxhcmdlOiAgICAgICA2cHggIWRlZmF1bHQ7XG4kYm9yZGVyLXJhZGl1cy1zbWFsbDogICAgICAgM3B4ICFkZWZhdWx0O1xuXG4vLyoqIEdsb2JhbCBjb2xvciBmb3IgYWN0aXZlIGl0ZW1zIChlLmcuLCBuYXZzIG9yIGRyb3Bkb3ducykuXG4kY29tcG9uZW50LWFjdGl2ZS1jb2xvcjogICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogR2xvYmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGFjdGl2ZSBpdGVtcyAoZS5nLiwgbmF2cyBvciBkcm9wZG93bnMpLlxuJGNvbXBvbmVudC1hY3RpdmUtYmc6ICAgICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuXG4vLyoqIFdpZHRoIG9mIHRoZSBgYm9yZGVyYCBmb3IgZ2VuZXJhdGluZyBjYXJldHMgdGhhdCBpbmRpY2F0b3IgZHJvcGRvd25zLlxuJGNhcmV0LXdpZHRoLWJhc2U6ICAgICAgICAgIDRweCAhZGVmYXVsdDtcbi8vKiogQ2FyZXRzIGluY3JlYXNlIHNsaWdodGx5IGluIHNpemUgZm9yIGxhcmdlciBjb21wb25lbnRzLlxuJGNhcmV0LXdpZHRoLWxhcmdlOiAgICAgICAgIDVweCAhZGVmYXVsdDtcblxuXG4vLz09IFRhYmxlc1xuLy9cbi8vIyMgQ3VzdG9taXplcyB0aGUgYC50YWJsZWAgY29tcG9uZW50IHdpdGggYmFzaWMgdmFsdWVzLCBlYWNoIHVzZWQgYWNyb3NzIGFsbCB0YWJsZSB2YXJpYXRpb25zLlxuXG4vLyoqIFBhZGRpbmcgZm9yIGA8dGg+YHMgYW5kIGA8dGQ+YHMuXG4kdGFibGUtY2VsbC1wYWRkaW5nOiAgICAgICAgICAgIDhweCAhZGVmYXVsdDtcbi8vKiogUGFkZGluZyBmb3IgY2VsbHMgaW4gYC50YWJsZS1jb25kZW5zZWRgLlxuJHRhYmxlLWNvbmRlbnNlZC1jZWxsLXBhZGRpbmc6ICA1cHggIWRlZmF1bHQ7XG5cbi8vKiogRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIGFsbCB0YWJsZXMuXG4kdGFibGUtYmc6ICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50ICFkZWZhdWx0O1xuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIGAudGFibGUtc3RyaXBlZGAuXG4kdGFibGUtYmctYWNjZW50OiAgICAgICAgICAgICAgICNmOWY5ZjkgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgYC50YWJsZS1ob3ZlcmAuXG4kdGFibGUtYmctaG92ZXI6ICAgICAgICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4kdGFibGUtYmctYWN0aXZlOiAgICAgICAgICAgICAgICR0YWJsZS1iZy1ob3ZlciAhZGVmYXVsdDtcblxuLy8qKiBCb3JkZXIgY29sb3IgZm9yIHRhYmxlIGFuZCBjZWxsIGJvcmRlcnMuXG4kdGFibGUtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG5cblxuLy89PSBCdXR0b25zXG4vL1xuLy8jIyBGb3IgZWFjaCBvZiBCb290c3RyYXAncyBidXR0b25zLCBkZWZpbmUgdGV4dCwgYmFja2dyb3VuZCBhbmQgYm9yZGVyIGNvbG9yLlxuXG4kYnRuLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgICAgICBub3JtYWwgIWRlZmF1bHQ7XG5cbiRidG4tZGVmYXVsdC1jb2xvcjogICAgICAgICAgICAgICMzMzMgIWRlZmF1bHQ7XG4kYnRuLWRlZmF1bHQtYmc6ICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuJGJ0bi1kZWZhdWx0LWJvcmRlcjogICAgICAgICAgICAgI2NjYyAhZGVmYXVsdDtcblxuJGJ0bi1wcmltYXJ5LWNvbG9yOiAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRidG4tcHJpbWFyeS1iZzogICAgICAgICAgICAgICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuJGJ0bi1wcmltYXJ5LWJvcmRlcjogICAgICAgICAgICAgZGFya2VuKCRidG4tcHJpbWFyeS1iZywgNSUpICFkZWZhdWx0O1xuXG4kYnRuLXN1Y2Nlc3MtY29sb3I6ICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuJGJ0bi1zdWNjZXNzLWJnOiAgICAgICAgICAgICAgICAgJGJyYW5kLXN1Y2Nlc3MgIWRlZmF1bHQ7XG4kYnRuLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgICAgICBkYXJrZW4oJGJ0bi1zdWNjZXNzLWJnLCA1JSkgIWRlZmF1bHQ7XG5cbiRidG4taW5mby1jb2xvcjogICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kYnRuLWluZm8tYmc6ICAgICAgICAgICAgICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcbiRidG4taW5mby1ib3JkZXI6ICAgICAgICAgICAgICAgIGRhcmtlbigkYnRuLWluZm8tYmcsIDUlKSAhZGVmYXVsdDtcblxuJGJ0bi13YXJuaW5nLWNvbG9yOiAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRidG4td2FybmluZy1iZzogICAgICAgICAgICAgICAgICRicmFuZC13YXJuaW5nICFkZWZhdWx0O1xuJGJ0bi13YXJuaW5nLWJvcmRlcjogICAgICAgICAgICAgZGFya2VuKCRidG4td2FybmluZy1iZywgNSUpICFkZWZhdWx0O1xuXG4kYnRuLWRhbmdlci1jb2xvcjogICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuJGJ0bi1kYW5nZXItYmc6ICAgICAgICAgICAgICAgICAgJGJyYW5kLWRhbmdlciAhZGVmYXVsdDtcbiRidG4tZGFuZ2VyLWJvcmRlcjogICAgICAgICAgICAgIGRhcmtlbigkYnRuLWRhbmdlci1iZywgNSUpICFkZWZhdWx0O1xuXG4kYnRuLWxpbmstZGlzYWJsZWQtY29sb3I6ICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcblxuLy8gQWxsb3dzIGZvciBjdXN0b21pemluZyBidXR0b24gcmFkaXVzIGluZGVwZW5kZW50bHkgZnJvbSBnbG9iYWwgYm9yZGVyIHJhZGl1c1xuJGJ0bi1ib3JkZXItcmFkaXVzLWJhc2U6ICAgICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcbiRidG4tYm9yZGVyLXJhZGl1cy1sYXJnZTogICAgICAgICRib3JkZXItcmFkaXVzLWxhcmdlICFkZWZhdWx0O1xuJGJ0bi1ib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICAgJGJvcmRlci1yYWRpdXMtc21hbGwgIWRlZmF1bHQ7XG5cblxuLy89PSBGb3Jtc1xuLy9cbi8vIyNcblxuLy8qKiBgPGlucHV0PmAgYmFja2dyb3VuZCBjb2xvclxuJGlucHV0LWJnOiAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogYDxpbnB1dCBkaXNhYmxlZD5gIGJhY2tncm91bmQgY29sb3JcbiRpbnB1dC1iZy1kaXNhYmxlZDogICAgICAgICAgICAgICRncmF5LWxpZ2h0ZXIgIWRlZmF1bHQ7XG5cbi8vKiogVGV4dCBjb2xvciBmb3IgYDxpbnB1dD5gc1xuJGlucHV0LWNvbG9yOiAgICAgICAgICAgICAgICAgICAgJGdyYXkgIWRlZmF1bHQ7XG4vLyoqIGA8aW5wdXQ+YCBib3JkZXIgY29sb3JcbiRpbnB1dC1ib3JkZXI6ICAgICAgICAgICAgICAgICAgICNjY2MgIWRlZmF1bHQ7XG5cbi8vIFRPRE86IFJlbmFtZSBgJGlucHV0LWJvcmRlci1yYWRpdXNgIHRvIGAkaW5wdXQtYm9yZGVyLXJhZGl1cy1iYXNlYCBpbiB2NFxuLy8qKiBEZWZhdWx0IGAuZm9ybS1jb250cm9sYCBib3JkZXIgcmFkaXVzXG4vLyBUaGlzIGhhcyBubyBlZmZlY3Qgb24gYDxzZWxlY3Q+YHMgaW4gc29tZSBicm93c2VycywgZHVlIHRvIHRoZSBsaW1pdGVkIHN0eWxhYmlsaXR5IG9mIGA8c2VsZWN0PmBzIGluIENTUy5cbiRpbnB1dC1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgICRib3JkZXItcmFkaXVzLWJhc2UgIWRlZmF1bHQ7XG4vLyoqIExhcmdlIGAuZm9ybS1jb250cm9sYCBib3JkZXIgcmFkaXVzXG4kaW5wdXQtYm9yZGVyLXJhZGl1cy1sYXJnZTogICAgICAkYm9yZGVyLXJhZGl1cy1sYXJnZSAhZGVmYXVsdDtcbi8vKiogU21hbGwgYC5mb3JtLWNvbnRyb2xgIGJvcmRlciByYWRpdXNcbiRpbnB1dC1ib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICRib3JkZXItcmFkaXVzLXNtYWxsICFkZWZhdWx0O1xuXG4vLyoqIEJvcmRlciBjb2xvciBmb3IgaW5wdXRzIG9uIGZvY3VzXG4kaW5wdXQtYm9yZGVyLWZvY3VzOiAgICAgICAgICAgICAjNjZhZmU5ICFkZWZhdWx0O1xuXG4vLyoqIFBsYWNlaG9sZGVyIHRleHQgY29sb3JcbiRpbnB1dC1jb2xvci1wbGFjZWhvbGRlcjogICAgICAgICM5OTkgIWRlZmF1bHQ7XG5cbi8vKiogRGVmYXVsdCBgLmZvcm0tY29udHJvbGAgaGVpZ2h0XG4kaW5wdXQtaGVpZ2h0LWJhc2U6ICAgICAgICAgICAgICAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICsgKCRwYWRkaW5nLWJhc2UtdmVydGljYWwgKiAyKSArIDIpICFkZWZhdWx0O1xuLy8qKiBMYXJnZSBgLmZvcm0tY29udHJvbGAgaGVpZ2h0XG4kaW5wdXQtaGVpZ2h0LWxhcmdlOiAgICAgICAgICAgICAoY2VpbCgkZm9udC1zaXplLWxhcmdlICogJGxpbmUtaGVpZ2h0LWxhcmdlKSArICgkcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCAqIDIpICsgMikgIWRlZmF1bHQ7XG4vLyoqIFNtYWxsIGAuZm9ybS1jb250cm9sYCBoZWlnaHRcbiRpbnB1dC1oZWlnaHQtc21hbGw6ICAgICAgICAgICAgIChmbG9vcigkZm9udC1zaXplLXNtYWxsICogJGxpbmUtaGVpZ2h0LXNtYWxsKSArICgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCAqIDIpICsgMikgIWRlZmF1bHQ7XG5cbi8vKiogYC5mb3JtLWdyb3VwYCBtYXJnaW5cbiRmb3JtLWdyb3VwLW1hcmdpbi1ib3R0b206ICAgICAgIDE1cHggIWRlZmF1bHQ7XG5cbiRsZWdlbmQtY29sb3I6ICAgICAgICAgICAgICAgICAgICRncmF5LWRhcmsgIWRlZmF1bHQ7XG4kbGVnZW5kLWJvcmRlci1jb2xvcjogICAgICAgICAgICAjZTVlNWU1ICFkZWZhdWx0O1xuXG4vLyoqIEJhY2tncm91bmQgY29sb3IgZm9yIHRleHR1YWwgaW5wdXQgYWRkb25zXG4kaW5wdXQtZ3JvdXAtYWRkb24tYmc6ICAgICAgICAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuLy8qKiBCb3JkZXIgY29sb3IgZm9yIHRleHR1YWwgaW5wdXQgYWRkb25zXG4kaW5wdXQtZ3JvdXAtYWRkb24tYm9yZGVyLWNvbG9yOiAkaW5wdXQtYm9yZGVyICFkZWZhdWx0O1xuXG4vLyoqIERpc2FibGVkIGN1cnNvciBmb3IgZm9ybSBjb250cm9scyBhbmQgYnV0dG9ucy5cbiRjdXJzb3ItZGlzYWJsZWQ6ICAgICAgICAgICAgICAgIG5vdC1hbGxvd2VkICFkZWZhdWx0O1xuXG5cbi8vPT0gRHJvcGRvd25zXG4vL1xuLy8jIyBEcm9wZG93biBtZW51IGNvbnRhaW5lciBhbmQgY29udGVudHMuXG5cbi8vKiogQmFja2dyb3VuZCBmb3IgdGhlIGRyb3Bkb3duIG1lbnUuXG4kZHJvcGRvd24tYmc6ICAgICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBEcm9wZG93biBtZW51IGBib3JkZXItY29sb3JgLlxuJGRyb3Bkb3duLWJvcmRlcjogICAgICAgICAgICAgICAgcmdiYSgwLDAsMCwuMTUpICFkZWZhdWx0O1xuLy8qKiBEcm9wZG93biBtZW51IGBib3JkZXItY29sb3JgICoqZm9yIElFOCoqLlxuJGRyb3Bkb3duLWZhbGxiYWNrLWJvcmRlcjogICAgICAgI2NjYyAhZGVmYXVsdDtcbi8vKiogRGl2aWRlciBjb2xvciBmb3IgYmV0d2VlbiBkcm9wZG93biBpdGVtcy5cbiRkcm9wZG93bi1kaXZpZGVyLWJnOiAgICAgICAgICAgICNlNWU1ZTUgIWRlZmF1bHQ7XG5cbi8vKiogRHJvcGRvd24gbGluayB0ZXh0IGNvbG9yLlxuJGRyb3Bkb3duLWxpbmstY29sb3I6ICAgICAgICAgICAgJGdyYXktZGFyayAhZGVmYXVsdDtcbi8vKiogSG92ZXIgY29sb3IgZm9yIGRyb3Bkb3duIGxpbmtzLlxuJGRyb3Bkb3duLWxpbmstaG92ZXItY29sb3I6ICAgICAgZGFya2VuKCRncmF5LWRhcmssIDUlKSAhZGVmYXVsdDtcbi8vKiogSG92ZXIgYmFja2dyb3VuZCBmb3IgZHJvcGRvd24gbGlua3MuXG4kZHJvcGRvd24tbGluay1ob3Zlci1iZzogICAgICAgICAjZjVmNWY1ICFkZWZhdWx0O1xuXG4vLyoqIEFjdGl2ZSBkcm9wZG93biBtZW51IGl0ZW0gdGV4dCBjb2xvci5cbiRkcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcjogICAgICRjb21wb25lbnQtYWN0aXZlLWNvbG9yICFkZWZhdWx0O1xuLy8qKiBBY3RpdmUgZHJvcGRvd24gbWVudSBpdGVtIGJhY2tncm91bmQgY29sb3IuXG4kZHJvcGRvd24tbGluay1hY3RpdmUtYmc6ICAgICAgICAkY29tcG9uZW50LWFjdGl2ZS1iZyAhZGVmYXVsdDtcblxuLy8qKiBEaXNhYmxlZCBkcm9wZG93biBtZW51IGl0ZW0gYmFja2dyb3VuZCBjb2xvci5cbiRkcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yOiAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuXG4vLyoqIFRleHQgY29sb3IgZm9yIGhlYWRlcnMgd2l0aGluIGRyb3Bkb3duIG1lbnVzLlxuJGRyb3Bkb3duLWhlYWRlci1jb2xvcjogICAgICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG5cbi8vKiogRGVwcmVjYXRlZCBgJGRyb3Bkb3duLWNhcmV0LWNvbG9yYCBhcyBvZiB2My4xLjBcbiRkcm9wZG93bi1jYXJldC1jb2xvcjogICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG5cblxuLy8tLSBaLWluZGV4IG1hc3RlciBsaXN0XG4vL1xuLy8gV2FybmluZzogQXZvaWQgY3VzdG9taXppbmcgdGhlc2UgdmFsdWVzLiBUaGV5J3JlIHVzZWQgZm9yIGEgYmlyZCdzIGV5ZSB2aWV3XG4vLyBvZiBjb21wb25lbnRzIGRlcGVuZGVudCBvbiB0aGUgei1heGlzIGFuZCBhcmUgZGVzaWduZWQgdG8gYWxsIHdvcmsgdG9nZXRoZXIuXG4vL1xuLy8gTm90ZTogVGhlc2UgdmFyaWFibGVzIGFyZSBub3QgZ2VuZXJhdGVkIGludG8gdGhlIEN1c3RvbWl6ZXIuXG5cbiR6aW5kZXgtbmF2YmFyOiAgICAgICAgICAgIDEwMDAgIWRlZmF1bHQ7XG4kemluZGV4LWRyb3Bkb3duOiAgICAgICAgICAxMDAwICFkZWZhdWx0O1xuJHppbmRleC1wb3BvdmVyOiAgICAgICAgICAgMTA2MCAhZGVmYXVsdDtcbiR6aW5kZXgtdG9vbHRpcDogICAgICAgICAgIDEwNzAgIWRlZmF1bHQ7XG4kemluZGV4LW5hdmJhci1maXhlZDogICAgICAxMDMwICFkZWZhdWx0O1xuJHppbmRleC1tb2RhbC1iYWNrZ3JvdW5kOiAgMTA0MCAhZGVmYXVsdDtcbiR6aW5kZXgtbW9kYWw6ICAgICAgICAgICAgIDEwNTAgIWRlZmF1bHQ7XG5cblxuLy89PSBNZWRpYSBxdWVyaWVzIGJyZWFrcG9pbnRzXG4vL1xuLy8jIyBEZWZpbmUgdGhlIGJyZWFrcG9pbnRzIGF0IHdoaWNoIHlvdXIgbGF5b3V0IHdpbGwgY2hhbmdlLCBhZGFwdGluZyB0byBkaWZmZXJlbnQgc2NyZWVuIHNpemVzLlxuXG4vLyBFeHRyYSBzbWFsbCBzY3JlZW4gLyBwaG9uZVxuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLXhzYCBhcyBvZiB2My4wLjFcbiRzY3JlZW4teHM6ICAgICAgICAgICAgICAgICAgNDgwcHggIWRlZmF1bHQ7XG4vLyoqIERlcHJlY2F0ZWQgYCRzY3JlZW4teHMtbWluYCBhcyBvZiB2My4yLjBcbiRzY3JlZW4teHMtbWluOiAgICAgICAgICAgICAgJHNjcmVlbi14cyAhZGVmYXVsdDtcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1waG9uZWAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXBob25lOiAgICAgICAgICAgICAgICRzY3JlZW4teHMtbWluICFkZWZhdWx0O1xuXG4vLyBTbWFsbCBzY3JlZW4gLyB0YWJsZXRcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1zbWAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXNtOiAgICAgICAgICAgICAgICAgIDc2OHB4ICFkZWZhdWx0O1xuJHNjcmVlbi1zbS1taW46ICAgICAgICAgICAgICAkc2NyZWVuLXNtICFkZWZhdWx0O1xuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLXRhYmxldGAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXRhYmxldDogICAgICAgICAgICAgICRzY3JlZW4tc20tbWluICFkZWZhdWx0O1xuXG4vLyBNZWRpdW0gc2NyZWVuIC8gZGVza3RvcFxuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLW1kYCBhcyBvZiB2My4wLjFcbiRzY3JlZW4tbWQ6ICAgICAgICAgICAgICAgICAgOTkycHggIWRlZmF1bHQ7XG4kc2NyZWVuLW1kLW1pbjogICAgICAgICAgICAgICRzY3JlZW4tbWQgIWRlZmF1bHQ7XG4vLyoqIERlcHJlY2F0ZWQgYCRzY3JlZW4tZGVza3RvcGAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLWRlc2t0b3A6ICAgICAgICAgICAgICRzY3JlZW4tbWQtbWluICFkZWZhdWx0O1xuXG4vLyBMYXJnZSBzY3JlZW4gLyB3aWRlIGRlc2t0b3Bcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1sZ2AgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLWxnOiAgICAgICAgICAgICAgICAgIDEyMDBweCAhZGVmYXVsdDtcbiRzY3JlZW4tbGctbWluOiAgICAgICAgICAgICAgJHNjcmVlbi1sZyAhZGVmYXVsdDtcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1sZy1kZXNrdG9wYCBhcyBvZiB2My4wLjFcbiRzY3JlZW4tbGctZGVza3RvcDogICAgICAgICAgJHNjcmVlbi1sZy1taW4gIWRlZmF1bHQ7XG5cbi8vIFNvIG1lZGlhIHF1ZXJpZXMgZG9uJ3Qgb3ZlcmxhcCB3aGVuIHJlcXVpcmVkLCBwcm92aWRlIGEgbWF4aW11bVxuJHNjcmVlbi14cy1tYXg6ICAgICAgICAgICAgICAoJHNjcmVlbi1zbS1taW4gLSAxKSAhZGVmYXVsdDtcbiRzY3JlZW4tc20tbWF4OiAgICAgICAgICAgICAgKCRzY3JlZW4tbWQtbWluIC0gMSkgIWRlZmF1bHQ7XG4kc2NyZWVuLW1kLW1heDogICAgICAgICAgICAgICgkc2NyZWVuLWxnLW1pbiAtIDEpICFkZWZhdWx0O1xuXG5cbi8vPT0gR3JpZCBzeXN0ZW1cbi8vXG4vLyMjIERlZmluZSB5b3VyIGN1c3RvbSByZXNwb25zaXZlIGdyaWQuXG5cbi8vKiogTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuXG4kZ3JpZC1jb2x1bW5zOiAgICAgICAgICAgICAgMTIgIWRlZmF1bHQ7XG4vLyoqIFBhZGRpbmcgYmV0d2VlbiBjb2x1bW5zLiBHZXRzIGRpdmlkZWQgaW4gaGFsZiBmb3IgdGhlIGxlZnQgYW5kIHJpZ2h0LlxuJGdyaWQtZ3V0dGVyLXdpZHRoOiAgICAgICAgIDMwcHggIWRlZmF1bHQ7XG4vLyBOYXZiYXIgY29sbGFwc2Vcbi8vKiogUG9pbnQgYXQgd2hpY2ggdGhlIG5hdmJhciBiZWNvbWVzIHVuY29sbGFwc2VkLlxuJGdyaWQtZmxvYXQtYnJlYWtwb2ludDogICAgICRzY3JlZW4tc20tbWluICFkZWZhdWx0O1xuLy8qKiBQb2ludCBhdCB3aGljaCB0aGUgbmF2YmFyIGJlZ2lucyBjb2xsYXBzaW5nLlxuJGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXg6ICgkZ3JpZC1mbG9hdC1icmVha3BvaW50IC0gMSkgIWRlZmF1bHQ7XG5cblxuLy89PSBDb250YWluZXIgc2l6ZXNcbi8vXG4vLyMjIERlZmluZSB0aGUgbWF4aW11bSB3aWR0aCBvZiBgLmNvbnRhaW5lcmAgZm9yIGRpZmZlcmVudCBzY3JlZW4gc2l6ZXMuXG5cbi8vIFNtYWxsIHNjcmVlbiAvIHRhYmxldFxuJGNvbnRhaW5lci10YWJsZXQ6ICAgICAgICAgICAgICg3MjBweCArICRncmlkLWd1dHRlci13aWR0aCkgIWRlZmF1bHQ7XG4vLyoqIEZvciBgJHNjcmVlbi1zbS1taW5gIGFuZCB1cC5cbiRjb250YWluZXItc206ICAgICAgICAgICAgICAgICAkY29udGFpbmVyLXRhYmxldCAhZGVmYXVsdDtcblxuLy8gTWVkaXVtIHNjcmVlbiAvIGRlc2t0b3BcbiRjb250YWluZXItZGVza3RvcDogICAgICAgICAgICAoOTQwcHggKyAkZ3JpZC1ndXR0ZXItd2lkdGgpICFkZWZhdWx0O1xuLy8qKiBGb3IgYCRzY3JlZW4tbWQtbWluYCBhbmQgdXAuXG4kY29udGFpbmVyLW1kOiAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci1kZXNrdG9wICFkZWZhdWx0O1xuXG4vLyBMYXJnZSBzY3JlZW4gLyB3aWRlIGRlc2t0b3BcbiRjb250YWluZXItbGFyZ2UtZGVza3RvcDogICAgICAoMTE0MHB4ICsgJGdyaWQtZ3V0dGVyLXdpZHRoKSAhZGVmYXVsdDtcbi8vKiogRm9yIGAkc2NyZWVuLWxnLW1pbmAgYW5kIHVwLlxuJGNvbnRhaW5lci1sZzogICAgICAgICAgICAgICAgICRjb250YWluZXItbGFyZ2UtZGVza3RvcCAhZGVmYXVsdDtcblxuXG4vLz09IE5hdmJhclxuLy9cbi8vIyNcblxuLy8gQmFzaWNzIG9mIGEgbmF2YmFyXG4kbmF2YmFyLWhlaWdodDogICAgICAgICAgICAgICAgICAgIDUwcHggIWRlZmF1bHQ7XG4kbmF2YmFyLW1hcmdpbi1ib3R0b206ICAgICAgICAgICAgICRsaW5lLWhlaWdodC1jb21wdXRlZCAhZGVmYXVsdDtcbiRuYXZiYXItYm9yZGVyLXJhZGl1czogICAgICAgICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcbiRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsOiAgICAgICAgZmxvb3IoKCRncmlkLWd1dHRlci13aWR0aCAvIDIpKSAhZGVmYXVsdDtcbiRuYXZiYXItcGFkZGluZy12ZXJ0aWNhbDogICAgICAgICAgKCgkbmF2YmFyLWhlaWdodCAtICRsaW5lLWhlaWdodC1jb21wdXRlZCkgLyAyKSAhZGVmYXVsdDtcbiRuYXZiYXItY29sbGFwc2UtbWF4LWhlaWdodDogICAgICAgMzQwcHggIWRlZmF1bHQ7XG5cbiRuYXZiYXItZGVmYXVsdC1jb2xvcjogICAgICAgICAgICAgIzc3NyAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1iZzogICAgICAgICAgICAgICAgI2Y4ZjhmOCAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1ib3JkZXI6ICAgICAgICAgICAgZGFya2VuKCRuYXZiYXItZGVmYXVsdC1iZywgNi41JSkgIWRlZmF1bHQ7XG5cbi8vIE5hdmJhciBsaW5rc1xuJG5hdmJhci1kZWZhdWx0LWxpbmstY29sb3I6ICAgICAgICAgICAgICAgICM3NzcgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgIzMzMyAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgICB0cmFuc3BhcmVudCAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjogICAgICAgICAjNTU1ICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWJnOiAgICAgICAgICAgIGRhcmtlbigkbmF2YmFyLWRlZmF1bHQtYmcsIDYuNSUpICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I6ICAgICAgICNjY2MgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZzogICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIE5hdmJhciBicmFuZCBsYWJlbFxuJG5hdmJhci1kZWZhdWx0LWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWJyYW5kLWhvdmVyLWNvbG9yOiAgICAgICAgIGRhcmtlbigkbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3IsIDEwJSkgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc6ICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIE5hdmJhciB0b2dnbGVcbiRuYXZiYXItZGVmYXVsdC10b2dnbGUtaG92ZXItYmc6ICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1pY29uLWJhci1iZzogICAgICAgICM4ODggIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWJvcmRlci1jb2xvcjogICAgICAgI2RkZCAhZGVmYXVsdDtcblxuXG4vLz09PSBJbnZlcnRlZCBuYXZiYXJcbi8vIFJlc2V0IGludmVydGVkIG5hdmJhciBiYXNpY3NcbiRuYXZiYXItaW52ZXJzZS1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgbGlnaHRlbigkZ3JheS1saWdodCwgMTUlKSAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1iZzogICAgICAgICAgICAgICAgICAgICAgICAgIzIyMiAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1ib3JkZXI6ICAgICAgICAgICAgICAgICAgICAgZGFya2VuKCRuYXZiYXItaW52ZXJzZS1iZywgMTAlKSAhZGVmYXVsdDtcblxuLy8gSW52ZXJ0ZWQgbmF2YmFyIGxpbmtzXG4kbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjogICAgICAgICAgICAgICAgIGxpZ2h0ZW4oJGdyYXktbGlnaHQsIDE1JSkgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgIHRyYW5zcGFyZW50ICFkZWZhdWx0O1xuJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWNvbG9yOiAgICAgICAgICAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1iZzogICAgICAgICAgICAgZGFya2VuKCRuYXZiYXItaW52ZXJzZS1iZywgMTAlKSAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yOiAgICAgICAgIzQ0NCAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWJnOiAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIEludmVydGVkIG5hdmJhciBicmFuZCBsYWJlbFxuJG5hdmJhci1pbnZlcnNlLWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgICAkbmF2YmFyLWludmVyc2UtbGluay1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1jb2xvcjogICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1iZzogICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIEludmVydGVkIG5hdmJhciB0b2dnbGVcbiRuYXZiYXItaW52ZXJzZS10b2dnbGUtaG92ZXItYmc6ICAgICAgICAgICAgIzMzMyAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS10b2dnbGUtaWNvbi1iYXItYmc6ICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS10b2dnbGUtYm9yZGVyLWNvbG9yOiAgICAgICAgIzMzMyAhZGVmYXVsdDtcblxuXG4vLz09IE5hdnNcbi8vXG4vLyMjXG5cbi8vPT09IFNoYXJlZCBuYXYgc3R5bGVzXG4kbmF2LWxpbmstcGFkZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgIDEwcHggMTVweCAhZGVmYXVsdDtcbiRuYXYtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcblxuJG5hdi1kaXNhYmxlZC1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbiRuYXYtZGlzYWJsZWQtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG5cbi8vPT0gVGFic1xuJG5hdi10YWJzLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuXG4kbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3I6ICAgICAgICAgICRncmF5LWxpZ2h0ZXIgIWRlZmF1bHQ7XG5cbiRuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgJGJvZHktYmcgIWRlZmF1bHQ7XG4kbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICRncmF5ICFkZWZhdWx0O1xuJG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjogICAjZGRkICFkZWZhdWx0O1xuXG4kbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG4kbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjogICAgICRib2R5LWJnICFkZWZhdWx0O1xuXG4vLz09IFBpbGxzXG4kbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgICRib3JkZXItcmFkaXVzLWJhc2UgIWRlZmF1bHQ7XG4kbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xuJG5hdi1waWxscy1hY3RpdmUtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAkY29tcG9uZW50LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcblxuXG4vLz09IFBhZ2luYXRpb25cbi8vXG4vLyMjXG5cbiRwYWdpbmF0aW9uLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICRsaW5rLWNvbG9yICFkZWZhdWx0O1xuJHBhZ2luYXRpb24tYmc6ICAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG5cbiRwYWdpbmF0aW9uLWhvdmVyLWNvbG9yOiAgICAgICAgICAgICAgICRsaW5rLWhvdmVyLWNvbG9yICFkZWZhdWx0O1xuJHBhZ2luYXRpb24taG92ZXItYmc6ICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWhvdmVyLWJvcmRlcjogICAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG5cbiRwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjogICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFnaW5hdGlvbi1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWFjdGl2ZS1ib3JkZXI6ICAgICAgICAgICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuXG4kcGFnaW5hdGlvbi1kaXNhYmxlZC1jb2xvcjogICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWRpc2FibGVkLWJnOiAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFnaW5hdGlvbi1kaXNhYmxlZC1ib3JkZXI6ICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuXG5cbi8vPT0gUGFnZXJcbi8vXG4vLyMjXG5cbiRwYWdlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWJnICFkZWZhdWx0O1xuJHBhZ2VyLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24tYm9yZGVyICFkZWZhdWx0O1xuJHBhZ2VyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgMTVweCAhZGVmYXVsdDtcblxuJHBhZ2VyLWhvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24taG92ZXItYmcgIWRlZmF1bHQ7XG5cbiRwYWdlci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWFjdGl2ZS1iZyAhZGVmYXVsdDtcbiRwYWdlci1hY3RpdmUtY29sb3I6ICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcblxuJHBhZ2VyLWRpc2FibGVkLWNvbG9yOiAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG5cblxuLy89PSBKdW1ib3Ryb25cbi8vXG4vLyMjXG5cbiRqdW1ib3Ryb24tcGFkZGluZzogICAgICAgICAgICAgIDMwcHggIWRlZmF1bHQ7XG4kanVtYm90cm9uLWNvbG9yOiAgICAgICAgICAgICAgICBpbmhlcml0ICFkZWZhdWx0O1xuJGp1bWJvdHJvbi1iZzogICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbiRqdW1ib3Ryb24taGVhZGluZy1jb2xvcjogICAgICAgIGluaGVyaXQgIWRlZmF1bHQ7XG4kanVtYm90cm9uLWZvbnQtc2l6ZTogICAgICAgICAgICBjZWlsKCgkZm9udC1zaXplLWJhc2UgKiAxLjUpKSAhZGVmYXVsdDtcbiRqdW1ib3Ryb24taGVhZGluZy1mb250LXNpemU6ICAgIGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDQuNSkpICFkZWZhdWx0O1xuXG5cbi8vPT0gRm9ybSBzdGF0ZXMgYW5kIGFsZXJ0c1xuLy9cbi8vIyMgRGVmaW5lIGNvbG9ycyBmb3IgZm9ybSBmZWVkYmFjayBzdGF0ZXMgYW5kLCBieSBkZWZhdWx0LCBhbGVydHMuXG5cbiRzdGF0ZS1zdWNjZXNzLXRleHQ6ICAgICAgICAgICAgICMzYzc2M2QgIWRlZmF1bHQ7XG4kc3RhdGUtc3VjY2Vzcy1iZzogICAgICAgICAgICAgICAjZGZmMGQ4ICFkZWZhdWx0O1xuJHN0YXRlLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgICAgZGFya2VuKGFkanVzdC1odWUoJHN0YXRlLXN1Y2Nlc3MtYmcsIC0xMCksIDUlKSAhZGVmYXVsdDtcblxuJHN0YXRlLWluZm8tdGV4dDogICAgICAgICAgICAgICAgIzMxNzA4ZiAhZGVmYXVsdDtcbiRzdGF0ZS1pbmZvLWJnOiAgICAgICAgICAgICAgICAgICNkOWVkZjcgIWRlZmF1bHQ7XG4kc3RhdGUtaW5mby1ib3JkZXI6ICAgICAgICAgICAgICBkYXJrZW4oYWRqdXN0LWh1ZSgkc3RhdGUtaW5mby1iZywgLTEwKSwgNyUpICFkZWZhdWx0O1xuXG4kc3RhdGUtd2FybmluZy10ZXh0OiAgICAgICAgICAgICAjOGE2ZDNiICFkZWZhdWx0O1xuJHN0YXRlLXdhcm5pbmctYmc6ICAgICAgICAgICAgICAgI2ZjZjhlMyAhZGVmYXVsdDtcbiRzdGF0ZS13YXJuaW5nLWJvcmRlcjogICAgICAgICAgIGRhcmtlbihhZGp1c3QtaHVlKCRzdGF0ZS13YXJuaW5nLWJnLCAtMTApLCA1JSkgIWRlZmF1bHQ7XG5cbiRzdGF0ZS1kYW5nZXItdGV4dDogICAgICAgICAgICAgICNhOTQ0NDIgIWRlZmF1bHQ7XG4kc3RhdGUtZGFuZ2VyLWJnOiAgICAgICAgICAgICAgICAjZjJkZWRlICFkZWZhdWx0O1xuJHN0YXRlLWRhbmdlci1ib3JkZXI6ICAgICAgICAgICAgZGFya2VuKGFkanVzdC1odWUoJHN0YXRlLWRhbmdlci1iZywgLTEwKSwgNSUpICFkZWZhdWx0O1xuXG5cbi8vPT0gVG9vbHRpcHNcbi8vXG4vLyMjXG5cbi8vKiogVG9vbHRpcCBtYXggd2lkdGhcbiR0b29sdGlwLW1heC13aWR0aDogICAgICAgICAgIDIwMHB4ICFkZWZhdWx0O1xuLy8qKiBUb29sdGlwIHRleHQgY29sb3JcbiR0b29sdGlwLWNvbG9yOiAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIFRvb2x0aXAgYmFja2dyb3VuZCBjb2xvclxuJHRvb2x0aXAtYmc6ICAgICAgICAgICAgICAgICAgIzAwMCAhZGVmYXVsdDtcbiR0b29sdGlwLW9wYWNpdHk6ICAgICAgICAgICAgIC45ICFkZWZhdWx0O1xuXG4vLyoqIFRvb2x0aXAgYXJyb3cgd2lkdGhcbiR0b29sdGlwLWFycm93LXdpZHRoOiAgICAgICAgIDVweCAhZGVmYXVsdDtcbi8vKiogVG9vbHRpcCBhcnJvdyBjb2xvclxuJHRvb2x0aXAtYXJyb3ctY29sb3I6ICAgICAgICAgJHRvb2x0aXAtYmcgIWRlZmF1bHQ7XG5cblxuLy89PSBQb3BvdmVyc1xuLy9cbi8vIyNcblxuLy8qKiBQb3BvdmVyIGJvZHkgYmFja2dyb3VuZCBjb2xvclxuJHBvcG92ZXItYmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIG1heGltdW0gd2lkdGhcbiRwb3BvdmVyLW1heC13aWR0aDogICAgICAgICAgICAgICAgICAgMjc2cHggIWRlZmF1bHQ7XG4vLyoqIFBvcG92ZXIgYm9yZGVyIGNvbG9yXG4kcG9wb3Zlci1ib3JkZXItY29sb3I6ICAgICAgICAgICAgICAgIHJnYmEoMCwwLDAsLjIpICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIGZhbGxiYWNrIGJvcmRlciBjb2xvclxuJHBvcG92ZXItZmFsbGJhY2stYm9yZGVyLWNvbG9yOiAgICAgICAjY2NjICFkZWZhdWx0O1xuXG4vLyoqIFBvcG92ZXIgdGl0bGUgYmFja2dyb3VuZCBjb2xvclxuJHBvcG92ZXItdGl0bGUtYmc6ICAgICAgICAgICAgICAgICAgICBkYXJrZW4oJHBvcG92ZXItYmcsIDMlKSAhZGVmYXVsdDtcblxuLy8qKiBQb3BvdmVyIGFycm93IHdpZHRoXG4kcG9wb3Zlci1hcnJvdy13aWR0aDogICAgICAgICAgICAgICAgIDEwcHggIWRlZmF1bHQ7XG4vLyoqIFBvcG92ZXIgYXJyb3cgY29sb3JcbiRwb3BvdmVyLWFycm93LWNvbG9yOiAgICAgICAgICAgICAgICAgJHBvcG92ZXItYmcgIWRlZmF1bHQ7XG5cbi8vKiogUG9wb3ZlciBvdXRlciBhcnJvdyB3aWR0aFxuJHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg6ICAgICAgICAgICAoJHBvcG92ZXItYXJyb3ctd2lkdGggKyAxKSAhZGVmYXVsdDtcbi8vKiogUG9wb3ZlciBvdXRlciBhcnJvdyBjb2xvclxuJHBvcG92ZXItYXJyb3ctb3V0ZXItY29sb3I6ICAgICAgICAgICBmYWRlX2luKCRwb3BvdmVyLWJvcmRlci1jb2xvciwgMC4wNSkgIWRlZmF1bHQ7XG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgZmFsbGJhY2sgY29sb3JcbiRwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOiAgZGFya2VuKCRwb3BvdmVyLWZhbGxiYWNrLWJvcmRlci1jb2xvciwgMjAlKSAhZGVmYXVsdDtcblxuXG4vLz09IExhYmVsc1xuLy9cbi8vIyNcblxuLy8qKiBEZWZhdWx0IGxhYmVsIGJhY2tncm91bmQgY29sb3JcbiRsYWJlbC1kZWZhdWx0LWJnOiAgICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBQcmltYXJ5IGxhYmVsIGJhY2tncm91bmQgY29sb3JcbiRsYWJlbC1wcmltYXJ5LWJnOiAgICAgICAgICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuLy8qKiBTdWNjZXNzIGxhYmVsIGJhY2tncm91bmQgY29sb3JcbiRsYWJlbC1zdWNjZXNzLWJnOiAgICAgICAgICAgICRicmFuZC1zdWNjZXNzICFkZWZhdWx0O1xuLy8qKiBJbmZvIGxhYmVsIGJhY2tncm91bmQgY29sb3JcbiRsYWJlbC1pbmZvLWJnOiAgICAgICAgICAgICAgICRicmFuZC1pbmZvICFkZWZhdWx0O1xuLy8qKiBXYXJuaW5nIGxhYmVsIGJhY2tncm91bmQgY29sb3JcbiRsYWJlbC13YXJuaW5nLWJnOiAgICAgICAgICAgICRicmFuZC13YXJuaW5nICFkZWZhdWx0O1xuLy8qKiBEYW5nZXIgbGFiZWwgYmFja2dyb3VuZCBjb2xvclxuJGxhYmVsLWRhbmdlci1iZzogICAgICAgICAgICAgJGJyYW5kLWRhbmdlciAhZGVmYXVsdDtcblxuLy8qKiBEZWZhdWx0IGxhYmVsIHRleHQgY29sb3JcbiRsYWJlbC1jb2xvcjogICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIERlZmF1bHQgdGV4dCBjb2xvciBvZiBhIGxpbmtlZCBsYWJlbFxuJGxhYmVsLWxpbmstaG92ZXItY29sb3I6ICAgICAgI2ZmZiAhZGVmYXVsdDtcblxuXG4vLz09IE1vZGFsc1xuLy9cbi8vIyNcblxuLy8qKiBQYWRkaW5nIGFwcGxpZWQgdG8gdGhlIG1vZGFsIGJvZHlcbiRtb2RhbC1pbm5lci1wYWRkaW5nOiAgICAgICAgIDE1cHggIWRlZmF1bHQ7XG5cbi8vKiogUGFkZGluZyBhcHBsaWVkIHRvIHRoZSBtb2RhbCB0aXRsZVxuJG1vZGFsLXRpdGxlLXBhZGRpbmc6ICAgICAgICAgMTVweCAhZGVmYXVsdDtcbi8vKiogTW9kYWwgdGl0bGUgbGluZS1oZWlnaHRcbiRtb2RhbC10aXRsZS1saW5lLWhlaWdodDogICAgICRsaW5lLWhlaWdodC1iYXNlICFkZWZhdWx0O1xuXG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgbW9kYWwgY29udGVudCBhcmVhXG4kbW9kYWwtY29udGVudC1iZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIE1vZGFsIGNvbnRlbnQgYm9yZGVyIGNvbG9yXG4kbW9kYWwtY29udGVudC1ib3JkZXItY29sb3I6ICAgICAgICAgICAgICAgICAgIHJnYmEoMCwwLDAsLjIpICFkZWZhdWx0O1xuLy8qKiBNb2RhbCBjb250ZW50IGJvcmRlciBjb2xvciAqKmZvciBJRTgqKlxuJG1vZGFsLWNvbnRlbnQtZmFsbGJhY2stYm9yZGVyLWNvbG9yOiAgICAgICAgICAjOTk5ICFkZWZhdWx0O1xuXG4vLyoqIE1vZGFsIGJhY2tkcm9wIGJhY2tncm91bmQgY29sb3JcbiRtb2RhbC1iYWNrZHJvcC1iZzogICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4vLyoqIE1vZGFsIGJhY2tkcm9wIG9wYWNpdHlcbiRtb2RhbC1iYWNrZHJvcC1vcGFjaXR5OiAgICAgIC41ICFkZWZhdWx0O1xuLy8qKiBNb2RhbCBoZWFkZXIgYm9yZGVyIGNvbG9yXG4kbW9kYWwtaGVhZGVyLWJvcmRlci1jb2xvcjogICAjZTVlNWU1ICFkZWZhdWx0O1xuLy8qKiBNb2RhbCBmb290ZXIgYm9yZGVyIGNvbG9yXG4kbW9kYWwtZm9vdGVyLWJvcmRlci1jb2xvcjogICAkbW9kYWwtaGVhZGVyLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcblxuJG1vZGFsLWxnOiAgICAgICAgICAgICAgICAgICAgOTAwcHggIWRlZmF1bHQ7XG4kbW9kYWwtbWQ6ICAgICAgICAgICAgICAgICAgICA2MDBweCAhZGVmYXVsdDtcbiRtb2RhbC1zbTogICAgICAgICAgICAgICAgICAgIDMwMHB4ICFkZWZhdWx0O1xuXG5cbi8vPT0gQWxlcnRzXG4vL1xuLy8jIyBEZWZpbmUgYWxlcnQgY29sb3JzLCBib3JkZXIgcmFkaXVzLCBhbmQgcGFkZGluZy5cblxuJGFsZXJ0LXBhZGRpbmc6ICAgICAgICAgICAgICAgMTVweCAhZGVmYXVsdDtcbiRhbGVydC1ib3JkZXItcmFkaXVzOiAgICAgICAgICRib3JkZXItcmFkaXVzLWJhc2UgIWRlZmF1bHQ7XG4kYWxlcnQtbGluay1mb250LXdlaWdodDogICAgICBib2xkICFkZWZhdWx0O1xuXG4kYWxlcnQtc3VjY2Vzcy1iZzogICAgICAgICAgICAkc3RhdGUtc3VjY2Vzcy1iZyAhZGVmYXVsdDtcbiRhbGVydC1zdWNjZXNzLXRleHQ6ICAgICAgICAgICRzdGF0ZS1zdWNjZXNzLXRleHQgIWRlZmF1bHQ7XG4kYWxlcnQtc3VjY2Vzcy1ib3JkZXI6ICAgICAgICAkc3RhdGUtc3VjY2Vzcy1ib3JkZXIgIWRlZmF1bHQ7XG5cbiRhbGVydC1pbmZvLWJnOiAgICAgICAgICAgICAgICRzdGF0ZS1pbmZvLWJnICFkZWZhdWx0O1xuJGFsZXJ0LWluZm8tdGV4dDogICAgICAgICAgICAgJHN0YXRlLWluZm8tdGV4dCAhZGVmYXVsdDtcbiRhbGVydC1pbmZvLWJvcmRlcjogICAgICAgICAgICRzdGF0ZS1pbmZvLWJvcmRlciAhZGVmYXVsdDtcblxuJGFsZXJ0LXdhcm5pbmctYmc6ICAgICAgICAgICAgJHN0YXRlLXdhcm5pbmctYmcgIWRlZmF1bHQ7XG4kYWxlcnQtd2FybmluZy10ZXh0OiAgICAgICAgICAkc3RhdGUtd2FybmluZy10ZXh0ICFkZWZhdWx0O1xuJGFsZXJ0LXdhcm5pbmctYm9yZGVyOiAgICAgICAgJHN0YXRlLXdhcm5pbmctYm9yZGVyICFkZWZhdWx0O1xuXG4kYWxlcnQtZGFuZ2VyLWJnOiAgICAgICAgICAgICAkc3RhdGUtZGFuZ2VyLWJnICFkZWZhdWx0O1xuJGFsZXJ0LWRhbmdlci10ZXh0OiAgICAgICAgICAgJHN0YXRlLWRhbmdlci10ZXh0ICFkZWZhdWx0O1xuJGFsZXJ0LWRhbmdlci1ib3JkZXI6ICAgICAgICAgJHN0YXRlLWRhbmdlci1ib3JkZXIgIWRlZmF1bHQ7XG5cblxuLy89PSBQcm9ncmVzcyBiYXJzXG4vL1xuLy8jI1xuXG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIHdob2xlIHByb2dyZXNzIGNvbXBvbmVudFxuJHByb2dyZXNzLWJnOiAgICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbi8vKiogUHJvZ3Jlc3MgYmFyIHRleHQgY29sb3JcbiRwcm9ncmVzcy1iYXItY29sb3I6ICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIFZhcmlhYmxlIGZvciBzZXR0aW5nIHJvdW5kZWQgY29ybmVycyBvbiBwcm9ncmVzcyBiYXIuXG4kcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogICAgICAkYm9yZGVyLXJhZGl1cy1iYXNlICFkZWZhdWx0O1xuXG4vLyoqIERlZmF1bHQgcHJvZ3Jlc3MgYmFyIGNvbG9yXG4kcHJvZ3Jlc3MtYmFyLWJnOiAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogU3VjY2VzcyBwcm9ncmVzcyBiYXIgY29sb3JcbiRwcm9ncmVzcy1iYXItc3VjY2Vzcy1iZzogICAgICRicmFuZC1zdWNjZXNzICFkZWZhdWx0O1xuLy8qKiBXYXJuaW5nIHByb2dyZXNzIGJhciBjb2xvclxuJHByb2dyZXNzLWJhci13YXJuaW5nLWJnOiAgICAgJGJyYW5kLXdhcm5pbmcgIWRlZmF1bHQ7XG4vLyoqIERhbmdlciBwcm9ncmVzcyBiYXIgY29sb3JcbiRwcm9ncmVzcy1iYXItZGFuZ2VyLWJnOiAgICAgICRicmFuZC1kYW5nZXIgIWRlZmF1bHQ7XG4vLyoqIEluZm8gcHJvZ3Jlc3MgYmFyIGNvbG9yXG4kcHJvZ3Jlc3MtYmFyLWluZm8tYmc6ICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcblxuXG4vLz09IExpc3QgZ3JvdXBcbi8vXG4vLyMjXG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvbiBgLmxpc3QtZ3JvdXAtaXRlbWBcbiRsaXN0LWdyb3VwLWJnOiAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogYC5saXN0LWdyb3VwLWl0ZW1gIGJvcmRlciBjb2xvclxuJGxpc3QtZ3JvdXAtYm9yZGVyOiAgICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuLy8qKiBMaXN0IGdyb3VwIGJvcmRlciByYWRpdXNcbiRsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXM6ICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHNpbmdsZSBsaXN0IGl0ZW1zIG9uIGhvdmVyXG4kbGlzdC1ncm91cC1ob3Zlci1iZzogICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4vLyoqIFRleHQgY29sb3Igb2YgYWN0aXZlIGxpc3QgaXRlbXNcbiRsaXN0LWdyb3VwLWFjdGl2ZS1jb2xvcjogICAgICAgJGNvbXBvbmVudC1hY3RpdmUtY29sb3IgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgYWN0aXZlIGxpc3QgaXRlbXNcbiRsaXN0LWdyb3VwLWFjdGl2ZS1iZzogICAgICAgICAgJGNvbXBvbmVudC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG4vLyoqIEJvcmRlciBjb2xvciBvZiBhY3RpdmUgbGlzdCBlbGVtZW50c1xuJGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjogICAgICAkbGlzdC1ncm91cC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG4vLyoqIFRleHQgY29sb3IgZm9yIGNvbnRlbnQgd2l0aGluIGFjdGl2ZSBsaXN0IGl0ZW1zXG4kbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjogIGxpZ2h0ZW4oJGxpc3QtZ3JvdXAtYWN0aXZlLWJnLCA0MCUpICFkZWZhdWx0O1xuXG4vLyoqIFRleHQgY29sb3Igb2YgZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtY29sb3I6ICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtYmc6ICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbi8vKiogVGV4dCBjb2xvciBmb3IgY29udGVudCB3aXRoaW4gZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtdGV4dC1jb2xvcjogJGxpc3QtZ3JvdXAtZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG5cbiRsaXN0LWdyb3VwLWxpbmstY29sb3I6ICAgICAgICAgIzU1NSAhZGVmYXVsdDtcbiRsaXN0LWdyb3VwLWxpbmstaG92ZXItY29sb3I6ICAgJGxpc3QtZ3JvdXAtbGluay1jb2xvciAhZGVmYXVsdDtcbiRsaXN0LWdyb3VwLWxpbmstaGVhZGluZy1jb2xvcjogIzMzMyAhZGVmYXVsdDtcblxuXG4vLz09IFBhbmVsc1xuLy9cbi8vIyNcblxuJHBhbmVsLWJnOiAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRwYW5lbC1ib2R5LXBhZGRpbmc6ICAgICAgICAgIDE1cHggIWRlZmF1bHQ7XG4kcGFuZWwtaGVhZGluZy1wYWRkaW5nOiAgICAgICAxMHB4IDE1cHggIWRlZmF1bHQ7XG4kcGFuZWwtZm9vdGVyLXBhZGRpbmc6ICAgICAgICAkcGFuZWwtaGVhZGluZy1wYWRkaW5nICFkZWZhdWx0O1xuJHBhbmVsLWJvcmRlci1yYWRpdXM6ICAgICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBCb3JkZXIgY29sb3IgZm9yIGVsZW1lbnRzIHdpdGhpbiBwYW5lbHNcbiRwYW5lbC1pbm5lci1ib3JkZXI6ICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG4kcGFuZWwtZm9vdGVyLWJnOiAgICAgICAgICAgICAjZjVmNWY1ICFkZWZhdWx0O1xuXG4kcGFuZWwtZGVmYXVsdC10ZXh0OiAgICAgICAgICAkZ3JheS1kYXJrICFkZWZhdWx0O1xuJHBhbmVsLWRlZmF1bHQtYm9yZGVyOiAgICAgICAgI2RkZCAhZGVmYXVsdDtcbiRwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmc6ICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG5cbiRwYW5lbC1wcmltYXJ5LXRleHQ6ICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFuZWwtcHJpbWFyeS1ib3JkZXI6ICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRwYW5lbC1wcmltYXJ5LWhlYWRpbmctYmc6ICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuXG4kcGFuZWwtc3VjY2Vzcy10ZXh0OiAgICAgICAgICAkc3RhdGUtc3VjY2Vzcy10ZXh0ICFkZWZhdWx0O1xuJHBhbmVsLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgJHN0YXRlLXN1Y2Nlc3MtYm9yZGVyICFkZWZhdWx0O1xuJHBhbmVsLXN1Y2Nlc3MtaGVhZGluZy1iZzogICAgJHN0YXRlLXN1Y2Nlc3MtYmcgIWRlZmF1bHQ7XG5cbiRwYW5lbC1pbmZvLXRleHQ6ICAgICAgICAgICAgICRzdGF0ZS1pbmZvLXRleHQgIWRlZmF1bHQ7XG4kcGFuZWwtaW5mby1ib3JkZXI6ICAgICAgICAgICAkc3RhdGUtaW5mby1ib3JkZXIgIWRlZmF1bHQ7XG4kcGFuZWwtaW5mby1oZWFkaW5nLWJnOiAgICAgICAkc3RhdGUtaW5mby1iZyAhZGVmYXVsdDtcblxuJHBhbmVsLXdhcm5pbmctdGV4dDogICAgICAgICAgJHN0YXRlLXdhcm5pbmctdGV4dCAhZGVmYXVsdDtcbiRwYW5lbC13YXJuaW5nLWJvcmRlcjogICAgICAgICRzdGF0ZS13YXJuaW5nLWJvcmRlciAhZGVmYXVsdDtcbiRwYW5lbC13YXJuaW5nLWhlYWRpbmctYmc6ICAgICRzdGF0ZS13YXJuaW5nLWJnICFkZWZhdWx0O1xuXG4kcGFuZWwtZGFuZ2VyLXRleHQ6ICAgICAgICAgICAkc3RhdGUtZGFuZ2VyLXRleHQgIWRlZmF1bHQ7XG4kcGFuZWwtZGFuZ2VyLWJvcmRlcjogICAgICAgICAkc3RhdGUtZGFuZ2VyLWJvcmRlciAhZGVmYXVsdDtcbiRwYW5lbC1kYW5nZXItaGVhZGluZy1iZzogICAgICRzdGF0ZS1kYW5nZXItYmcgIWRlZmF1bHQ7XG5cblxuLy89PSBUaHVtYm5haWxzXG4vL1xuLy8jI1xuXG4vLyoqIFBhZGRpbmcgYXJvdW5kIHRoZSB0aHVtYm5haWwgaW1hZ2VcbiR0aHVtYm5haWwtcGFkZGluZzogICAgICAgICAgIDRweCAhZGVmYXVsdDtcbi8vKiogVGh1bWJuYWlsIGJhY2tncm91bmQgY29sb3JcbiR0aHVtYm5haWwtYmc6ICAgICAgICAgICAgICAgICRib2R5LWJnICFkZWZhdWx0O1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIGNvbG9yXG4kdGh1bWJuYWlsLWJvcmRlcjogICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIHJhZGl1c1xuJHRodW1ibmFpbC1ib3JkZXItcmFkaXVzOiAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBDdXN0b20gdGV4dCBjb2xvciBmb3IgdGh1bWJuYWlsIGNhcHRpb25zXG4kdGh1bWJuYWlsLWNhcHRpb24tY29sb3I6ICAgICAkdGV4dC1jb2xvciAhZGVmYXVsdDtcbi8vKiogUGFkZGluZyBhcm91bmQgdGhlIHRodW1ibmFpbCBjYXB0aW9uXG4kdGh1bWJuYWlsLWNhcHRpb24tcGFkZGluZzogICA5cHggIWRlZmF1bHQ7XG5cblxuLy89PSBXZWxsc1xuLy9cbi8vIyNcblxuJHdlbGwtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbiR3ZWxsLWJvcmRlcjogICAgICAgICAgICAgICAgIGRhcmtlbigkd2VsbC1iZywgNyUpICFkZWZhdWx0O1xuXG5cbi8vPT0gQmFkZ2VzXG4vL1xuLy8jI1xuXG4kYmFkZ2UtY29sb3I6ICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBMaW5rZWQgYmFkZ2UgdGV4dCBjb2xvciBvbiBob3ZlclxuJGJhZGdlLWxpbmstaG92ZXItY29sb3I6ICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRiYWRnZS1iZzogICAgICAgICAgICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuXG4vLyoqIEJhZGdlIHRleHQgY29sb3IgaW4gYWN0aXZlIG5hdiBsaW5rXG4kYmFkZ2UtYWN0aXZlLWNvbG9yOiAgICAgICAgICAkbGluay1jb2xvciAhZGVmYXVsdDtcbi8vKiogQmFkZ2UgYmFja2dyb3VuZCBjb2xvciBpbiBhY3RpdmUgbmF2IGxpbmtcbiRiYWRnZS1hY3RpdmUtYmc6ICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG5cbiRiYWRnZS1mb250LXdlaWdodDogICAgICAgICAgIGJvbGQgIWRlZmF1bHQ7XG4kYmFkZ2UtbGluZS1oZWlnaHQ6ICAgICAgICAgICAxICFkZWZhdWx0O1xuJGJhZGdlLWJvcmRlci1yYWRpdXM6ICAgICAgICAgMTBweCAhZGVmYXVsdDtcblxuXG4vLz09IEJyZWFkY3J1bWJzXG4vL1xuLy8jI1xuXG4kYnJlYWRjcnVtYi1wYWRkaW5nLXZlcnRpY2FsOiAgIDhweCAhZGVmYXVsdDtcbiRicmVhZGNydW1iLXBhZGRpbmctaG9yaXpvbnRhbDogMTVweCAhZGVmYXVsdDtcbi8vKiogQnJlYWRjcnVtYiBiYWNrZ3JvdW5kIGNvbG9yXG4kYnJlYWRjcnVtYi1iZzogICAgICAgICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4vLyoqIEJyZWFkY3J1bWIgdGV4dCBjb2xvclxuJGJyZWFkY3J1bWItY29sb3I6ICAgICAgICAgICAgICAjY2NjICFkZWZhdWx0O1xuLy8qKiBUZXh0IGNvbG9yIG9mIGN1cnJlbnQgcGFnZSBpbiB0aGUgYnJlYWRjcnVtYlxuJGJyZWFkY3J1bWItYWN0aXZlLWNvbG9yOiAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbi8vKiogVGV4dHVhbCBzZXBhcmF0b3IgZm9yIGJldHdlZW4gYnJlYWRjcnVtYiBlbGVtZW50c1xuJGJyZWFkY3J1bWItc2VwYXJhdG9yOiAgICAgICAgICBcIi9cIiAhZGVmYXVsdDtcblxuXG4vLz09IENhcm91c2VsXG4vL1xuLy8jI1xuXG4kY2Fyb3VzZWwtdGV4dC1zaGFkb3c6ICAgICAgICAgICAgICAgICAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjYpICFkZWZhdWx0O1xuXG4kY2Fyb3VzZWwtY29udHJvbC1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRjYXJvdXNlbC1jb250cm9sLXdpZHRoOiAgICAgICAgICAgICAgICAgICAgICAxNSUgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtY29udHJvbC1vcGFjaXR5OiAgICAgICAgICAgICAgICAgICAgLjUgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtY29udHJvbC1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgMjBweCAhZGVmYXVsdDtcblxuJGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcblxuJGNhcm91c2VsLWNhcHRpb24tY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBDbG9zZVxuLy9cbi8vIyNcblxuJGNsb3NlLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgYm9sZCAhZGVmYXVsdDtcbiRjbG9zZS1jb2xvcjogICAgICAgICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4kY2xvc2UtdGV4dC1zaGFkb3c6ICAgICAgICAgICAwIDFweCAwICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBDb2RlXG4vL1xuLy8jI1xuXG4kY29kZS1jb2xvcjogICAgICAgICAgICAgICAgICAjYzcyNTRlICFkZWZhdWx0O1xuJGNvZGUtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y5ZjJmNCAhZGVmYXVsdDtcblxuJGtiZC1jb2xvcjogICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRrYmQtYmc6ICAgICAgICAgICAgICAgICAgICAgICMzMzMgIWRlZmF1bHQ7XG5cbiRwcmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4kcHJlLWNvbG9yOiAgICAgICAgICAgICAgICAgICAkZ3JheS1kYXJrICFkZWZhdWx0O1xuJHByZS1ib3JkZXItY29sb3I6ICAgICAgICAgICAgI2NjYyAhZGVmYXVsdDtcbiRwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0OiAgIDM0MHB4ICFkZWZhdWx0O1xuXG5cbi8vPT0gVHlwZVxuLy9cbi8vIyNcblxuLy8qKiBIb3Jpem9udGFsIG9mZnNldCBmb3IgZm9ybXMgYW5kIGxpc3RzLlxuJGNvbXBvbmVudC1vZmZzZXQtaG9yaXpvbnRhbDogMTgwcHggIWRlZmF1bHQ7XG4vLyoqIFRleHQgbXV0ZWQgY29sb3JcbiR0ZXh0LW11dGVkOiAgICAgICAgICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBBYmJyZXZpYXRpb25zIGFuZCBhY3JvbnltcyBib3JkZXIgY29sb3JcbiRhYmJyLWJvcmRlci1jb2xvcjogICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBIZWFkaW5ncyBzbWFsbCBjb2xvclxuJGhlYWRpbmdzLXNtYWxsLWNvbG9yOiAgICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG4vLyoqIEJsb2NrcXVvdGUgc21hbGwgY29sb3JcbiRibG9ja3F1b3RlLXNtYWxsLWNvbG9yOiAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBCbG9ja3F1b3RlIGZvbnQgc2l6ZVxuJGJsb2NrcXVvdGUtZm9udC1zaXplOiAgICAgICAgKCRmb250LXNpemUtYmFzZSAqIDEuMjUpICFkZWZhdWx0O1xuLy8qKiBCbG9ja3F1b3RlIGJvcmRlciBjb2xvclxuJGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yOiAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbi8vKiogUGFnZSBoZWFkZXIgYm9yZGVyIGNvbG9yXG4kcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yOiAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuLy8qKiBXaWR0aCBvZiBob3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3QgdGl0bGVzXG4kZGwtaG9yaXpvbnRhbC1vZmZzZXQ6ICAgICAgICAkY29tcG9uZW50LW9mZnNldC1ob3Jpem9udGFsICFkZWZhdWx0O1xuLy8qKiBIb3Jpem9udGFsIGxpbmUgY29sb3IuXG4kaHItYm9yZGVyOiAgICAgICAgICAgICAgICAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuIiwiLy8gV2ViS2l0LXN0eWxlIGZvY3VzXG5cbkBtaXhpbiB0YWItZm9jdXMoKSB7XG4gIC8vIERlZmF1bHRcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIC8vIFdlYktpdFxuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuIiwiLy8gSW1hZ2UgTWl4aW5zXG4vLyAtIFJlc3BvbnNpdmUgaW1hZ2Vcbi8vIC0gUmV0aW5hIGltYWdlXG5cblxuLy8gUmVzcG9uc2l2ZSBpbWFnZVxuLy9cbi8vIEtlZXAgaW1hZ2VzIGZyb20gc2NhbGluZyBiZXlvbmQgdGhlIHdpZHRoIG9mIHRoZWlyIHBhcmVudHMuXG5AbWl4aW4gaW1nLXJlc3BvbnNpdmUoJGRpc3BsYXk6IGJsb2NrKSB7XG4gIGRpc3BsYXk6ICRkaXNwbGF5O1xuICBtYXgtd2lkdGg6IDEwMCU7IC8vIFBhcnQgMTogU2V0IGEgbWF4aW11bSByZWxhdGl2ZSB0byB0aGUgcGFyZW50XG4gIGhlaWdodDogYXV0bzsgLy8gUGFydCAyOiBTY2FsZSB0aGUgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgd2lkdGgsIG90aGVyd2lzZSB5b3UgZ2V0IHN0cmV0Y2hpbmdcbn1cblxuXG4vLyBSZXRpbmEgaW1hZ2Vcbi8vXG4vLyBTaG9ydCByZXRpbmEgbWl4aW4gZm9yIHNldHRpbmcgYmFja2dyb3VuZC1pbWFnZSBhbmQgLXNpemUuIE5vdGUgdGhhdCB0aGVcbi8vIHNwZWxsaW5nIG9mIGBtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW9gIGlzIGludGVudGlvbmFsLlxuQG1peGluIGltZy1yZXRpbmEoJGZpbGUtMXgsICRmaWxlLTJ4LCAkd2lkdGgtMXgsICRoZWlnaHQtMXgpIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGlmKCRib290c3RyYXAtc2Fzcy1hc3NldC1oZWxwZXIsIHR3YnMtaW1hZ2UtcGF0aChcIiN7JGZpbGUtMXh9XCIpLCBcIiN7JGZpbGUtMXh9XCIpKTtcblxuICBAbWVkaWFcbiAgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgIG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyLzEpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAgICAgICAgICAgIG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgICAgICAgICBtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWYoJGJvb3RzdHJhcC1zYXNzLWFzc2V0LWhlbHBlciwgdHdicy1pbWFnZS1wYXRoKFwiI3skZmlsZS0yeH1cIiksIFwiI3skZmlsZS0yeH1cIikpO1xuICAgIGJhY2tncm91bmQtc2l6ZTogJHdpZHRoLTF4ICRoZWlnaHQtMXg7XG4gIH1cbn1cbiIsIi8vXG4vLyBUeXBvZ3JhcGh5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEhlYWRpbmdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsXG4uaDEsIC5oMiwgLmgzLCAuaDQsIC5oNSwgLmg2IHtcbiAgZm9udC1mYW1pbHk6ICRoZWFkaW5ncy1mb250LWZhbWlseTtcbiAgZm9udC13ZWlnaHQ6ICRoZWFkaW5ncy1mb250LXdlaWdodDtcbiAgbGluZS1oZWlnaHQ6ICRoZWFkaW5ncy1saW5lLWhlaWdodDtcbiAgY29sb3I6ICRoZWFkaW5ncy1jb2xvcjtcblxuICBzbWFsbCxcbiAgLnNtYWxsIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIGNvbG9yOiAkaGVhZGluZ3Mtc21hbGwtY29sb3I7XG4gIH1cbn1cblxuaDEsIC5oMSxcbmgyLCAuaDIsXG5oMywgLmgzIHtcbiAgbWFyZ2luLXRvcDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW4tYm90dG9tOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMik7XG5cbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgZm9udC1zaXplOiA2NSU7XG4gIH1cbn1cbmg0LCAuaDQsXG5oNSwgLmg1LFxuaDYsIC5oNiB7XG4gIG1hcmdpbi10b3A6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgbWFyZ2luLWJvdHRvbTogKCRsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGZvbnQtc2l6ZTogNzUlO1xuICB9XG59XG5cbmgxLCAuaDEgeyBmb250LXNpemU6ICRmb250LXNpemUtaDE7IH1cbmgyLCAuaDIgeyBmb250LXNpemU6ICRmb250LXNpemUtaDI7IH1cbmgzLCAuaDMgeyBmb250LXNpemU6ICRmb250LXNpemUtaDM7IH1cbmg0LCAuaDQgeyBmb250LXNpemU6ICRmb250LXNpemUtaDQ7IH1cbmg1LCAuaDUgeyBmb250LXNpemU6ICRmb250LXNpemUtaDU7IH1cbmg2LCAuaDYgeyBmb250LXNpemU6ICRmb250LXNpemUtaDY7IH1cblxuXG4vLyBCb2R5IHRleHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucCB7XG4gIG1hcmdpbjogMCAwICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbn1cblxuLmxlYWQge1xuICBtYXJnaW4tYm90dG9tOiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGZvbnQtc2l6ZTogZmxvb3IoKCRmb250LXNpemUtYmFzZSAqIDEuMTUpKTtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBmb250LXNpemU6ICgkZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICB9XG59XG5cblxuLy8gRW1waGFzaXMgJiBtaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEV4OiAoMTJweCBzbWFsbCBmb250IC8gMTRweCBiYXNlIGZvbnQpICogMTAwJSA9IGFib3V0IDg1JVxuc21hbGwsXG4uc21hbGwge1xuICBmb250LXNpemU6IGZsb29yKCgxMDAlICogJGZvbnQtc2l6ZS1zbWFsbCAvICRmb250LXNpemUtYmFzZSkpO1xufVxuXG5tYXJrLFxuLm1hcmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkc3RhdGUtd2FybmluZy1iZztcbiAgcGFkZGluZzogLjJlbTtcbn1cblxuLy8gQWxpZ25tZW50XG4udGV4dC1sZWZ0ICAgICAgICAgICB7IHRleHQtYWxpZ246IGxlZnQ7IH1cbi50ZXh0LXJpZ2h0ICAgICAgICAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50ZXh0LWNlbnRlciAgICAgICAgIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9XG4udGV4dC1qdXN0aWZ5ICAgICAgICB7IHRleHQtYWxpZ246IGp1c3RpZnk7IH1cbi50ZXh0LW5vd3JhcCAgICAgICAgIHsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfVxuXG4vLyBUcmFuc2Zvcm1hdGlvblxuLnRleHQtbG93ZXJjYXNlICAgICAgeyB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlOyB9XG4udGV4dC11cHBlcmNhc2UgICAgICB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH1cbi50ZXh0LWNhcGl0YWxpemUgICAgIHsgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7IH1cblxuLy8gQ29udGV4dHVhbCBjb2xvcnNcbi50ZXh0LW11dGVkIHtcbiAgY29sb3I6ICR0ZXh0LW11dGVkO1xufVxuXG5AaW5jbHVkZSB0ZXh0LWVtcGhhc2lzLXZhcmlhbnQoJy50ZXh0LXByaW1hcnknLCAkYnJhbmQtcHJpbWFyeSk7XG5cbkBpbmNsdWRlIHRleHQtZW1waGFzaXMtdmFyaWFudCgnLnRleHQtc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLXRleHQpO1xuXG5AaW5jbHVkZSB0ZXh0LWVtcGhhc2lzLXZhcmlhbnQoJy50ZXh0LWluZm8nLCAkc3RhdGUtaW5mby10ZXh0KTtcblxuQGluY2x1ZGUgdGV4dC1lbXBoYXNpcy12YXJpYW50KCcudGV4dC13YXJuaW5nJywgJHN0YXRlLXdhcm5pbmctdGV4dCk7XG5cbkBpbmNsdWRlIHRleHQtZW1waGFzaXMtdmFyaWFudCgnLnRleHQtZGFuZ2VyJywgJHN0YXRlLWRhbmdlci10ZXh0KTtcblxuLy8gQ29udGV4dHVhbCBiYWNrZ3JvdW5kc1xuLy8gRm9yIG5vdyB3ZSdsbCBsZWF2ZSB0aGVzZSBhbG9uZ3NpZGUgdGhlIHRleHQgY2xhc3NlcyB1bnRpbCB2NCB3aGVuIHdlIGNhblxuLy8gc2FmZWx5IHNoaWZ0IHRoaW5ncyBhcm91bmQgKHBlciBTZW1WZXIgcnVsZXMpLlxuLmJnLXByaW1hcnkge1xuICAvLyBHaXZlbiB0aGUgY29udHJhc3QgaGVyZSwgdGhpcyBpcyB0aGUgb25seSBjbGFzcyB0byBoYXZlIGl0cyBjb2xvciBpbnZlcnRlZFxuICAvLyBhdXRvbWF0aWNhbGx5LlxuICBjb2xvcjogI2ZmZjtcbn1cbkBpbmNsdWRlIGJnLXZhcmlhbnQoJy5iZy1wcmltYXJ5JywgJGJyYW5kLXByaW1hcnkpO1xuXG5AaW5jbHVkZSBiZy12YXJpYW50KCcuYmctc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLWJnKTtcblxuQGluY2x1ZGUgYmctdmFyaWFudCgnLmJnLWluZm8nLCAkc3RhdGUtaW5mby1iZyk7XG5cbkBpbmNsdWRlIGJnLXZhcmlhbnQoJy5iZy13YXJuaW5nJywgJHN0YXRlLXdhcm5pbmctYmcpO1xuXG5AaW5jbHVkZSBiZy12YXJpYW50KCcuYmctZGFuZ2VyJywgJHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUGFnZSBoZWFkZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnBhZ2UtaGVhZGVyIHtcbiAgcGFkZGluZy1ib3R0b206ICgoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMikgLSAxKTtcbiAgbWFyZ2luOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMikgMCAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yO1xufVxuXG5cbi8vIExpc3RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFVub3JkZXJlZCBhbmQgT3JkZXJlZCBsaXN0c1xudWwsXG5vbCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgdWwsXG4gIG9sIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIExpc3Qgb3B0aW9uc1xuXG4vLyBbY29udmVydGVyXSBleHRyYWN0ZWQgZnJvbSBgLmxpc3QtdW5zdHlsZWRgIGZvciBsaWJzYXNzIGNvbXBhdGliaWxpdHlcbkBtaXhpbiBsaXN0LXVuc3R5bGVkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGFzIGBAbWl4aW4gbGlzdC11bnN0eWxlZGAgZm9yIGxpYnNhc3MgY29tcGF0aWJpbGl0eVxuLmxpc3QtdW5zdHlsZWQge1xuICBAaW5jbHVkZSBsaXN0LXVuc3R5bGVkO1xufVxuXG5cbi8vIElubGluZSB0dXJucyBsaXN0IGl0ZW1zIGludG8gaW5saW5lLWJsb2NrXG4ubGlzdC1pbmxpbmUge1xuICBAaW5jbHVkZSBsaXN0LXVuc3R5bGVkO1xuICBtYXJnaW4tbGVmdDogLTVweDtcblxuICA+IGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xuICB9XG59XG5cbi8vIERlc2NyaXB0aW9uIExpc3RzXG5kbCB7XG4gIG1hcmdpbi10b3A6IDA7IC8vIFJlbW92ZSBicm93c2VyIGRlZmF1bHRcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xufVxuZHQsXG5kZCB7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbn1cbmR0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5kZCB7XG4gIG1hcmdpbi1sZWZ0OiAwOyAvLyBVbmRvIGJyb3dzZXIgZGVmYXVsdFxufVxuXG4vLyBIb3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3RzXG4vL1xuLy8gRGVmYXVsdHMgdG8gYmVpbmcgc3RhY2tlZCB3aXRob3V0IGFueSBvZiB0aGUgYmVsb3cgc3R5bGVzIGFwcGxpZWQsIHVudGlsIHRoZVxuLy8gZ3JpZCBicmVha3BvaW50IGlzIHJlYWNoZWQgKGRlZmF1bHQgb2Ygfjc2OHB4KS5cblxuLmRsLWhvcml6b250YWwge1xuICBkZCB7XG4gICAgQGluY2x1ZGUgY2xlYXJmaXg7IC8vIENsZWFyIHRoZSBmbG9hdGVkIGBkdGAgaWYgYW4gZW1wdHkgYGRkYCBpcyBwcmVzZW50XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGR0IHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgd2lkdGg6ICgkZGwtaG9yaXpvbnRhbC1vZmZzZXQgLSAyMCk7XG4gICAgICBjbGVhcjogbGVmdDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgQGluY2x1ZGUgdGV4dC1vdmVyZmxvdztcbiAgICB9XG4gICAgZGQge1xuICAgICAgbWFyZ2luLWxlZnQ6ICRkbC1ob3Jpem9udGFsLW9mZnNldDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBNaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEFiYnJldmlhdGlvbnMgYW5kIGFjcm9ueW1zXG5hYmJyW3RpdGxlXSxcbi8vIEFkZCBkYXRhLSogYXR0cmlidXRlIHRvIGhlbHAgb3V0IG91ciB0b29sdGlwIHBsdWdpbiwgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNTI1N1xuYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSB7XG4gIGN1cnNvcjogaGVscDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAkYWJici1ib3JkZXItY29sb3I7XG59XG4uaW5pdGlhbGlzbSB7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBAZXh0ZW5kIC50ZXh0LXVwcGVyY2FzZTtcbn1cblxuLy8gQmxvY2txdW90ZXNcbmJsb2NrcXVvdGUge1xuICBwYWRkaW5nOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMikgJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW46IDAgMCAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGZvbnQtc2l6ZTogJGJsb2NrcXVvdGUtZm9udC1zaXplO1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICRibG9ja3F1b3RlLWJvcmRlci1jb2xvcjtcblxuICBwLFxuICB1bCxcbiAgb2wge1xuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdGU6IERlcHJlY2F0ZWQgc21hbGwgYW5kIC5zbWFsbCBhcyBvZiB2My4xLjBcbiAgLy8gQ29udGV4dDogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTY2MFxuICBmb290ZXIsXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGZvbnQtc2l6ZTogODAlOyAvLyBiYWNrIHRvIGRlZmF1bHQgZm9udC1zaXplXG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICAgIGNvbG9yOiAkYmxvY2txdW90ZS1zbWFsbC1jb2xvcjtcblxuICAgICY6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6ICdcXDIwMTQgXFwwMEEwJzsgLy8gZW0gZGFzaCwgbmJzcFxuICAgIH1cbiAgfVxufVxuXG4vLyBPcHBvc2l0ZSBhbGlnbm1lbnQgb2YgYmxvY2txdW90ZVxuLy9cbi8vIEhlYWRzIHVwOiBgYmxvY2txdW90ZS5wdWxsLXJpZ2h0YCBoYXMgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHYzLjEuMC5cbi5ibG9ja3F1b3RlLXJldmVyc2UsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQge1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGJvcmRlci1yaWdodDogNXB4IHNvbGlkICRibG9ja3F1b3RlLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLWxlZnQ6IDA7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuXG4gIC8vIEFjY291bnQgZm9yIGNpdGF0aW9uXG4gIGZvb3RlcixcbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgJjpiZWZvcmUgeyBjb250ZW50OiAnJzsgfVxuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJ1xcMDBBMCBcXDIwMTQnOyAvLyBuYnNwLCBlbSBkYXNoXG4gICAgfVxuICB9XG59XG5cbi8vIEFkZHJlc3Nlc1xuYWRkcmVzcyB7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG59XG4iLCIvLyBUeXBvZ3JhcGh5XG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIHRleHQtZW1waGFzaXMtdmFyaWFudCgkcGFyZW50LCAkY29sb3IpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgY29sb3I6ICRjb2xvcjtcbiAgfVxuICBhI3skcGFyZW50fTpob3ZlcixcbiAgYSN7JHBhcmVudH06Zm9jdXMge1xuICAgIGNvbG9yOiBkYXJrZW4oJGNvbG9yLCAxMCUpO1xuICB9XG59XG4iLCIvLyBDb250ZXh0dWFsIGJhY2tncm91bmRzXG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIGJnLXZhcmlhbnQoJHBhcmVudCwgJGNvbG9yKSB7XG4gICN7JHBhcmVudH0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbiAgfVxuICBhI3skcGFyZW50fTpob3ZlcixcbiAgYSN7JHBhcmVudH06Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vIENsZWFyZml4XG4vL1xuLy8gRm9yIG1vZGVybiBicm93c2Vyc1xuLy8gMS4gVGhlIHNwYWNlIGNvbnRlbnQgaXMgb25lIHdheSB0byBhdm9pZCBhbiBPcGVyYSBidWcgd2hlbiB0aGVcbi8vICAgIGNvbnRlbnRlZGl0YWJsZSBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgYW55d2hlcmUgZWxzZSBpbiB0aGUgZG9jdW1lbnQuXG4vLyAgICBPdGhlcndpc2UgaXQgY2F1c2VzIHNwYWNlIHRvIGFwcGVhciBhdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgZWxlbWVudHNcbi8vICAgIHRoYXQgYXJlIGNsZWFyZml4ZWQuXG4vLyAyLiBUaGUgdXNlIG9mIGB0YWJsZWAgcmF0aGVyIHRoYW4gYGJsb2NrYCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB1c2luZ1xuLy8gICAgYDpiZWZvcmVgIHRvIGNvbnRhaW4gdGhlIHRvcC1tYXJnaW5zIG9mIGNoaWxkIGVsZW1lbnRzLlxuLy9cbi8vIFNvdXJjZTogaHR0cDovL25pY29sYXNnYWxsYWdoZXIuY29tL21pY3JvLWNsZWFyZml4LWhhY2svXG5cbkBtaXhpbiBjbGVhcmZpeCgpIHtcbiAgJjpiZWZvcmUsXG4gICY6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIFwiOyAvLyAxXG4gICAgZGlzcGxheTogdGFibGU7IC8vIDJcbiAgfVxuICAmOmFmdGVyIHtcbiAgICBjbGVhcjogYm90aDtcbiAgfVxufVxuIiwiLy8gVGV4dCBvdmVyZmxvd1xuLy8gUmVxdWlyZXMgaW5saW5lLWJsb2NrIG9yIGJsb2NrIGZvciBwcm9wZXIgc3R5bGluZ1xuXG5AbWl4aW4gdGV4dC1vdmVyZmxvdygpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4iLCIvL1xuLy8gQ29kZSAoaW5saW5lIGFuZCBibG9jaylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gSW5saW5lIGFuZCBibG9jayBjb2RlIHN0eWxlc1xuY29kZSxcbmtiZCxcbnByZSxcbnNhbXAge1xuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm9zcGFjZTtcbn1cblxuLy8gSW5saW5lIGNvZGVcbmNvZGUge1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBmb250LXNpemU6IDkwJTtcbiAgY29sb3I6ICRjb2RlLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29kZS1iZztcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtYmFzZTtcbn1cblxuLy8gVXNlciBpbnB1dCB0eXBpY2FsbHkgZW50ZXJlZCB2aWEga2V5Ym9hcmRcbmtiZCB7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBjb2xvcjogJGtiZC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGtiZC1iZztcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjI1KTtcblxuICBrYmQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC1zaXplOiAxMDAlO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbn1cblxuLy8gQmxvY2tzIG9mIGNvZGVcbnByZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAoKCRsaW5lLWhlaWdodC1jb21wdXRlZCAtIDEpIC8gMik7XG4gIG1hcmdpbjogMCAwICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgZm9udC1zaXplOiAoJGZvbnQtc2l6ZS1iYXNlIC0gMSk7IC8vIDE0cHggdG8gMTNweFxuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBjb2xvcjogJHByZS1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHByZS1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJHByZS1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgLy8gQWNjb3VudCBmb3Igc29tZSBjb2RlIG91dHB1dHMgdGhhdCBwbGFjZSBjb2RlIHRhZ3MgaW4gcHJlIHRhZ3NcbiAgY29kZSB7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLy8gRW5hYmxlIHNjcm9sbGFibGUgYmxvY2tzIG9mIGNvZGVcbi5wcmUtc2Nyb2xsYWJsZSB7XG4gIG1heC1oZWlnaHQ6ICRwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4iLCIvL1xuLy8gR3JpZCBzeXN0ZW1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQ29udGFpbmVyIHdpZHRoc1xuLy9cbi8vIFNldCB0aGUgY29udGFpbmVyIHdpZHRoLCBhbmQgb3ZlcnJpZGUgaXQgZm9yIGZpeGVkIG5hdmJhcnMgaW4gbWVkaWEgcXVlcmllcy5cblxuLmNvbnRhaW5lciB7XG4gIEBpbmNsdWRlIGNvbnRhaW5lci1maXhlZDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1zbTtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1tZDtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1sZztcbiAgfVxufVxuXG5cbi8vIEZsdWlkIGNvbnRhaW5lclxuLy9cbi8vIFV0aWxpemVzIHRoZSBtaXhpbiBtZWFudCBmb3IgZml4ZWQgd2lkdGggY29udGFpbmVycywgYnV0IHdpdGhvdXQgYW55IGRlZmluZWRcbi8vIHdpZHRoIGZvciBmbHVpZCwgZnVsbCB3aWR0aCBsYXlvdXRzLlxuXG4uY29udGFpbmVyLWZsdWlkIHtcbiAgQGluY2x1ZGUgY29udGFpbmVyLWZpeGVkO1xufVxuXG5cbi8vIFJvd1xuLy9cbi8vIFJvd3MgY29udGFpbiBhbmQgY2xlYXIgdGhlIGZsb2F0cyBvZiB5b3VyIGNvbHVtbnMuXG5cbi5yb3cge1xuICBAaW5jbHVkZSBtYWtlLXJvdztcbn1cblxuXG4vLyBDb2x1bW5zXG4vL1xuLy8gQ29tbW9uIHN0eWxlcyBmb3Igc21hbGwgYW5kIGxhcmdlIGdyaWQgY29sdW1uc1xuXG5AaW5jbHVkZSBtYWtlLWdyaWQtY29sdW1ucztcblxuXG4vLyBFeHRyYSBzbWFsbCBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIGV4dHJhIHNtYWxsIGRldmljZXMgbGlrZVxuLy8gc21hcnRwaG9uZXMuXG5cbkBpbmNsdWRlIG1ha2UtZ3JpZCh4cyk7XG5cblxuLy8gU21hbGwgZ3JpZFxuLy9cbi8vIENvbHVtbnMsIG9mZnNldHMsIHB1c2hlcywgYW5kIHB1bGxzIGZvciB0aGUgc21hbGwgZGV2aWNlIHJhbmdlLCBmcm9tIHBob25lc1xuLy8gdG8gdGFibGV0cy5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gIEBpbmNsdWRlIG1ha2UtZ3JpZChzbSk7XG59XG5cblxuLy8gTWVkaXVtIGdyaWRcbi8vXG4vLyBDb2x1bW5zLCBvZmZzZXRzLCBwdXNoZXMsIGFuZCBwdWxscyBmb3IgdGhlIGRlc2t0b3AgZGV2aWNlIHJhbmdlLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIHtcbiAgQGluY2x1ZGUgbWFrZS1ncmlkKG1kKTtcbn1cblxuXG4vLyBMYXJnZSBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIHRoZSBsYXJnZSBkZXNrdG9wIGRldmljZSByYW5nZS5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gIEBpbmNsdWRlIG1ha2UtZ3JpZChsZyk7XG59XG4iLCIvLyBHcmlkIHN5c3RlbVxuLy9cbi8vIEdlbmVyYXRlIHNlbWFudGljIGdyaWQgY29sdW1ucyB3aXRoIHRoZXNlIG1peGlucy5cblxuLy8gQ2VudGVyZWQgY29udGFpbmVyIGVsZW1lbnRcbkBtaXhpbiBjb250YWluZXItZml4ZWQoJGd1dHRlcjogJGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xufVxuXG4vLyBDcmVhdGVzIGEgd3JhcHBlciBmb3IgYSBzZXJpZXMgb2YgY29sdW1uc1xuQG1peGluIG1ha2Utcm93KCRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBtYXJnaW4tbGVmdDogIGNlaWwoKCRndXR0ZXIgLyAtMikpO1xuICBtYXJnaW4tcmlnaHQ6IGZsb29yKCgkZ3V0dGVyIC8gLTIpKTtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBleHRyYSBzbWFsbCBjb2x1bW5zXG5AbWl4aW4gbWFrZS14cy1jb2x1bW4oJGNvbHVtbnMsICRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKCRndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKCRndXR0ZXIgLyAyKTtcbn1cbkBtaXhpbiBtYWtlLXhzLWNvbHVtbi1vZmZzZXQoJGNvbHVtbnMpIHtcbiAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xufVxuQG1peGluIG1ha2UteHMtY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG59XG5AbWl4aW4gbWFrZS14cy1jb2x1bW4tcHVsbCgkY29sdW1ucykge1xuICByaWdodDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBzbWFsbCBjb2x1bW5zXG5AbWl4aW4gbWFrZS1zbS1jb2x1bW4oJGNvbHVtbnMsICRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKCRndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKCRndXR0ZXIgLyAyKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLXNtLWNvbHVtbi1vZmZzZXQoJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1zbS1jb2x1bW4tcHVzaCgkY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2Utc20tY29sdW1uLXB1bGwoJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgcmlnaHQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBtZWRpdW0gY29sdW1uc1xuQG1peGluIG1ha2UtbWQtY29sdW1uKCRjb2x1bW5zLCAkZ3V0dGVyOiAkZ3JpZC1ndXR0ZXItd2lkdGgpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1tZC1jb2x1bW4tb2Zmc2V0KCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikge1xuICAgIG1hcmdpbi1sZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2UtbWQtY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gICAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLW1kLWNvbHVtbi1wdWxsKCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikge1xuICAgIHJpZ2h0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuXG4vLyBHZW5lcmF0ZSB0aGUgbGFyZ2UgY29sdW1uc1xuQG1peGluIG1ha2UtbGctY29sdW1uKCRjb2x1bW5zLCAkZ3V0dGVyOiAkZ3JpZC1ndXR0ZXItd2lkdGgpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1sZy1jb2x1bW4tb2Zmc2V0KCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICAgIG1hcmdpbi1sZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2UtbGctY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLWxnLWNvbHVtbi1wdWxsKCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICAgIHJpZ2h0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuIiwiLy8gRnJhbWV3b3JrIGdyaWQgZ2VuZXJhdGlvblxuLy9cbi8vIFVzZWQgb25seSBieSBCb290c3RyYXAgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGdyaWQgY2xhc3NlcyBnaXZlblxuLy8gYW55IHZhbHVlIG9mIGAkZ3JpZC1jb2x1bW5zYC5cblxuLy8gW2NvbnZlcnRlcl0gVGhpcyBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGluIExFU1MsIGJ1dCBTYXNzIHN1cHBvcnRzIHJlYWwgbG9vcHNcbkBtaXhpbiBtYWtlLWdyaWQtY29sdW1ucygkaTogMSwgJGxpc3Q6IFwiLmNvbC14cy0jeyRpfSwgLmNvbC1zbS0jeyRpfSwgLmNvbC1tZC0jeyRpfSwgLmNvbC1sZy0jeyRpfVwiKSB7XG4gIEBmb3IgJGkgZnJvbSAoMSArIDEpIHRocm91Z2ggJGdyaWQtY29sdW1ucyB7XG4gICAgJGxpc3Q6IFwiI3skbGlzdH0sIC5jb2wteHMtI3skaX0sIC5jb2wtc20tI3skaX0sIC5jb2wtbWQtI3skaX0sIC5jb2wtbGctI3skaX1cIjtcbiAgfVxuICAjeyRsaXN0fSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC8vIFByZXZlbnQgY29sdW1ucyBmcm9tIGNvbGxhcHNpbmcgd2hlbiBlbXB0eVxuICAgIG1pbi1oZWlnaHQ6IDFweDtcbiAgICAvLyBJbm5lciBndXR0ZXIgdmlhIHBhZGRpbmdcbiAgICBwYWRkaW5nLWxlZnQ6ICBjZWlsKCgkZ3JpZC1ndXR0ZXItd2lkdGggLyAyKSk7XG4gICAgcGFkZGluZy1yaWdodDogZmxvb3IoKCRncmlkLWd1dHRlci13aWR0aCAvIDIpKTtcbiAgfVxufVxuXG5cbi8vIFtjb252ZXJ0ZXJdIFRoaXMgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBpbiBMRVNTLCBidXQgU2FzcyBzdXBwb3J0cyByZWFsIGxvb3BzXG5AbWl4aW4gZmxvYXQtZ3JpZC1jb2x1bW5zKCRjbGFzcywgJGk6IDEsICRsaXN0OiBcIi5jb2wtI3skY2xhc3N9LSN7JGl9XCIpIHtcbiAgQGZvciAkaSBmcm9tICgxICsgMSkgdGhyb3VnaCAkZ3JpZC1jb2x1bW5zIHtcbiAgICAkbGlzdDogXCIjeyRsaXN0fSwgLmNvbC0jeyRjbGFzc30tI3skaX1cIjtcbiAgfVxuICAjeyRsaXN0fSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuXG5AbWl4aW4gY2FsYy1ncmlkLWNvbHVtbigkaW5kZXgsICRjbGFzcywgJHR5cGUpIHtcbiAgQGlmICgkdHlwZSA9PSB3aWR0aCkgYW5kICgkaW5kZXggPiAwKSB7XG4gICAgLmNvbC0jeyRjbGFzc30tI3skaW5kZXh9IHtcbiAgICAgIHdpZHRoOiBwZXJjZW50YWdlKCgkaW5kZXggLyAkZ3JpZC1jb2x1bW5zKSk7XG4gICAgfVxuICB9XG4gIEBpZiAoJHR5cGUgPT0gcHVzaCkgYW5kICgkaW5kZXggPiAwKSB7XG4gICAgLmNvbC0jeyRjbGFzc30tcHVzaC0jeyRpbmRleH0ge1xuICAgICAgbGVmdDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxuICBAaWYgKCR0eXBlID09IHB1c2gpIGFuZCAoJGluZGV4ID09IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdXNoLTAge1xuICAgICAgbGVmdDogYXV0bztcbiAgICB9XG4gIH1cbiAgQGlmICgkdHlwZSA9PSBwdWxsKSBhbmQgKCRpbmRleCA+IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdWxsLSN7JGluZGV4fSB7XG4gICAgICByaWdodDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxuICBAaWYgKCR0eXBlID09IHB1bGwpIGFuZCAoJGluZGV4ID09IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdWxsLTAge1xuICAgICAgcmlnaHQ6IGF1dG87XG4gICAgfVxuICB9XG4gIEBpZiAoJHR5cGUgPT0gb2Zmc2V0KSB7XG4gICAgLmNvbC0jeyRjbGFzc30tb2Zmc2V0LSN7JGluZGV4fSB7XG4gICAgICBtYXJnaW4tbGVmdDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBbY29udmVydGVyXSBUaGlzIGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgaW4gTEVTUywgYnV0IFNhc3Mgc3VwcG9ydHMgcmVhbCBsb29wc1xuQG1peGluIGxvb3AtZ3JpZC1jb2x1bW5zKCRjb2x1bW5zLCAkY2xhc3MsICR0eXBlKSB7XG4gIEBmb3IgJGkgZnJvbSAwIHRocm91Z2ggJGNvbHVtbnMge1xuICAgIEBpbmNsdWRlIGNhbGMtZ3JpZC1jb2x1bW4oJGksICRjbGFzcywgJHR5cGUpO1xuICB9XG59XG5cblxuLy8gQ3JlYXRlIGdyaWQgZm9yIHNwZWNpZmljIGNsYXNzXG5AbWl4aW4gbWFrZS1ncmlkKCRjbGFzcykge1xuICBAaW5jbHVkZSBmbG9hdC1ncmlkLWNvbHVtbnMoJGNsYXNzKTtcbiAgQGluY2x1ZGUgbG9vcC1ncmlkLWNvbHVtbnMoJGdyaWQtY29sdW1ucywgJGNsYXNzLCB3aWR0aCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgcHVsbCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgcHVzaCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgb2Zmc2V0KTtcbn1cbiIsIi8vXG4vLyBUYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxudGFibGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdGFibGUtYmc7XG59XG5jYXB0aW9uIHtcbiAgcGFkZGluZy10b3A6ICR0YWJsZS1jZWxsLXBhZGRpbmc7XG4gIHBhZGRpbmctYm90dG9tOiAkdGFibGUtY2VsbC1wYWRkaW5nO1xuICBjb2xvcjogJHRleHQtbXV0ZWQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG50aCB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cblxuLy8gQmFzZWxpbmUgc3R5bGVzXG5cbi50YWJsZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgLy8gQ2VsbHNcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIHBhZGRpbmc6ICR0YWJsZS1jZWxsLXBhZGRpbmc7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEJvdHRvbSBhbGlnbiBmb3IgY29sdW1uIGhlYWRpbmdzXG4gID4gdGhlYWQgPiB0ciA+IHRoIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAkdGFibGUtYm9yZGVyLWNvbG9yO1xuICB9XG4gIC8vIFJlbW92ZSB0b3AgYm9yZGVyIGZyb20gdGhlYWQgYnkgZGVmYXVsdFxuICA+IGNhcHRpb24gKyB0aGVhZCxcbiAgPiBjb2xncm91cCArIHRoZWFkLFxuICA+IHRoZWFkOmZpcnN0LWNoaWxkIHtcbiAgICA+IHRyOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gdGgsXG4gICAgICA+IHRkIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gQWNjb3VudCBmb3IgbXVsdGlwbGUgdGJvZHkgaW5zdGFuY2VzXG4gID4gdGJvZHkgKyB0Ym9keSB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gIH1cblxuICAvLyBOZXN0aW5nXG4gIC50YWJsZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmc7XG4gIH1cbn1cblxuXG4vLyBDb25kZW5zZWQgdGFibGUgdy8gaGFsZiBwYWRkaW5nXG5cbi50YWJsZS1jb25kZW5zZWQge1xuICA+IHRoZWFkLFxuICA+IHRib2R5LFxuICA+IHRmb290IHtcbiAgICA+IHRyIHtcbiAgICAgID4gdGgsXG4gICAgICA+IHRkIHtcbiAgICAgICAgcGFkZGluZzogJHRhYmxlLWNvbmRlbnNlZC1jZWxsLXBhZGRpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gQm9yZGVyZWQgdmVyc2lvblxuLy9cbi8vIEFkZCBib3JkZXJzIGFsbCBhcm91bmQgdGhlIHRhYmxlIGFuZCBiZXR3ZWVuIGFsbCB0aGUgY29sdW1ucy5cblxuLnRhYmxlLWJvcmRlcmVkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgJHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gdGhlYWQgPiB0ciB7XG4gICAgPiB0aCxcbiAgICA+IHRkIHtcbiAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDJweDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBaZWJyYS1zdHJpcGluZ1xuLy9cbi8vIERlZmF1bHQgemVicmEtc3RyaXBlIHN0eWxlcyAoYWx0ZXJuYXRpbmcgZ3JheSBhbmQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZHMpXG5cbi50YWJsZS1zdHJpcGVkIHtcbiAgPiB0Ym9keSA+IHRyOm50aC1vZi10eXBlKG9kZCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR0YWJsZS1iZy1hY2NlbnQ7XG4gIH1cbn1cblxuXG4vLyBIb3ZlciBlZmZlY3Rcbi8vXG4vLyBQbGFjZWQgaGVyZSBzaW5jZSBpdCBoYXMgdG8gY29tZSBhZnRlciB0aGUgcG90ZW50aWFsIHplYnJhIHN0cmlwaW5nXG5cbi50YWJsZS1ob3ZlciB7XG4gID4gdGJvZHkgPiB0cjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHRhYmxlLWJnLWhvdmVyO1xuICB9XG59XG5cblxuLy8gVGFibGUgY2VsbCBzaXppbmdcbi8vXG4vLyBSZXNldCBkZWZhdWx0IHRhYmxlIGJlaGF2aW9yXG5cbnRhYmxlIGNvbFtjbGFzcyo9XCJjb2wtXCJdIHtcbiAgcG9zaXRpb246IHN0YXRpYzsgLy8gUHJldmVudCBib3JkZXIgaGlkaW5nIGluIEZpcmVmb3ggYW5kIElFOS0xMSAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE2MjMpXG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiB0YWJsZS1jb2x1bW47XG59XG50YWJsZSB7XG4gIHRkLFxuICB0aCB7XG4gICAgJltjbGFzcyo9XCJjb2wtXCJdIHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0aWM7IC8vIFByZXZlbnQgYm9yZGVyIGhpZGluZyBpbiBGaXJlZm94IGFuZCBJRTktMTEgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjIzKVxuICAgICAgZmxvYXQ6IG5vbmU7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIFRhYmxlIGJhY2tncm91bmRzXG4vL1xuLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbi8vIGluaGVyaXRhbmNlIHRvIG5lc3RlZCB0YWJsZXMuXG5cbi8vIEdlbmVyYXRlIHRoZSBjb250ZXh0dWFsIHZhcmlhbnRzXG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnYWN0aXZlJywgJHRhYmxlLWJnLWFjdGl2ZSk7XG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLWJnKTtcbkBpbmNsdWRlIHRhYmxlLXJvdy12YXJpYW50KCdpbmZvJywgJHN0YXRlLWluZm8tYmcpO1xuQGluY2x1ZGUgdGFibGUtcm93LXZhcmlhbnQoJ3dhcm5pbmcnLCAkc3RhdGUtd2FybmluZy1iZyk7XG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnZGFuZ2VyJywgJHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUmVzcG9uc2l2ZSB0YWJsZXNcbi8vXG4vLyBXcmFwIHlvdXIgdGFibGVzIGluIGAudGFibGUtcmVzcG9uc2l2ZWAgYW5kIHdlJ2xsIG1ha2UgdGhlbSBtb2JpbGUgZnJpZW5kbHlcbi8vIGJ5IGVuYWJsaW5nIGhvcml6b250YWwgc2Nyb2xsaW5nLiBPbmx5IGFwcGxpZXMgPDc2OHB4LiBFdmVyeXRoaW5nIGFib3ZlIHRoYXRcbi8vIHdpbGwgZGlzcGxheSBub3JtYWxseS5cblxuLnRhYmxlLXJlc3BvbnNpdmUge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBtaW4taGVpZ2h0OiAwLjAxJTsgLy8gV29ya2Fyb3VuZCBmb3IgSUU5IGJ1ZyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTQ4MzcpXG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJHNjcmVlbi14cy1tYXgpIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMC43NSk7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogLW1zLWF1dG9oaWRpbmctc2Nyb2xsYmFyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG5cbiAgICAvLyBUaWdodGVuIHVwIHNwYWNpbmdcbiAgICA+IC50YWJsZSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGNvbnRlbnQgZG9lc24ndCB3cmFwXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoLFxuICAgICAgICAgID4gdGQge1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIG92ZXJyaWRlcyBmb3IgdGhlIGJvcmRlcmVkIHRhYmxlc1xuICAgID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICAgIGJvcmRlcjogMDtcblxuICAgICAgLy8gTnVrZSB0aGUgYXBwcm9wcmlhdGUgYm9yZGVycyBzbyB0aGF0IHRoZSBwYXJlbnQgY2FuIGhhbmRsZSB0aGVtXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICAgID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgID4gdGg6bGFzdC1jaGlsZCxcbiAgICAgICAgICA+IHRkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IG51a2UgdGhlIGxhc3Qgcm93J3MgYm90dG9tLWJvcmRlciBpbiBgdGJvZHlgIGFuZCBgdGZvb3RgIHNpbmNlXG4gICAgICAvLyBjaGFuY2VzIGFyZSB0aGVyZSB3aWxsIGJlIG9ubHkgb25lIGB0cmAgaW4gYSBgdGhlYWRgIGFuZCB0aGF0IHdvdWxkXG4gICAgICAvLyByZW1vdmUgdGhlIGJvcmRlciBhbHRvZ2V0aGVyLlxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICAgID4gdGgsXG4gICAgICAgICAgPiB0ZCB7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICB9XG59XG4iLCIvLyBUYWJsZXNcblxuQG1peGluIHRhYmxlLXJvdy12YXJpYW50KCRzdGF0ZSwgJGJhY2tncm91bmQpIHtcbiAgLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbiAgLy8gaW5oZXJpdGFuY2UgdG8gbmVzdGVkIHRhYmxlcy5cbiAgLnRhYmxlID4gdGhlYWQgPiB0cixcbiAgLnRhYmxlID4gdGJvZHkgPiB0cixcbiAgLnRhYmxlID4gdGZvb3QgPiB0ciB7XG4gICAgPiB0ZC4jeyRzdGF0ZX0sXG4gICAgPiB0aC4jeyRzdGF0ZX0sXG4gICAgJi4jeyRzdGF0ZX0gPiB0ZCxcbiAgICAmLiN7JHN0YXRlfSA+IHRoIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhvdmVyIHN0YXRlcyBmb3IgYC50YWJsZS1ob3ZlcmBcbiAgLy8gTm90ZTogdGhpcyBpcyBub3QgYXZhaWxhYmxlIGZvciBjZWxscyBvciByb3dzIHdpdGhpbiBgdGhlYWRgIG9yIGB0Zm9vdGAuXG4gIC50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIge1xuICAgID4gdGQuI3skc3RhdGV9OmhvdmVyLFxuICAgID4gdGguI3skc3RhdGV9OmhvdmVyLFxuICAgICYuI3skc3RhdGV9OmhvdmVyID4gdGQsXG4gICAgJjpob3ZlciA+IC4jeyRzdGF0ZX0sXG4gICAgJi4jeyRzdGF0ZX06aG92ZXIgPiB0aCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oJGJhY2tncm91bmQsIDUlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBGb3Jtc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBOb3JtYWxpemUgbm9uLWNvbnRyb2xzXG4vL1xuLy8gUmVzdHlsZSBhbmQgYmFzZWxpbmUgbm9uLWNvbnRyb2wgZm9ybSBlbGVtZW50cy5cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlcjogMDtcbiAgLy8gQ2hyb21lIGFuZCBGaXJlZm94IHNldCBhIGBtaW4td2lkdGg6IG1pbi1jb250ZW50O2Agb24gZmllbGRzZXRzLFxuICAvLyBzbyB3ZSByZXNldCB0aGF0IHRvIGVuc3VyZSBpdCBiZWhhdmVzIG1vcmUgbGlrZSBhIHN0YW5kYXJkIGJsb2NrIGVsZW1lbnQuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEyMzU5LlxuICBtaW4td2lkdGg6IDA7XG59XG5cbmxlZ2VuZCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBmb250LXNpemU6ICgkZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgY29sb3I6ICRsZWdlbmQtY29sb3I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRsZWdlbmQtYm9yZGVyLWNvbG9yO1xufVxuXG5sYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlOyAvLyBGb3JjZSBJRTggdG8gd3JhcCBsb25nIGNvbnRlbnQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEzMTQxKVxuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5cbi8vIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2xzXG4vL1xuLy8gV2hpbGUgbW9zdCBvZiBvdXIgZm9ybSBzdHlsZXMgcmVxdWlyZSBleHRyYSBjbGFzc2VzLCBzb21lIGJhc2ljIG5vcm1hbGl6YXRpb25cbi8vIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSBvcHRpbXVtIGRpc3BsYXkgd2l0aCBvciB3aXRob3V0IHRob3NlIGNsYXNzZXMgdG8gYmV0dGVyXG4vLyBhZGRyZXNzIGJyb3dzZXIgaW5jb25zaXN0ZW5jaWVzLlxuXG4vLyBPdmVycmlkZSBjb250ZW50LWJveCBpbiBOb3JtYWxpemUgKCogaXNuJ3Qgc3BlY2lmaWMgZW5vdWdoKVxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIEBpbmNsdWRlIGJveC1zaXppbmcoYm9yZGVyLWJveCk7XG59XG5cbi8vIFBvc2l0aW9uIHJhZGlvcyBhbmQgY2hlY2tib3hlcyBiZXR0ZXJcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIG1hcmdpbjogNHB4IDAgMDtcbiAgbWFyZ2luLXRvcDogMXB4IFxcOTsgLy8gSUU4LTlcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuaW5wdXRbdHlwZT1cImZpbGVcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLy8gTWFrZSByYW5nZSBpbnB1dHMgYmVoYXZlIGxpa2UgdGV4dHVhbCBmb3JtIGNvbnRyb2xzXG5pbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi8vIE1ha2UgbXVsdGlwbGUgc2VsZWN0IGVsZW1lbnRzIGhlaWdodCBub3QgZml4ZWRcbnNlbGVjdFttdWx0aXBsZV0sXG5zZWxlY3Rbc2l6ZV0ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8vIEZvY3VzIGZvciBmaWxlLCByYWRpbywgYW5kIGNoZWNrYm94XG5pbnB1dFt0eXBlPVwiZmlsZVwiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpmb2N1cyB7XG4gIEBpbmNsdWRlIHRhYi1mb2N1cztcbn1cblxuLy8gQWRqdXN0IG91dHB1dCBlbGVtZW50XG5vdXRwdXQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7XG4gIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1iYXNlO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiAkaW5wdXQtY29sb3I7XG59XG5cblxuLy8gQ29tbW9uIGZvcm0gY29udHJvbHNcbi8vXG4vLyBTaGFyZWQgc2l6ZSBhbmQgdHlwZSByZXNldHMgZm9yIGZvcm0gY29udHJvbHMuIEFwcGx5IGAuZm9ybS1jb250cm9sYCB0byBhbnlcbi8vIG9mIHRoZSBmb2xsb3dpbmcgZm9ybSBjb250cm9sczpcbi8vXG4vLyBzZWxlY3Rcbi8vIHRleHRhcmVhXG4vLyBpbnB1dFt0eXBlPVwidGV4dFwiXVxuLy8gaW5wdXRbdHlwZT1cInBhc3N3b3JkXCJdXG4vLyBpbnB1dFt0eXBlPVwiZGF0ZXRpbWVcIl1cbi8vIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXVxuLy8gaW5wdXRbdHlwZT1cImRhdGVcIl1cbi8vIGlucHV0W3R5cGU9XCJtb250aFwiXVxuLy8gaW5wdXRbdHlwZT1cInRpbWVcIl1cbi8vIGlucHV0W3R5cGU9XCJ3ZWVrXCJdXG4vLyBpbnB1dFt0eXBlPVwibnVtYmVyXCJdXG4vLyBpbnB1dFt0eXBlPVwiZW1haWxcIl1cbi8vIGlucHV0W3R5cGU9XCJ1cmxcIl1cbi8vIGlucHV0W3R5cGU9XCJzZWFyY2hcIl1cbi8vIGlucHV0W3R5cGU9XCJ0ZWxcIl1cbi8vIGlucHV0W3R5cGU9XCJjb2xvclwiXVxuXG4uZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtYmFzZTsgLy8gTWFrZSBpbnB1dHMgYXQgbGVhc3QgdGhlIGhlaWdodCBvZiB0aGVpciBidXR0b24gY291bnRlcnBhcnQgKGJhc2UgbGluZS1oZWlnaHQgKyBwYWRkaW5nICsgYm9yZGVyKVxuICBwYWRkaW5nOiAkcGFkZGluZy1iYXNlLXZlcnRpY2FsICRwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICRpbnB1dC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0LWJnO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkICRpbnB1dC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRpbnB1dC1ib3JkZXItcmFkaXVzOyAvLyBOb3RlOiBUaGlzIGhhcyBubyBlZmZlY3Qgb24gPHNlbGVjdD5zIGluIHNvbWUgYnJvd3NlcnMsIGR1ZSB0byB0aGUgbGltaXRlZCBzdHlsYWJpbGl0eSBvZiA8c2VsZWN0PnMgaW4gQ1NTLlxuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpKTtcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAuMTVzKTtcblxuICAvLyBDdXN0b21pemUgdGhlIGA6Zm9jdXNgIHN0YXRlIHRvIGltaXRhdGUgbmF0aXZlIFdlYktpdCBzdHlsZXMuXG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC1mb2N1cztcblxuICAvLyBQbGFjZWhvbGRlclxuICBAaW5jbHVkZSBwbGFjZWhvbGRlcjtcblxuICAvLyBEaXNhYmxlZCBhbmQgcmVhZC1vbmx5IGlucHV0c1xuICAvL1xuICAvLyBIVE1MNSBzYXlzIHRoYXQgY29udHJvbHMgdW5kZXIgYSBmaWVsZHNldCA+IGxlZ2VuZDpmaXJzdC1jaGlsZCB3b24ndCBiZVxuICAvLyBkaXNhYmxlZCBpZiB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQuIER1ZSB0byBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHR5LCB3ZVxuICAvLyBkb24ndCBob25vciB0aGF0IGVkZ2UgY2FzZTsgd2Ugc3R5bGUgdGhlbSBhcyBkaXNhYmxlZCBhbnl3YXkuXG4gICZbZGlzYWJsZWRdLFxuICAmW3JlYWRvbmx5XSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1iZy1kaXNhYmxlZDtcbiAgICBvcGFjaXR5OiAxOyAvLyBpT1MgZml4IGZvciB1bnJlYWRhYmxlIGRpc2FibGVkIGNvbnRlbnQ7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjU1XG4gIH1cblxuICAmW2Rpc2FibGVkXSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxuXG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCB0ZXh0YXJlYSYgdG8gdGV4dGFyZWEuZm9ybS1jb250cm9sXG59XG5cbi8vIFJlc2V0IGhlaWdodCBmb3IgYHRleHRhcmVhYHNcbnRleHRhcmVhLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuXG4vLyBTZWFyY2ggaW5wdXRzIGluIGlPU1xuLy9cbi8vIFRoaXMgb3ZlcnJpZGVzIHRoZSBleHRyYSByb3VuZGVkIGNvcm5lcnMgb24gc2VhcmNoIGlucHV0cyBpbiBpT1Mgc28gdGhhdCBvdXJcbi8vIGAuZm9ybS1jb250cm9sYCBjbGFzcyBjYW4gcHJvcGVybHkgc3R5bGUgdGhlbS4gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHNpbXBseVxuLy8gYmUgYWRkZWQgdG8gYC5mb3JtLWNvbnRyb2xgIGFzIGl0J3Mgbm90IHNwZWNpZmljIGVub3VnaC4gRm9yIGRldGFpbHMsIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTU4Ni5cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuXG4vLyBTcGVjaWFsIHN0eWxlcyBmb3IgaU9TIHRlbXBvcmFsIGlucHV0c1xuLy9cbi8vIEluIE1vYmlsZSBTYWZhcmksIHNldHRpbmcgYGRpc3BsYXk6IGJsb2NrYCBvbiB0ZW1wb3JhbCBpbnB1dHMgY2F1c2VzIHRoZVxuLy8gdGV4dCB3aXRoaW4gdGhlIGlucHV0IHRvIGJlY29tZSB2ZXJ0aWNhbGx5IG1pc2FsaWduZWQuIEFzIGEgd29ya2Fyb3VuZCwgd2Vcbi8vIHNldCBhIHBpeGVsIGxpbmUtaGVpZ2h0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaGVpZ2h0IG9mIHRoZSBpbnB1dCwgYnV0IG9ubHlcbi8vIGZvciBTYWZhcmkuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM5ODQ4XG4vL1xuLy8gTm90ZSB0aGF0IGFzIG9mIDguMywgaU9TIGRvZXNuJ3Qgc3VwcG9ydCBgZGF0ZXRpbWVgIG9yIGB3ZWVrYC5cblxuQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMCkge1xuICBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0sXG4gIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbiAgaW5wdXRbdHlwZT1cIm1vbnRoXCJdIHtcbiAgICAmLmZvcm0tY29udHJvbCB7XG4gICAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICAgIH1cblxuICAgICYuaW5wdXQtc20sXG4gICAgLmlucHV0LWdyb3VwLXNtICYge1xuICAgICAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQtc21hbGw7XG4gICAgfVxuXG4gICAgJi5pbnB1dC1sZyxcbiAgICAuaW5wdXQtZ3JvdXAtbGcgJiB7XG4gICAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1sYXJnZTtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBGb3JtIGdyb3Vwc1xuLy9cbi8vIERlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGUgb3JnYW5pemF0aW9uIGFuZCBzcGFjaW5nIG9mIHZlcnRpY2FsIGZvcm1zLiBGb3Jcbi8vIGhvcml6b250YWwgZm9ybXMsIHVzZSB0aGUgcHJlZGVmaW5lZCBncmlkIGNsYXNzZXMuXG5cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogJGZvcm0tZ3JvdXAtbWFyZ2luLWJvdHRvbTtcbn1cblxuXG4vLyBDaGVja2JveGVzIGFuZCByYWRpb3Ncbi8vXG4vLyBJbmRlbnQgdGhlIGxhYmVscyB0byBwb3NpdGlvbiByYWRpb3MvY2hlY2tib3hlcyBhcyBoYW5naW5nIGNvbnRyb2xzLlxuXG4ucmFkaW8sXG4uY2hlY2tib3gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuXG4gIGxhYmVsIHtcbiAgICBtaW4taGVpZ2h0OiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7IC8vIEVuc3VyZSB0aGUgaW5wdXQgZG9lc24ndCBqdW1wIHdoZW4gdGhlcmUgaXMgbm8gdGV4dFxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4ucmFkaW8gaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuLnJhZGlvLWlubGluZSBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4uY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi1sZWZ0OiAtMjBweDtcbiAgbWFyZ2luLXRvcDogNHB4IFxcOTtcbn1cblxuLnJhZGlvICsgLnJhZGlvLFxuLmNoZWNrYm94ICsgLmNoZWNrYm94IHtcbiAgbWFyZ2luLXRvcDogLTVweDsgLy8gTW92ZSB1cCBzaWJsaW5nIHJhZGlvcyBvciBjaGVja2JveGVzIGZvciB0aWdodGVyIHNwYWNpbmdcbn1cblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIG9uIHNhbWUgbGluZVxuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmFkaW8taW5saW5lICsgLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUgKyAuY2hlY2tib3gtaW5saW5lIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7IC8vIHNwYWNlIG91dCBjb25zZWN1dGl2ZSBpbmxpbmUgY29udHJvbHNcbn1cblxuLy8gQXBwbHkgc2FtZSBkaXNhYmxlZCBjdXJzb3IgdHdlYWsgYXMgZm9yIGlucHV0c1xuLy8gU29tZSBzcGVjaWFsIGNhcmUgaXMgbmVlZGVkIGJlY2F1c2UgPGxhYmVsPnMgZG9uJ3QgaW5oZXJpdCB0aGVpciBwYXJlbnQncyBgY3Vyc29yYC5cbi8vXG4vLyBOb3RlOiBOZWl0aGVyIHJhZGlvcyBub3IgY2hlY2tib3hlcyBjYW4gYmUgcmVhZG9ubHkuXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAmW2Rpc2FibGVkXSxcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuLy8gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBkaXJlY3RseSBvbiA8bGFiZWw+c1xuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICAmLmRpc2FibGVkLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgY3Vyc29yOiAkY3Vyc29yLWRpc2FibGVkO1xuICB9XG59XG4vLyBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIG9uIGVsZW1lbnRzIHdpdGggPGxhYmVsPiBkZXNjZW5kYW50c1xuLnJhZGlvLFxuLmNoZWNrYm94IHtcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGxhYmVsIHtcbiAgICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBTdGF0aWMgZm9ybSBjb250cm9sIHRleHRcbi8vXG4vLyBBcHBseSBjbGFzcyB0byBhIGBwYCBlbGVtZW50IHRvIG1ha2UgYW55IHN0cmluZyBvZiB0ZXh0IGFsaWduIHdpdGggbGFiZWxzIGluXG4vLyBhIGhvcml6b250YWwgZm9ybSBsYXlvdXQuXG5cbi5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgLy8gU2l6ZSBpdCBhcHByb3ByaWF0ZWx5IG5leHQgdG8gcmVhbCBmb3JtIGNvbnRyb2xzXG4gIHBhZGRpbmctdG9wOiAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpO1xuICBwYWRkaW5nLWJvdHRvbTogKCRwYWRkaW5nLWJhc2UtdmVydGljYWwgKyAxKTtcbiAgLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luIGZyb20gYHBgXG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLWJhc2UpO1xuXG4gICYuaW5wdXQtbGcsXG4gICYuaW5wdXQtc20ge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIEJ1aWxkIG9uIGAuZm9ybS1jb250cm9sYCB3aXRoIG1vZGlmaWVyIGNsYXNzZXMgdG8gZGVjcmVhc2Ugb3IgaW5jcmVhc2UgdGhlXG4vLyBoZWlnaHQgYW5kIGZvbnQtc2l6ZSBvZiBmb3JtIGNvbnRyb2xzLlxuLy9cbi8vIFRoZSBgLmZvcm0tZ3JvdXAtKiBmb3JtLWNvbnRyb2xgIHZhcmlhdGlvbnMgYXJlIHNhZGx5IGR1cGxpY2F0ZWQgdG8gYXZvaWQgdGhlXG4vLyBpc3N1ZSBkb2N1bWVudGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTUwNzQuXG5cbkBpbmNsdWRlIGlucHV0LXNpemUoJy5pbnB1dC1zbScsICRpbnB1dC1oZWlnaHQtc21hbGwsICRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsLCAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsLCAkZm9udC1zaXplLXNtYWxsLCAkbGluZS1oZWlnaHQtc21hbGwsICRpbnB1dC1ib3JkZXItcmFkaXVzLXNtYWxsKTtcbi5mb3JtLWdyb3VwLXNtIHtcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIHBhZGRpbmc6ICRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsICRwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogJGlucHV0LWJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICB9XG4gIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbiAgc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLXNtYWxsKTtcbiAgICBwYWRkaW5nOiAoJHBhZGRpbmctc21hbGwtdmVydGljYWwgKyAxKSAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LXNtYWxsO1xuICB9XG59XG5cbkBpbmNsdWRlIGlucHV0LXNpemUoJy5pbnB1dC1sZycsICRpbnB1dC1oZWlnaHQtbGFyZ2UsICRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsLCAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsLCAkZm9udC1zaXplLWxhcmdlLCAkbGluZS1oZWlnaHQtbGFyZ2UsICRpbnB1dC1ib3JkZXItcmFkaXVzLWxhcmdlKTtcbi5mb3JtLWdyb3VwLWxnIHtcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIHBhZGRpbmc6ICRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICRwYWRkaW5nLWxhcmdlLWhvcml6b250YWw7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLWxhcmdlO1xuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogJGlucHV0LWJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cbiAgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICB9XG4gIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbiAgc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLWxhcmdlKTtcbiAgICBwYWRkaW5nOiAoJHBhZGRpbmctbGFyZ2UtdmVydGljYWwgKyAxKSAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1sYXJnZTtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWxhcmdlO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIGZlZWRiYWNrIHN0YXRlc1xuLy9cbi8vIEFwcGx5IGNvbnRleHR1YWwgYW5kIHNlbWFudGljIHN0YXRlcyB0byBpbmRpdmlkdWFsIGZvcm0gY29udHJvbHMuXG5cbi5oYXMtZmVlZGJhY2sge1xuICAvLyBFbmFibGUgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC8vIEVuc3VyZSBpY29ucyBkb24ndCBvdmVybGFwIHRleHRcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgcGFkZGluZy1yaWdodDogKCRpbnB1dC1oZWlnaHQtYmFzZSAqIDEuMjUpO1xuICB9XG59XG4vLyBGZWVkYmFjayBpY29uIChyZXF1aXJlcyAuZ2x5cGhpY29uIGNsYXNzZXMpXG4uZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICB6LWluZGV4OiAyOyAvLyBFbnN1cmUgaWNvbiBpcyBhYm92ZSBpbnB1dCBncm91cHNcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LWJhc2U7XG4gIGhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLmlucHV0LWxnICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1sZyArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtbGFyZ2U7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xufVxuLmlucHV0LXNtICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1zbSArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uZm9ybS1ncm91cC1zbSAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtc21hbGw7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xufVxuXG4vLyBGZWVkYmFjayBzdGF0ZXNcbi5oYXMtc3VjY2VzcyB7XG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCRzdGF0ZS1zdWNjZXNzLXRleHQsICRzdGF0ZS1zdWNjZXNzLXRleHQsICRzdGF0ZS1zdWNjZXNzLWJnKTtcbn1cbi5oYXMtd2FybmluZyB7XG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCRzdGF0ZS13YXJuaW5nLXRleHQsICRzdGF0ZS13YXJuaW5nLXRleHQsICRzdGF0ZS13YXJuaW5nLWJnKTtcbn1cbi5oYXMtZXJyb3Ige1xuICBAaW5jbHVkZSBmb3JtLWNvbnRyb2wtdmFsaWRhdGlvbigkc3RhdGUtZGFuZ2VyLXRleHQsICRzdGF0ZS1kYW5nZXItdGV4dCwgJHN0YXRlLWRhbmdlci1iZyk7XG59XG5cbi8vIFJlcG9zaXRpb24gZmVlZGJhY2sgaWNvbiBpZiBpbnB1dCBoYXMgdmlzaWJsZSBsYWJlbCBhYm92ZVxuLmhhcy1mZWVkYmFjayBsYWJlbCB7XG5cbiAgJiB+IC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICB0b3A6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyA1KTsgLy8gSGVpZ2h0IG9mIHRoZSBgbGFiZWxgIGFuZCBpdHMgbWFyZ2luXG4gIH1cbiAgJi5zci1vbmx5IH4gLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gICAgIHRvcDogMDtcbiAgfVxufVxuXG5cbi8vIEhlbHAgdGV4dFxuLy9cbi8vIEFwcGx5IHRvIGFueSBlbGVtZW50IHlvdSB3aXNoIHRvIGNyZWF0ZSBsaWdodCB0ZXh0IGZvciBwbGFjZW1lbnQgaW1tZWRpYXRlbHlcbi8vIGJlbG93IGEgZm9ybSBjb250cm9sLiBVc2UgZm9yIGdlbmVyYWwgaGVscCwgZm9ybWF0dGluZywgb3IgaW5zdHJ1Y3Rpb25hbCB0ZXh0LlxuXG4uaGVscC1ibG9jayB7XG4gIGRpc3BsYXk6IGJsb2NrOyAvLyBhY2NvdW50IGZvciBhbnkgZWxlbWVudCB1c2luZyBoZWxwLWJsb2NrXG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgY29sb3I6IGxpZ2h0ZW4oJHRleHQtY29sb3IsIDI1JSk7IC8vIGxpZ2h0ZW4gdGhlIHRleHQgc29tZSBmb3IgY29udHJhc3Rcbn1cblxuXG4vLyBJbmxpbmUgZm9ybXNcbi8vXG4vLyBNYWtlIGZvcm1zIGFwcGVhciBpbmxpbmUoLWJsb2NrKSBieSBhZGRpbmcgdGhlIGAuZm9ybS1pbmxpbmVgIGNsYXNzLiBJbmxpbmVcbi8vIGZvcm1zIGJlZ2luIHN0YWNrZWQgb24gZXh0cmEgc21hbGwgKG1vYmlsZSkgZGV2aWNlcyBhbmQgdGhlbiBnbyBpbmxpbmUgd2hlblxuLy8gdmlld3BvcnRzIHJlYWNoIDw3NjhweC5cbi8vXG4vLyBSZXF1aXJlcyB3cmFwcGluZyBpbnB1dHMgYW5kIGxhYmVscyB3aXRoIGAuZm9ybS1ncm91cGAgZm9yIHByb3BlciBkaXNwbGF5IG9mXG4vLyBkZWZhdWx0IEhUTUwgZm9ybSBjb250cm9scyBhbmQgb3VyIGN1c3RvbSBmb3JtIGNvbnRyb2xzIChlLmcuLCBpbnB1dCBncm91cHMpLlxuLy9cbi8vIEhlYWRzIHVwISBUaGlzIGlzIG1peGluLWVkIGludG8gYC5uYXZiYXItZm9ybWAgaW4gbmF2YmFycy5sZXNzLlxuXG4vLyBbY29udmVydGVyXSBleHRyYWN0ZWQgZnJvbSBgLmZvcm0taW5saW5lYCBmb3IgbGlic2FzcyBjb21wYXRpYmlsaXR5XG5AbWl4aW4gZm9ybS1pbmxpbmUge1xuXG4gIC8vIEtpY2sgaW4gdGhlIGlubGluZVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICAvLyBJbmxpbmUtYmxvY2sgYWxsIHRoZSB0aGluZ3MgZm9yIFwiaW5saW5lXCJcbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBJbiBuYXZiYXItZm9ybSwgYWxsb3cgZm9sa3MgdG8gKm5vdCogdXNlIGAuZm9ybS1ncm91cGBcbiAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiBhdXRvOyAvLyBQcmV2ZW50IGxhYmVscyBmcm9tIHN0YWNraW5nIGFib3ZlIGlucHV0cyBpbiBgLmZvcm0tZ3JvdXBgXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3RhdGljIGNvbnRyb2xzIGJlaGF2ZSBsaWtlIHJlZ3VsYXIgb25lc1xuICAgIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG5cbiAgICAuaW5wdXQtZ3JvdXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgICAgLmlucHV0LWdyb3VwLWFkZG9uLFxuICAgICAgLmlucHV0LWdyb3VwLWJ0bixcbiAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnB1dCBncm91cHMgbmVlZCB0aGF0IDEwMCUgd2lkdGggdGhvdWdoXG4gICAgLmlucHV0LWdyb3VwID4gLmZvcm0tY29udHJvbCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuY29udHJvbC1sYWJlbCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZGVmYXVsdCBtYXJnaW4gb24gcmFkaW9zL2NoZWNrYm94ZXMgdGhhdCB3ZXJlIHVzZWQgZm9yIHN0YWNraW5nLCBhbmRcbiAgICAvLyB0aGVuIHVuZG8gdGhlIGZsb2F0aW5nIG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlcyB0byBtYXRjaC5cbiAgICAucmFkaW8sXG4gICAgLmNoZWNrYm94IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgICAgbGFiZWwge1xuICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuICAgIC5yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4gICAgLmNoZWNrYm94IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICB9XG5cbiAgICAvLyBSZS1vdmVycmlkZSB0aGUgZmVlZGJhY2sgaWNvbi5cbiAgICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICAgdG9wOiAwO1xuICAgIH1cbiAgfVxufVxuLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGFzIGBAbWl4aW4gZm9ybS1pbmxpbmVgIGZvciBsaWJzYXNzIGNvbXBhdGliaWxpdHlcbi5mb3JtLWlubGluZSB7XG4gIEBpbmNsdWRlIGZvcm0taW5saW5lO1xufVxuXG5cblxuLy8gSG9yaXpvbnRhbCBmb3Jtc1xuLy9cbi8vIEhvcml6b250YWwgZm9ybXMgYXJlIGJ1aWx0IG9uIGdyaWQgY2xhc3NlcyBhbmQgYWxsb3cgeW91IHRvIGNyZWF0ZSBmb3JtcyB3aXRoXG4vLyBsYWJlbHMgb24gdGhlIGxlZnQgYW5kIGlucHV0cyBvbiB0aGUgcmlnaHQuXG5cbi5mb3JtLWhvcml6b250YWwge1xuXG4gIC8vIENvbnNpc3RlbnQgdmVydGljYWwgYWxpZ25tZW50IG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlc1xuICAvL1xuICAvLyBMYWJlbHMgYWxzbyBnZXQgc29tZSByZXNldCBzdHlsZXMsIGJ1dCB0aGF0IGlzIHNjb3BlZCB0byBhIG1lZGlhIHF1ZXJ5IGJlbG93LlxuICAucmFkaW8sXG4gIC5jaGVja2JveCxcbiAgLnJhZGlvLWlubGluZSxcbiAgLmNoZWNrYm94LWlubGluZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHBhZGRpbmctdG9wOiAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpOyAvLyBEZWZhdWx0IHBhZGRpbmcgcGx1cyBhIGJvcmRlclxuICB9XG4gIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgd2UncmUgYWRkaW5nIHRvIGVuc3VyZSB0aGUgYWxpZ25tZW50IGFuZCBvZiBoZWxwIHRleHRcbiAgLy8gYW5kIG90aGVyIGNvbnRlbnQgYmVsb3cgaXRlbXNcbiAgLnJhZGlvLFxuICAuY2hlY2tib3gge1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpKTtcbiAgfVxuXG4gIC8vIE1ha2UgZm9ybSBncm91cHMgYmVoYXZlIGxpa2Ugcm93c1xuICAuZm9ybS1ncm91cCB7XG4gICAgQGluY2x1ZGUgbWFrZS1yb3c7XG4gIH1cblxuICAvLyBSZXNldCBzcGFjaW5nIGFuZCByaWdodCBhbGlnbiBsYWJlbHMsIGJ1dCBzY29wZSB0byBtZWRpYSBxdWVyaWVzIHNvIHRoYXRcbiAgLy8gbGFiZWxzIG9uIG5hcnJvdyB2aWV3cG9ydHMgc3RhY2sgdGhlIHNhbWUgYXMgYSBkZWZhdWx0IGZvcm0gZXhhbXBsZS5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgLmNvbnRyb2wtbGFiZWwge1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7IC8vIERlZmF1bHQgcGFkZGluZyBwbHVzIGEgYm9yZGVyXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGlvbiBzdGF0ZXNcbiAgLy9cbiAgLy8gUmVwb3NpdGlvbiB0aGUgaWNvbiBiZWNhdXNlIGl0J3Mgbm93IHdpdGhpbiBhIGdyaWQgY29sdW1uIGFuZCBjb2x1bW5zIGhhdmVcbiAgLy8gYHBvc2l0aW9uOiByZWxhdGl2ZTtgIG9uIHRoZW0uIEFsc28gYWNjb3VudHMgZm9yIHRoZSBncmlkIGd1dHRlciBwYWRkaW5nLlxuICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIHJpZ2h0OiBmbG9vcigoJGdyaWQtZ3V0dGVyLXdpZHRoIC8gMikpO1xuICB9XG5cbiAgLy8gRm9ybSBncm91cCBzaXplc1xuICAvL1xuICAvLyBRdWljayB1dGlsaXR5IGNsYXNzIGZvciBhcHBseWluZyBgLmlucHV0LWxnYCBhbmQgYC5pbnB1dC1zbWAgc3R5bGVzIHRvIHRoZVxuICAvLyBpbnB1dHMgYW5kIGxhYmVscyB3aXRoaW4gYSBgLmZvcm0tZ3JvdXBgLlxuICAuZm9ybS1ncm91cC1sZyB7XG4gICAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgICAuY29udHJvbC1sYWJlbCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAoKCRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICogJGxpbmUtaGVpZ2h0LWxhcmdlKSArIDEpO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtbGFyZ2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC5mb3JtLWdyb3VwLXNtIHtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICAgIC5jb250cm9sLWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCArIDEpO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3JtIHZhbGlkYXRpb24gc3RhdGVzXG4vL1xuLy8gVXNlZCBpbiBmb3Jtcy5sZXNzIHRvIGdlbmVyYXRlIHRoZSBmb3JtIHZhbGlkYXRpb24gQ1NTIGZvciB3YXJuaW5ncywgZXJyb3JzLFxuLy8gYW5kIHN1Y2Nlc3Nlcy5cblxuQG1peGluIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCR0ZXh0LWNvbG9yOiAjNTU1LCAkYm9yZGVyLWNvbG9yOiAjY2NjLCAkYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNSkge1xuICAvLyBDb2xvciB0aGUgbGFiZWwgYW5kIGhlbHAgdGV4dFxuICAuaGVscC1ibG9jayxcbiAgLmNvbnRyb2wtbGFiZWwsXG4gIC5yYWRpbyxcbiAgLmNoZWNrYm94LFxuICAucmFkaW8taW5saW5lLFxuICAuY2hlY2tib3gtaW5saW5lLFxuICAmLnJhZGlvIGxhYmVsLFxuICAmLmNoZWNrYm94IGxhYmVsLFxuICAmLnJhZGlvLWlubGluZSBsYWJlbCxcbiAgJi5jaGVja2JveC1pbmxpbmUgbGFiZWwgIHtcbiAgICBjb2xvcjogJHRleHQtY29sb3I7XG4gIH1cbiAgLy8gU2V0IHRoZSBib3JkZXIgYW5kIGJveCBzaGFkb3cgb24gc3BlY2lmaWMgaW5wdXRzIHRvIG1hdGNoXG4gIC5mb3JtLWNvbnRyb2wge1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpKTsgLy8gUmVkZWNsYXJlIHNvIHRyYW5zaXRpb25zIHdvcmtcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogZGFya2VuKCRib3JkZXItY29sb3IsIDEwJSk7XG4gICAgICAkc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwgMCAwIDZweCBsaWdodGVuKCRib3JkZXItY29sb3IsIDIwJSk7XG4gICAgICBAaW5jbHVkZSBib3gtc2hhZG93KCRzaGFkb3cpO1xuICAgIH1cbiAgfVxuICAvLyBTZXQgdmFsaWRhdGlvbiBzdGF0ZXMgYWxzbyBmb3IgYWRkb25zXG4gIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gICAgY29sb3I6ICR0ZXh0LWNvbG9yO1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZC1jb2xvcjtcbiAgfVxuICAvLyBPcHRpb25hbCBmZWVkYmFjayBpY29uXG4gIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIGNvbG9yOiAkdGV4dC1jb2xvcjtcbiAgfVxufVxuXG5cbi8vIEZvcm0gY29udHJvbCBmb2N1cyBzdGF0ZVxuLy9cbi8vIEdlbmVyYXRlIGEgY3VzdG9taXplZCBmb2N1cyBzdGF0ZSBhbmQgZm9yIGFueSBpbnB1dCB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IsXG4vLyB3aGljaCBkZWZhdWx0cyB0byB0aGUgYCRpbnB1dC1ib3JkZXItZm9jdXNgIHZhcmlhYmxlLlxuLy9cbi8vIFdlIGhpZ2hseSBlbmNvdXJhZ2UgeW91IHRvIG5vdCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdmFsdWUsIGJ1dCBpbnN0ZWFkIHVzZVxuLy8gdGhpcyB0byB0d2VhayBjb2xvcnMgb24gYW4gYXMtbmVlZGVkIGJhc2lzLiBUaGlzIGFlc3RoZXRpYyBjaGFuZ2UgaXMgYmFzZWQgb25cbi8vIFdlYktpdCdzIGRlZmF1bHQgc3R5bGVzLCBidXQgYXBwbGljYWJsZSB0byBhIHdpZGVyIHJhbmdlIG9mIGJyb3dzZXJzLiBJdHNcbi8vIHVzYWJpbGl0eSBhbmQgYWNjZXNzaWJpbGl0eSBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IHdpdGggYW55IGNoYW5nZS5cbi8vXG4vLyBFeGFtcGxlIHVzYWdlOiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmx1ZSBib3JkZXIgYW5kIHNoYWRvdyB0byB3aGl0ZSBmb3IgYmV0dGVyXG4vLyBjb250cmFzdCBhZ2FpbnN0IGEgZGFyayBncmF5IGJhY2tncm91bmQuXG5AbWl4aW4gZm9ybS1jb250cm9sLWZvY3VzKCRjb2xvcjogJGlucHV0LWJvcmRlci1mb2N1cykge1xuICAkY29sb3ItcmdiYTogcmdiYShyZWQoJGNvbG9yKSwgZ3JlZW4oJGNvbG9yKSwgYmx1ZSgkY29sb3IpLCAuNik7XG4gICY6Zm9jdXMge1xuICAgIGJvcmRlci1jb2xvcjogJGNvbG9yO1xuICAgIG91dGxpbmU6IDA7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwgMCAwIDhweCAkY29sb3ItcmdiYSk7XG4gIH1cbn1cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIFJlbGF0aXZlIHRleHQgc2l6ZSwgcGFkZGluZywgYW5kIGJvcmRlci1yYWRpaSBjaGFuZ2VzIGZvciBmb3JtIGNvbnRyb2xzLiBGb3Jcbi8vIGhvcml6b250YWwgc2l6aW5nLCB3cmFwIGNvbnRyb2xzIGluIHRoZSBwcmVkZWZpbmVkIGdyaWQgY2xhc3Nlcy4gYDxzZWxlY3Q+YFxuLy8gZWxlbWVudCBnZXRzIHNwZWNpYWwgbG92ZSBiZWNhdXNlIGl0J3Mgc3BlY2lhbCwgYW5kIHRoYXQncyBhIGZhY3QhXG4vLyBbY29udmVydGVyXSAkcGFyZW50IGhhY2tcbkBtaXhpbiBpbnB1dC1zaXplKCRwYXJlbnQsICRpbnB1dC1oZWlnaHQsICRwYWRkaW5nLXZlcnRpY2FsLCAkcGFkZGluZy1ob3Jpem9udGFsLCAkZm9udC1zaXplLCAkbGluZS1oZWlnaHQsICRib3JkZXItcmFkaXVzKSB7XG4gICN7JHBhcmVudH0ge1xuICAgIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgICBwYWRkaW5nOiAkcGFkZGluZy12ZXJ0aWNhbCAkcGFkZGluZy1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZTtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICB9XG5cbiAgc2VsZWN0I3skcGFyZW50fSB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICB9XG5cbiAgdGV4dGFyZWEjeyRwYXJlbnR9LFxuICBzZWxlY3RbbXVsdGlwbGVdI3skcGFyZW50fSB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICB9XG59XG4iLCIvL1xuLy8gQnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWJvdHRvbTogMDsgLy8gRm9yIGlucHV0LmJ0blxuICBmb250LXdlaWdodDogJGJ0bi1mb250LXdlaWdodDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBAaW5jbHVkZSBidXR0b24tc2l6ZSgkcGFkZGluZy1iYXNlLXZlcnRpY2FsLCAkcGFkZGluZy1iYXNlLWhvcml6b250YWwsICRmb250LXNpemUtYmFzZSwgJGxpbmUtaGVpZ2h0LWJhc2UsICRidG4tYm9yZGVyLXJhZGl1cy1iYXNlKTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJixcbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgQGluY2x1ZGUgdGFiLWZvY3VzO1xuICAgIH1cbiAgfVxuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICYuZm9jdXMge1xuICAgIGNvbG9yOiAkYnRuLWRlZmF1bHQtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG5cbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICBvdXRsaW5lOiAwO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhpbnNldCAwIDNweCA1cHggcmdiYSgwLDAsMCwuMTI1KSk7XG4gIH1cblxuICAmLmRpc2FibGVkLFxuICAmW2Rpc2FibGVkXSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICBAaW5jbHVkZSBvcGFjaXR5KC42NSk7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgfVxuXG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCBhJiB0byBhLmJ0blxufVxuXG5hLmJ0biB7XG4gICYuZGlzYWJsZWQsXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgLy8gRnV0dXJlLXByb29mIGRpc2FibGluZyBvZiBjbGlja3Mgb24gYDxhPmAgZWxlbWVudHNcbiAgfVxufVxuXG5cbi8vIEFsdGVybmF0ZSBidXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWRlZmF1bHQge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWRlZmF1bHQtY29sb3IsICRidG4tZGVmYXVsdC1iZywgJGJ0bi1kZWZhdWx0LWJvcmRlcik7XG59XG4uYnRuLXByaW1hcnkge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLXByaW1hcnktY29sb3IsICRidG4tcHJpbWFyeS1iZywgJGJ0bi1wcmltYXJ5LWJvcmRlcik7XG59XG4vLyBTdWNjZXNzIGFwcGVhcnMgYXMgZ3JlZW5cbi5idG4tc3VjY2VzcyB7XG4gIEBpbmNsdWRlIGJ1dHRvbi12YXJpYW50KCRidG4tc3VjY2Vzcy1jb2xvciwgJGJ0bi1zdWNjZXNzLWJnLCAkYnRuLXN1Y2Nlc3MtYm9yZGVyKTtcbn1cbi8vIEluZm8gYXBwZWFycyBhcyBibHVlLWdyZWVuXG4uYnRuLWluZm8ge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWluZm8tY29sb3IsICRidG4taW5mby1iZywgJGJ0bi1pbmZvLWJvcmRlcik7XG59XG4vLyBXYXJuaW5nIGFwcGVhcnMgYXMgb3JhbmdlXG4uYnRuLXdhcm5pbmcge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLXdhcm5pbmctY29sb3IsICRidG4td2FybmluZy1iZywgJGJ0bi13YXJuaW5nLWJvcmRlcik7XG59XG4vLyBEYW5nZXIgYW5kIGVycm9yIGFwcGVhciBhcyByZWRcbi5idG4tZGFuZ2VyIHtcbiAgQGluY2x1ZGUgYnV0dG9uLXZhcmlhbnQoJGJ0bi1kYW5nZXItY29sb3IsICRidG4tZGFuZ2VyLWJnLCAkYnRuLWRhbmdlci1ib3JkZXIpO1xufVxuXG5cbi8vIExpbmsgYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBNYWtlIGEgYnV0dG9uIGxvb2sgYW5kIGJlaGF2ZSBsaWtlIGEgbGlua1xuLmJ0bi1saW5rIHtcbiAgY29sb3I6ICRsaW5rLWNvbG9yO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBib3JkZXItcmFkaXVzOiAwO1xuXG4gICYsXG4gICY6YWN0aXZlLFxuICAmLmFjdGl2ZSxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KG5vbmUpO1xuICB9XG4gICYsXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICY6YWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246ICRsaW5rLWhvdmVyLWRlY29yYXRpb247XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRidG4tbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBCdXR0b24gU2l6ZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tbGcge1xuICAvLyBsaW5lLWhlaWdodDogZW5zdXJlIGV2ZW4tbnVtYmVyZWQgaGVpZ2h0IG9mIGJ1dHRvbiBuZXh0IHRvIGxhcmdlIGlucHV0XG4gIEBpbmNsdWRlIGJ1dHRvbi1zaXplKCRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsLCAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsLCAkZm9udC1zaXplLWxhcmdlLCAkbGluZS1oZWlnaHQtbGFyZ2UsICRidG4tYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG4uYnRuLXNtIHtcbiAgLy8gbGluZS1oZWlnaHQ6IGVuc3VyZSBwcm9wZXIgaGVpZ2h0IG9mIGJ1dHRvbiBuZXh0IHRvIHNtYWxsIGlucHV0XG4gIEBpbmNsdWRlIGJ1dHRvbi1zaXplKCRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsLCAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsLCAkZm9udC1zaXplLXNtYWxsLCAkbGluZS1oZWlnaHQtc21hbGwsICRidG4tYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG4uYnRuLXhzIHtcbiAgQGluY2x1ZGUgYnV0dG9uLXNpemUoJHBhZGRpbmcteHMtdmVydGljYWwsICRwYWRkaW5nLXhzLWhvcml6b250YWwsICRmb250LXNpemUtc21hbGwsICRsaW5lLWhlaWdodC1zbWFsbCwgJGJ0bi1ib3JkZXItcmFkaXVzLXNtYWxsKTtcbn1cblxuXG4vLyBCbG9jayBidXR0b25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi8vIFZlcnRpY2FsbHkgc3BhY2Ugb3V0IG11bHRpcGxlIGJsb2NrIGJ1dHRvbnNcbi5idG4tYmxvY2sgKyAuYnRuLWJsb2NrIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4vLyBTcGVjaWZpY2l0eSBvdmVycmlkZXNcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl0sXG5pbnB1dFt0eXBlPVwicmVzZXRcIl0sXG5pbnB1dFt0eXBlPVwiYnV0dG9uXCJdIHtcbiAgJi5idG4tYmxvY2sge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG4iLCIvLyBCdXR0b24gdmFyaWFudHNcbi8vXG4vLyBFYXNpbHkgcHVtcCBvdXQgZGVmYXVsdCBzdHlsZXMsIGFzIHdlbGwgYXMgOmhvdmVyLCA6Zm9jdXMsIDphY3RpdmUsXG4vLyBhbmQgZGlzYWJsZWQgb3B0aW9ucyBmb3IgYWxsIGJ1dHRvbnNcblxuQG1peGluIGJ1dHRvbi12YXJpYW50KCRjb2xvciwgJGJhY2tncm91bmQsICRib3JkZXIpIHtcbiAgY29sb3I6ICRjb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQ7XG4gIGJvcmRlci1jb2xvcjogJGJvcmRlcjtcblxuICAmOmZvY3VzLFxuICAmLmZvY3VzIHtcbiAgICBjb2xvcjogJGNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTAlKTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJvcmRlciwgMjUlKTtcbiAgfVxuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogJGNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTAlKTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJvcmRlciwgMTIlKTtcbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gJi5kcm9wZG93bi10b2dnbGUge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogZGFya2VuKCRiYWNrZ3JvdW5kLCAxMCUpO1xuICAgICAgICBib3JkZXItY29sb3I6IGRhcmtlbigkYm9yZGVyLCAxMiUpO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTclKTtcbiAgICAgICAgICBib3JkZXItY29sb3I6IGRhcmtlbigkYm9yZGVyLCAyNSUpO1xuICAgIH1cbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gJi5kcm9wZG93bi10b2dnbGUge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIH1cbiAgJi5kaXNhYmxlZCxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmLmZvY3VzLFxuICAgICY6YWN0aXZlLFxuICAgICYuYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kO1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogJGJvcmRlcjtcbiAgICB9XG4gIH1cblxuICAuYmFkZ2Uge1xuICAgIGNvbG9yOiAkYmFja2dyb3VuZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3I7XG4gIH1cbn1cblxuLy8gQnV0dG9uIHNpemVzXG5AbWl4aW4gYnV0dG9uLXNpemUoJHBhZGRpbmctdmVydGljYWwsICRwYWRkaW5nLWhvcml6b250YWwsICRmb250LXNpemUsICRsaW5lLWhlaWdodCwgJGJvcmRlci1yYWRpdXMpIHtcbiAgcGFkZGluZzogJHBhZGRpbmctdmVydGljYWwgJHBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbn1cbiIsIi8vIE9wYWNpdHlcblxuQG1peGluIG9wYWNpdHkoJG9wYWNpdHkpIHtcbiAgb3BhY2l0eTogJG9wYWNpdHk7XG4gIC8vIElFOCBmaWx0ZXJcbiAgJG9wYWNpdHktaWU6ICgkb3BhY2l0eSAqIDEwMCk7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0kb3BhY2l0eS1pZSk7XG59XG4iLCIvL1xuLy8gQ29tcG9uZW50IGFuaW1hdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhlYWRzIHVwIVxuLy9cbi8vIFdlIGRvbid0IHVzZSB0aGUgYC5vcGFjaXR5KClgIG1peGluIGhlcmUgc2luY2UgaXQgY2F1c2VzIGEgYnVnIHdpdGggdGV4dFxuLy8gZmllbGRzIGluIElFNy04LiBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzM1NTIuXG5cbi5mYWRlIHtcbiAgb3BhY2l0eTogMDtcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihvcGFjaXR5IC4xNXMgbGluZWFyKTtcbiAgJi5pbiB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuXG4uY29sbGFwc2Uge1xuICBkaXNwbGF5OiBub25lO1xuXG4gICYuaW4gICAgICB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCB0ciYuaW4gdG8gdHIuY29sbGFwc2UuaW5cbiAgLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIHRib2R5Ji5pbiB0byB0Ym9keS5jb2xsYXBzZS5pblxufVxuXG50ci5jb2xsYXBzZS5pbiAgICB7IGRpc3BsYXk6IHRhYmxlLXJvdzsgfVxuXG50Ym9keS5jb2xsYXBzZS5pbiB7IGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cDsgfVxuXG4uY29sbGFwc2luZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBAaW5jbHVkZSB0cmFuc2l0aW9uLXByb3BlcnR5KGhlaWdodCwgdmlzaWJpbGl0eSk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tZHVyYXRpb24oLjM1cyk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uKGVhc2UpO1xufVxuIiwiLy9cbi8vIERyb3Bkb3duIG1lbnVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIERyb3Bkb3duIGFycm93L2NhcmV0XG4uY2FyZXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlci10b3A6ICAgJGNhcmV0LXdpZHRoLWJhc2UgZGFzaGVkO1xuICBib3JkZXItdG9wOiAgICRjYXJldC13aWR0aC1iYXNlIHNvbGlkIFxcOTsgLy8gSUU4XG4gIGJvcmRlci1yaWdodDogJGNhcmV0LXdpZHRoLWJhc2Ugc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiAgJGNhcmV0LXdpZHRoLWJhc2Ugc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi8vIFRoZSBkcm9wZG93biB3cmFwcGVyIChkaXYpXG4uZHJvcHVwLFxuLmRyb3Bkb3duIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4vLyBQcmV2ZW50IHRoZSBmb2N1cyBvbiB0aGUgZHJvcGRvd24gdG9nZ2xlIHdoZW4gY2xvc2luZyBkcm9wZG93bnNcbi5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBUaGUgZHJvcGRvd24gbWVudSAodWwpXG4uZHJvcGRvd24tbWVudSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LWRyb3Bkb3duO1xuICBkaXNwbGF5OiBub25lOyAvLyBub25lIGJ5IGRlZmF1bHQsIGJ1dCBibG9jayBvbiBcIm9wZW5cIiBvZiB0aGUgbWVudVxuICBmbG9hdDogbGVmdDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIG1hcmdpbjogMnB4IDAgMDsgLy8gb3ZlcnJpZGUgZGVmYXVsdCB1bFxuICBsaXN0LXN0eWxlOiBub25lO1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRW5zdXJlcyBwcm9wZXIgYWxpZ25tZW50IGlmIHBhcmVudCBoYXMgaXQgY2hhbmdlZCAoZS5nLiwgbW9kYWwgZm9vdGVyKVxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkZHJvcGRvd24tYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRkcm9wZG93bi1mYWxsYmFjay1ib3JkZXI7IC8vIElFOCBmYWxsYmFja1xuICBib3JkZXI6IDFweCBzb2xpZCAkZHJvcGRvd24tYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgNnB4IDEycHggcmdiYSgwLDAsMCwuMTc1KSk7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG5cbiAgLy8gQWxpZ25zIHRoZSBkcm9wZG93biBtZW51IHRvIHJpZ2h0XG4gIC8vXG4gIC8vIERlcHJlY2F0ZWQgYXMgb2YgMy4xLjAgaW4gZmF2b3Igb2YgYC5kcm9wZG93bi1tZW51LVtkaXJdYFxuICAmLnB1bGwtcmlnaHQge1xuICAgIHJpZ2h0OiAwO1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cblxuICAvLyBEaXZpZGVycyAoYmFzaWNhbGx5IGFuIGhyKSB3aXRoaW4gdGhlIGRyb3Bkb3duXG4gIC5kaXZpZGVyIHtcbiAgICBAaW5jbHVkZSBuYXYtZGl2aWRlcigkZHJvcGRvd24tZGl2aWRlci1iZyk7XG4gIH1cblxuICAvLyBMaW5rcyB3aXRoaW4gdGhlIGRyb3Bkb3duIG1lbnVcbiAgPiBsaSA+IGEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBhZGRpbmc6IDNweCAyMHB4O1xuICAgIGNsZWFyOiBib3RoO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1jb2xvcjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOyAvLyBwcmV2ZW50IGxpbmtzIGZyb20gcmFuZG9tbHkgYnJlYWtpbmcgb250byBuZXcgbGluZXNcbiAgfVxufVxuXG4vLyBIb3Zlci9Gb2N1cyBzdGF0ZVxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6ICRkcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRkcm9wZG93bi1saW5rLWhvdmVyLWJnO1xuICB9XG59XG5cbi8vIEFjdGl2ZSBzdGF0ZVxuLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSB7XG4gICYsXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIG91dGxpbmU6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGRyb3Bkb3duLWxpbmstYWN0aXZlLWJnO1xuICB9XG59XG5cbi8vIERpc2FibGVkIHN0YXRlXG4vL1xuLy8gR3JheSBvdXQgdGV4dCBhbmQgZW5zdXJlIHRoZSBob3Zlci9mb2N1cyBzdGF0ZSByZW1haW5zIGdyYXlcblxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhIHtcbiAgJixcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6ICRkcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yO1xuICB9XG5cbiAgLy8gTnVrZSBob3Zlci9mb2N1cyBlZmZlY3RzXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZW1vdmUgQ1NTIGdyYWRpZW50XG4gICAgQGluY2x1ZGUgcmVzZXQtZmlsdGVyO1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuXG4vLyBPcGVuIHN0YXRlIGZvciB0aGUgZHJvcGRvd25cbi5vcGVuIHtcbiAgLy8gU2hvdyB0aGUgbWVudVxuICA+IC5kcm9wZG93bi1tZW51IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgb3V0bGluZSB3aGVuIDpmb2N1cyBpcyB0cmlnZ2VyZWRcbiAgPiBhIHtcbiAgICBvdXRsaW5lOiAwO1xuICB9XG59XG5cbi8vIE1lbnUgcG9zaXRpb25pbmdcbi8vXG4vLyBBZGQgZXh0cmEgY2xhc3MgdG8gYC5kcm9wZG93bi1tZW51YCB0byBmbGlwIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGRyb3Bkb3duXG4vLyBtZW51IHdpdGggdGhlIHBhcmVudC5cbi5kcm9wZG93bi1tZW51LXJpZ2h0IHtcbiAgbGVmdDogYXV0bzsgLy8gUmVzZXQgdGhlIGRlZmF1bHQgZnJvbSBgLmRyb3Bkb3duLW1lbnVgXG4gIHJpZ2h0OiAwO1xufVxuLy8gV2l0aCB2Mywgd2UgZW5hYmxlZCBhdXRvLWZsaXBwaW5nIGlmIHlvdSBoYXZlIGEgZHJvcGRvd24gd2l0aGluIGEgcmlnaHRcbi8vIGFsaWduZWQgbmF2IGNvbXBvbmVudC4gVG8gZW5hYmxlIHRoZSB1bmRvaW5nIG9mIHRoYXQsIHdlIHByb3ZpZGUgYW4gb3ZlcnJpZGVcbi8vIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgZHJvcGRvd24gbWVudSBhbGlnbm1lbnQuXG4vL1xuLy8gVGhpcyBpcyBvbmx5IGZvciBsZWZ0LWFsaWduaW5nIGEgZHJvcGRvd24gbWVudSB3aXRoaW4gYSBgLm5hdmJhci1yaWdodGAgb3Jcbi8vIGAucHVsbC1yaWdodGAgbmF2IGNvbXBvbmVudC5cbi5kcm9wZG93bi1tZW51LWxlZnQge1xuICBsZWZ0OiAwO1xuICByaWdodDogYXV0bztcbn1cblxuLy8gRHJvcGRvd24gc2VjdGlvbiBoZWFkZXJzXG4uZHJvcGRvd24taGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDNweCAyMHB4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICRkcm9wZG93bi1oZWFkZXItY29sb3I7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7IC8vIGFzIHdpdGggPiBsaSA+IGFcbn1cblxuLy8gQmFja2Ryb3AgdG8gY2F0Y2ggYm9keSBjbGlja3Mgb24gbW9iaWxlLCBldGMuXG4uZHJvcGRvd24tYmFja2Ryb3Age1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIHRvcDogMDtcbiAgei1pbmRleDogKCR6aW5kZXgtZHJvcGRvd24gLSAxMCk7XG59XG5cbi8vIFJpZ2h0IGFsaWduZWQgZHJvcGRvd25zXG4ucHVsbC1yaWdodCA+IC5kcm9wZG93bi1tZW51IHtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IGF1dG87XG59XG5cbi8vIEFsbG93IGZvciBkcm9wZG93bnMgdG8gZ28gYm90dG9tIHVwIChha2EsIGRyb3B1cC1tZW51KVxuLy9cbi8vIEp1c3QgYWRkIC5kcm9wdXAgYWZ0ZXIgdGhlIHN0YW5kYXJkIC5kcm9wZG93biBjbGFzcyBhbmQgeW91J3JlIHNldCwgYnJvLlxuLy8gVE9ETzogYWJzdHJhY3QgdGhpcyBzbyB0aGF0IHRoZSBuYXZiYXIgZml4ZWQgc3R5bGVzIGFyZSBub3QgcGxhY2VkIGhlcmU/XG5cbi5kcm9wdXAsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24ge1xuICAvLyBSZXZlcnNlIHRoZSBjYXJldFxuICAuY2FyZXQge1xuICAgIGJvcmRlci10b3A6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogJGNhcmV0LXdpZHRoLWJhc2UgZGFzaGVkO1xuICAgIGJvcmRlci1ib3R0b206ICRjYXJldC13aWR0aC1iYXNlIHNvbGlkIFxcOTsgLy8gSUU4XG4gICAgY29udGVudDogXCJcIjtcbiAgfVxuICAvLyBEaWZmZXJlbnQgcG9zaXRpb25pbmcgZm9yIGJvdHRvbSB1cCBtZW51XG4gIC5kcm9wZG93bi1tZW51IHtcbiAgICB0b3A6IGF1dG87XG4gICAgYm90dG9tOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgfVxufVxuXG5cbi8vIENvbXBvbmVudCBhbGlnbm1lbnRcbi8vXG4vLyBSZWl0ZXJhdGUgcGVyIG5hdmJhci5sZXNzIGFuZCB0aGUgbW9kaWZpZWQgY29tcG9uZW50IGFsaWdubWVudCB0aGVyZS5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgLm5hdmJhci1yaWdodCB7XG4gICAgLmRyb3Bkb3duLW1lbnUge1xuICAgICAgcmlnaHQ6IDA7IGxlZnQ6IGF1dG87XG4gICAgfVxuICAgIC8vIE5lY2Vzc2FyeSBmb3Igb3ZlcnJpZGVzIG9mIHRoZSBkZWZhdWx0IHJpZ2h0IGFsaWduZWQgbWVudS5cbiAgICAvLyBXaWxsIHJlbW92ZSBjb21lIHY0IGluIGFsbCBsaWtlbGlob29kLlxuICAgIC5kcm9wZG93bi1tZW51LWxlZnQge1xuICAgICAgbGVmdDogMDsgcmlnaHQ6IGF1dG87XG4gICAgfVxuICB9XG59XG4iLCIvLyBIb3Jpem9udGFsIGRpdmlkZXJzXG4vL1xuLy8gRGl2aWRlcnMgKGJhc2ljYWxseSBhbiBocikgd2l0aGluIGRyb3Bkb3ducyBhbmQgbmF2IGxpc3RzXG5cbkBtaXhpbiBuYXYtZGl2aWRlcigkY29sb3I6ICNlNWU1ZTUpIHtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogKCgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKSAtIDEpIDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbn1cbiIsIi8vIFJlc2V0IGZpbHRlcnMgZm9yIElFXG4vL1xuLy8gV2hlbiB5b3UgbmVlZCB0byByZW1vdmUgYSBncmFkaWVudCBiYWNrZ3JvdW5kLCBkbyBub3QgZm9yZ2V0IHRvIHVzZSB0aGlzIHRvIHJlc2V0XG4vLyB0aGUgSUUgZmlsdGVyIGZvciBJRTkgYW5kIGJlbG93LlxuXG5AbWl4aW4gcmVzZXQtZmlsdGVyKCkge1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChlbmFibGVkID0gZmFsc2UpO1xufVxuIiwiLy9cbi8vIEJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE1ha2UgdGhlIGRpdiBiZWhhdmUgbGlrZSBhIGJ1dHRvblxuLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLy8gbWF0Y2ggLmJ0biBhbGlnbm1lbnQgZ2l2ZW4gZm9udC1zaXplIGhhY2sgYWJvdmVcbiAgPiAuYnRuIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gQnJpbmcgdGhlIFwiYWN0aXZlXCIgYnV0dG9uIHRvIHRoZSBmcm9udFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmOmFjdGl2ZSxcbiAgICAmLmFjdGl2ZSB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgIH1cbiAgfVxufVxuXG4vLyBQcmV2ZW50IGRvdWJsZSBib3JkZXJzIHdoZW4gYnV0dG9ucyBhcmUgbmV4dCB0byBlYWNoIG90aGVyXG4uYnRuLWdyb3VwIHtcbiAgLmJ0biArIC5idG4sXG4gIC5idG4gKyAuYnRuLWdyb3VwLFxuICAuYnRuLWdyb3VwICsgLmJ0bixcbiAgLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsOiBHcm91cCBtdWx0aXBsZSBidXR0b24gZ3JvdXBzIHRvZ2V0aGVyIGZvciBhIHRvb2xiYXJcbi5idG4tdG9vbGJhciB7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4OyAvLyBPZmZzZXQgdGhlIGZpcnN0IGNoaWxkJ3MgbWFyZ2luXG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gIC5idG4sXG4gIC5idG4tZ3JvdXAsXG4gIC5pbnB1dC1ncm91cCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAsXG4gID4gLmlucHV0LWdyb3VwIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLy8gU2V0IGNvcm5lcnMgaW5kaXZpZHVhbCBiZWNhdXNlIHNvbWV0aW1lcyBhIHNpbmdsZSBidXR0b24gY2FuIGJlIGluIGEgLmJ0bi1ncm91cCBhbmQgd2UgbmVlZCA6Zmlyc3QtY2hpbGQgYW5kIDpsYXN0LWNoaWxkIHRvIGJvdGggbWF0Y2hcbi5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gICY6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSkge1xuICAgIEBpbmNsdWRlIGJvcmRlci1yaWdodC1yYWRpdXMoMCk7XG4gIH1cbn1cbi8vIE5lZWQgLmRyb3Bkb3duLXRvZ2dsZSBzaW5jZSA6bGFzdC1jaGlsZCBkb2Vzbid0IGFwcGx5IGdpdmVuIGEgLmRyb3Bkb3duLW1lbnUgaW1tZWRpYXRlbHkgYWZ0ZXIgaXRcbi5idG4tZ3JvdXAgPiAuYnRuOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4uYnRuLWdyb3VwID4gLmRyb3Bkb3duLXRvZ2dsZTpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIEBpbmNsdWRlIGJvcmRlci1sZWZ0LXJhZGl1cygwKTtcbn1cblxuLy8gQ3VzdG9tIGVkaXRzIGZvciBpbmNsdWRpbmcgYnRuLWdyb3VwcyB3aXRoaW4gYnRuLWdyb3VwcyAodXNlZnVsIGZvciBpbmNsdWRpbmcgZHJvcGRvd24gYnV0dG9ucyB3aXRoaW4gYSBidG4tZ3JvdXApXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gID4gLmJ0bjpsYXN0LWNoaWxkLFxuICA+IC5kcm9wZG93bi10b2dnbGUge1xuICAgIEBpbmNsdWRlIGJvcmRlci1yaWdodC1yYWRpdXMoMCk7XG4gIH1cbn1cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgQGluY2x1ZGUgYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuXG4vLyBPbiBhY3RpdmUgYW5kIG9wZW4sIGRvbid0IHNob3cgb3V0bGluZVxuLmJ0bi1ncm91cCAuZHJvcGRvd24tdG9nZ2xlOmFjdGl2ZSxcbi5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgb3V0bGluZTogMDtcbn1cblxuXG4vLyBTaXppbmdcbi8vXG4vLyBSZW1peCB0aGUgZGVmYXVsdCBidXR0b24gc2l6aW5nIGNsYXNzZXMgaW50byBuZXcgb25lcyBmb3IgZWFzaWVyIG1hbmlwdWxhdGlvbi5cblxuLmJ0bi1ncm91cC14cyA+IC5idG4geyBAZXh0ZW5kIC5idG4teHM7IH1cbi5idG4tZ3JvdXAtc20gPiAuYnRuIHsgQGV4dGVuZCAuYnRuLXNtOyB9XG4uYnRuLWdyb3VwLWxnID4gLmJ0biB7IEBleHRlbmQgLmJ0bi1sZzsgfVxuXG5cbi8vIFNwbGl0IGJ1dHRvbiBkcm9wZG93bnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gR2l2ZSB0aGUgbGluZSBiZXR3ZWVuIGJ1dHRvbnMgc29tZSBkZXB0aFxuLmJ0bi1ncm91cCA+IC5idG4gKyAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcbn1cbi5idG4tZ3JvdXAgPiAuYnRuLWxnICsgLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIHBhZGRpbmctbGVmdDogMTJweDtcbiAgcGFkZGluZy1yaWdodDogMTJweDtcbn1cblxuLy8gVGhlIGNsaWNrYWJsZSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBtZW51XG4vLyBSZW1vdmUgdGhlIGdyYWRpZW50IGFuZCBzZXQgdGhlIHNhbWUgaW5zZXQgc2hhZG93IGFzIHRoZSA6YWN0aXZlIHN0YXRlXG4uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSkpO1xuXG4gIC8vIFNob3cgbm8gc2hhZG93IGZvciBgLmJ0bi1saW5rYCBzaW5jZSBpdCBoYXMgbm8gb3RoZXIgYnV0dG9uIHN0eWxlcy5cbiAgJi5idG4tbGluayB7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgfVxufVxuXG5cbi8vIFJlcG9zaXRpb24gdGhlIGNhcmV0XG4uYnRuIC5jYXJldCB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuLy8gQ2FyZXRzIGluIG90aGVyIGJ1dHRvbiBzaXplc1xuLmJ0bi1sZyAuY2FyZXQge1xuICBib3JkZXItd2lkdGg6ICRjYXJldC13aWR0aC1sYXJnZSAkY2FyZXQtd2lkdGgtbGFyZ2UgMDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbn1cbi8vIFVwc2lkZSBkb3duIGNhcmV0cyBmb3IgLmRyb3B1cFxuLmRyb3B1cCAuYnRuLWxnIC5jYXJldCB7XG4gIGJvcmRlci13aWR0aDogMCAkY2FyZXQtd2lkdGgtbGFyZ2UgJGNhcmV0LXdpZHRoLWxhcmdlO1xufVxuXG5cbi8vIFZlcnRpY2FsIGJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCB7XG4gID4gLmJ0bixcbiAgPiAuYnRuLWdyb3VwLFxuICA+IC5idG4tZ3JvdXAgPiAuYnRuIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBmbG9hdDogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICAvLyBDbGVhciBmbG9hdHMgc28gZHJvcGRvd24gbWVudXMgY2FuIGJlIHByb3Blcmx5IHBsYWNlZFxuICA+IC5idG4tZ3JvdXAge1xuICAgIEBpbmNsdWRlIGNsZWFyZml4O1xuICAgID4gLmJ0biB7XG4gICAgICBmbG9hdDogbm9uZTtcbiAgICB9XG4gIH1cblxuICA+IC5idG4gKyAuYnRuLFxuICA+IC5idG4gKyAuYnRuLWdyb3VwLFxuICA+IC5idG4tZ3JvdXAgKyAuYnRuLFxuICA+IC5idG4tZ3JvdXAgKyAuYnRuLWdyb3VwIHtcbiAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuIHtcbiAgJjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICB9XG4gICY6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRidG4tYm9yZGVyLXJhZGl1cy1iYXNlO1xuICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xuICB9XG4gICY6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJGJ0bi1ib3JkZXItcmFkaXVzLWJhc2U7XG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG4gIH1cbn1cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgPiAuYnRuIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkge1xuICA+IC5idG46bGFzdC1jaGlsZCxcbiAgPiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cygwKTtcbiAgfVxufVxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cblxuXG4vLyBKdXN0aWZpZWQgYnV0dG9uIGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCB7XG4gIGRpc3BsYXk6IHRhYmxlO1xuICB3aWR0aDogMTAwJTtcbiAgdGFibGUtbGF5b3V0OiBmaXhlZDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAge1xuICAgIGZsb2F0OiBub25lO1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgd2lkdGg6IDElO1xuICB9XG4gID4gLmJ0bi1ncm91cCAuYnRuIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gID4gLmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxufVxuXG5cbi8vIENoZWNrYm94IGFuZCByYWRpbyBvcHRpb25zXG4vL1xuLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgYnJvd3NlcidzIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjaywgcG93ZXJlZCBieSB0aGVcbi8vIGByZXF1aXJlZGAgYXR0cmlidXRlLCB3ZSBoYXZlIHRvIFwiaGlkZVwiIHRoZSBpbnB1dHMgdmlhIGBjbGlwYC4gV2UgY2Fubm90IHVzZVxuLy8gYGRpc3BsYXk6IG5vbmU7YCBvciBgdmlzaWJpbGl0eTogaGlkZGVuO2AgYXMgdGhhdCBhbHNvIGhpZGVzIHRoZSBwb3BvdmVyLlxuLy8gU2ltcGx5IHZpc3VhbGx5IGhpZGluZyB0aGUgaW5wdXRzIHZpYSBgb3BhY2l0eWAgd291bGQgbGVhdmUgdGhlbSBjbGlja2FibGUgaW5cbi8vIGNlcnRhaW4gY2FzZXMgd2hpY2ggaXMgcHJldmVudGVkIGJ5IHVzaW5nIGBjbGlwYCBhbmQgYHBvaW50ZXItZXZlbnRzYC5cbi8vIFRoaXMgd2F5LCB3ZSBlbnN1cmUgYSBET00gZWxlbWVudCBpcyB2aXNpYmxlIHRvIHBvc2l0aW9uIHRoZSBwb3BvdmVyIGZyb20uXG4vL1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEyNzk0IGFuZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTQ1NTkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0ge1xuICA+IC5idG4sXG4gID4gLmJ0bi1ncm91cCA+IC5idG4ge1xuICAgIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY2xpcDogcmVjdCgwLDAsMCwwKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gU2luZ2xlIHNpZGUgYm9yZGVyLXJhZGl1c1xuXG5AbWl4aW4gYm9yZGVyLXRvcC1yYWRpdXMoJHJhZGl1cykge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHJhZGl1cztcbiAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICRyYWRpdXM7XG59XG5AbWl4aW4gYm9yZGVyLXJpZ2h0LXJhZGl1cygkcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkcmFkaXVzO1xuICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHJhZGl1cztcbn1cbkBtaXhpbiBib3JkZXItYm90dG9tLXJhZGl1cygkcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkcmFkaXVzO1xuICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJHJhZGl1cztcbn1cbkBtaXhpbiBib3JkZXItbGVmdC1yYWRpdXMoJHJhZGl1cykge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAkcmFkaXVzO1xuICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkcmFkaXVzO1xufVxuIiwiLy9cbi8vIElucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQmFzZSBzdHlsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5pbnB1dC1ncm91cCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLy8gRm9yIGRyb3Bkb3duc1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLy8gcHJldmVudCBpbnB1dCBncm91cHMgZnJvbSBpbmhlcml0aW5nIGJvcmRlciBzdHlsZXMgZnJvbSB0YWJsZSBjZWxscyB3aGVuIHBsYWNlZCB3aXRoaW4gYSB0YWJsZVxuXG4gIC8vIFVuZG8gcGFkZGluZyBhbmQgZmxvYXQgb2YgZ3JpZCBjbGFzc2VzXG4gICZbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cblxuICAuZm9ybS1jb250cm9sIHtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGFib3ZlIHRoZSAqYXBwZW5kZWQqIGFkZG9uIGJ1dHRvbiBmb3JcbiAgICAvLyBwcm9wZXIgYm9yZGVyIGNvbG9ycy5cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMjtcblxuICAgIC8vIElFOSBmdWJhcnMgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZSBpbiB0ZXh0IGlucHV0cyBhbmQgdGhlIGFycm93cyBvblxuICAgIC8vIHNlbGVjdCBlbGVtZW50cyBpbiBpbnB1dCBncm91cHMuIFRvIGZpeCBpdCwgd2UgZmxvYXQgdGhlIGlucHV0LiBEZXRhaWxzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE1NjEjaXNzdWVjb21tZW50LTI4OTM2ODU1XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIFNpemluZyBvcHRpb25zXG4vL1xuLy8gUmVtaXggdGhlIGRlZmF1bHQgZm9ybSBjb250cm9sIHNpemluZyBjbGFzc2VzIGludG8gbmV3IG9uZXMgZm9yIGVhc2llclxuLy8gbWFuaXB1bGF0aW9uLlxuXG4uaW5wdXQtZ3JvdXAtbGcgPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICBAZXh0ZW5kIC5pbnB1dC1sZztcbn1cbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIEBleHRlbmQgLmlucHV0LXNtO1xufVxuXG5cbi8vIERpc3BsYXkgYXMgdGFibGUtY2VsbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWJ0bixcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcblxuICAmOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cbi8vIEFkZG9uIGFuZCBhZGRvbiB3cmFwcGVyIGZvciBidXR0b25zXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgd2lkdGg6IDElO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvLyBNYXRjaCB0aGUgaW5wdXRzXG59XG5cbi8vIFRleHQgaW5wdXQgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBwYWRkaW5nOiAkcGFkZGluZy1iYXNlLXZlcnRpY2FsICRwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGlucHV0LWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1ncm91cC1hZGRvbi1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJGlucHV0LWdyb3VwLWFkZG9uLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtYmFzZTtcblxuICAvLyBTaXppbmdcbiAgJi5pbnB1dC1zbSB7XG4gICAgcGFkZGluZzogJHBhZGRpbmctc21hbGwtdmVydGljYWwgJHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgJi5pbnB1dC1sZyB7XG4gICAgcGFkZGluZzogJHBhZGRpbmctbGFyZ2UtdmVydGljYWwgJHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cblxuICAvLyBOdWtlIGRlZmF1bHQgbWFyZ2lucyBmcm9tIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyB0byB2ZXJ0aWNhbGx5IGNlbnRlciB3aXRoaW4uXG4gIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi8vIFJlc2V0IHJvdW5kZWQgY29ybmVyc1xuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBAaW5jbHVkZSBib3JkZXItcmlnaHQtcmFkaXVzKDApO1xufVxuLmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xufVxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6bGFzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1hZGRvbjpsYXN0LWNoaWxkLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXAgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmRyb3Bkb3duLXRvZ2dsZSxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuIHtcbiAgQGluY2x1ZGUgYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQge1xuICBib3JkZXItbGVmdDogMDtcbn1cblxuLy8gQnV0dG9uIGlucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWJ0biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gSmFua2lseSBwcmV2ZW50IGlucHV0IGJ1dHRvbiBncm91cHMgZnJvbSB3cmFwcGluZyB3aXRoIGB3aGl0ZS1zcGFjZWAgYW5kXG4gIC8vIGBmb250LXNpemVgIGluIGNvbWJpbmF0aW9uIHdpdGggYGlubGluZS1ibG9ja2Agb24gYnV0dG9ucy5cbiAgZm9udC1zaXplOiAwO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gIC8vIE5lZ2F0aXZlIG1hcmdpbiBmb3Igc3BhY2luZywgcG9zaXRpb24gZm9yIGJyaW5naW5nIGhvdmVyZWQvZm9jdXNlZC9hY3RpdmVkXG4gIC8vIGVsZW1lbnQgYWJvdmUgdGhlIHNpYmxpbmdzLlxuICA+IC5idG4ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICArIC5idG4ge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfVxuICAgIC8vIEJyaW5nIHRoZSBcImFjdGl2ZVwiIGJ1dHRvbiB0byB0aGUgZnJvbnRcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMsXG4gICAgJjphY3RpdmUge1xuICAgICAgei1pbmRleDogMjtcbiAgICB9XG4gIH1cblxuICAvLyBOZWdhdGl2ZSBtYXJnaW4gdG8gb25seSBoYXZlIGEgMXB4IGJvcmRlciBiZXR3ZWVuIHRoZSB0d29cbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgPiAuYnRuLFxuICAgID4gLmJ0bi1ncm91cCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG4gICAgfVxuICB9XG4gICY6bGFzdC1jaGlsZCB7XG4gICAgPiAuYnRuLFxuICAgID4gLmJ0bi1ncm91cCB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gTmF2c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubmF2IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgcGFkZGluZy1sZWZ0OiAwOyAvLyBPdmVycmlkZSBkZWZhdWx0IHVsL29sXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gID4gbGkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcblxuICAgID4gYSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBhZGRpbmc6ICRuYXYtbGluay1wYWRkaW5nO1xuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtbGluay1ob3Zlci1iZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlZCBzdGF0ZSBzZXRzIHRleHQgdG8gZ3JheSBhbmQgbnVrZXMgaG92ZXIvdGFiIGVmZmVjdHNcbiAgICAmLmRpc2FibGVkID4gYSB7XG4gICAgICBjb2xvcjogJG5hdi1kaXNhYmxlZC1saW5rLWNvbG9yO1xuXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2LWRpc2FibGVkLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBPcGVuIGRyb3Bkb3duc1xuICAub3BlbiA+IGEge1xuICAgICYsXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtbGluay1ob3Zlci1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJGxpbmstY29sb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gTmF2IGRpdmlkZXJzIChkZXByZWNhdGVkIHdpdGggdjMuMC4xKVxuICAvL1xuICAvLyBUaGlzIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBpbiB2MyB3aXRoIHRoZSBkcm9wcGluZyBvZiBgLm5hdi1saXN0YCwgYnV0XG4gIC8vIHdlIG1pc3NlZCBpdC4gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBhbnl3aGVyZSwgYnV0IGluIHRoZSBpbnRlcmVzdFxuICAvLyBvZiBtYWludGFpbmluZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGluIGNhc2UgeW91IHVzZSBpdCwgaXQncyBkZXByZWNhdGVkLlxuICAubmF2LWRpdmlkZXIge1xuICAgIEBpbmNsdWRlIG5hdi1kaXZpZGVyO1xuICB9XG5cbiAgLy8gUHJldmVudCBJRTggZnJvbSBtaXNwbGFjaW5nIGltZ3NcbiAgLy9cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2lzc3Vlcy85ODQjaXNzdWVjb21tZW50LTM5ODU5ODlcbiAgPiBsaSA+IGEgPiBpbWcge1xuICAgIG1heC13aWR0aDogbm9uZTtcbiAgfVxufVxuXG5cbi8vIFRhYnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gR2l2ZSB0aGUgdGFicyBzb21ldGhpbmcgdG8gc2l0IG9uXG4ubmF2LXRhYnMge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJG5hdi10YWJzLWJvcmRlci1jb2xvcjtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gTWFrZSB0aGUgbGlzdC1pdGVtcyBvdmVybGF5IHRoZSBib3R0b20gYm9yZGVyXG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDtcblxuICAgIC8vIEFjdHVhbCB0YWJzIChhcyBsaW5rcylcbiAgICA+IGEge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2UgJGJvcmRlci1yYWRpdXMtYmFzZSAwIDA7XG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3IgJG5hdi10YWJzLWxpbmstaG92ZXItYm9yZGVyLWNvbG9yICRuYXYtdGFicy1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIHN0YXRlLCBhbmQgaXRzIDpob3ZlciB0byBvdmVycmlkZSBub3JtYWwgOmhvdmVyXG4gICAgJi5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZztcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gcHVsbGluZyB0aGlzIGluIG1haW5seSBmb3IgbGVzcyBzaG9ydGhhbmRcbiAgJi5uYXYtanVzdGlmaWVkIHtcbiAgICBAZXh0ZW5kIC5uYXYtanVzdGlmaWVkO1xuICAgIEBleHRlbmQgLm5hdi10YWJzLWp1c3RpZmllZDtcbiAgfVxufVxuXG5cbi8vIFBpbGxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4ubmF2LXBpbGxzIHtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICAvLyBMaW5rcyByZW5kZXJlZCBhcyBwaWxsc1xuICAgID4gYSB7XG4gICAgICBib3JkZXItcmFkaXVzOiAkbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM7XG4gICAgfVxuICAgICsgbGkge1xuICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmUgc3RhdGVcbiAgICAmLmFjdGl2ZSA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXYtcGlsbHMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtcGlsbHMtYWN0aXZlLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gU3RhY2tlZCBwaWxsc1xuLm5hdi1zdGFja2VkIHtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgKyBsaSB7XG4gICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICBtYXJnaW4tbGVmdDogMDsgLy8gbm8gbmVlZCBmb3IgdGhpcyBnYXAgYmV0d2VlbiBuYXYgaXRlbXNcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBOYXYgdmFyaWF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSnVzdGlmaWVkIG5hdiBsaW5rc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubmF2LWp1c3RpZmllZCB7XG4gIHdpZHRoOiAxMDAlO1xuXG4gID4gbGkge1xuICAgIGZsb2F0OiBub25lO1xuICAgID4gYSB7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gICAgfVxuICB9XG5cbiAgPiAuZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUge1xuICAgIHRvcDogYXV0bztcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgPiBsaSB7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgICAgd2lkdGg6IDElO1xuICAgICAgPiBhIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gTW92ZSBib3JkZXJzIHRvIGFuY2hvcnMgaW5zdGVhZCBvZiBib3R0b20gb2YgbGlzdFxuLy9cbi8vIE1peGluIGZvciBhZGRpbmcgb24gdG9wIHRoZSBzaGFyZWQgYC5uYXYtanVzdGlmaWVkYCBzdHlsZXMgZm9yIG91ciB0YWJzXG4ubmF2LXRhYnMtanVzdGlmaWVkIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcblxuICA+IGxpID4gYSB7XG4gICAgLy8gT3ZlcnJpZGUgbWFyZ2luIGZyb20gLm5hdi10YWJzXG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG4gIH1cblxuICA+IC5hY3RpdmUgPiBhLFxuICA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuICA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgPiBsaSA+IGEge1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRuYXYtdGFicy1qdXN0aWZpZWQtbGluay1ib3JkZXItY29sb3I7XG4gICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlICRib3JkZXItcmFkaXVzLWJhc2UgMCAwO1xuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhLFxuICAgID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4gICAgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBUYWJiYWJsZSB0YWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhpZGUgdGFiYmFibGUgcGFuZXMgdG8gc3RhcnQsIHNob3cgdGhlbSB3aGVuIGAuYWN0aXZlYFxuLnRhYi1jb250ZW50IHtcbiAgPiAudGFiLXBhbmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgPiAuYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxufVxuXG5cbi8vIERyb3Bkb3duc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBTcGVjaWZpYyBkcm9wZG93bnNcbi5uYXYtdGFicyAuZHJvcGRvd24tbWVudSB7XG4gIC8vIG1ha2UgZHJvcGRvd24gYm9yZGVyIG92ZXJsYXAgdGFiIGJvcmRlclxuICBtYXJnaW4tdG9wOiAtMXB4O1xuICAvLyBSZW1vdmUgdGhlIHRvcCByb3VuZGVkIGNvcm5lcnMgaGVyZSBzaW5jZSB0aGVyZSBpcyBhIGhhcmQgZWRnZSBhYm92ZSB0aGUgbWVudVxuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cbiIsIi8vXG4vLyBOYXZiYXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIFdyYXBwZXIgYW5kIGJhc2UgY2xhc3Ncbi8vXG4vLyBQcm92aWRlIGEgc3RhdGljIG5hdmJhciBmcm9tIHdoaWNoIHdlIGV4cGFuZCB0byBjcmVhdGUgZnVsbC13aWR0aCwgZml4ZWQsIGFuZFxuLy8gb3RoZXIgbmF2YmFyIHZhcmlhdGlvbnMuXG5cbi5uYXZiYXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6ICRuYXZiYXItaGVpZ2h0OyAvLyBFbnN1cmUgYSBuYXZiYXIgYWx3YXlzIHNob3dzIChlLmcuLCB3aXRob3V0IGEgLm5hdmJhci1icmFuZCBpbiBjb2xsYXBzZWQgbW9kZSlcbiAgbWFyZ2luLWJvdHRvbTogJG5hdmJhci1tYXJnaW4tYm90dG9tO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcblxuICAvLyBQcmV2ZW50IGZsb2F0cyBmcm9tIGJyZWFraW5nIHRoZSBuYXZiYXJcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAkbmF2YmFyLWJvcmRlci1yYWRpdXM7XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgaGVhZGluZ1xuLy9cbi8vIEdyb3VwcyBgLm5hdmJhci1icmFuZGAgYW5kIGAubmF2YmFyLXRvZ2dsZWAgaW50byBhIHNpbmdsZSBjb21wb25lbnQgZm9yIGVhc3lcbi8vIHN0eWxpbmcgb2YgcmVzcG9uc2l2ZSBhc3BlY3RzLlxuXG4ubmF2YmFyLWhlYWRlciB7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgY29sbGFwc2UgKGJvZHkpXG4vL1xuLy8gR3JvdXAgeW91ciBuYXZiYXIgY29udGVudCBpbnRvIHRoaXMgZm9yIGVhc3kgY29sbGFwc2luZyBhbmQgZXhwYW5kaW5nIGFjcm9zc1xuLy8gdmFyaW91cyBkZXZpY2Ugc2l6ZXMuIEJ5IGRlZmF1bHQsIHRoaXMgY29udGVudCBpcyBjb2xsYXBzZWQgd2hlbiA8NzY4cHgsIGJ1dFxuLy8gd2lsbCBleHBhbmQgcGFzdCB0aGF0IGZvciBhIGhvcml6b250YWwgZGlzcGxheS5cbi8vXG4vLyBUbyBzdGFydCAob24gbW9iaWxlIGRldmljZXMpIHRoZSBuYXZiYXIgbGlua3MsIGZvcm1zLCBhbmQgYnV0dG9ucyBhcmUgc3RhY2tlZFxuLy8gdmVydGljYWxseSBhbmQgaW5jbHVkZSBhIGBtYXgtaGVpZ2h0YCB0byBvdmVyZmxvdyBpbiBjYXNlIHlvdSBoYXZlIHRvbyBtdWNoXG4vLyBjb250ZW50IGZvciB0aGUgdXNlcidzIHZpZXdwb3J0LlxuXG4ubmF2YmFyLWNvbGxhcHNlIHtcbiAgb3ZlcmZsb3cteDogdmlzaWJsZTtcbiAgcGFkZGluZy1yaWdodDogJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIHBhZGRpbmctbGVmdDogICRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG5cbiAgJi5pbiB7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuXG4gICAgJi5jb2xsYXBzZSB7XG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMDsgLy8gT3ZlcnJpZGUgZGVmYXVsdCBzZXR0aW5nXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgICYuaW4ge1xuICAgICAgb3ZlcmZsb3cteTogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvLyBVbmRvIHRoZSBjb2xsYXBzZSBzaWRlIHBhZGRpbmcgZm9yIG5hdmJhcnMgd2l0aCBjb250YWluZXJzIHRvIGVuc3VyZVxuICAgIC8vIGFsaWdubWVudCBvZiByaWdodC1hbGlnbmVkIGNvbnRlbnRzLlxuICAgIC5uYXZiYXItZml4ZWQtdG9wICYsXG4gICAgLm5hdmJhci1zdGF0aWMtdG9wICYsXG4gICAgLm5hdmJhci1maXhlZC1ib3R0b20gJiB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxufVxuXG4ubmF2YmFyLWZpeGVkLXRvcCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIHtcbiAgLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWF4LWhlaWdodDogJG5hdmJhci1jb2xsYXBzZS1tYXgtaGVpZ2h0O1xuXG4gICAgQG1lZGlhIChtYXgtZGV2aWNlLXdpZHRoOiAkc2NyZWVuLXhzLW1pbikgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSB7XG4gICAgICBtYXgtaGVpZ2h0OiAyMDBweDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBCb3RoIG5hdmJhciBoZWFkZXIgYW5kIGNvbGxhcHNlXG4vL1xuLy8gV2hlbiBhIGNvbnRhaW5lciBpcyBwcmVzZW50LCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBoZWFkZXIgYW5kIGNvbGxhcHNlLlxuXG4uY29udGFpbmVyLFxuLmNvbnRhaW5lci1mbHVpZCB7XG4gID4gLm5hdmJhci1oZWFkZXIsXG4gID4gLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gICAgbWFyZ2luLWxlZnQ6ICAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG5cbiAgICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgICAgbWFyZ2luLWxlZnQ6ICAwO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vXG4vLyBOYXZiYXIgYWxpZ25tZW50IG9wdGlvbnNcbi8vXG4vLyBEaXNwbGF5IHRoZSBuYXZiYXIgYWNyb3NzIHRoZSBlbnRpcmV0eSBvZiB0aGUgcGFnZSBvciBmaXhlZCBpdCB0byB0aGUgdG9wIG9yXG4vLyBib3R0b20gb2YgdGhlIHBhZ2UuXG5cbi8vIFN0YXRpYyB0b3AgKHVuZml4ZWQsIGJ1dCAxMDAlIHdpZGUpIG5hdmJhclxuLm5hdmJhci1zdGF0aWMtdG9wIHtcbiAgei1pbmRleDogJHppbmRleC1uYXZiYXI7XG4gIGJvcmRlci13aWR0aDogMCAwIDFweDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLy8gRml4IHRoZSB0b3AvYm90dG9tIG5hdmJhcnMgd2hlbiBzY3JlZW4gcmVhbCBlc3RhdGUgc3VwcG9ydHMgaXRcbi5uYXZiYXItZml4ZWQtdG9wLFxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LW5hdmJhci1maXhlZDtcblxuICAvLyBVbmRvIHRoZSByb3VuZGVkIGNvcm5lcnNcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICB9XG59XG4ubmF2YmFyLWZpeGVkLXRvcCB7XG4gIHRvcDogMDtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4O1xufVxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICBib3R0b206IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7IC8vIG92ZXJyaWRlIC5uYXZiYXIgZGVmYXVsdHNcbiAgYm9yZGVyLXdpZHRoOiAxcHggMCAwO1xufVxuXG5cbi8vIEJyYW5kL3Byb2plY3QgbmFtZVxuXG4ubmF2YmFyLWJyYW5kIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHBhZGRpbmc6ICRuYXZiYXItcGFkZGluZy12ZXJ0aWNhbCAkbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWxhcmdlO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBoZWlnaHQ6ICRuYXZiYXItaGVpZ2h0O1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgfVxuXG4gID4gaW1nIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgLm5hdmJhciA+IC5jb250YWluZXIgJixcbiAgICAubmF2YmFyID4gLmNvbnRhaW5lci1mbHVpZCAmIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gICAgfVxuICB9XG59XG5cblxuLy8gTmF2YmFyIHRvZ2dsZVxuLy9cbi8vIEN1c3RvbSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBgLm5hdmJhci1jb2xsYXBzZWAsIHBvd2VyZWQgYnkgdGhlIGNvbGxhcHNlXG4vLyBKYXZhU2NyaXB0IHBsdWdpbi5cblxuLm5hdmJhci10b2dnbGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsb2F0OiByaWdodDtcbiAgbWFyZ2luLXJpZ2h0OiAkbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgcGFkZGluZzogOXB4IDEwcHg7XG4gIEBpbmNsdWRlIG5hdmJhci12ZXJ0aWNhbC1hbGlnbigzNHB4KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlc2V0IHVudXN1YWwgRmlyZWZveC1vbi1BbmRyb2lkIGRlZmF1bHQgc3R5bGU7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzL2lzc3Vlcy8yMTRcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgLy8gV2UgcmVtb3ZlIHRoZSBgb3V0bGluZWAgaGVyZSwgYnV0IGxhdGVyIGNvbXBlbnNhdGUgYnkgYXR0YWNoaW5nIGA6aG92ZXJgXG4gIC8vIHN0eWxlcyB0byBgOmZvY3VzYC5cbiAgJjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIC8vIEJhcnNcbiAgLmljb24tYmFyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gIH1cbiAgLmljb24tYmFyICsgLmljb24tYmFyIHtcbiAgICBtYXJnaW4tdG9wOiA0cHg7XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgbmF2IGxpbmtzXG4vL1xuLy8gQnVpbGRzIG9uIHRvcCBvZiB0aGUgYC5uYXZgIGNvbXBvbmVudHMgd2l0aCBpdHMgb3duIG1vZGlmaWVyIGNsYXNzIHRvIG1ha2Vcbi8vIHRoZSBuYXYgdGhlIGZ1bGwgaGVpZ2h0IG9mIHRoZSBob3Jpem9udGFsIG5hdiAoYWJvdmUgNzY4cHgpLlxuXG4ubmF2YmFyLW5hdiB7XG4gIG1hcmdpbjogKCRuYXZiYXItcGFkZGluZy12ZXJ0aWNhbCAvIDIpICgtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWwpO1xuXG4gID4gbGkgPiBhIHtcbiAgICBwYWRkaW5nLXRvcDogICAgMTBweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICB9XG5cbiAgQG1lZGlhIChtYXgtd2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQtbWF4KSB7XG4gICAgLy8gRHJvcGRvd25zIGdldCBjdXN0b20gZGlzcGxheSB3aGVuIGNvbGxhcHNlZFxuICAgIC5vcGVuIC5kcm9wZG93bi1tZW51IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICBmbG9hdDogbm9uZTtcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgID4gbGkgPiBhLFxuICAgICAgLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgICAgIHBhZGRpbmc6IDVweCAxNXB4IDVweCAyNXB4O1xuICAgICAgfVxuICAgICAgPiBsaSA+IGEge1xuICAgICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICAgICAgICAmOmhvdmVyLFxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVW5jb2xsYXBzZSB0aGUgbmF2XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luOiAwO1xuXG4gICAgPiBsaSB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICAgID4gYSB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAgICAkbmF2YmFyLXBhZGRpbmctdmVydGljYWw7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAkbmF2YmFyLXBhZGRpbmctdmVydGljYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gTmF2YmFyIGZvcm1cbi8vXG4vLyBFeHRlbnNpb24gb2YgdGhlIGAuZm9ybS1pbmxpbmVgIHdpdGggc29tZSBleHRyYSBmbGF2b3IgZm9yIG9wdGltdW0gZGlzcGxheSBpblxuLy8gb3VyIG5hdmJhcnMuXG5cbi5uYXZiYXItZm9ybSB7XG4gIG1hcmdpbi1sZWZ0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIG1hcmdpbi1yaWdodDogLSRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBwYWRkaW5nOiAxMHB4ICRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgJHNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKSwgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtcbiAgQGluY2x1ZGUgYm94LXNoYWRvdygkc2hhZG93KTtcblxuICAvLyBNaXhpbiBiZWhhdmlvciBmb3Igb3B0aW11bSBkaXNwbGF5XG4gIEBpbmNsdWRlIGZvcm0taW5saW5lO1xuXG4gIC5mb3JtLWdyb3VwIHtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWZXJ0aWNhbGx5IGNlbnRlciBpbiBleHBhbmRlZCwgaG9yaXpvbnRhbCBuYXZiYXJcbiAgQGluY2x1ZGUgbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRpbnB1dC1oZWlnaHQtYmFzZSk7XG5cbiAgLy8gVW5kbyAxMDAlIHdpZHRoIGZvciBwdWxsIGNsYXNzZXNcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSk7XG4gIH1cbn1cblxuXG4vLyBEcm9wZG93biBtZW51c1xuXG4vLyBNZW51IHBvc2l0aW9uIGFuZCBtZW51IGNhcmV0c1xuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51IHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG59XG4vLyBNZW51IHBvc2l0aW9uIGFuZCBtZW51IGNhcmV0IHN1cHBvcnQgZm9yIGRyb3B1cHMgdmlhIGV4dHJhIGRyb3B1cCBjbGFzc1xuLm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoJG5hdmJhci1ib3JkZXItcmFkaXVzKTtcbiAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXMoMCk7XG59XG5cblxuLy8gQnV0dG9ucyBpbiBuYXZiYXJzXG4vL1xuLy8gVmVydGljYWxseSBjZW50ZXIgYSBidXR0b24gd2l0aGluIGEgbmF2YmFyICh3aGVuICpub3QqIGluIGEgZm9ybSkuXG5cbi5uYXZiYXItYnRuIHtcbiAgQGluY2x1ZGUgbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRpbnB1dC1oZWlnaHQtYmFzZSk7XG5cbiAgJi5idG4tc20ge1xuICAgIEBpbmNsdWRlIG5hdmJhci12ZXJ0aWNhbC1hbGlnbigkaW5wdXQtaGVpZ2h0LXNtYWxsKTtcbiAgfVxuICAmLmJ0bi14cyB7XG4gICAgQGluY2x1ZGUgbmF2YmFyLXZlcnRpY2FsLWFsaWduKDIyKTtcbiAgfVxufVxuXG5cbi8vIFRleHQgaW4gbmF2YmFyc1xuLy9cbi8vIEFkZCBhIGNsYXNzIHRvIG1ha2UgYW55IGVsZW1lbnQgcHJvcGVybHkgYWxpZ24gaXRzZWxmIHZlcnRpY2FsbHkgd2l0aGluIHRoZSBuYXZiYXJzLlxuXG4ubmF2YmFyLXRleHQge1xuICBAaW5jbHVkZSBuYXZiYXItdmVydGljYWwtYWxpZ24oJGxpbmUtaGVpZ2h0LWNvbXB1dGVkKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1sZWZ0OiAkbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgICBtYXJnaW4tcmlnaHQ6ICRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICB9XG59XG5cblxuLy8gQ29tcG9uZW50IGFsaWdubWVudFxuLy9cbi8vIFJlcHVycG9zZSB0aGUgcHVsbCB1dGlsaXRpZXMgYXMgdGhlaXIgb3duIG5hdmJhciB1dGlsaXRpZXMgdG8gYXZvaWQgc3BlY2lmaWNpdHlcbi8vIGlzc3VlcyB3aXRoIHBhcmVudHMgYW5kIGNoYWluaW5nLiBPbmx5IGRvIHRoaXMgd2hlbiB0aGUgbmF2YmFyIGlzIHVuY29sbGFwc2VkXG4vLyB0aG91Z2ggc28gdGhhdCBuYXZiYXIgY29udGVudHMgcHJvcGVybHkgc3RhY2sgYW5kIGFsaWduIGluIG1vYmlsZS5cbi8vXG4vLyBEZWNsYXJlZCBhZnRlciB0aGUgbmF2YmFyIGNvbXBvbmVudHMgdG8gZW5zdXJlIG1vcmUgc3BlY2lmaWNpdHkgb24gdGhlIG1hcmdpbnMuXG5cbkBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gIC5uYXZiYXItbGVmdCB7XG4gICAgZmxvYXQ6IGxlZnQgIWltcG9ydGFudDtcbiAgfVxuICAubmF2YmFyLXJpZ2h0IHtcbiAgICBmbG9hdDogcmlnaHQgIWltcG9ydGFudDtcbiAgbWFyZ2luLXJpZ2h0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG5cbiAgICB+IC5uYXZiYXItcmlnaHQge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIEFsdGVybmF0ZSBuYXZiYXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBEZWZhdWx0IG5hdmJhclxuLm5hdmJhci1kZWZhdWx0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWJnO1xuICBib3JkZXItY29sb3I6ICRuYXZiYXItZGVmYXVsdC1ib3JkZXI7XG5cbiAgLm5hdmJhci1icmFuZCB7XG4gICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1icmFuZC1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1icmFuZC1ob3Zlci1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1icmFuZC1ob3Zlci1iZztcbiAgICB9XG4gIH1cblxuICAubmF2YmFyLXRleHQge1xuICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtY29sb3I7XG4gIH1cblxuICAubmF2YmFyLW5hdiB7XG4gICAgPiBsaSA+IGEge1xuICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuICAgID4gLmFjdGl2ZSA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWJnO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5kaXNhYmxlZCA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAubmF2YmFyLXRvZ2dsZSB7XG4gICAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWJvcmRlci1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1ob3Zlci1iZztcbiAgICB9XG4gICAgLmljb24tYmFyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC10b2dnbGUtaWNvbi1iYXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci1jb2xsYXBzZSxcbiAgLm5hdmJhci1mb3JtIHtcbiAgICBib3JkZXItY29sb3I6ICRuYXZiYXItZGVmYXVsdC1ib3JkZXI7XG4gIH1cblxuICAvLyBEcm9wZG93biBtZW51IGl0ZW1zXG4gIC5uYXZiYXItbmF2IHtcbiAgICAvLyBSZW1vdmUgYmFja2dyb3VuZCBjb2xvciBmcm9tIG9wZW4gZHJvcGRvd25cbiAgICA+IC5vcGVuID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtYmc7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQtbWF4KSB7XG4gICAgICAvLyBEcm9wZG93bnMgZ2V0IGN1c3RvbSBkaXNwbGF5IHdoZW4gY29sbGFwc2VkXG4gICAgICAub3BlbiAuZHJvcGRvd24tbWVudSB7XG4gICAgICAgID4gbGkgPiBhIHtcbiAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstY29sb3I7XG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICAgICAmLFxuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA+IC5kaXNhYmxlZCA+IGEge1xuICAgICAgICAgICYsXG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLy8gTGlua3MgaW4gbmF2YmFyc1xuICAvL1xuICAvLyBBZGQgYSBjbGFzcyB0byBlbnN1cmUgbGlua3Mgb3V0c2lkZSB0aGUgbmF2YmFyIG5hdiBhcmUgY29sb3JlZCBjb3JyZWN0bHkuXG5cbiAgLm5hdmJhci1saW5rIHtcbiAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstY29sb3I7XG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgfVxuICB9XG5cbiAgLmJ0bi1saW5rIHtcbiAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjtcbiAgICB9XG4gICAgJltkaXNhYmxlZF0sXG4gICAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEludmVyc2UgbmF2YmFyXG5cbi5uYXZiYXItaW52ZXJzZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1iZztcbiAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYm9yZGVyO1xuXG4gIC5uYXZiYXItYnJhbmQge1xuICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtYnJhbmQtY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtYnJhbmQtaG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYnJhbmQtaG92ZXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci10ZXh0IHtcbiAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWNvbG9yO1xuICB9XG5cbiAgLm5hdmJhci1uYXYge1xuICAgID4gbGkgPiBhIHtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjtcblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWJnO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1iZztcbiAgICAgIH1cbiAgICB9XG4gICAgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstZGlzYWJsZWQtYmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRGFya2VuIHRoZSByZXNwb25zaXZlIG5hdiB0b2dnbGVcbiAgLm5hdmJhci10b2dnbGUge1xuICAgIGJvcmRlci1jb2xvcjogJG5hdmJhci1pbnZlcnNlLXRvZ2dsZS1ib3JkZXItY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS10b2dnbGUtaG92ZXItYmc7XG4gICAgfVxuICAgIC5pY29uLWJhciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtdG9nZ2xlLWljb24tYmFyLWJnO1xuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItY29sbGFwc2UsXG4gIC5uYXZiYXItZm9ybSB7XG4gICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJG5hdmJhci1pbnZlcnNlLWJnLCA3JSk7XG4gIH1cblxuICAvLyBEcm9wZG93bnNcbiAgLm5hdmJhci1uYXYge1xuICAgID4gLm9wZW4gPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1iZztcbiAgICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIC8vIERyb3Bkb3ducyBnZXQgY3VzdG9tIGRpc3BsYXlcbiAgICAgIC5vcGVuIC5kcm9wZG93bi1tZW51IHtcbiAgICAgICAgPiAuZHJvcGRvd24taGVhZGVyIHtcbiAgICAgICAgICBib3JkZXItY29sb3I6ICRuYXZiYXItaW52ZXJzZS1ib3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLmRpdmlkZXIge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1ib3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjtcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgID4gLmFjdGl2ZSA+IGEge1xuICAgICAgICAgICYsXG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgID4gLmRpc2FibGVkID4gYSB7XG4gICAgICAgICAgJixcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstZGlzYWJsZWQtYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci1saW5rIHtcbiAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG4gICAgfVxuICB9XG5cbiAgLmJ0bi1saW5rIHtcbiAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICB9XG4gICAgJltkaXNhYmxlZF0sXG4gICAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBOYXZiYXIgdmVydGljYWwgYWxpZ25cbi8vXG4vLyBWZXJ0aWNhbGx5IGNlbnRlciBlbGVtZW50cyBpbiB0aGUgbmF2YmFyLlxuLy8gRXhhbXBsZTogYW4gZWxlbWVudCBoYXMgYSBoZWlnaHQgb2YgMzBweCwgc28gd3JpdGUgb3V0IGAubmF2YmFyLXZlcnRpY2FsLWFsaWduKDMwcHgpO2AgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB0b3AgbWFyZ2luLlxuXG5AbWl4aW4gbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRlbGVtZW50LWhlaWdodCkge1xuICBtYXJnaW4tdG9wOiAoKCRuYXZiYXItaGVpZ2h0IC0gJGVsZW1lbnQtaGVpZ2h0KSAvIDIpO1xuICBtYXJnaW4tYm90dG9tOiAoKCRuYXZiYXItaGVpZ2h0IC0gJGVsZW1lbnQtaGVpZ2h0KSAvIDIpO1xufVxuIiwiLy9cbi8vIEJyZWFkY3J1bWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5icmVhZGNydW1iIHtcbiAgcGFkZGluZzogJGJyZWFkY3J1bWItcGFkZGluZy12ZXJ0aWNhbCAkYnJlYWRjcnVtYi1wYWRkaW5nLWhvcml6b250YWw7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJyZWFkY3J1bWItYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gICAgKyBsaTpiZWZvcmUge1xuICAgICAgY29udGVudDogXCIjeyRicmVhZGNydW1iLXNlcGFyYXRvcn1cXDAwYTBcIjsgLy8gVW5pY29kZSBzcGFjZSBhZGRlZCBzaW5jZSBpbmxpbmUtYmxvY2sgbWVhbnMgbm9uLWNvbGxhcHNpbmcgd2hpdGUtc3BhY2VcbiAgICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgICAgY29sb3I6ICRicmVhZGNydW1iLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSB7XG4gICAgY29sb3I6ICRicmVhZGNydW1iLWFjdGl2ZS1jb2xvcjtcbiAgfVxufVxuIiwiLy9cbi8vIFBhZ2luYXRpb24gKG11bHRpcGxlIHBhZ2VzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lOyAvLyBSZW1vdmUgbGlzdC1zdHlsZSBhbmQgYmxvY2stbGV2ZWwgZGVmYXVsdHNcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsb2F0OiBsZWZ0OyAvLyBDb2xsYXBzZSB3aGl0ZS1zcGFjZVxuICAgICAgcGFkZGluZzogJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCAkcGFkZGluZy1iYXNlLWhvcml6b250YWw7XG4gICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYWdpbmF0aW9uLWJvcmRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgIH1cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gYSxcbiAgICAgID4gc3BhbiB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItbGVmdC1yYWRpdXMoJGJvcmRlci1yYWRpdXMtYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICA+IGEsXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItcmlnaHQtcmFkaXVzKCRib3JkZXItcmFkaXVzLWJhc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gID4gbGkgPiBhLFxuICA+IGxpID4gc3BhbiB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDM7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24taG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1ob3Zlci1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJHBhZ2luYXRpb24taG92ZXItYm9yZGVyO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSA+IGEsXG4gID4gLmFjdGl2ZSA+IHNwYW4ge1xuICAgICYsXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDI7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tYWN0aXZlLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHBhZ2luYXRpb24tYWN0aXZlLWJnO1xuICAgICAgYm9yZGVyLWNvbG9yOiAkcGFnaW5hdGlvbi1hY3RpdmUtYm9yZGVyO1xuICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIH1cbiAgfVxuXG4gID4gLmRpc2FibGVkIHtcbiAgICA+IHNwYW4sXG4gICAgPiBzcGFuOmhvdmVyLFxuICAgID4gc3Bhbjpmb2N1cyxcbiAgICA+IGEsXG4gICAgPiBhOmhvdmVyLFxuICAgID4gYTpmb2N1cyB7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1kaXNhYmxlZC1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJHBhZ2luYXRpb24tZGlzYWJsZWQtYm9yZGVyO1xuICAgICAgY3Vyc29yOiAkY3Vyc29yLWRpc2FibGVkO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTaXppbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIExhcmdlXG4ucGFnaW5hdGlvbi1sZyB7XG4gIEBpbmNsdWRlIHBhZ2luYXRpb24tc2l6ZSgkcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCwgJHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbCwgJGZvbnQtc2l6ZS1sYXJnZSwgJGxpbmUtaGVpZ2h0LWxhcmdlLCAkYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG5cbi8vIFNtYWxsXG4ucGFnaW5hdGlvbi1zbSB7XG4gIEBpbmNsdWRlIHBhZ2luYXRpb24tc2l6ZSgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCwgJHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbCwgJGZvbnQtc2l6ZS1zbWFsbCwgJGxpbmUtaGVpZ2h0LXNtYWxsLCAkYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG4iLCIvLyBQYWdpbmF0aW9uXG5cbkBtaXhpbiBwYWdpbmF0aW9uLXNpemUoJHBhZGRpbmctdmVydGljYWwsICRwYWRkaW5nLWhvcml6b250YWwsICRmb250LXNpemUsICRsaW5lLWhlaWdodCwgJGJvcmRlci1yYWRpdXMpIHtcbiAgPiBsaSB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBwYWRkaW5nOiAkcGFkZGluZy12ZXJ0aWNhbCAkcGFkZGluZy1ob3Jpem9udGFsO1xuICAgICAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICA+IGEsXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItbGVmdC1yYWRpdXMoJGJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgPiBhLFxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXJpZ2h0LXJhZGl1cygkYm9yZGVyLXJhZGl1cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gUGFnZXIgcGFnaW5hdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4ucGFnZXIge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG4gIGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBwYWRkaW5nOiA1cHggMTRweDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYWdlci1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYWdlci1ib3JkZXI7XG4gICAgICBib3JkZXItcmFkaXVzOiAkcGFnZXItYm9yZGVyLXJhZGl1cztcbiAgICB9XG5cbiAgICA+IGE6aG92ZXIsXG4gICAgPiBhOmZvY3VzIHtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYWdlci1ob3Zlci1iZztcbiAgICB9XG4gIH1cblxuICAubmV4dCB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBmbG9hdDogcmlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLnByZXZpb3VzIHtcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgIH1cbiAgfVxuXG4gIC5kaXNhYmxlZCB7XG4gICAgPiBhLFxuICAgID4gYTpob3ZlcixcbiAgICA+IGE6Zm9jdXMsXG4gICAgPiBzcGFuIHtcbiAgICAgIGNvbG9yOiAkcGFnZXItZGlzYWJsZWQtY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnZXItYmc7XG4gICAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gTGFiZWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmU7XG4gIHBhZGRpbmc6IC4yZW0gLjZlbSAuM2VtO1xuICBmb250LXNpemU6IDc1JTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGxhYmVsLWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgYm9yZGVyLXJhZGl1czogLjI1ZW07XG5cbiAgLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGEmIHRvIGEubGFiZWxcblxuICAvLyBFbXB0eSBsYWJlbHMgY29sbGFwc2UgYXV0b21hdGljYWxseSAobm90IGF2YWlsYWJsZSBpbiBJRTgpXG4gICY6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvLyBRdWljayBmaXggZm9yIGxhYmVscyBpbiBidXR0b25zXG4gIC5idG4gJiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTFweDtcbiAgfVxufVxuXG4vLyBBZGQgaG92ZXIgZWZmZWN0cywgYnV0IG9ubHkgZm9yIGxpbmtzXG5hLmxhYmVsIHtcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6ICRsYWJlbC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbn1cblxuLy8gQ29sb3JzXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnMgKGxpbmtlZCBsYWJlbHMgZ2V0IGRhcmtlciBvbiA6aG92ZXIpXG5cbi5sYWJlbC1kZWZhdWx0IHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtZGVmYXVsdC1iZyk7XG59XG5cbi5sYWJlbC1wcmltYXJ5IHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtcHJpbWFyeS1iZyk7XG59XG5cbi5sYWJlbC1zdWNjZXNzIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtc3VjY2Vzcy1iZyk7XG59XG5cbi5sYWJlbC1pbmZvIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtaW5mby1iZyk7XG59XG5cbi5sYWJlbC13YXJuaW5nIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtd2FybmluZy1iZyk7XG59XG5cbi5sYWJlbC1kYW5nZXIge1xuICBAaW5jbHVkZSBsYWJlbC12YXJpYW50KCRsYWJlbC1kYW5nZXItYmcpO1xufVxuIiwiLy8gTGFiZWxzXG5cbkBtaXhpbiBsYWJlbC12YXJpYW50KCRjb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3I7XG5cbiAgJltocmVmXSB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkY29sb3IsIDEwJSk7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gQmFkZ2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAxMHB4O1xuICBwYWRkaW5nOiAzcHggN3B4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gIGZvbnQtd2VpZ2h0OiAkYmFkZ2UtZm9udC13ZWlnaHQ7XG4gIGNvbG9yOiAkYmFkZ2UtY29sb3I7XG4gIGxpbmUtaGVpZ2h0OiAkYmFkZ2UtbGluZS1oZWlnaHQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJhZGdlLWJnO1xuICBib3JkZXItcmFkaXVzOiAkYmFkZ2UtYm9yZGVyLXJhZGl1cztcblxuICAvLyBFbXB0eSBiYWRnZXMgY29sbGFwc2UgYXV0b21hdGljYWxseSAobm90IGF2YWlsYWJsZSBpbiBJRTgpXG4gICY6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvLyBRdWljayBmaXggZm9yIGJhZGdlcyBpbiBidXR0b25zXG4gIC5idG4gJiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTFweDtcbiAgfVxuXG4gIC5idG4teHMgJixcbiAgLmJ0bi1ncm91cC14cyA+IC5idG4gJiB7XG4gICAgdG9wOiAwO1xuICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSYgdG8gYS5iYWRnZVxuXG4gIC8vIEFjY291bnQgZm9yIGJhZGdlcyBpbiBuYXZzXG4gIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlID4gJixcbiAgLm5hdi1waWxscyA+IC5hY3RpdmUgPiBhID4gJiB7XG4gICAgY29sb3I6ICRiYWRnZS1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJhZGdlLWFjdGl2ZS1iZztcbiAgfVxuXG4gIC5saXN0LWdyb3VwLWl0ZW0gPiAmIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gIH1cblxuICAubGlzdC1ncm91cC1pdGVtID4gJiArICYge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG5cbiAgLm5hdi1waWxscyA+IGxpID4gYSA+ICYge1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIH1cbn1cblxuLy8gSG92ZXIgc3RhdGUsIGJ1dCBvbmx5IGZvciBsaW5rc1xuYS5iYWRnZSB7XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkYmFkZ2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4iLCIvL1xuLy8gSnVtYm90cm9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5qdW1ib3Ryb24ge1xuICBwYWRkaW5nLXRvcDogICAgJGp1bWJvdHJvbi1wYWRkaW5nO1xuICBwYWRkaW5nLWJvdHRvbTogJGp1bWJvdHJvbi1wYWRkaW5nO1xuICBtYXJnaW4tYm90dG9tOiAkanVtYm90cm9uLXBhZGRpbmc7XG4gIGNvbG9yOiAkanVtYm90cm9uLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkanVtYm90cm9uLWJnO1xuXG4gIGgxLFxuICAuaDEge1xuICAgIGNvbG9yOiAkanVtYm90cm9uLWhlYWRpbmctY29sb3I7XG4gIH1cblxuICBwIHtcbiAgICBtYXJnaW4tYm90dG9tOiAoJGp1bWJvdHJvbi1wYWRkaW5nIC8gMik7XG4gICAgZm9udC1zaXplOiAkanVtYm90cm9uLWZvbnQtc2l6ZTtcbiAgICBmb250LXdlaWdodDogMjAwO1xuICB9XG5cbiAgPiBociB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogZGFya2VuKCRqdW1ib3Ryb24tYmcsIDEwJSk7XG4gIH1cblxuICAuY29udGFpbmVyICYsXG4gIC5jb250YWluZXItZmx1aWQgJiB7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7IC8vIE9ubHkgcm91bmQgY29ybmVycyBhdCBoaWdoZXIgcmVzb2x1dGlvbnMgaWYgY29udGFpbmVkIGluIGEgY29udGFpbmVyXG4gIH1cblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikge1xuICAgIHBhZGRpbmctdG9wOiAgICAoJGp1bWJvdHJvbi1wYWRkaW5nICogMS42KTtcbiAgICBwYWRkaW5nLWJvdHRvbTogKCRqdW1ib3Ryb24tcGFkZGluZyAqIDEuNik7XG5cbiAgICAuY29udGFpbmVyICYsXG4gICAgLmNvbnRhaW5lci1mbHVpZCAmIHtcbiAgICAgIHBhZGRpbmctbGVmdDogICgkanVtYm90cm9uLXBhZGRpbmcgKiAyKTtcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICgkanVtYm90cm9uLXBhZGRpbmcgKiAyKTtcbiAgICB9XG5cbiAgICBoMSxcbiAgICAuaDEge1xuICAgICAgZm9udC1zaXplOiAkanVtYm90cm9uLWhlYWRpbmctZm9udC1zaXplO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFRodW1ibmFpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gTWl4aW4gYW5kIGFkanVzdCB0aGUgcmVndWxhciBpbWFnZSBjbGFzc1xuLnRodW1ibmFpbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAkdGh1bWJuYWlsLXBhZGRpbmc7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdGh1bWJuYWlsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCAkdGh1bWJuYWlsLWJvcmRlcjtcbiAgYm9yZGVyLXJhZGl1czogJHRodW1ibmFpbC1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSB0cmFuc2l0aW9uKGJvcmRlciAuMnMgZWFzZS1pbi1vdXQpO1xuXG4gID4gaW1nLFxuICBhID4gaW1nIHtcbiAgICBAaW5jbHVkZSBpbWctcmVzcG9uc2l2ZTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSY6aG92ZXIsIGEmOmZvY3VzLCBhJi5hY3RpdmUgdG8gYS50aHVtYm5haWw6aG92ZXIsIGEudGh1bWJuYWlsOmZvY3VzLCBhLnRodW1ibmFpbC5hY3RpdmVcblxuICAvLyBJbWFnZSBjYXB0aW9uc1xuICAuY2FwdGlvbiB7XG4gICAgcGFkZGluZzogJHRodW1ibmFpbC1jYXB0aW9uLXBhZGRpbmc7XG4gICAgY29sb3I6ICR0aHVtYm5haWwtY2FwdGlvbi1jb2xvcjtcbiAgfVxufVxuXG4vLyBBZGQgYSBob3ZlciBzdGF0ZSBmb3IgbGlua2VkIHZlcnNpb25zIG9ubHlcbmEudGh1bWJuYWlsOmhvdmVyLFxuYS50aHVtYm5haWw6Zm9jdXMsXG5hLnRodW1ibmFpbC5hY3RpdmUge1xuICBib3JkZXItY29sb3I6ICRsaW5rLWNvbG9yO1xufVxuIiwiLy9cbi8vIEFsZXJ0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYWxlcnQge1xuICBwYWRkaW5nOiAkYWxlcnQtcGFkZGluZztcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogJGFsZXJ0LWJvcmRlci1yYWRpdXM7XG5cbiAgLy8gSGVhZGluZ3MgZm9yIGxhcmdlciBhbGVydHNcbiAgaDQge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgLy8gU3BlY2lmaWVkIGZvciB0aGUgaDQgdG8gcHJldmVudCBjb25mbGljdHMgb2YgY2hhbmdpbmcgJGhlYWRpbmdzLWNvbG9yXG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cblxuICAvLyBQcm92aWRlIGNsYXNzIGZvciBsaW5rcyB0aGF0IG1hdGNoIGFsZXJ0c1xuICAuYWxlcnQtbGluayB7XG4gICAgZm9udC13ZWlnaHQ6ICRhbGVydC1saW5rLWZvbnQtd2VpZ2h0O1xuICB9XG5cbiAgLy8gSW1wcm92ZSBhbGlnbm1lbnQgYW5kIHNwYWNpbmcgb2YgaW5uZXIgY29udGVudFxuICA+IHAsXG4gID4gdWwge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICA+IHAgKyBwIHtcbiAgICBtYXJnaW4tdG9wOiA1cHg7XG4gIH1cbn1cblxuLy8gRGlzbWlzc2libGUgYWxlcnRzXG4vL1xuLy8gRXhwYW5kIHRoZSByaWdodCBwYWRkaW5nIGFuZCBhY2NvdW50IGZvciB0aGUgY2xvc2UgYnV0dG9uJ3MgcG9zaXRpb25pbmcuXG5cbi5hbGVydC1kaXNtaXNzYWJsZSwgLy8gVGhlIG1pc3NwZWxsZWQgLmFsZXJ0LWRpc21pc3NhYmxlIHdhcyBkZXByZWNhdGVkIGluIDMuMi4wLlxuLmFsZXJ0LWRpc21pc3NpYmxlIHtcbiAgcGFkZGluZy1yaWdodDogKCRhbGVydC1wYWRkaW5nICsgMjApO1xuXG4gIC8vIEFkanVzdCBjbG9zZSBsaW5rIHBvc2l0aW9uXG4gIC5jbG9zZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTJweDtcbiAgICByaWdodDogLTIxcHg7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbn1cblxuLy8gQWx0ZXJuYXRlIHN0eWxlc1xuLy9cbi8vIEdlbmVyYXRlIGNvbnRleHR1YWwgbW9kaWZpZXIgY2xhc3NlcyBmb3IgY29sb3JpemluZyB0aGUgYWxlcnQuXG5cbi5hbGVydC1zdWNjZXNzIHtcbiAgQGluY2x1ZGUgYWxlcnQtdmFyaWFudCgkYWxlcnQtc3VjY2Vzcy1iZywgJGFsZXJ0LXN1Y2Nlc3MtYm9yZGVyLCAkYWxlcnQtc3VjY2Vzcy10ZXh0KTtcbn1cblxuLmFsZXJ0LWluZm8ge1xuICBAaW5jbHVkZSBhbGVydC12YXJpYW50KCRhbGVydC1pbmZvLWJnLCAkYWxlcnQtaW5mby1ib3JkZXIsICRhbGVydC1pbmZvLXRleHQpO1xufVxuXG4uYWxlcnQtd2FybmluZyB7XG4gIEBpbmNsdWRlIGFsZXJ0LXZhcmlhbnQoJGFsZXJ0LXdhcm5pbmctYmcsICRhbGVydC13YXJuaW5nLWJvcmRlciwgJGFsZXJ0LXdhcm5pbmctdGV4dCk7XG59XG5cbi5hbGVydC1kYW5nZXIge1xuICBAaW5jbHVkZSBhbGVydC12YXJpYW50KCRhbGVydC1kYW5nZXItYmcsICRhbGVydC1kYW5nZXItYm9yZGVyLCAkYWxlcnQtZGFuZ2VyLXRleHQpO1xufVxuIiwiLy8gQWxlcnRzXG5cbkBtaXhpbiBhbGVydC12YXJpYW50KCRiYWNrZ3JvdW5kLCAkYm9yZGVyLCAkdGV4dC1jb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyO1xuICBjb2xvcjogJHRleHQtY29sb3I7XG5cbiAgaHIge1xuICAgIGJvcmRlci10b3AtY29sb3I6IGRhcmtlbigkYm9yZGVyLCA1JSk7XG4gIH1cbiAgLmFsZXJ0LWxpbmsge1xuICAgIGNvbG9yOiBkYXJrZW4oJHRleHQtY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vXG4vLyBQcm9ncmVzcyBiYXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhciBhbmltYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFdlYktpdFxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVzIHtcbiAgZnJvbSAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7IH1cbiAgdG8gICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH1cbn1cblxuLy8gU3BlYyBhbmQgSUUxMCtcbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXMge1xuICBmcm9tICB7IGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDsgfVxuICB0byAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfVxufVxuXG5cbi8vIEJhciBpdHNlbGZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gT3V0ZXIgY29udGFpbmVyXG4ucHJvZ3Jlc3Mge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRwcm9ncmVzcy1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDJweCByZ2JhKDAsMCwwLC4xKSk7XG59XG5cbi8vIEJhciBvZiBwcm9ncmVzc1xuLnByb2dyZXNzLWJhciB7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBjb2xvcjogJHByb2dyZXNzLWJhci1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYmFyLWJnO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjE1KSk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24od2lkdGggLjZzIGVhc2UpO1xufVxuXG4vLyBTdHJpcGVkIGJhcnNcbi8vXG4vLyBgLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhcmAgaXMgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgaW4gZmF2b3Igb2YgdGhlXG4vLyBgLnByb2dyZXNzLWJhci1zdHJpcGVkYCBjbGFzcywgd2hpY2ggeW91IGp1c3QgYWRkIHRvIGFuIGV4aXN0aW5nXG4vLyBgLnByb2dyZXNzLWJhcmAuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLFxuLnByb2dyZXNzLWJhci1zdHJpcGVkIHtcbiAgQGluY2x1ZGUgZ3JhZGllbnQtc3RyaXBlZDtcbiAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHg7XG59XG5cbi8vIENhbGwgYW5pbWF0aW9uIGZvciB0aGUgYWN0aXZlIG9uZVxuLy9cbi8vIGAucHJvZ3Jlc3MuYWN0aXZlIC5wcm9ncmVzcy1iYXJgIGlzIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMi4wIGluIGZhdm9yIG9mIHRoZVxuLy8gYC5wcm9ncmVzcy1iYXIuYWN0aXZlYCBhcHByb2FjaC5cbi5wcm9ncmVzcy5hY3RpdmUgLnByb2dyZXNzLWJhcixcbi5wcm9ncmVzcy1iYXIuYWN0aXZlIHtcbiAgQGluY2x1ZGUgYW5pbWF0aW9uKHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZSk7XG59XG5cblxuLy8gVmFyaWF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucHJvZ3Jlc3MtYmFyLXN1Y2Nlc3Mge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3MtYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWluZm8ge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLWluZm8tYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLXdhcm5pbmcge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLXdhcm5pbmctYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWRhbmdlciB7XG4gIEBpbmNsdWRlIHByb2dyZXNzLWJhci12YXJpYW50KCRwcm9ncmVzcy1iYXItZGFuZ2VyLWJnKTtcbn1cbiIsIi8vIEdyYWRpZW50c1xuXG5cblxuLy8gSG9yaXpvbnRhbCBncmFkaWVudCwgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4vL1xuLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbi8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG5AbWl4aW4gZ3JhZGllbnQtaG9yaXpvbnRhbCgkc3RhcnQtY29sb3I6ICM1NTUsICRlbmQtY29sb3I6ICMzMzMsICRzdGFydC1wZXJjZW50OiAwJSwgJGVuZC1wZXJjZW50OiAxMDAlKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBTYWZhcmkgNS4xLTYsIENocm9tZSAxMCtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBPcGVyYSAxMlxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBTdGFuZGFyZCwgSUUxMCwgRmlyZWZveCAxNissIE9wZXJhIDEyLjEwKywgU2FmYXJpIDcrLCBDaHJvbWUgMjYrXG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRzdGFydC1jb2xvcil9JywgZW5kQ29sb3JzdHI9JyN7aWUtaGV4LXN0cigkZW5kLWNvbG9yKX0nLCBHcmFkaWVudFR5cGU9MSk7IC8vIElFOSBhbmQgZG93blxufVxuXG4vLyBWZXJ0aWNhbCBncmFkaWVudCwgZnJvbSB0b3AgdG8gYm90dG9tXG4vL1xuLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbi8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG5AbWl4aW4gZ3JhZGllbnQtdmVydGljYWwoJHN0YXJ0LWNvbG9yOiAjNTU1LCAkZW5kLWNvbG9yOiAjMzMzLCAkc3RhcnQtcGVyY2VudDogMCUsICRlbmQtcGVyY2VudDogMTAwJSkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAgLy8gT3BlcmEgMTJcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgJHN0YXJ0LWNvbG9yICRzdGFydC1wZXJjZW50LCAkZW5kLWNvbG9yICRlbmQtcGVyY2VudCk7IC8vIFN0YW5kYXJkLCBJRTEwLCBGaXJlZm94IDE2KywgT3BlcmEgMTIuMTArLCBTYWZhcmkgNyssIENocm9tZSAyNitcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScje2llLWhleC1zdHIoJHN0YXJ0LWNvbG9yKX0nLCBlbmRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRlbmQtY29sb3IpfScsIEdyYWRpZW50VHlwZT0wKTsgLy8gSUU5IGFuZCBkb3duXG59XG5cbkBtaXhpbiBncmFkaWVudC1kaXJlY3Rpb25hbCgkc3RhcnQtY29sb3I6ICM1NTUsICRlbmQtY29sb3I6ICMzMzMsICRkZWc6IDQ1ZGVnKSB7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoJGRlZywgJHN0YXJ0LWNvbG9yLCAkZW5kLWNvbG9yKTsgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgkZGVnLCAkc3RhcnQtY29sb3IsICRlbmQtY29sb3IpOyAvLyBPcGVyYSAxMlxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJGRlZywgJHN0YXJ0LWNvbG9yLCAkZW5kLWNvbG9yKTsgLy8gU3RhbmRhcmQsIElFMTAsIEZpcmVmb3ggMTYrLCBPcGVyYSAxMi4xMCssIFNhZmFyaSA3KywgQ2hyb21lIDI2K1xufVxuQG1peGluIGdyYWRpZW50LWhvcml6b250YWwtdGhyZWUtY29sb3JzKCRzdGFydC1jb2xvcjogIzAwYjNlZSwgJG1pZC1jb2xvcjogIzdhNDNiNiwgJGNvbG9yLXN0b3A6IDUwJSwgJGVuZC1jb2xvcjogI2MzMzI1Zikge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCAkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgJHN0YXJ0LWNvbG9yLCAkbWlkLWNvbG9yICRjb2xvci1zdG9wLCAkZW5kLWNvbG9yKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScje2llLWhleC1zdHIoJHN0YXJ0LWNvbG9yKX0nLCBlbmRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRlbmQtY29sb3IpfScsIEdyYWRpZW50VHlwZT0xKTsgLy8gSUU5IGFuZCBkb3duLCBnZXRzIG5vIGNvbG9yLXN0b3AgYXQgYWxsIGZvciBwcm9wZXIgZmFsbGJhY2tcbn1cbkBtaXhpbiBncmFkaWVudC12ZXJ0aWNhbC10aHJlZS1jb2xvcnMoJHN0YXJ0LWNvbG9yOiAjMDBiM2VlLCAkbWlkLWNvbG9yOiAjN2E0M2I2LCAkY29sb3Itc3RvcDogNTAlLCAkZW5kLWNvbG9yOiAjYzMzMjVmKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCRzdGFydC1jb2xvciwgJG1pZC1jb2xvciAkY29sb3Itc3RvcCwgJGVuZC1jb2xvcik7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJHN0YXJ0LWNvbG9yLCAkbWlkLWNvbG9yICRjb2xvci1zdG9wLCAkZW5kLWNvbG9yKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRzdGFydC1jb2xvcil9JywgZW5kQ29sb3JzdHI9JyN7aWUtaGV4LXN0cigkZW5kLWNvbG9yKX0nLCBHcmFkaWVudFR5cGU9MCk7IC8vIElFOSBhbmQgZG93biwgZ2V0cyBubyBjb2xvci1zdG9wIGF0IGFsbCBmb3IgcHJvcGVyIGZhbGxiYWNrXG59XG5AbWl4aW4gZ3JhZGllbnQtcmFkaWFsKCRpbm5lci1jb2xvcjogIzU1NSwgJG91dGVyLWNvbG9yOiAjMzMzKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtcmFkaWFsLWdyYWRpZW50KGNpcmNsZSwgJGlubmVyLWNvbG9yLCAkb3V0ZXItY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlLCAkaW5uZXItY29sb3IsICRvdXRlci1jb2xvcik7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG5AbWl4aW4gZ3JhZGllbnQtc3RyaXBlZCgkY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjE1KSwgJGFuZ2xlOiA0NWRlZykge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgkYW5nbGUsICRjb2xvciAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCAkY29sb3IgNTAlLCAkY29sb3IgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KCRhbmdsZSwgJGNvbG9yIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsICRjb2xvciA1MCUsICRjb2xvciA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJGFuZ2xlLCAkY29sb3IgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgJGNvbG9yIDUwJSwgJGNvbG9yIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG59XG4iLCIvLyBQcm9ncmVzcyBiYXJzXG5cbkBtaXhpbiBwcm9ncmVzcy1iYXItdmFyaWFudCgkY29sb3IpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yO1xuXG4gIC8vIERlcHJlY2F0ZWQgcGFyZW50IGNsYXNzIHJlcXVpcmVtZW50IGFzIG9mIHYzLjIuMFxuICAucHJvZ3Jlc3Mtc3RyaXBlZCAmIHtcbiAgICBAaW5jbHVkZSBncmFkaWVudC1zdHJpcGVkO1xuICB9XG59XG4iLCIubWVkaWEge1xuICAvLyBQcm9wZXIgc3BhY2luZyBiZXR3ZWVuIGluc3RhbmNlcyBvZiAubWVkaWFcbiAgbWFyZ2luLXRvcDogMTVweDtcblxuICAmOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi5tZWRpYSxcbi5tZWRpYS1ib2R5IHtcbiAgem9vbTogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLm1lZGlhLWJvZHkge1xuICB3aWR0aDogMTAwMDBweDtcbn1cblxuLm1lZGlhLW9iamVjdCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuXG4gIC8vIEZpeCBjb2xsYXBzZSBpbiB3ZWJraXQgZnJvbSBtYXgtd2lkdGg6IDEwMCUgYW5kIGRpc3BsYXk6IHRhYmxlLWNlbGwuXG4gICYuaW1nLXRodW1ibmFpbCB7XG4gICAgbWF4LXdpZHRoOiBub25lO1xuICB9XG59XG5cbi5tZWRpYS1yaWdodCxcbi5tZWRpYSA+IC5wdWxsLXJpZ2h0IHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYSA+IC5wdWxsLWxlZnQge1xuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYS1yaWdodCxcbi5tZWRpYS1ib2R5IHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxuLm1lZGlhLW1pZGRsZSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5tZWRpYS1ib3R0b20ge1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4vLyBSZXNldCBtYXJnaW5zIG9uIGhlYWRpbmdzIGZvciB0aWdodGVyIGRlZmF1bHQgc3BhY2luZ1xuLm1lZGlhLWhlYWRpbmcge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi8vIE1lZGlhIGxpc3QgdmFyaWF0aW9uXG4vL1xuLy8gVW5kbyBkZWZhdWx0IHVsL29sIHN0eWxlc1xuLm1lZGlhLWxpc3Qge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG4iLCIvL1xuLy8gTGlzdCBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQmFzZSBjbGFzc1xuLy9cbi8vIEVhc2lseSB1c2FibGUgb24gPHVsPiwgPG9sPiwgb3IgPGRpdj4uXG5cbi5saXN0LWdyb3VwIHtcbiAgLy8gTm8gbmVlZCB0byBzZXQgbGlzdC1zdHlsZTogbm9uZTsgc2luY2UgLmxpc3QtZ3JvdXAtaXRlbSBpcyBibG9jayBsZXZlbFxuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7IC8vIHJlc2V0IHBhZGRpbmcgYmVjYXVzZSB1bCBhbmQgb2xcbn1cblxuXG4vLyBJbmRpdmlkdWFsIGxpc3QgaXRlbXNcbi8vXG4vLyBVc2Ugb24gYGxpYHMgb3IgYGRpdmBzIHdpdGhpbiB0aGUgYC5saXN0LWdyb3VwYCBwYXJlbnQuXG5cbi5saXN0LWdyb3VwLWl0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gIC8vIFBsYWNlIHRoZSBib3JkZXIgb24gdGhlIGxpc3QgaXRlbXMgYW5kIG5lZ2F0aXZlIG1hcmdpbiB1cCBmb3IgYmV0dGVyIHN0eWxpbmdcbiAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGxpc3QtZ3JvdXAtYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRsaXN0LWdyb3VwLWJvcmRlcjtcblxuICAvLyBSb3VuZCB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXNcbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoJGxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyk7XG4gIH1cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKCRsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO1xuICB9XG59XG5cblxuLy8gSW50ZXJhY3RpdmUgbGlzdCBpdGVtc1xuLy9cbi8vIFVzZSBhbmNob3Igb3IgYnV0dG9uIGVsZW1lbnRzIGluc3RlYWQgb2YgYGxpYHMgb3IgYGRpdmBzIHRvIGNyZWF0ZSBpbnRlcmFjdGl2ZSBpdGVtcy5cbi8vIEluY2x1ZGVzIGFuIGV4dHJhIGAuYWN0aXZlYCBtb2RpZmllciBjbGFzcyBmb3Igc2hvd2luZyBzZWxlY3RlZCBpdGVtcy5cblxuYS5saXN0LWdyb3VwLWl0ZW0sXG5idXR0b24ubGlzdC1ncm91cC1pdGVtIHtcbiAgY29sb3I6ICRsaXN0LWdyb3VwLWxpbmstY29sb3I7XG5cbiAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgICBjb2xvcjogJGxpc3QtZ3JvdXAtbGluay1oZWFkaW5nLWNvbG9yO1xuICB9XG5cbiAgLy8gSG92ZXIgc3RhdGVcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRsaXN0LWdyb3VwLWhvdmVyLWJnO1xuICB9XG59XG5cbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0ge1xuICB3aWR0aDogMTAwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIC8vIERpc2FibGVkIHN0YXRlXG4gICYuZGlzYWJsZWQsXG4gICYuZGlzYWJsZWQ6aG92ZXIsXG4gICYuZGlzYWJsZWQ6Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRsaXN0LWdyb3VwLWRpc2FibGVkLWJnO1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcjtcbiAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG5cbiAgICAvLyBGb3JjZSBjb2xvciB0byBpbmhlcml0IGZvciBjdXN0b20gY29udGVudFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiAkbGlzdC1ncm91cC1kaXNhYmxlZC10ZXh0LWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFjdGl2ZSBjbGFzcyBvbiBpdGVtIGl0c2VsZiwgbm90IHBhcmVudFxuICAmLmFjdGl2ZSxcbiAgJi5hY3RpdmU6aG92ZXIsXG4gICYuYWN0aXZlOmZvY3VzIHtcbiAgICB6LWluZGV4OiAyOyAvLyBQbGFjZSBhY3RpdmUgaXRlbXMgYWJvdmUgdGhlaXIgc2libGluZ3MgZm9yIHByb3BlciBib3JkZXIgc3R5bGluZ1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGxpc3QtZ3JvdXAtYWN0aXZlLWJnO1xuICAgIGJvcmRlci1jb2xvcjogJGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjtcblxuICAgIC8vIEZvcmNlIGNvbG9yIHRvIGluaGVyaXQgZm9yIGN1c3RvbSBjb250ZW50XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiAkbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhbnRzXG4vL1xuLy8gQWRkIG1vZGlmaWVyIGNsYXNzZXMgdG8gY2hhbmdlIHRleHQgYW5kIGJhY2tncm91bmQgY29sb3Igb24gaW5kaXZpZHVhbCBpdGVtcy5cbi8vIE9yZ2FuaXphdGlvbmFsbHksIHRoaXMgbXVzdCBjb21lIGFmdGVyIHRoZSBgOmhvdmVyYCBzdGF0ZXMuXG5cbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHN1Y2Nlc3MsICRzdGF0ZS1zdWNjZXNzLWJnLCAkc3RhdGUtc3VjY2Vzcy10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KGluZm8sICRzdGF0ZS1pbmZvLWJnLCAkc3RhdGUtaW5mby10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHdhcm5pbmcsICRzdGF0ZS13YXJuaW5nLWJnLCAkc3RhdGUtd2FybmluZy10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KGRhbmdlciwgJHN0YXRlLWRhbmdlci1iZywgJHN0YXRlLWRhbmdlci10ZXh0KTtcblxuXG4vLyBDdXN0b20gY29udGVudCBvcHRpb25zXG4vL1xuLy8gRXh0cmEgY2xhc3NlcyBmb3IgY3JlYXRpbmcgd2VsbC1mb3JtYXR0ZWQgY29udGVudCB3aXRoaW4gYC5saXN0LWdyb3VwLWl0ZW1gcy5cblxuLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbn1cbiIsIi8vIExpc3QgR3JvdXBzXG5cbkBtaXhpbiBsaXN0LWdyb3VwLWl0ZW0tdmFyaWFudCgkc3RhdGUsICRiYWNrZ3JvdW5kLCAkY29sb3IpIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbS0jeyRzdGF0ZX0ge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQ7XG5cbiAgICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSYsIGJ1dHRvbiYgdG8gYS5saXN0LWdyb3VwLWl0ZW0tI3skc3RhdGV9LCBidXR0b24ubGlzdC1ncm91cC1pdGVtLSN7JHN0YXRlfVxuICB9XG5cbiAgYS5saXN0LWdyb3VwLWl0ZW0tI3skc3RhdGV9LFxuICBidXR0b24ubGlzdC1ncm91cC1pdGVtLSN7JHN0YXRlfSB7XG4gICAgY29sb3I6ICRjb2xvcjtcblxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG5cbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgNSUpO1xuICAgIH1cbiAgICAmLmFjdGl2ZSxcbiAgICAmLmFjdGl2ZTpob3ZlcixcbiAgICAmLmFjdGl2ZTpmb2N1cyB7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbiAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFBhbmVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ucGFuZWwge1xuICBtYXJnaW4tYm90dG9tOiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6ICRwYW5lbC1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSkpO1xufVxuXG4vLyBQYW5lbCBjb250ZW50c1xuLnBhbmVsLWJvZHkge1xuICBwYWRkaW5nOiAkcGFuZWwtYm9keS1wYWRkaW5nO1xuICBAaW5jbHVkZSBjbGVhcmZpeDtcbn1cblxuLy8gT3B0aW9uYWwgaGVhZGluZ1xuLnBhbmVsLWhlYWRpbmcge1xuICBwYWRkaW5nOiAkcGFuZWwtaGVhZGluZy1wYWRkaW5nO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKCgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpKTtcblxuICA+IC5kcm9wZG93biAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBXaXRoaW4gaGVhZGluZywgc3RyaXAgYW55IGBoKmAgdGFnIG9mIGl0cyBkZWZhdWx0IG1hcmdpbnMgZm9yIHNwYWNpbmcuXG4ucGFuZWwtdGl0bGUge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LXNpemU6IGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDEuMTI1KSk7XG4gIGNvbG9yOiBpbmhlcml0O1xuXG4gID4gYSxcbiAgPiBzbWFsbCxcbiAgPiAuc21hbGwsXG4gID4gc21hbGwgPiBhLFxuICA+IC5zbWFsbCA+IGEge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsIGZvb3RlciAoc3RheXMgZ3JheSBpbiBldmVyeSBtb2RpZmllciBjbGFzcylcbi5wYW5lbC1mb290ZXIge1xuICBwYWRkaW5nOiAkcGFuZWwtZm9vdGVyLXBhZGRpbmc7XG4gIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1mb290ZXItYmc7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAkcGFuZWwtaW5uZXItYm9yZGVyO1xuICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cygoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG59XG5cblxuLy8gTGlzdCBncm91cHMgaW4gcGFuZWxzXG4vL1xuLy8gQnkgZGVmYXVsdCwgc3BhY2Ugb3V0IGxpc3QgZ3JvdXAgY29udGVudCBmcm9tIHBhbmVsIGhlYWRpbmdzIHRvIGFjY291bnQgZm9yXG4vLyBhbnkga2luZCBvZiBjdXN0b20gY29udGVudCBiZXR3ZWVuIHRoZSB0d28uXG5cbi5wYW5lbCB7XG4gID4gLmxpc3QtZ3JvdXAsXG4gID4gLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICAubGlzdC1ncm91cC1pdGVtIHtcbiAgICAgIGJvcmRlci13aWR0aDogMXB4IDA7XG4gICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIH1cblxuICAgIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMDtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBib3JkZXIgYm90dG9tIHJhZGl1cyBmb3IgbGFzdCBvbmVcbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG4gICAgfVxuICB9XG59XG4vLyBDb2xsYXBzZSBzcGFjZSBiZXR3ZWVuIHdoZW4gdGhlcmUncyBubyBhZGRpdGlvbmFsIGNvbnRlbnQuXG4ucGFuZWwtaGVhZGluZyArIC5saXN0LWdyb3VwIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgfVxufVxuLmxpc3QtZ3JvdXAgKyAucGFuZWwtZm9vdGVyIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbn1cblxuLy8gVGFibGVzIGluIHBhbmVsc1xuLy9cbi8vIFBsYWNlIGEgbm9uLWJvcmRlcmVkIGAudGFibGVgIHdpdGhpbiBhIHBhbmVsIChub3Qgd2l0aGluIGEgYC5wYW5lbC1ib2R5YCkgYW5kXG4vLyB3YXRjaCBpdCBnbyBmdWxsIHdpZHRoLlxuXG4ucGFuZWwge1xuICA+IC50YWJsZSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSxcbiAgPiAucGFuZWwtY29sbGFwc2UgPiAudGFibGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICBjYXB0aW9uIHtcbiAgICAgIHBhZGRpbmctbGVmdDogJHBhbmVsLWJvZHktcGFkZGluZztcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICRwYW5lbC1ib2R5LXBhZGRpbmc7XG4gICAgfVxuICB9XG4gIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gID4gLnRhYmxlOmZpcnN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkIHtcbiAgICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG5cbiAgICA+IHRoZWFkOmZpcnN0LWNoaWxkLFxuICAgID4gdGJvZHk6Zmlyc3QtY2hpbGQge1xuICAgICAgPiB0cjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG5cbiAgICAgICAgdGQ6Zmlyc3QtY2hpbGQsXG4gICAgICAgIHRoOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZDpsYXN0LWNoaWxkLFxuICAgICAgICB0aDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gQWRkIGJvcmRlciBib3R0b20gcmFkaXVzIGZvciBsYXN0IG9uZVxuICA+IC50YWJsZTpsYXN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCB7XG4gICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuXG4gICAgPiB0Ym9keTpsYXN0LWNoaWxkLFxuICAgID4gdGZvb3Q6bGFzdC1jaGlsZCB7XG4gICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuXG4gICAgICAgIHRkOmZpcnN0LWNoaWxkLFxuICAgICAgICB0aDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGQ6bGFzdC1jaGlsZCxcbiAgICAgICAgdGg6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gLnBhbmVsLWJvZHkgKyAudGFibGUsXG4gID4gLnBhbmVsLWJvZHkgKyAudGFibGUtcmVzcG9uc2l2ZSxcbiAgPiAudGFibGUgKyAucGFuZWwtYm9keSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSArIC5wYW5lbC1ib2R5IHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgfVxuICA+IC50YWJsZSA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGgsXG4gID4gLnRhYmxlID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZCB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgfVxuICA+IC50YWJsZS1ib3JkZXJlZCxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCB7XG4gICAgYm9yZGVyOiAwO1xuICAgID4gdGhlYWQsXG4gICAgPiB0Ym9keSxcbiAgICA+IHRmb290IHtcbiAgICAgID4gdHIge1xuICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICA+IHRkOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItbGVmdDogMDtcbiAgICAgICAgfVxuICAgICAgICA+IHRoOmxhc3QtY2hpbGQsXG4gICAgICAgID4gdGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgID4gdGhlYWQsXG4gICAgPiB0Ym9keSB7XG4gICAgICA+IHRyOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgPiB0ZCxcbiAgICAgICAgPiB0aCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICA+IHRib2R5LFxuICAgID4gdGZvb3Qge1xuICAgICAgPiB0cjpsYXN0LWNoaWxkIHtcbiAgICAgICAgPiB0ZCxcbiAgICAgICAgPiB0aCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IC50YWJsZS1yZXNwb25zaXZlIHtcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG5cbi8vIENvbGxhcHNhYmxlIHBhbmVscyAoYWthLCBhY2NvcmRpb24pXG4vL1xuLy8gV3JhcCBhIHNlcmllcyBvZiBwYW5lbHMgaW4gYC5wYW5lbC1ncm91cGAgdG8gdHVybiB0aGVtIGludG8gYW4gYWNjb3JkaW9uIHdpdGhcbi8vIHRoZSBoZWxwIG9mIG91ciBjb2xsYXBzZSBKYXZhU2NyaXB0IHBsdWdpbi5cblxuLnBhbmVsLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuXG4gIC8vIFRpZ2h0ZW4gdXAgbWFyZ2luIHNvIGl0J3Mgb25seSBiZXR3ZWVuIHBhbmVsc1xuICAucGFuZWwge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgYm9yZGVyLXJhZGl1czogJHBhbmVsLWJvcmRlci1yYWRpdXM7XG5cbiAgICArIC5wYW5lbCB7XG4gICAgICBtYXJnaW4tdG9wOiA1cHg7XG4gICAgfVxuICB9XG5cbiAgLnBhbmVsLWhlYWRpbmcge1xuICAgIGJvcmRlci1ib3R0b206IDA7XG5cbiAgICArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5LFxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRwYW5lbC1pbm5lci1ib3JkZXI7XG4gICAgfVxuICB9XG5cbiAgLnBhbmVsLWZvb3RlciB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICArIC5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keSB7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHBhbmVsLWlubmVyLWJvcmRlcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnNcbi5wYW5lbC1kZWZhdWx0IHtcbiAgQGluY2x1ZGUgcGFuZWwtdmFyaWFudCgkcGFuZWwtZGVmYXVsdC1ib3JkZXIsICRwYW5lbC1kZWZhdWx0LXRleHQsICRwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmcsICRwYW5lbC1kZWZhdWx0LWJvcmRlcik7XG59XG4ucGFuZWwtcHJpbWFyeSB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLXByaW1hcnktYm9yZGVyLCAkcGFuZWwtcHJpbWFyeS10ZXh0LCAkcGFuZWwtcHJpbWFyeS1oZWFkaW5nLWJnLCAkcGFuZWwtcHJpbWFyeS1ib3JkZXIpO1xufVxuLnBhbmVsLXN1Y2Nlc3Mge1xuICBAaW5jbHVkZSBwYW5lbC12YXJpYW50KCRwYW5lbC1zdWNjZXNzLWJvcmRlciwgJHBhbmVsLXN1Y2Nlc3MtdGV4dCwgJHBhbmVsLXN1Y2Nlc3MtaGVhZGluZy1iZywgJHBhbmVsLXN1Y2Nlc3MtYm9yZGVyKTtcbn1cbi5wYW5lbC1pbmZvIHtcbiAgQGluY2x1ZGUgcGFuZWwtdmFyaWFudCgkcGFuZWwtaW5mby1ib3JkZXIsICRwYW5lbC1pbmZvLXRleHQsICRwYW5lbC1pbmZvLWhlYWRpbmctYmcsICRwYW5lbC1pbmZvLWJvcmRlcik7XG59XG4ucGFuZWwtd2FybmluZyB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLXdhcm5pbmctYm9yZGVyLCAkcGFuZWwtd2FybmluZy10ZXh0LCAkcGFuZWwtd2FybmluZy1oZWFkaW5nLWJnLCAkcGFuZWwtd2FybmluZy1ib3JkZXIpO1xufVxuLnBhbmVsLWRhbmdlciB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLWRhbmdlci1ib3JkZXIsICRwYW5lbC1kYW5nZXItdGV4dCwgJHBhbmVsLWRhbmdlci1oZWFkaW5nLWJnLCAkcGFuZWwtZGFuZ2VyLWJvcmRlcik7XG59XG4iLCIvLyBQYW5lbHNcblxuQG1peGluIHBhbmVsLXZhcmlhbnQoJGJvcmRlciwgJGhlYWRpbmctdGV4dC1jb2xvciwgJGhlYWRpbmctYmctY29sb3IsICRoZWFkaW5nLWJvcmRlcikge1xuICBib3JkZXItY29sb3I6ICRib3JkZXI7XG5cbiAgJiA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgICBjb2xvcjogJGhlYWRpbmctdGV4dC1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGluZy1iZy1jb2xvcjtcbiAgICBib3JkZXItY29sb3I6ICRoZWFkaW5nLWJvcmRlcjtcblxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGJvcmRlcjtcbiAgICB9XG4gICAgLmJhZGdlIHtcbiAgICAgIGNvbG9yOiAkaGVhZGluZy1iZy1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRoZWFkaW5nLXRleHQtY29sb3I7XG4gICAgfVxuICB9XG4gICYgPiAucGFuZWwtZm9vdGVyIHtcbiAgICArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRib3JkZXI7XG4gICAgfVxuICB9XG59XG4iLCIvLyBFbWJlZHMgcmVzcG9uc2l2ZVxuLy9cbi8vIENyZWRpdDogTmljb2xhcyBHYWxsYWdoZXIgYW5kIFNVSVQgQ1NTLlxuXG4uZW1iZWQtcmVzcG9uc2l2ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogMDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAuZW1iZWQtcmVzcG9uc2l2ZS1pdGVtLFxuICBpZnJhbWUsXG4gIGVtYmVkLFxuICBvYmplY3QsXG4gIHZpZGVvIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IDA7XG4gIH1cbn1cblxuLy8gTW9kaWZpZXIgY2xhc3MgZm9yIDE2OjkgYXNwZWN0IHJhdGlvXG4uZW1iZWQtcmVzcG9uc2l2ZS0xNmJ5OSB7XG4gIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG59XG5cbi8vIE1vZGlmaWVyIGNsYXNzIGZvciA0OjMgYXNwZWN0IHJhdGlvXG4uZW1iZWQtcmVzcG9uc2l2ZS00YnkzIHtcbiAgcGFkZGluZy1ib3R0b206IDc1JTtcbn1cbiIsIi8vXG4vLyBXZWxsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ud2VsbCB7XG4gIG1pbi1oZWlnaHQ6IDIwcHg7XG4gIHBhZGRpbmc6IDE5cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3ZWxsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCAkd2VsbC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KSk7XG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlci1jb2xvcjogI2RkZDtcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsLjE1KTtcbiAgfVxufVxuXG4vLyBTaXplc1xuLndlbGwtbGcge1xuICBwYWRkaW5nOiAyNHB4O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1sYXJnZTtcbn1cbi53ZWxsLXNtIHtcbiAgcGFkZGluZzogOXB4O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1zbWFsbDtcbn1cbiIsIi8vXG4vLyBDbG9zZSBpY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4uY2xvc2Uge1xuICBmbG9hdDogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogKCRmb250LXNpemUtYmFzZSAqIDEuNSk7XG4gIGZvbnQtd2VpZ2h0OiAkY2xvc2UtZm9udC13ZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGNsb3NlLWNvbG9yO1xuICB0ZXh0LXNoYWRvdzogJGNsb3NlLXRleHQtc2hhZG93O1xuICBAaW5jbHVkZSBvcGFjaXR5KC4yKTtcblxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBjb2xvcjogJGNsb3NlLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgQGluY2x1ZGUgb3BhY2l0eSguNSk7XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYnV0dG9uJiB0byBidXR0b24uY2xvc2Vcbn1cblxuLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBidXR0b24gdmVyc2lvblxuLy8gaU9TIHJlcXVpcmVzIHRoZSBidXR0b24gZWxlbWVudCBpbnN0ZWFkIG9mIGFuIGFuY2hvciB0YWcuXG4vLyBJZiB5b3Ugd2FudCB0aGUgYW5jaG9yIHZlcnNpb24sIGl0IHJlcXVpcmVzIGBocmVmPVwiI1wiYC5cbi8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvY2xpY2sjU2FmYXJpX01vYmlsZVxuYnV0dG9uLmNsb3NlIHtcbiAgcGFkZGluZzogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG4iLCIvL1xuLy8gTW9kYWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyAubW9kYWwtb3BlbiAgICAgIC0gYm9keSBjbGFzcyBmb3Iga2lsbGluZyB0aGUgc2Nyb2xsXG4vLyAubW9kYWwgICAgICAgICAgIC0gY29udGFpbmVyIHRvIHNjcm9sbCB3aXRoaW5cbi8vIC5tb2RhbC1kaWFsb2cgICAgLSBwb3NpdGlvbmluZyBzaGVsbCBmb3IgdGhlIGFjdHVhbCBtb2RhbFxuLy8gLm1vZGFsLWNvbnRlbnQgICAtIGFjdHVhbCBtb2RhbCB3LyBiZyBhbmQgY29ybmVycyBhbmQgc2hpdFxuXG4vLyBLaWxsIHRoZSBzY3JvbGwgb24gdGhlIGJvZHlcbi5tb2RhbC1vcGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLy8gQ29udGFpbmVyIHRoYXQgdGhlIG1vZGFsIHNjcm9sbHMgd2l0aGluXG4ubW9kYWwge1xuICBkaXNwbGF5OiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHppbmRleC1tb2RhbDtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuXG4gIC8vIFByZXZlbnQgQ2hyb21lIG9uIFdpbmRvd3MgZnJvbSBhZGRpbmcgYSBmb2N1cyBvdXRsaW5lLiBGb3IgZGV0YWlscywgc2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEwOTUxLlxuICBvdXRsaW5lOiAwO1xuXG4gIC8vIFdoZW4gZmFkaW5nIGluIHRoZSBtb2RhbCwgYW5pbWF0ZSBpdCB0byBzbGlkZSBkb3duXG4gICYuZmFkZSAubW9kYWwtZGlhbG9nIHtcbiAgICBAaW5jbHVkZSB0cmFuc2xhdGUoMCwgLTI1JSk7XG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbi10cmFuc2Zvcm0oMC4zcyBlYXNlLW91dCk7XG4gIH1cbiAgJi5pbiAubW9kYWwtZGlhbG9nIHsgQGluY2x1ZGUgdHJhbnNsYXRlKDAsIDApIH1cbn1cbi5tb2RhbC1vcGVuIC5tb2RhbCB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLy8gU2hlbGwgZGl2IHRvIHBvc2l0aW9uIHRoZSBtb2RhbCB3aXRoIGJvdHRvbSBwYWRkaW5nXG4ubW9kYWwtZGlhbG9nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogYXV0bztcbiAgbWFyZ2luOiAxMHB4O1xufVxuXG4vLyBBY3R1YWwgbW9kYWxcbi5tb2RhbC1jb250ZW50IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtY29udGVudC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJG1vZGFsLWNvbnRlbnQtZmFsbGJhY2stYm9yZGVyLWNvbG9yOyAvL29sZCBicm93c2VycyBmYWxsYmFjayAoaWU4IGV0YylcbiAgYm9yZGVyOiAxcHggc29saWQgJG1vZGFsLWNvbnRlbnQtYm9yZGVyLWNvbG9yO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1sYXJnZTtcbiAgQGluY2x1ZGUgYm94LXNoYWRvdygwIDNweCA5cHggcmdiYSgwLDAsMCwuNSkpO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuICAvLyBSZW1vdmUgZm9jdXMgb3V0bGluZSBmcm9tIG9wZW5lZCBtb2RhbFxuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBNb2RhbCBiYWNrZ3JvdW5kXG4ubW9kYWwtYmFja2Ryb3Age1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHppbmRleC1tb2RhbC1iYWNrZ3JvdW5kO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtYmFja2Ryb3AtYmc7XG4gIC8vIEZhZGUgZm9yIGJhY2tkcm9wXG4gICYuZmFkZSB7IEBpbmNsdWRlIG9wYWNpdHkoMCk7IH1cbiAgJi5pbiB7IEBpbmNsdWRlIG9wYWNpdHkoJG1vZGFsLWJhY2tkcm9wLW9wYWNpdHkpOyB9XG59XG5cbi8vIE1vZGFsIGhlYWRlclxuLy8gVG9wIHNlY3Rpb24gb2YgdGhlIG1vZGFsIHcvIHRpdGxlIGFuZCBkaXNtaXNzXG4ubW9kYWwtaGVhZGVyIHtcbiAgcGFkZGluZzogJG1vZGFsLXRpdGxlLXBhZGRpbmc7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkbW9kYWwtaGVhZGVyLWJvcmRlci1jb2xvcjtcbiAgbWluLWhlaWdodDogKCRtb2RhbC10aXRsZS1wYWRkaW5nICsgJG1vZGFsLXRpdGxlLWxpbmUtaGVpZ2h0KTtcbn1cbi8vIENsb3NlIGljb25cbi5tb2RhbC1oZWFkZXIgLmNsb3NlIHtcbiAgbWFyZ2luLXRvcDogLTJweDtcbn1cblxuLy8gVGl0bGUgdGV4dCB3aXRoaW4gaGVhZGVyXG4ubW9kYWwtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGxpbmUtaGVpZ2h0OiAkbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQ7XG59XG5cbi8vIE1vZGFsIGJvZHlcbi8vIFdoZXJlIGFsbCBtb2RhbCBjb250ZW50IHJlc2lkZXMgKHNpYmxpbmcgb2YgLm1vZGFsLWhlYWRlciBhbmQgLm1vZGFsLWZvb3Rlcilcbi5tb2RhbC1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiAkbW9kYWwtaW5uZXItcGFkZGluZztcbn1cblxuLy8gRm9vdGVyIChmb3IgYWN0aW9ucylcbi5tb2RhbC1mb290ZXIge1xuICBwYWRkaW5nOiAkbW9kYWwtaW5uZXItcGFkZGluZztcbiAgdGV4dC1hbGlnbjogcmlnaHQ7IC8vIHJpZ2h0IGFsaWduIGJ1dHRvbnNcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRtb2RhbC1mb290ZXItYm9yZGVyLWNvbG9yO1xuICBAaW5jbHVkZSBjbGVhcmZpeDsgLy8gY2xlYXIgaXQgaW4gY2FzZSBmb2xrcyB1c2UgLnB1bGwtKiBjbGFzc2VzIG9uIGJ1dHRvbnNcblxuICAvLyBQcm9wZXJseSBzcGFjZSBvdXQgYnV0dG9uc1xuICAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyAvLyBhY2NvdW50IGZvciBpbnB1dFt0eXBlPVwic3VibWl0XCJdIHdoaWNoIGdldHMgdGhlIGJvdHRvbSBtYXJnaW4gbGlrZSBhbGwgb3RoZXIgaW5wdXRzXG4gIH1cbiAgLy8gYnV0IG92ZXJyaWRlIHRoYXQgZm9yIGJ1dHRvbiBncm91cHNcbiAgLmJ0bi1ncm91cCAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIH1cbiAgLy8gYW5kIG92ZXJyaWRlIGl0IGZvciBibG9jayBidXR0b25zIGFzIHdlbGxcbiAgLmJ0bi1ibG9jayArIC5idG4tYmxvY2sge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi8vIE1lYXN1cmUgc2Nyb2xsYmFyIHdpZHRoIGZvciBwYWRkaW5nIGJvZHkgZHVyaW5nIG1vZGFsIHNob3cvaGlkZVxuLm1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC05OTk5cHg7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5cbi8vIFNjYWxlIHVwIHRoZSBtb2RhbFxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gIC8vIEF1dG9tYXRpY2FsbHkgc2V0IG1vZGFsJ3Mgd2lkdGggZm9yIGxhcmdlciB2aWV3cG9ydHNcbiAgLm1vZGFsLWRpYWxvZyB7XG4gICAgd2lkdGg6ICRtb2RhbC1tZDtcbiAgICBtYXJnaW46IDMwcHggYXV0bztcbiAgfVxuICAubW9kYWwtY29udGVudCB7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdygwIDVweCAxNXB4IHJnYmEoMCwwLDAsLjUpKTtcbiAgfVxuXG4gIC8vIE1vZGFsIHNpemVzXG4gIC5tb2RhbC1zbSB7IHdpZHRoOiAkbW9kYWwtc207IH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gIC5tb2RhbC1sZyB7IHdpZHRoOiAkbW9kYWwtbGc7IH1cbn1cbiIsIi8vXG4vLyBUb29sdGlwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4udG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogJHppbmRleC10b29sdGlwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgLy8gT3VyIHBhcmVudCBlbGVtZW50IGNhbiBiZSBhcmJpdHJhcnkgc2luY2UgdG9vbHRpcHMgYXJlIGJ5IGRlZmF1bHQgaW5zZXJ0ZWQgYXMgYSBzaWJsaW5nIG9mIHRoZWlyIHRhcmdldCBlbGVtZW50LlxuICAvLyBTbyByZXNldCBvdXIgZm9udCBhbmQgdGV4dCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGluaGVyaXRpbmcgd2VpcmQgdmFsdWVzLlxuICBAaW5jbHVkZSByZXNldC10ZXh0O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG5cbiAgQGluY2x1ZGUgb3BhY2l0eSgwKTtcblxuICAmLmluICAgICB7IEBpbmNsdWRlIG9wYWNpdHkoJHRvb2x0aXAtb3BhY2l0eSk7IH1cbiAgJi50b3AgICAgeyBtYXJnaW4tdG9wOiAgLTNweDsgcGFkZGluZzogJHRvb2x0aXAtYXJyb3ctd2lkdGggMDsgfVxuICAmLnJpZ2h0ICB7IG1hcmdpbi1sZWZ0OiAgM3B4OyBwYWRkaW5nOiAwICR0b29sdGlwLWFycm93LXdpZHRoOyB9XG4gICYuYm90dG9tIHsgbWFyZ2luLXRvcDogICAzcHg7IHBhZGRpbmc6ICR0b29sdGlwLWFycm93LXdpZHRoIDA7IH1cbiAgJi5sZWZ0ICAgeyBtYXJnaW4tbGVmdDogLTNweDsgcGFkZGluZzogMCAkdG9vbHRpcC1hcnJvdy13aWR0aDsgfVxufVxuXG4vLyBXcmFwcGVyIGZvciB0aGUgdG9vbHRpcCBjb250ZW50XG4udG9vbHRpcC1pbm5lciB7XG4gIG1heC13aWR0aDogJHRvb2x0aXAtbWF4LXdpZHRoO1xuICBwYWRkaW5nOiAzcHggOHB4O1xuICBjb2xvcjogJHRvb2x0aXAtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHRvb2x0aXAtYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG59XG5cbi8vIEFycm93c1xuLnRvb2x0aXAtYXJyb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG59XG4vLyBOb3RlOiBEZXByZWNhdGVkIC50b3AtbGVmdCwgLnRvcC1yaWdodCwgLmJvdHRvbS1sZWZ0LCBhbmQgLmJvdHRvbS1yaWdodCBhcyBvZiB2My4zLjFcbi50b29sdGlwIHtcbiAgJi50b3AgLnRvb2x0aXAtYXJyb3cge1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogJHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbiAgJi50b3AtbGVmdCAudG9vbHRpcC1hcnJvdyB7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAkdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBtYXJnaW4tYm90dG9tOiAtJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAkdG9vbHRpcC1hcnJvdy13aWR0aCAkdG9vbHRpcC1hcnJvdy13aWR0aCAwO1xuICAgIGJvcmRlci10b3AtY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYudG9wLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgbWFyZ2luLWJvdHRvbTogLSR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGggMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLnJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogNTAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoIDAgJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tIC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAwICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogMDtcbiAgICByaWdodDogJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgbWFyZ2luLXRvcDogLSR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogMCAkdG9vbHRpcC1hcnJvdy13aWR0aCAkdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmJvdHRvbS1yaWdodCAudG9vbHRpcC1hcnJvdyB7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6ICR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IDAgJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbn1cbiIsIkBtaXhpbiByZXNldC10ZXh0KCkge1xuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWJhc2U7XG4gIC8vIFdlIGRlbGliZXJhdGVseSBkbyBOT1QgcmVzZXQgZm9udC1zaXplLlxuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gIGxpbmUtYnJlYWs6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRmFsbGJhY2sgZm9yIHdoZXJlIGBzdGFydGAgaXMgbm90IHN1cHBvcnRlZFxuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIHdvcmQtYnJlYWs6IG5vcm1hbDtcbiAgd29yZC1zcGFjaW5nOiBub3JtYWw7XG4gIHdvcmQtd3JhcDogbm9ybWFsO1xufVxuIiwiLy9cbi8vIFBvcG92ZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5wb3BvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6ICR6aW5kZXgtcG9wb3ZlcjtcbiAgZGlzcGxheTogbm9uZTtcbiAgbWF4LXdpZHRoOiAkcG9wb3Zlci1tYXgtd2lkdGg7XG4gIHBhZGRpbmc6IDFweDtcbiAgLy8gT3VyIHBhcmVudCBlbGVtZW50IGNhbiBiZSBhcmJpdHJhcnkgc2luY2UgcG9wb3ZlcnMgYXJlIGJ5IGRlZmF1bHQgaW5zZXJ0ZWQgYXMgYSBzaWJsaW5nIG9mIHRoZWlyIHRhcmdldCBlbGVtZW50LlxuICAvLyBTbyByZXNldCBvdXIgZm9udCBhbmQgdGV4dCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGluaGVyaXRpbmcgd2VpcmQgdmFsdWVzLlxuICBAaW5jbHVkZSByZXNldC10ZXh0O1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcG9wb3Zlci1iZztcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgJHBvcG92ZXItZmFsbGJhY2stYm9yZGVyLWNvbG9yO1xuICBib3JkZXI6IDFweCBzb2xpZCAkcG9wb3Zlci1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWxhcmdlO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMikpO1xuXG4gIC8vIE9mZnNldCB0aGUgcG9wb3ZlciB0byBhY2NvdW50IGZvciB0aGUgcG9wb3ZlciBhcnJvd1xuICAmLnRvcCAgICAgeyBtYXJnaW4tdG9wOiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7IH1cbiAgJi5yaWdodCAgIHsgbWFyZ2luLWxlZnQ6ICRwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYuYm90dG9tICB7IG1hcmdpbi10b3A6ICRwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYubGVmdCAgICB7IG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7IH1cbn1cblxuLnBvcG92ZXItdGl0bGUge1xuICBtYXJnaW46IDA7IC8vIHJlc2V0IGhlYWRpbmcgbWFyZ2luXG4gIHBhZGRpbmc6IDhweCAxNHB4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHBvcG92ZXItdGl0bGUtYmc7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBkYXJrZW4oJHBvcG92ZXItdGl0bGUtYmcsIDUlKTtcbiAgYm9yZGVyLXJhZGl1czogKCRib3JkZXItcmFkaXVzLWxhcmdlIC0gMSkgKCRib3JkZXItcmFkaXVzLWxhcmdlIC0gMSkgMCAwO1xufVxuXG4ucG9wb3Zlci1jb250ZW50IHtcbiAgcGFkZGluZzogOXB4IDE0cHg7XG59XG5cbi8vIEFycm93c1xuLy9cbi8vIC5hcnJvdyBpcyBvdXRlciwgLmFycm93OmFmdGVyIGlzIGlubmVyXG5cbi5wb3BvdmVyID4gLmFycm93IHtcbiAgJixcbiAgJjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIH1cbn1cbi5wb3BvdmVyID4gLmFycm93IHtcbiAgYm9yZGVyLXdpZHRoOiAkcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbn1cbi5wb3BvdmVyID4gLmFycm93OmFmdGVyIHtcbiAgYm9yZGVyLXdpZHRoOiAkcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgY29udGVudDogXCJcIjtcbn1cblxuLnBvcG92ZXIge1xuICAmLnRvcCA+IC5hcnJvdyB7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjsgLy8gSUU4IGZhbGxiYWNrXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItY29sb3I7XG4gICAgYm90dG9tOiAtJHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiBcIiBcIjtcbiAgICAgIGJvdHRvbTogMXB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJi5yaWdodCA+IC5hcnJvdyB7XG4gICAgdG9wOiA1MCU7XG4gICAgbGVmdDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgICBib3JkZXItcmlnaHQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItcmlnaHQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICBsZWZ0OiAxcHg7XG4gICAgICBib3R0b206IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJi5ib3R0b20gPiAuYXJyb3cge1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIGJvcmRlci10b3Atd2lkdGg6IDA7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItZmFsbGJhY2stY29sb3I7IC8vIElFOCBmYWxsYmFja1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgIHRvcDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICB0b3A6IDFweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgfVxuICB9XG5cbiAgJi5sZWZ0ID4gLmFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICByaWdodDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItbGVmdC1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItY29sb3I7XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiBcIiBcIjtcbiAgICAgIHJpZ2h0OiAxcHg7XG4gICAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgICBib3JkZXItbGVmdC1jb2xvcjogJHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgICBib3R0b206IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBDYXJvdXNlbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBXcmFwcGVyIGZvciB0aGUgc2xpZGUgY29udGFpbmVyIGFuZCBpbmRpY2F0b3JzXG4uY2Fyb3VzZWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jYXJvdXNlbC1pbm5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2lkdGg6IDEwMCU7XG5cbiAgPiAuaXRlbSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbiguNnMgZWFzZS1pbi1vdXQgbGVmdCk7XG5cbiAgICAvLyBBY2NvdW50IGZvciBqYW5raXR1ZGUgb24gaW1hZ2VzXG4gICAgPiBpbWcsXG4gICAgPiBhID4gaW1nIHtcbiAgICAgIEBpbmNsdWRlIGltZy1yZXNwb25zaXZlO1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgfVxuXG4gICAgLy8gV2ViS2l0IENTUzMgdHJhbnNmb3JtcyBmb3Igc3VwcG9ydGVkIGRldmljZXNcbiAgICBAbWVkaWEgYWxsIGFuZCAodHJhbnNmb3JtLTNkKSwgKC13ZWJraXQtdHJhbnNmb3JtLTNkKSB7XG4gICAgICBAaW5jbHVkZSB0cmFuc2l0aW9uLXRyYW5zZm9ybSgwLjZzIGVhc2UtaW4tb3V0KTtcbiAgICAgIEBpbmNsdWRlIGJhY2tmYWNlLXZpc2liaWxpdHkoaGlkZGVuKTtcbiAgICAgIEBpbmNsdWRlIHBlcnNwZWN0aXZlKDEwMDBweCk7XG5cbiAgICAgICYubmV4dCxcbiAgICAgICYuYWN0aXZlLnJpZ2h0IHtcbiAgICAgICAgQGluY2x1ZGUgdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG4gICAgICAmLnByZXYsXG4gICAgICAmLmFjdGl2ZS5sZWZ0IHtcbiAgICAgICAgQGluY2x1ZGUgdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgICAgJi5uZXh0LmxlZnQsXG4gICAgICAmLnByZXYucmlnaHQsXG4gICAgICAmLmFjdGl2ZSB7XG4gICAgICAgIEBpbmNsdWRlIHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSxcbiAgPiAubmV4dCxcbiAgPiAucHJldiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICA+IC5hY3RpdmUge1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICA+IC5uZXh0LFxuICA+IC5wcmV2IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgPiAubmV4dCB7XG4gICAgbGVmdDogMTAwJTtcbiAgfVxuICA+IC5wcmV2IHtcbiAgICBsZWZ0OiAtMTAwJTtcbiAgfVxuICA+IC5uZXh0LmxlZnQsXG4gID4gLnByZXYucmlnaHQge1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICA+IC5hY3RpdmUubGVmdCB7XG4gICAgbGVmdDogLTEwMCU7XG4gIH1cbiAgPiAuYWN0aXZlLnJpZ2h0IHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG5cbn1cblxuLy8gTGVmdC9yaWdodCBjb250cm9scyBmb3IgbmF2XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmNhcm91c2VsLWNvbnRyb2wge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgYm90dG9tOiAwO1xuICB3aWR0aDogJGNhcm91c2VsLWNvbnRyb2wtd2lkdGg7XG4gIEBpbmNsdWRlIG9wYWNpdHkoJGNhcm91c2VsLWNvbnRyb2wtb3BhY2l0eSk7XG4gIGZvbnQtc2l6ZTogJGNhcm91c2VsLWNvbnRyb2wtZm9udC1zaXplO1xuICBjb2xvcjogJGNhcm91c2VsLWNvbnRyb2wtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdGV4dC1zaGFkb3c6ICRjYXJvdXNlbC10ZXh0LXNoYWRvdztcbiAgLy8gV2UgY2FuJ3QgaGF2ZSB0aGlzIHRyYW5zaXRpb24gaGVyZSBiZWNhdXNlIFdlYktpdCBjYW5jZWxzIHRoZSBjYXJvdXNlbFxuICAvLyBhbmltYXRpb24gaWYgeW91IHRyaXAgdGhpcyB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIGFub3RoZXIgYW5pbWF0aW9uLlxuXG4gIC8vIFNldCBncmFkaWVudHMgZm9yIGJhY2tncm91bmRzXG4gICYubGVmdCB7XG4gICAgQGluY2x1ZGUgZ3JhZGllbnQtaG9yaXpvbnRhbCgkc3RhcnQtY29sb3I6IHJnYmEoMCwwLDAsLjUpLCAkZW5kLWNvbG9yOiByZ2JhKDAsMCwwLC4wMDAxKSk7XG4gIH1cbiAgJi5yaWdodCB7XG4gICAgbGVmdDogYXV0bztcbiAgICByaWdodDogMDtcbiAgICBAaW5jbHVkZSBncmFkaWVudC1ob3Jpem9udGFsKCRzdGFydC1jb2xvcjogcmdiYSgwLDAsMCwuMDAwMSksICRlbmQtY29sb3I6IHJnYmEoMCwwLDAsLjUpKTtcbiAgfVxuXG4gIC8vIEhvdmVyL2ZvY3VzIHN0YXRlXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG4gICAgY29sb3I6ICRjYXJvdXNlbC1jb250cm9sLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBAaW5jbHVkZSBvcGFjaXR5KC45KTtcbiAgfVxuXG4gIC8vIFRvZ2dsZXNcbiAgLmljb24tcHJldixcbiAgLmljb24tbmV4dCxcbiAgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xuICAgIHotaW5kZXg6IDU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLW5leHQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5pY29uLW5leHQge1xuICAgIHdpZHRoOiAgMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgZm9udC1mYW1pbHk6IHNlcmlmO1xuICB9XG5cblxuICAuaWNvbi1wcmV2IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDM5JzsvLyBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAoVSsyMDM5KVxuICAgIH1cbiAgfVxuICAuaWNvbi1uZXh0IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDNhJzsvLyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKFUrMjAzQSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3B0aW9uYWwgaW5kaWNhdG9yIHBpcHNcbi8vXG4vLyBBZGQgYW4gdW5vcmRlcmVkIGxpc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNsYXNzIGFuZCBhZGQgYSBsaXN0IGl0ZW0gZm9yIGVhY2hcbi8vIHNsaWRlIHlvdXIgY2Fyb3VzZWwgaG9sZHMuXG5cbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIHdpZHRoOiA2MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAgMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgbWFyZ2luOiAxcHg7XG4gICAgdGV4dC1pbmRlbnQ6IC05OTlweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgIC8vIElFOC05IGhhY2sgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgLy9cbiAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA4LTkgZG9lcyBub3Qgc3VwcG9ydCBjbGlja3Mgb24gZWxlbWVudHMgd2l0aG91dCBhIHNldFxuICAgIC8vIGBiYWNrZ3JvdW5kLWNvbG9yYC4gV2UgY2Fubm90IHVzZSBgZmlsdGVyYCBzaW5jZSB0aGF0J3Mgbm90IHZpZXdlZCBhcyBhXG4gICAgLy8gYmFja2dyb3VuZCBjb2xvciBieSB0aGUgYnJvd3Nlci4gVGh1cywgYSBoYWNrIGlzIG5lZWRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2NsaWNrI0ludGVybmV0X0V4cGxvcmVyXG4gICAgLy9cbiAgICAvLyBGb3IgSUU4LCB3ZSBzZXQgc29saWQgYmxhY2sgYXMgaXQgZG9lc24ndCBzdXBwb3J0IGByZ2JhKClgLiBGb3IgSUU5LCB3ZVxuICAgIC8vIHNldCBhbHBoYSB0cmFuc3BhcmVuY3kgZm9yIHRoZSBiZXN0IHJlc3VsdHMgcG9zc2libGUuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMCBcXDk7IC8vIElFOFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMCk7IC8vIElFOVxuICB9XG4gIC5hY3RpdmUge1xuICAgIG1hcmdpbjogMDtcbiAgICB3aWR0aDogIDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjYXJvdXNlbC1pbmRpY2F0b3ItYWN0aXZlLWJnO1xuICB9XG59XG5cbi8vIE9wdGlvbmFsIGNhcHRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGlkZGVuIGJ5IGRlZmF1bHQgZm9yIHNtYWxsZXIgdmlld3BvcnRzXG4uY2Fyb3VzZWwtY2FwdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMTUlO1xuICByaWdodDogMTUlO1xuICBib3R0b206IDIwcHg7XG4gIHotaW5kZXg6IDEwO1xuICBwYWRkaW5nLXRvcDogMjBweDtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG4gIGNvbG9yOiAkY2Fyb3VzZWwtY2FwdGlvbi1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXNoYWRvdzogJGNhcm91c2VsLXRleHQtc2hhZG93O1xuICAmIC5idG4ge1xuICAgIHRleHQtc2hhZG93OiBub25lOyAvLyBObyBzaGFkb3cgZm9yIGJ1dHRvbiBlbGVtZW50cyBpbiBjYXJvdXNlbC1jYXB0aW9uXG4gIH1cbn1cblxuXG4vLyBTY2FsZSB1cCBjb250cm9scyBmb3IgdGFibGV0cyBhbmQgdXBcbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG5cbiAgLy8gU2NhbGUgdXAgdGhlIGNvbnRyb2xzIGEgc21pZGdlXG4gIC5jYXJvdXNlbC1jb250cm9sIHtcbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tbGVmdCxcbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gICAgLmljb24tcHJldixcbiAgICAuaWNvbi1uZXh0IHtcbiAgICAgIHdpZHRoOiAzMHB4O1xuICAgICAgaGVpZ2h0OiAzMHB4O1xuICAgICAgbWFyZ2luLXRvcDogLTE1cHg7XG4gICAgICBmb250LXNpemU6IDMwcHg7XG4gICAgfVxuICAgIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAgIC5pY29uLXByZXYge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICAgIH1cbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gICAgLmljb24tbmV4dCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgYW5kIGxlZnQgYWxpZ24gdGhlIGNhcHRpb25zXG4gIC5jYXJvdXNlbC1jYXB0aW9uIHtcbiAgICBsZWZ0OiAyMCU7XG4gICAgcmlnaHQ6IDIwJTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMzBweDtcbiAgfVxuXG4gIC8vIE1vdmUgdXAgdGhlIGluZGljYXRvcnNcbiAgLmNhcm91c2VsLWluZGljYXRvcnMge1xuICAgIGJvdHRvbTogMjBweDtcbiAgfVxufVxuIiwiLy9cbi8vIFV0aWxpdHkgY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBGbG9hdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmNsZWFyZml4IHtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG59XG4uY2VudGVyLWJsb2NrIHtcbiAgQGluY2x1ZGUgY2VudGVyLWJsb2NrO1xufVxuLnB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQgIWltcG9ydGFudDtcbn1cbi5wdWxsLWxlZnQge1xuICBmbG9hdDogbGVmdCAhaW1wb3J0YW50O1xufVxuXG5cbi8vIFRvZ2dsaW5nIGNvbnRlbnRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gTm90ZTogRGVwcmVjYXRlZCAuaGlkZSBpbiBmYXZvciBvZiAuaGlkZGVuIG9yIC5zci1vbmx5IChhcyBhcHByb3ByaWF0ZSkgaW4gdjMuMC4xXG4uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5zaG93IHtcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbn1cbi5pbnZpc2libGUge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG4udGV4dC1oaWRlIHtcbiAgQGluY2x1ZGUgdGV4dC1oaWRlO1xufVxuXG5cbi8vIEhpZGUgZnJvbSBzY3JlZW5yZWFkZXJzIGFuZCBicm93c2Vyc1xuLy9cbi8vIENyZWRpdDogSFRNTDUgQm9pbGVycGxhdGVcblxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuXG4vLyBGb3IgQWZmaXggcGx1Z2luXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5hZmZpeCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbiIsIi8vIENlbnRlci1hbGlnbiBhIGJsb2NrIGxldmVsIGVsZW1lbnRcblxuQG1peGluIGNlbnRlci1ibG9jaygpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4iLCIvLyBDU1MgaW1hZ2UgcmVwbGFjZW1lbnRcbi8vXG4vLyBIZWFkcyB1cCEgdjMgbGF1bmNoZWQgd2l0aCBvbmx5IGAuaGlkZS10ZXh0KClgLCBidXQgcGVyIG91ciBwYXR0ZXJuIGZvclxuLy8gbWl4aW5zIGJlaW5nIHJldXNlZCBhcyBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhpcyBkb2Vzbid0IGhvbGQgdXAuIEFzXG4vLyBvZiB2My4wLjEgd2UgaGF2ZSBhZGRlZCBgLnRleHQtaGlkZSgpYCBhbmQgZGVwcmVjYXRlZCBgLmhpZGUtdGV4dCgpYC5cbi8vXG4vLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2NvbW1pdC9hYTAzOTZlYWU3NTdcblxuLy8gRGVwcmVjYXRlZCBhcyBvZiB2My4wLjEgKHdpbGwgYmUgcmVtb3ZlZCBpbiB2NClcbkBtaXhpbiBoaWRlLXRleHQoKSB7XG4gIGZvbnQ6IDAvMCBhO1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHRleHQtc2hhZG93OiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xufVxuXG4vLyBOZXcgbWl4aW4gdG8gdXNlIGFzIG9mIHYzLjAuMVxuQG1peGluIHRleHQtaGlkZSgpIHtcbiAgQGluY2x1ZGUgaGlkZS10ZXh0O1xufVxuIiwiLy9cbi8vIFJlc3BvbnNpdmU6IFV0aWxpdHkgY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBJRTEwIGluIFdpbmRvd3MgKFBob25lKSA4XG4vL1xuLy8gU3VwcG9ydCBmb3IgcmVzcG9uc2l2ZSB2aWV3cyB2aWEgbWVkaWEgcXVlcmllcyBpcyBraW5kIG9mIGJvcmtlZCBpbiBJRTEwLCBmb3Jcbi8vIFN1cmZhY2UvZGVza3RvcCBpbiBzcGxpdCB2aWV3IGFuZCBmb3IgV2luZG93cyBQaG9uZSA4LiBUaGlzIHBhcnRpY3VsYXIgZml4XG4vLyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgc25pcHBldCBvZiBKYXZhU2NyaXB0IHRvIHNuaWZmIHRoZSB1c2VyIGFnZW50IGFuZFxuLy8gYXBwbHkgc29tZSBjb25kaXRpb25hbCBDU1MgdG8gKm9ubHkqIHRoZSBTdXJmYWNlL2Rlc2t0b3AgV2luZG93cyA4LiBMb29rIGF0XG4vLyBvdXIgR2V0dGluZyBTdGFydGVkIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBidWcuXG4vL1xuLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZm9sbG93aW5nOlxuLy9cbi8vIElzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEwNDk3XG4vLyBEb2NzOiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9nZXR0aW5nLXN0YXJ0ZWQvI3N1cHBvcnQtaWUxMC13aWR0aFxuLy8gU291cmNlOiBodHRwOi8vdGlta2FkbGVjLmNvbS8yMDEzLzAxL3dpbmRvd3MtcGhvbmUtOC1hbmQtZGV2aWNlLXdpZHRoL1xuLy8gU291cmNlOiBodHRwOi8vdGlta2FkbGVjLmNvbS8yMDEyLzEwL2llMTAtc25hcC1tb2RlLWFuZC1yZXNwb25zaXZlLWRlc2lnbi9cblxuQGF0LXJvb3Qge1xuICBALW1zLXZpZXdwb3J0IHtcbiAgICB3aWR0aDogZGV2aWNlLXdpZHRoO1xuICB9XG59XG5cblxuLy8gVmlzaWJpbGl0eSB1dGlsaXRpZXNcbi8vIE5vdGU6IERlcHJlY2F0ZWQgLnZpc2libGUteHMsIC52aXNpYmxlLXNtLCAudmlzaWJsZS1tZCwgYW5kIC52aXNpYmxlLWxnIGFzIG9mIHYzLjIuMFxuXG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUteHMnKTtcbkBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcudmlzaWJsZS1zbScpO1xuQGluY2x1ZGUgcmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoJy52aXNpYmxlLW1kJyk7XG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUtbGcnKTtcblxuLnZpc2libGUteHMtYmxvY2ssXG4udmlzaWJsZS14cy1pbmxpbmUsXG4udmlzaWJsZS14cy1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1zbS1ibG9jayxcbi52aXNpYmxlLXNtLWlubGluZSxcbi52aXNpYmxlLXNtLWlubGluZS1ibG9jayxcbi52aXNpYmxlLW1kLWJsb2NrLFxuLnZpc2libGUtbWQtaW5saW5lLFxuLnZpc2libGUtbWQtaW5saW5lLWJsb2NrLFxuLnZpc2libGUtbGctYmxvY2ssXG4udmlzaWJsZS1sZy1pbmxpbmUsXG4udmlzaWJsZS1sZy1pbmxpbmUtYmxvY2sge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLXhzJyk7XG59XG4udmlzaWJsZS14cy1ibG9jayB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXhzLWlubGluZSB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS14cy1pbmxpbmUtYmxvY2sge1xuICBAbWVkaWEgKG1heC13aWR0aDogJHNjcmVlbi14cy1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIGFuZCAobWF4LXdpZHRoOiAkc2NyZWVuLXNtLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLXNtJyk7XG59XG4udmlzaWJsZS1zbS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tc20tbWF4KSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtc20taW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1zbS1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtc20taW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1zbS1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiAkc2NyZWVuLW1kLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLW1kJyk7XG59XG4udmlzaWJsZS1tZC1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tbWQtbWF4KSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbWQtaW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1tZC1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbWQtaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1tZC1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCcudmlzaWJsZS1sZycpO1xufVxuLnZpc2libGUtbGctYmxvY2sge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS1sZy1pbmxpbmUge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbGctaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6ICRzY3JlZW4teHMtbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLXhzJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tc20tbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLXNtJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tbWQtbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLW1kJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLmhpZGRlbi1sZycpO1xufVxuXG5cbi8vIFByaW50IHV0aWxpdGllc1xuLy9cbi8vIE1lZGlhIHF1ZXJpZXMgYXJlIHBsYWNlZCBvbiB0aGUgaW5zaWRlIHRvIGJlIG1peGluLWZyaWVuZGx5LlxuXG4vLyBOb3RlOiBEZXByZWNhdGVkIC52aXNpYmxlLXByaW50IGFzIG9mIHYzLjIuMFxuXG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUtcHJpbnQnKTtcblxuQG1lZGlhIHByaW50IHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCcudmlzaWJsZS1wcmludCcpO1xufVxuLnZpc2libGUtcHJpbnQtYmxvY2sge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS1wcmludC1pbmxpbmUge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtcHJpbnQtaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIHByaW50IHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoJy5oaWRkZW4tcHJpbnQnKTtcbn1cbiIsIi8vIFJlc3BvbnNpdmUgdXRpbGl0aWVzXG5cbi8vXG4vLyBNb3JlIGVhc2lseSBpbmNsdWRlIGFsbCB0aGUgc3RhdGVzIGZvciByZXNwb25zaXZlLXV0aWxpdGllcy5sZXNzLlxuLy8gW2NvbnZlcnRlcl0gJHBhcmVudCBoYWNrXG5AbWl4aW4gcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCRwYXJlbnQpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxuICB0YWJsZSN7JHBhcmVudH0gIHsgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsgfVxuICB0ciN7JHBhcmVudH0gICAgIHsgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7IH1cbiAgdGgjeyRwYXJlbnR9LFxuICB0ZCN7JHBhcmVudH0gICAgIHsgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50OyB9XG59XG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCRwYXJlbnQpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=
*/
\ No newline at end of file
diff --git a/ui/libs/themes/base/bootstrap.custom.css
b/ui/libs/themes/base/bootstrap.custom.css
new file mode 100755
index 0000000..ad3c484
--- /dev/null
+++ b/ui/libs/themes/base/bootstrap.custom.css
@@ -0,0 +1,8070 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * A partial implementation of the Ruby list functions from Compass:
+ *
https://github.com/Compass/compass/blob/stable/lib/compass/sass_extension...
+ */
+/*
+ * A partial implementation of the Ruby constants functions from Compass:
+ *
https://github.com/Compass/compass/blob/stable/lib/compass/sass_extension...
+ */
+/*
+ * A partial implementation of the Ruby display functions from Compass:
+ *
https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass...
+ */
+/*!
+ * Bootstrap v3.3.5 (
http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License |
github.com/necolas/normalize.css */
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline;
+}
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+[hidden],
+template {
+ display: none;
+}
+
+a {
+ background-color: transparent;
+}
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+b,
+strong {
+ font-weight: bold;
+}
+
+dfn {
+ font-style: italic;
+}
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+img {
+ border: 0;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+figure {
+ margin: 1em 40px;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+}
+
+pre {
+ overflow: auto;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0;
+}
+
+button {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+html input[type="button"], input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+input {
+ line-height: normal;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: textfield;
+ box-sizing: content-box;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+legend {
+ border: 0;
+ padding: 0;
+}
+
+textarea {
+ overflow: auto;
+}
+
+optgroup {
+ font-weight: bold;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
+
+/*! Source:
https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+ *,
+ *:before,
+ *:after {
+ background: transparent !important;
+ color: #000 !important;
+ box-shadow: none !important;
+ text-shadow: none !important;
+ }
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+ a[href^="#"]:after,
+ a[href^="javascript:"]:after {
+ content: "";
+ }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ img {
+ max-width: 100% !important;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ .navbar {
+ display: none;
+ }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+ .label {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+
+* {
+ box-sizing: border-box;
+}
+
+*:before,
+*:after {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 10px;
+ -webkit-tap-highlight-color: transparent;
+}
+
+body {
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #222;
+ background-color: #fff;
+}
+
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+a {
+ color: #3a393b;
+ text-decoration: none;
+}
+
+a:hover,
+a:focus {
+ color: #141314;
+ text-decoration: underline;
+}
+
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+figure {
+ margin: 0;
+}
+
+img {
+ vertical-align: middle;
+}
+
+.img-responsive {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-rounded {
+ border-radius: 3px;
+}
+
+.img-thumbnail {
+ padding: 4px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ transition: all 0.2s ease-in-out;
+ display: inline-block;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-circle {
+ border-radius: 50%;
+}
+
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #fff;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
+
+[role="button"] {
+ cursor: pointer;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
+h1 small,
+h1 .small, h2 small,
+h2 .small, h3 small,
+h3 .small, h4 small,
+h4 .small, h5 small,
+h5 .small, h6 small,
+h6 .small,
+.h1 small,
+.h1 .small, .h2 small,
+.h2 .small, .h3 small,
+.h3 .small, .h4 small,
+.h4 .small, .h5 small,
+.h5 .small, .h6 small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #999;
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+
+h1 small,
+h1 .small, .h1 small,
+.h1 .small,
+h2 small,
+h2 .small, .h2 small,
+.h2 .small,
+h3 small,
+h3 .small, .h3 small,
+.h3 .small {
+ font-size: 65%;
+}
+
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+h4 small,
+h4 .small, .h4 small,
+.h4 .small,
+h5 small,
+h5 .small, .h5 small,
+.h5 .small,
+h6 small,
+h6 .small, .h6 small,
+.h6 .small {
+ font-size: 75%;
+}
+
+h1, .h1 {
+ font-size: 1.571em;
+}
+
+h2, .h2 {
+ font-size: 22px;
+}
+
+h3, .h3 {
+ font-size: 17px;
+}
+
+h4, .h4 {
+ font-size: 14px;
+}
+
+h5, .h5 {
+ font-size: 14px;
+}
+
+h6, .h6 {
+ font-size: 14px;
+}
+
+p {
+ margin: 0 0 10px;
+}
+
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4;
+}
+
+@media (min-width: 992px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+
+small,
+.small {
+ font-size: 85%;
+}
+
+mark,
+.mark {
+ background-color: #f1e3c2;
+ padding: .2em;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-justify {
+ text-align: justify;
+}
+
+.text-nowrap {
+ white-space: nowrap;
+}
+
+.text-lowercase {
+ text-transform: lowercase;
+}
+
+.text-uppercase, .initialism {
+ text-transform: uppercase;
+}
+
+.text-capitalize {
+ text-transform: capitalize;
+}
+
+.text-muted {
+ color: #999;
+}
+
+.text-primary {
+ color: #3a393b;
+}
+
+a.text-primary:hover,
+a.text-primary:focus {
+ color: #212021;
+}
+
+.text-success {
+ color: #6c6c6c;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+ color: #525252;
+}
+
+.text-info {
+ color: #6c6c6c;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+ color: #525252;
+}
+
+.text-warning {
+ color: #6c6c6c;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+ color: #525252;
+}
+
+.text-danger {
+ color: #6c6c6c;
+}
+
+a.text-danger:hover,
+a.text-danger:focus {
+ color: #525252;
+}
+
+.bg-primary {
+ color: #fff;
+}
+
+.bg-primary {
+ background-color: #3a393b;
+}
+
+a.bg-primary:hover,
+a.bg-primary:focus {
+ background-color: #212021;
+}
+
+.bg-success {
+ background-color: #dae6cb;
+}
+
+a.bg-success:hover,
+a.bg-success:focus {
+ background-color: #c1d5a9;
+}
+
+.bg-info {
+ background-color: #d9edf7;
+}
+
+a.bg-info:hover,
+a.bg-info:focus {
+ background-color: #afd9ee;
+}
+
+.bg-warning {
+ background-color: #f1e3c2;
+}
+
+a.bg-warning:hover,
+a.bg-warning:focus {
+ background-color: #e7d099;
+}
+
+.bg-danger {
+ background-color: #eac3c7;
+}
+
+a.bg-danger:hover,
+a.bg-danger:focus {
+ background-color: #dd9da4;
+}
+
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #fff;
+}
+
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+ul ul,
+ul ol,
+ol ul,
+ol ol {
+ margin-bottom: 0;
+}
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+ margin-left: -5px;
+}
+
+.list-inline > li {
+ display: inline-block;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+dt,
+dd {
+ line-height: 1.428571429;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 0;
+}
+
+.dl-horizontal dd:before,
+.dl-horizontal dd:after {
+ content: " ";
+ display: table;
+}
+
+.dl-horizontal dd:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ clear: left;
+ text-align: right;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .dl-horizontal dd {
+ margin-left: 180px;
+ }
+}
+
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #999;
+}
+
+.initialism {
+ font-size: 90%;
+}
+
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #fff;
+}
+
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+ margin-bottom: 0;
+}
+
+blockquote footer,
+blockquote small,
+blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.428571429;
+ color: #999;
+}
+
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+ content: '\2014 \00A0';
+}
+
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid #fff;
+ border-left: 0;
+ text-align: right;
+}
+
+.blockquote-reverse footer:before,
+.blockquote-reverse small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right footer:before,
+blockquote.pull-right small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+
+.blockquote-reverse footer:after,
+.blockquote-reverse small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right footer:after,
+blockquote.pull-right small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.428571429;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ background-color: #f9f2f4;
+ border-radius: 3px;
+}
+
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+ box-shadow: none;
+}
+
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.428571429;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #222;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+}
+
+pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.container:before,
+.container:after {
+ content: " ";
+ display: table;
+}
+
+.container:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 940px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ width: 1140px;
+ }
+}
+
+@media (min-width: 1680) {
+ .container {
+ width: 1540px;
+ }
+}
+
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+ content: " ";
+ display: table;
+}
+
+.container-fluid:after {
+ clear: both;
+}
+
+.row {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.row:before,
+.row:after {
+ content: " ";
+ display: table;
+}
+
+.row:after {
+ clear: both;
+}
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2,
.col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4,
.col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6,
.col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8,
.col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10,
.col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12,
.col-md-12, .col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8,
.col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+ float: left;
+}
+
+.col-xs-1 {
+ width: 8.3333333333%;
+}
+
+.col-xs-2 {
+ width: 16.6666666667%;
+}
+
+.col-xs-3 {
+ width: 25%;
+}
+
+.col-xs-4 {
+ width: 33.3333333333%;
+}
+
+.col-xs-5 {
+ width: 41.6666666667%;
+}
+
+.col-xs-6 {
+ width: 50%;
+}
+
+.col-xs-7 {
+ width: 58.3333333333%;
+}
+
+.col-xs-8 {
+ width: 66.6666666667%;
+}
+
+.col-xs-9 {
+ width: 75%;
+}
+
+.col-xs-10 {
+ width: 83.3333333333%;
+}
+
+.col-xs-11 {
+ width: 91.6666666667%;
+}
+
+.col-xs-12 {
+ width: 100%;
+}
+
+.col-xs-pull-0 {
+ right: auto;
+}
+
+.col-xs-pull-1 {
+ right: 8.3333333333%;
+}
+
+.col-xs-pull-2 {
+ right: 16.6666666667%;
+}
+
+.col-xs-pull-3 {
+ right: 25%;
+}
+
+.col-xs-pull-4 {
+ right: 33.3333333333%;
+}
+
+.col-xs-pull-5 {
+ right: 41.6666666667%;
+}
+
+.col-xs-pull-6 {
+ right: 50%;
+}
+
+.col-xs-pull-7 {
+ right: 58.3333333333%;
+}
+
+.col-xs-pull-8 {
+ right: 66.6666666667%;
+}
+
+.col-xs-pull-9 {
+ right: 75%;
+}
+
+.col-xs-pull-10 {
+ right: 83.3333333333%;
+}
+
+.col-xs-pull-11 {
+ right: 91.6666666667%;
+}
+
+.col-xs-pull-12 {
+ right: 100%;
+}
+
+.col-xs-push-0 {
+ left: auto;
+}
+
+.col-xs-push-1 {
+ left: 8.3333333333%;
+}
+
+.col-xs-push-2 {
+ left: 16.6666666667%;
+}
+
+.col-xs-push-3 {
+ left: 25%;
+}
+
+.col-xs-push-4 {
+ left: 33.3333333333%;
+}
+
+.col-xs-push-5 {
+ left: 41.6666666667%;
+}
+
+.col-xs-push-6 {
+ left: 50%;
+}
+
+.col-xs-push-7 {
+ left: 58.3333333333%;
+}
+
+.col-xs-push-8 {
+ left: 66.6666666667%;
+}
+
+.col-xs-push-9 {
+ left: 75%;
+}
+
+.col-xs-push-10 {
+ left: 83.3333333333%;
+}
+
+.col-xs-push-11 {
+ left: 91.6666666667%;
+}
+
+.col-xs-push-12 {
+ left: 100%;
+}
+
+.col-xs-offset-0 {
+ margin-left: 0%;
+}
+
+.col-xs-offset-1 {
+ margin-left: 8.3333333333%;
+}
+
+.col-xs-offset-2 {
+ margin-left: 16.6666666667%;
+}
+
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+
+.col-xs-offset-4 {
+ margin-left: 33.3333333333%;
+}
+
+.col-xs-offset-5 {
+ margin-left: 41.6666666667%;
+}
+
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+
+.col-xs-offset-7 {
+ margin-left: 58.3333333333%;
+}
+
+.col-xs-offset-8 {
+ margin-left: 66.6666666667%;
+}
+
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+
+.col-xs-offset-10 {
+ margin-left: 83.3333333333%;
+}
+
+.col-xs-offset-11 {
+ margin-left: 91.6666666667%;
+}
+
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+
+@media (min-width: 992px) {
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8,
.col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+ float: left;
+ }
+ .col-sm-1 {
+ width: 8.3333333333%;
+ }
+ .col-sm-2 {
+ width: 16.6666666667%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-4 {
+ width: 33.3333333333%;
+ }
+ .col-sm-5 {
+ width: 41.6666666667%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-7 {
+ width: 58.3333333333%;
+ }
+ .col-sm-8 {
+ width: 66.6666666667%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-10 {
+ width: 83.3333333333%;
+ }
+ .col-sm-11 {
+ width: 91.6666666667%;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-pull-0 {
+ right: auto;
+ }
+ .col-sm-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-sm-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-sm-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-sm-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-sm-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-push-0 {
+ left: auto;
+ }
+ .col-sm-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-sm-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-sm-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-sm-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-sm-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8,
.col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+ float: left;
+ }
+ .col-md-1 {
+ width: 8.3333333333%;
+ }
+ .col-md-2 {
+ width: 16.6666666667%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-4 {
+ width: 33.3333333333%;
+ }
+ .col-md-5 {
+ width: 41.6666666667%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-7 {
+ width: 58.3333333333%;
+ }
+ .col-md-8 {
+ width: 66.6666666667%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-10 {
+ width: 83.3333333333%;
+ }
+ .col-md-11 {
+ width: 91.6666666667%;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-pull-0 {
+ right: auto;
+ }
+ .col-md-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-md-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-md-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-md-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-md-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-push-0 {
+ left: auto;
+ }
+ .col-md-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-md-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-md-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-md-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-md-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+@media (min-width: 1680) {
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8,
.col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+ float: left;
+ }
+ .col-lg-1 {
+ width: 8.3333333333%;
+ }
+ .col-lg-2 {
+ width: 16.6666666667%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-4 {
+ width: 33.3333333333%;
+ }
+ .col-lg-5 {
+ width: 41.6666666667%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-7 {
+ width: 58.3333333333%;
+ }
+ .col-lg-8 {
+ width: 66.6666666667%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-10 {
+ width: 83.3333333333%;
+ }
+ .col-lg-11 {
+ width: 91.6666666667%;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-pull-0 {
+ right: auto;
+ }
+ .col-lg-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-lg-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-lg-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-lg-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-lg-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-push-0 {
+ left: auto;
+ }
+ .col-lg-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-lg-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-lg-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-lg-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-lg-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+table {
+ background-color: transparent;
+}
+
+caption {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: #999;
+ text-align: left;
+}
+
+th {
+ text-align: left;
+}
+
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 20px;
+}
+
+.table > thead > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > th,
+.table > tbody > tr > td,
+.table > tfoot > tr > th,
+.table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.428571429;
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+}
+
+.table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ddd;
+}
+
+.table > caption + thead > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > th,
+.table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+
+.table > tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+
+.table .table {
+ background-color: #fff;
+}
+
+.table-condensed > thead > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > th,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > th,
+.table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+
+.table-bordered {
+ border: 1px solid #ddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > th,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > th,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #ddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) {
+ background-color: #f9f9f9;
+}
+
+.table-hover > tbody > tr:hover {
+ background-color: #f5f5f5;
+}
+
+table col[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-column;
+}
+
+table td[class*="col-"],
+table th[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-cell;
+}
+
+.table > thead > tr > td.active,
+.table > thead > tr > th.active,
+.table > thead > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr > td.active,
+.table > tbody > tr > th.active,
+.table > tbody > tr.active > td,
+.table > tbody > tr.active > th,
+.table > tfoot > tr > td.active,
+.table > tfoot > tr > th.active,
+.table > tfoot > tr.active > td,
+.table > tfoot > tr.active > th {
+ background-color: #f5f5f5;
+}
+
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+ background-color: #e8e8e8;
+}
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success,
+.table > thead > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+ background-color: #dae6cb;
+}
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #cedeba;
+}
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info,
+.table > thead > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+ background-color: #d9edf7;
+}
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #c4e3f3;
+}
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+ background-color: #f1e3c2;
+}
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #ecd9ad;
+}
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+ background-color: #eac3c7;
+}
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #e3b0b5;
+}
+
+.table-responsive {
+ overflow-x: auto;
+ min-height: 0.01%;
+}
+
+@media screen and (max-width: 991px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-y: hidden;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #ddd;
+ }
+ .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > th,
+ .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap;
+ }
+ .table-responsive > .table-bordered {
+ border: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+ }
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+ }
+}
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+ min-width: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #222;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+label {
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+
+input[type="search"] {
+ box-sizing: border-box;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ line-height: normal;
+}
+
+input[type="file"] {
+ display: block;
+}
+
+input[type="range"] {
+ display: block;
+ width: 100%;
+}
+
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #444;
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #444;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+
+.form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+
+.form-control::-moz-placeholder {
+ color: #999;
+ opacity: 1;
+}
+
+.form-control:-ms-input-placeholder {
+ color: #999;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #999;
+}
+
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+ background-color: #fff;
+ opacity: 1;
+}
+
+.form-control[disabled],
+fieldset[disabled] .form-control {
+ cursor: not-allowed;
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: none;
+}
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ input[type="date"].form-control,
+ input[type="time"].form-control,
+ input[type="datetime-local"].form-control,
+ input[type="month"].form-control {
+ line-height: 34px;
+ }
+ input[type="date"].input-sm,
+ .input-group-sm > input[type="date"].form-control,
+ .input-group-sm > input[type="date"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="date"].btn,
+ .input-group-sm input[type="date"],
+ input[type="time"].input-sm,
+ .input-group-sm > input[type="time"].form-control,
+ .input-group-sm > input[type="time"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="time"].btn,
+ .input-group-sm input[type="time"],
+ input[type="datetime-local"].input-sm,
+ .input-group-sm > input[type="datetime-local"].form-control,
+ .input-group-sm > input[type="datetime-local"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-sm input[type="datetime-local"],
+ input[type="month"].input-sm,
+ .input-group-sm > input[type="month"].form-control,
+ .input-group-sm > input[type="month"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="month"].btn,
+ .input-group-sm input[type="month"] {
+ line-height: 30px;
+ }
+ input[type="date"].input-lg,
+ .input-group-lg > input[type="date"].form-control,
+ .input-group-lg > input[type="date"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="date"].btn,
+ .input-group-lg input[type="date"],
+ input[type="time"].input-lg,
+ .input-group-lg > input[type="time"].form-control,
+ .input-group-lg > input[type="time"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="time"].btn,
+ .input-group-lg input[type="time"],
+ input[type="datetime-local"].input-lg,
+ .input-group-lg > input[type="datetime-local"].form-control,
+ .input-group-lg > input[type="datetime-local"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-lg input[type="datetime-local"],
+ input[type="month"].input-lg,
+ .input-group-lg > input[type="month"].form-control,
+ .input-group-lg > input[type="month"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="month"].btn,
+ .input-group-lg input[type="month"] {
+ line-height: 46px;
+ }
+}
+
+.form-group {
+ margin-bottom: 15px;
+}
+
+.radio,
+.checkbox {
+ position: relative;
+ display: block;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.radio label,
+.checkbox label {
+ min-height: 20px;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ position: absolute;
+ margin-left: -20px;
+ margin-top: 4px \9;
+}
+
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px;
+}
+
+.radio-inline,
+.checkbox-inline {
+ position: relative;
+ display: inline-block;
+ padding-left: 20px;
+ margin-bottom: 0;
+ vertical-align: middle;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
+ margin-left: 10px;
+}
+
+input[type="radio"][disabled],
+input[type="radio"].disabled,
+fieldset[disabled] input[type="radio"],
+input[type="checkbox"][disabled],
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="checkbox"] {
+ cursor: not-allowed;
+}
+
+.radio-inline.disabled,
+fieldset[disabled] .radio-inline,
+.checkbox-inline.disabled,
+fieldset[disabled] .checkbox-inline {
+ cursor: not-allowed;
+}
+
+.radio.disabled label,
+fieldset[disabled] .radio label,
+.checkbox.disabled label,
+fieldset[disabled] .checkbox label {
+ cursor: not-allowed;
+}
+
+.form-control-static {
+ padding-top: 7px;
+ padding-bottom: 7px;
+ margin-bottom: 0;
+ min-height: 34px;
+}
+
+.form-control-static.input-lg,
+.input-group-lg > .form-control-static.form-control,
+.input-group-lg > .form-control-static.input-group-addon,
+.input-group-lg > .input-group-btn > .form-control-static.btn,
+.form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
+.input-group-sm > .form-control-static.input-group-addon,
+.input-group-sm > .input-group-btn > .form-control-static.btn {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.input-sm, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+select.input-sm, .input-group-sm > select.form-control,
+.input-group-sm > select.input-group-addon,
+.input-group-sm > .input-group-btn > select.btn {
+ height: 30px;
+ line-height: 30px;
+}
+
+textarea.input-sm,
+.input-group-sm > textarea.form-control,
+.input-group-sm > textarea.input-group-addon,
+.input-group-sm > .input-group-btn > textarea.btn,
+select[multiple].input-sm, .input-group-sm > select[multiple].form-control,
+.input-group-sm > select[multiple].input-group-addon,
+.input-group-sm > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.form-group-sm .form-control {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.form-group-sm select.form-control {
+ height: 30px;
+ line-height: 30px;
+}
+
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+ height: auto;
+}
+
+.form-group-sm .form-control-static {
+ height: 30px;
+ min-height: 32px;
+ padding: 6px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.input-lg, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 3px;
+}
+
+select.input-lg, .input-group-lg > select.form-control,
+.input-group-lg > select.input-group-addon,
+.input-group-lg > .input-group-btn > select.btn {
+ height: 46px;
+ line-height: 46px;
+}
+
+textarea.input-lg,
+.input-group-lg > textarea.form-control,
+.input-group-lg > textarea.input-group-addon,
+.input-group-lg > .input-group-btn > textarea.btn,
+select[multiple].input-lg, .input-group-lg > select[multiple].form-control,
+.input-group-lg > select[multiple].input-group-addon,
+.input-group-lg > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.form-group-lg .form-control {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 3px;
+}
+
+.form-group-lg select.form-control {
+ height: 46px;
+ line-height: 46px;
+}
+
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+ height: auto;
+}
+
+.form-group-lg .form-control-static {
+ height: 46px;
+ min-height: 38px;
+ padding: 11px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+
+.has-feedback {
+ position: relative;
+}
+
+.has-feedback .form-control {
+ padding-right: 42.5px;
+}
+
+.form-control-feedback {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+ pointer-events: none;
+}
+
+.input-lg + .form-control-feedback,
+.input-group-lg > .form-control + .form-control-feedback,
+.input-group-lg > .input-group-addon + .form-control-feedback,
+.input-group-lg > .input-group-btn > .btn + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+ width: 46px;
+ height: 46px;
+ line-height: 46px;
+}
+
+.input-sm + .form-control-feedback,
+.input-group-sm > .form-control + .form-control-feedback,
+.input-group-sm > .input-group-addon + .form-control-feedback,
+.input-group-sm > .input-group-btn > .btn + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+}
+
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+ color: #6c6c6c;
+}
+
+.has-success .form-control {
+ border-color: #6c6c6c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-success .form-control:focus {
+ border-color: #525252;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #9f9f9f;
+}
+
+.has-success .input-group-addon {
+ color: #6c6c6c;
+ border-color: #6c6c6c;
+ background-color: #dae6cb;
+}
+
+.has-success .form-control-feedback {
+ color: #6c6c6c;
+}
+
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+ color: #6c6c6c;
+}
+
+.has-warning .form-control {
+ border-color: #6c6c6c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-warning .form-control:focus {
+ border-color: #525252;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #9f9f9f;
+}
+
+.has-warning .input-group-addon {
+ color: #6c6c6c;
+ border-color: #6c6c6c;
+ background-color: #f1e3c2;
+}
+
+.has-warning .form-control-feedback {
+ color: #6c6c6c;
+}
+
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+ color: #6c6c6c;
+}
+
+.has-error .form-control {
+ border-color: #6c6c6c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-error .form-control:focus {
+ border-color: #525252;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #9f9f9f;
+}
+
+.has-error .input-group-addon {
+ color: #6c6c6c;
+ border-color: #6c6c6c;
+ background-color: #eac3c7;
+}
+
+.has-error .form-control-feedback {
+ color: #6c6c6c;
+}
+
+.has-feedback label ~ .form-control-feedback {
+ top: 25px;
+}
+
+.has-feedback label.sr-only ~ .form-control-feedback {
+ top: 0;
+}
+
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #626262;
+}
+
+@media (min-width: 992px) {
+ .form-inline .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-static {
+ display: inline-block;
+ }
+ .form-inline .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .form-inline .input-group .input-group-addon,
+ .form-inline .input-group .input-group-btn,
+ .form-inline .input-group .form-control {
+ width: auto;
+ }
+ .form-inline .input-group > .form-control {
+ width: 100%;
+ }
+ .form-inline .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio label,
+ .form-inline .checkbox label {
+ padding-left: 0;
+ }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-top: 7px;
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px;
+}
+
+.form-horizontal .form-group {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after {
+ content: " ";
+ display: table;
+}
+
+.form-horizontal .form-group:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .form-horizontal .control-label {
+ text-align: right;
+ margin-bottom: 0;
+ padding-top: 7px;
+ }
+}
+
+.form-horizontal .has-feedback .form-control-feedback {
+ right: 0;
+}
+
+@media (min-width: 992px) {
+ .form-horizontal .form-group-lg .control-label {
+ padding-top: 14.333333px;
+ font-size: 18px;
+ }
+}
+
+@media (min-width: 992px) {
+ .form-horizontal .form-group-sm .control-label {
+ padding-top: 6px;
+ font-size: 12px;
+ }
+}
+
+.btn {
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: normal;
+ text-align: center;
+ vertical-align: middle;
+ touch-action: manipulation;
+ cursor: pointer;
+ background-image: none;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ border-radius: 3px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.btn:focus,
+.btn.focus,
+.btn:active:focus,
+.btn:active.focus,
+.btn.active:focus,
+.btn.active.focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+.btn:hover,
+.btn:focus,
+.btn.focus {
+ color: #444;
+ text-decoration: none;
+}
+
+.btn:active,
+.btn.active {
+ outline: 0;
+ background-image: none;
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+ cursor: not-allowed;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ box-shadow: none;
+}
+
+a.btn.disabled,
+fieldset[disabled] a.btn {
+ pointer-events: none;
+}
+
+.btn-default {
+ color: #444;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.btn-default:focus,
+.btn-default.focus {
+ color: #444;
+ background-color: #e6e6e6;
+ border-color: #8c8c8c;
+}
+
+.btn-default:hover {
+ color: #444;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open > .btn-default.dropdown-toggle {
+ color: #444;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+
+.btn-default:active:hover,
+.btn-default:active:focus,
+.btn-default:active.focus,
+.btn-default.active:hover,
+.btn-default.active:focus,
+.btn-default.active.focus,
+.open > .btn-default.dropdown-toggle:hover,
+.open > .btn-default.dropdown-toggle:focus,
+.open > .btn-default.dropdown-toggle.focus {
+ color: #444;
+ background-color: #d4d4d4;
+ border-color: #8c8c8c;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open > .btn-default.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-default.disabled,
+.btn-default.disabled:hover,
+.btn-default.disabled:focus,
+.btn-default.disabled.focus,
+.btn-default.disabled:active,
+.btn-default.disabled.active,
+.btn-default[disabled],
+.btn-default[disabled]:hover,
+.btn-default[disabled]:focus,
+.btn-default[disabled].focus,
+.btn-default[disabled]:active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-default:hover,
+fieldset[disabled] .btn-default:focus,
+fieldset[disabled] .btn-default.focus,
+fieldset[disabled] .btn-default:active,
+fieldset[disabled] .btn-default.active {
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.btn-default .badge {
+ color: #fff;
+ background-color: #444;
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.btn-primary:focus,
+.btn-primary.focus {
+ color: #fff;
+ background-color: #212021;
+ border-color: black;
+}
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #212021;
+ border-color: #1b1b1c;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #212021;
+ border-color: #1b1b1c;
+}
+
+.btn-primary:active:hover,
+.btn-primary:active:focus,
+.btn-primary:active.focus,
+.btn-primary.active:hover,
+.btn-primary.active:focus,
+.btn-primary.active.focus,
+.open > .btn-primary.dropdown-toggle:hover,
+.open > .btn-primary.dropdown-toggle:focus,
+.open > .btn-primary.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #0f0e0f;
+ border-color: black;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open > .btn-primary.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-primary.disabled,
+.btn-primary.disabled:hover,
+.btn-primary.disabled:focus,
+.btn-primary.disabled.focus,
+.btn-primary.disabled:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled],
+.btn-primary[disabled]:hover,
+.btn-primary[disabled]:focus,
+.btn-primary[disabled].focus,
+.btn-primary[disabled]:active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-primary:hover,
+fieldset[disabled] .btn-primary:focus,
+fieldset[disabled] .btn-primary.focus,
+fieldset[disabled] .btn-primary:active,
+fieldset[disabled] .btn-primary.active {
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.btn-primary .badge {
+ color: #3a393b;
+ background-color: #fff;
+}
+
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+}
+
+.btn-success:focus,
+.btn-success.focus {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #2d672d;
+}
+
+.btn-success:hover {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #419641;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #419641;
+}
+
+.btn-success:active:hover,
+.btn-success:active:focus,
+.btn-success:active.focus,
+.btn-success.active:hover,
+.btn-success.active:focus,
+.btn-success.active.focus,
+.open > .btn-success.dropdown-toggle:hover,
+.open > .btn-success.dropdown-toggle:focus,
+.open > .btn-success.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #398439;
+ border-color: #2d672d;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open > .btn-success.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-success.disabled,
+.btn-success.disabled:hover,
+.btn-success.disabled:focus,
+.btn-success.disabled.focus,
+.btn-success.disabled:active,
+.btn-success.disabled.active,
+.btn-success[disabled],
+.btn-success[disabled]:hover,
+.btn-success[disabled]:focus,
+.btn-success[disabled].focus,
+.btn-success[disabled]:active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-success:hover,
+fieldset[disabled] .btn-success:focus,
+fieldset[disabled] .btn-success.focus,
+fieldset[disabled] .btn-success:active,
+fieldset[disabled] .btn-success.active {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+}
+
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
+}
+
+.btn-info:focus,
+.btn-info.focus {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #1f7e9a;
+}
+
+.btn-info:hover {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #2aabd2;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #2aabd2;
+}
+
+.btn-info:active:hover,
+.btn-info:active:focus,
+.btn-info:active.focus,
+.btn-info.active:hover,
+.btn-info.active:focus,
+.btn-info.active.focus,
+.open > .btn-info.dropdown-toggle:hover,
+.open > .btn-info.dropdown-toggle:focus,
+.open > .btn-info.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #269abc;
+ border-color: #1f7e9a;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open > .btn-info.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-info.disabled,
+.btn-info.disabled:hover,
+.btn-info.disabled:focus,
+.btn-info.disabled.focus,
+.btn-info.disabled:active,
+.btn-info.disabled.active,
+.btn-info[disabled],
+.btn-info[disabled]:hover,
+.btn-info[disabled]:focus,
+.btn-info[disabled].focus,
+.btn-info[disabled]:active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-info:hover,
+fieldset[disabled] .btn-info:focus,
+fieldset[disabled] .btn-info.focus,
+fieldset[disabled] .btn-info:active,
+fieldset[disabled] .btn-info.active {
+ background-color: #5bc0de;
+ border-color: #5bc0de;
+}
+
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-warning:focus,
+.btn-warning.focus {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #b06d0f;
+}
+
+.btn-warning:hover {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #eb9316;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open > .btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #eb9316;
+}
+
+.btn-warning:active:hover,
+.btn-warning:active:focus,
+.btn-warning:active.focus,
+.btn-warning.active:hover,
+.btn-warning.active:focus,
+.btn-warning.active.focus,
+.open > .btn-warning.dropdown-toggle:hover,
+.open > .btn-warning.dropdown-toggle:focus,
+.open > .btn-warning.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #d58512;
+ border-color: #b06d0f;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open > .btn-warning.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-warning.disabled,
+.btn-warning.disabled:hover,
+.btn-warning.disabled:focus,
+.btn-warning.disabled.focus,
+.btn-warning.disabled:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled],
+.btn-warning[disabled]:hover,
+.btn-warning[disabled]:focus,
+.btn-warning[disabled].focus,
+.btn-warning[disabled]:active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-warning:hover,
+fieldset[disabled] .btn-warning:focus,
+fieldset[disabled] .btn-warning.focus,
+fieldset[disabled] .btn-warning:active,
+fieldset[disabled] .btn-warning.active {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d9534f;
+}
+
+.btn-danger:focus,
+.btn-danger.focus {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #8b211e;
+}
+
+.btn-danger:hover {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #c12e2a;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #c12e2a;
+}
+
+.btn-danger:active:hover,
+.btn-danger:active:focus,
+.btn-danger:active.focus,
+.btn-danger.active:hover,
+.btn-danger.active:focus,
+.btn-danger.active.focus,
+.open > .btn-danger.dropdown-toggle:hover,
+.open > .btn-danger.dropdown-toggle:focus,
+.open > .btn-danger.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #ac2925;
+ border-color: #8b211e;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open > .btn-danger.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-danger.disabled,
+.btn-danger.disabled:hover,
+.btn-danger.disabled:focus,
+.btn-danger.disabled.focus,
+.btn-danger.disabled:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled],
+.btn-danger[disabled]:hover,
+.btn-danger[disabled]:focus,
+.btn-danger[disabled].focus,
+.btn-danger[disabled]:active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger,
+fieldset[disabled] .btn-danger:hover,
+fieldset[disabled] .btn-danger:focus,
+fieldset[disabled] .btn-danger.focus,
+fieldset[disabled] .btn-danger:active,
+fieldset[disabled] .btn-danger.active {
+ background-color: #d9534f;
+ border-color: #d9534f;
+}
+
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+
+.btn-link {
+ color: #3a393b;
+ font-weight: normal;
+ border-radius: 0;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+ background-color: transparent;
+ box-shadow: none;
+}
+
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+ border-color: transparent;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+ color: #141314;
+ text-decoration: underline;
+ background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:hover,
+fieldset[disabled] .btn-link:focus {
+ color: #999;
+ text-decoration: none;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 3px;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-xs, .btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+}
+
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.fade {
+ opacity: 0;
+ transition: opacity 0.15s linear;
+}
+
+.fade.in {
+ opacity: 1;
+}
+
+.collapse {
+ display: none;
+}
+
+.collapse.in {
+ display: block;
+}
+
+tr.collapse.in {
+ display: table-row;
+}
+
+tbody.collapse.in {
+ display: table-row-group;
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition-property: height, visibility;
+ transition-duration: 0.35s;
+ transition-timing-function: ease;
+}
+
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px dashed;
+ border-top: 4px solid \9;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+
+.dropup,
+.dropdown {
+ position: relative;
+}
+
+.dropdown-toggle:focus {
+ outline: 0;
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0;
+ list-style: none;
+ font-size: 14px;
+ text-align: left;
+ background-color: #fcfcfc;
+ border: 1px solid #ccc;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #eee;
+}
+
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+ color: #222;
+ white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ text-decoration: none;
+ color: #151515;
+ background-color: #f5f5f5;
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ background-color: #3a393b;
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ cursor: not-allowed;
+}
+
+.open > .dropdown-menu {
+ display: block;
+}
+
+.open > a {
+ outline: 0;
+}
+
+.dropdown-menu-right {
+ left: auto;
+ right: 0;
+}
+
+.dropdown-menu-left {
+ left: 0;
+ right: auto;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.428571429;
+ color: #999;
+ white-space: nowrap;
+}
+
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: 990;
+}
+
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ border-top: 0;
+ border-bottom: 4px dashed;
+ border-bottom: 4px solid \9;
+ content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+}
+
+@media (min-width: 992px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .navbar-right .dropdown-menu-left {
+ left: 0;
+ right: auto;
+ }
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ float: left;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+ margin-left: -1px;
+}
+
+.btn-toolbar {
+ margin-left: -5px;
+}
+
+.btn-toolbar:before,
+.btn-toolbar:after {
+ content: " ";
+ display: table;
+}
+
+.btn-toolbar:after {
+ clear: both;
+}
+
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+ float: left;
+}
+
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+ margin-left: 5px;
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+
+.btn-group > .btn:first-child {
+ margin-left: 0;
+}
+
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group > .btn-group {
+ float: left;
+}
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px;
+}
+
+.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn +
.dropdown-toggle {
+ padding-left: 12px;
+ padding-right: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn-group.open .dropdown-toggle.btn-link {
+ box-shadow: none;
+}
+
+.btn .caret {
+ margin-left: 0;
+}
+
+.btn-lg .caret, .btn-group-lg > .btn .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0;
+}
+
+.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {
+ border-width: 0 5px 5px;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+}
+
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+ content: " ";
+ display: table;
+}
+
+.btn-group-vertical > .btn-group:after {
+ clear: both;
+}
+
+.btn-group-vertical > .btn-group > .btn {
+ float: none;
+}
+
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
+}
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-bottom-left-radius: 3px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ border-collapse: separate;
+}
+
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+ float: none;
+ display: table-cell;
+ width: 1%;
+}
+
+.btn-group-justified > .btn-group .btn {
+ width: 100%;
+}
+
+.btn-group-justified > .btn-group .dropdown-menu {
+ left: auto;
+}
+
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn
input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn
input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+
+.input-group[class*="col-"] {
+ float: none;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.input-group .form-control {
+ position: relative;
+ z-index: 2;
+ float: left;
+ width: 100%;
+ margin-bottom: 0;
+}
+
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+}
+
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #444;
+ text-align: center;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+}
+
+.input-group-addon.input-sm, .input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px;
+}
+
+.input-group-addon.input-lg, .input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 3px;
+}
+
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.input-group-addon:first-child {
+ border-right: 0;
+}
+
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.input-group-addon:last-child {
+ border-left: 0;
+}
+
+.input-group-btn {
+ position: relative;
+ font-size: 0;
+ white-space: nowrap;
+}
+
+.input-group-btn > .btn {
+ position: relative;
+}
+
+.input-group-btn > .btn + .btn {
+ margin-left: -1px;
+}
+
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+ z-index: 2;
+}
+
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+ margin-right: -1px;
+}
+
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+ z-index: 2;
+ margin-left: -1px;
+}
+
+.nav {
+ margin-bottom: 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+.nav:before,
+.nav:after {
+ content: " ";
+ display: table;
+}
+
+.nav:after {
+ clear: both;
+}
+
+.nav > li {
+ position: relative;
+ display: block;
+}
+
+.nav > li > a {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #fff;
+}
+
+.nav > li.disabled > a {
+ color: #999;
+}
+
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+ color: #999;
+ text-decoration: none;
+ background-color: transparent;
+ cursor: not-allowed;
+}
+
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background-color: #fff;
+ border-color: #3a393b;
+}
+
+.nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+
+.nav > li > a > img {
+ max-width: none;
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.428571429;
+ border: 1px solid transparent;
+ border-radius: 3px 3px 0 0;
+}
+
+.nav-tabs > li > a:hover {
+ border-color: #fff #fff #ddd;
+}
+
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ color: #444;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default;
+}
+
+.nav-pills > li {
+ float: left;
+}
+
+.nav-pills > li > a {
+ border-radius: 3px;
+}
+
+.nav-pills > li + li {
+ margin-left: 2px;
+}
+
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #3a393b;
+}
+
+.nav-stacked > li {
+ float: none;
+}
+
+.nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0;
+}
+
+.nav-justified, .nav-tabs.nav-justified {
+ width: 100%;
+}
+
+.nav-justified > li, .nav-tabs.nav-justified > li {
+ float: none;
+}
+
+.nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+
+@media (min-width: 992px) {
+ .nav-justified > li, .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+
+.nav-tabs-justified, .nav-tabs.nav-justified {
+ border-bottom: 0;
+}
+
+.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 3px;
+}
+
+.nav-tabs-justified > .active > a,
+.nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active >
a:hover,
+.nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active >
a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+
+@media (min-width: 992px) {
+ .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 3px 3px 0 0;
+ }
+ .nav-tabs-justified > .active > a,
+ .nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active >
a:hover,
+ .nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active
> a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+
+.tab-content > .active {
+ display: block;
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.navbar {
+ position: relative;
+ min-height: 40px;
+ margin-bottom: 0;
+ border: 0;
+}
+
+.navbar:before,
+.navbar:after {
+ content: " ";
+ display: table;
+}
+
+.navbar:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .navbar {
+ border-radius: 0;
+ }
+}
+
+.navbar-header:before,
+.navbar-header:after {
+ content: " ";
+ display: table;
+}
+
+.navbar-header:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .navbar-header {
+ float: left;
+ }
+}
+
+.navbar-collapse {
+ overflow-x: visible;
+ padding-right: 0;
+ padding-left: 0;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ -webkit-overflow-scrolling: touch;
+}
+
+.navbar-collapse:before,
+.navbar-collapse:after {
+ content: " ";
+ display: table;
+}
+
+.navbar-collapse:after {
+ clear: both;
+}
+
+.navbar-collapse.in {
+ overflow-y: auto;
+}
+
+@media (min-width: 992px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ box-shadow: none;
+ }
+ .navbar-collapse.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important;
+ }
+ .navbar-collapse.in {
+ overflow-y: visible;
+ }
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-static-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
+
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+ max-height: 340px;
+}
+
+@media (max-device-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ max-height: 200px;
+ }
+}
+
+.container > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-header,
+.container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+@media (min-width: 992px) {
+ .container > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-header,
+ .container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+ }
+}
+
+.navbar-static-top {
+ z-index: 1000;
+ border-width: 0 0 1px;
+}
+
+@media (min-width: 992px) {
+ .navbar-static-top {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+@media (min-width: 992px) {
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0;
+ border-width: 1px 0 0;
+}
+
+.navbar-brand {
+ display: block;
+ margin: 0 0 0 -80px;
+ padding: 0 0 0 80px;
+ height: 55px;
+ background: transparent url("../../../images/theme-default/logo-white.png")
no-repeat 24px 3px;
+ color: #fff;
+ font-family: "HelveticaNeueBold", "HelveticaNeue-Bold",
"HelveticaNeue Bold", "Helvetica Neue Bold", "Helvetica
Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande",
sans-serif;
+ font-weight: 600;
+ font-size: 1.571em;
+ line-height: 55px;
+ cursor: default;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.navbar-brand:hover,
+.navbar-brand:focus {
+ text-decoration: none;
+}
+
+.navbar-brand > img {
+ display: block;
+}
+
+@media (min-width: 992px) {
+ .navbar > .container .navbar-brand,
+ .navbar > .container-fluid .navbar-brand {
+ margin-left: -80px;
+ }
+}
+
+.navbar-toggle {
+ position: relative;
+ float: right;
+ margin-right: 0;
+ padding: 9px 10px;
+ margin-top: 3px;
+ margin-bottom: 3px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 3px;
+}
+
+.navbar-toggle:focus {
+ outline: 0;
+}
+
+.navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+}
+
+.navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px;
+}
+
+@media (min-width: 992px) {
+ .navbar-toggle {
+ display: none;
+ }
+}
+
+.navbar-nav {
+ margin: 5px 0;
+}
+
+.navbar-nav > li > a {
+ padding-left: 40px;
+ padding-right: 40px;
+ line-height: 20px;
+ font-family: "Helvetica Neue LT W1G 55 Roman", "Helvetica Neue LT
W1G", "HelveticaNeue Roman", "HelveticaNeue-Roman",
"Helvetica Neue Roman", "Helvetica Neue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+}
+
+.navbar-nav > li > a > .fa {
+ font-size: 26px;
+}
+
+.navbar-nav > li > a.dropdown-toggle {
+ padding-right: 22px;
+ padding-left: 22px;
+}
+
+@media (max-width: 991px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none;
+ }
+}
+
+@media (min-width: 992px) {
+ .navbar-nav {
+ float: left;
+ margin: 0;
+ }
+ .navbar-nav > li {
+ float: left;
+ }
+ .navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ }
+}
+
+.navbar-form {
+ margin-left: 0;
+ margin-right: 0;
+ padding: 10px 0;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+@media (min-width: 992px) {
+ .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control-static {
+ display: inline-block;
+ }
+ .navbar-form .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .navbar-form .input-group .input-group-addon,
+ .navbar-form .input-group .input-group-btn,
+ .navbar-form .input-group .form-control {
+ width: auto;
+ }
+ .navbar-form .input-group > .form-control {
+ width: 100%;
+ }
+ .navbar-form .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio,
+ .navbar-form .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio label,
+ .navbar-form .checkbox label {
+ padding-left: 0;
+ }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .navbar-form .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+
+@media (max-width: 991px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+ .navbar-form .form-group:last-child {
+ margin-bottom: 0;
+ }
+}
+
+@media (min-width: 992px) {
+ .navbar-form {
+ width: auto;
+ border: 0;
+ margin-left: 0;
+ margin-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ box-shadow: none;
+ }
+}
+
+.navbar-nav > li > a.dropdown-toggle > .caret {
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+ margin-left: 10px;
+ width: 40px;
+ height: 39px;
+}
+
+.navbar-nav > li > a.dropdown-toggle > .caret:before {
+ content: '\f078';
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: 13px;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+ color: #fff;
+ position: absolute;
+ top: 24px;
+ margin-left: 14px;
+ display: block;
+}
+
+.navbar-nav > li.dropdown.open > a > .caret {
+ background-color: #3a393b;
+}
+
+.navbar-nav > li.dropdown.open > a > .caret:before {
+ content: '\f077';
+}
+
+.navbar-right > li > a {
+ height: 49px;
+}
+
+.navbar-right > li > a .fa {
+ margin-right: 15px;
+}
+
+.navbar-right > li > a .topbar-text, .navbar-right > li > a .caret,
.navbar-right > li > a .fa {
+ vertical-align: middle;
+}
+
+.navbar-nav > li > .dropdown-menu {
+ padding: 0;
+ margin-top: 0;
+ background-color: #3a393b;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none !important;
+ background-clip: padding-box;
+ height: auto;
+ max-height: 400px;
+ overflow-x: hidden;
+ /* Track */
+ /* Handle */
+}
+
+.navbar-nav > li > .dropdown-menu > li {
+ display: block;
+}
+
+.navbar-nav > li > .dropdown-menu > li > a,
+.navbar-nav > li > .dropdown-menu > li > span {
+ margin: 0 !important;
+ display: block;
+ vertical-align: middle;
+ color: #fff;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+ font-weight: normal;
+ line-height: 24px;
+ padding: 7px 30px;
+ height: 40px;
+ border-top: 1px solid #2e2e2e;
+ box-shadow: inset 0px 1px 0px 0px #404042;
+ clear: both;
+ white-space: nowrap;
+}
+
+.navbar-nav > li > .dropdown-menu > li > a:hover,
+.navbar-nav > li > .dropdown-menu > li > a:focus,
+.navbar-nav > li > .dropdown-menu > li > span:hover,
+.navbar-nav > li > .dropdown-menu > li > span:focus {
+ text-decoration: none;
+ color: #fff;
+ background-color: #3a393b;
+}
+
+.navbar-nav > li > .dropdown-menu > li > a > .fa {
+ vertical-align: middle;
+ font-size: 26px;
+ margin-right: 15px;
+ margin-left: -15px;
+}
+
+.navbar-nav > li > .dropdown-menu > li.critical > a {
+ background: #d9182d;
+}
+
+.navbar-nav > li > .dropdown-menu::-webkit-scrollbar {
+ width: 12px;
+}
+
+.navbar-nav > li > .dropdown-menu::-webkit-scrollbar-track {
+ box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+}
+
+.navbar-nav > li > .dropdown-menu::-webkit-scrollbar-thumb {
+ border-radius: 4px;
+ background: #797979;
+ border-left: 1px solid #B3B3B3;
+ box-shadow: inset 6px 1px 6px #9e9e9e;
+}
+
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ margin-bottom: 0;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.navbar-btn {
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
+ margin-top: 9px;
+ margin-bottom: 9px;
+}
+
+.navbar-text {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+@media (min-width: 992px) {
+ .navbar-text {
+ float: left;
+ margin-left: 0;
+ margin-right: 0;
+ }
+}
+
+@media (min-width: 992px) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ margin-right: 0;
+ }
+ .navbar-right ~ .navbar-right {
+ margin-right: 0;
+ }
+}
+
+.navbar-default {
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.navbar-default .navbar-brand {
+ color: #fff;
+}
+
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+ color: #e6e6e6;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-text {
+ color: #fff;
+}
+
+.navbar-default .navbar-nav > li > a {
+ margin: 0 !important;
+ font-size: 13pt;
+ font-family: "HelveticaNeueBold", "HelveticaNeue-Bold",
"HelveticaNeue Bold", "Helvetica Neue Bold", "Helvetica
Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande",
sans-serif;
+ font-weight: 600;
+ color: #fff;
+ text-decoration: none;
+ outline: none;
+ min-width: 190px;
+ text-align: center;
+ height: 40px;
+}
+
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > li > a .digit-container {
+ display: inline-block;
+ margin-left: 10px;
+ margin-top: -2px;
+ border-radius: 16px;
+ height: 20px;
+ line-height: 16px;
+ background: #555;
+ border: 2px solid #555;
+ color: #fff;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 14px;
+ padding: 0 8px;
+}
+
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > .active > a .digit-container {
+ border-color: #fff;
+ background: transparent;
+}
+
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+ cursor: default;
+ color: #999;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > .disabled > a .digit-container {
+ display: none;
+}
+
+.navbar-default .navbar-nav > .active > a.host,
+.navbar-default .navbar-nav > .active > a.host:hover,
+.navbar-default .navbar-nav > .active > a.host:focus {
+ background-color: #008abf !important;
+}
+
+.navbar-default .navbar-nav > .active > a.guests,
+.navbar-default .navbar-nav > .active > a.guests:hover,
+.navbar-default .navbar-nav > .active > a.guests:focus {
+ background-color: #8cc63f !important;
+}
+
+.navbar-default .navbar-nav > .active > a.templates,
+.navbar-default .navbar-nav > .active > a.templates:hover,
+.navbar-default .navbar-nav > .active > a.templates:focus {
+ background-color: #00a6a0 !important;
+}
+
+.navbar-default .navbar-nav > .active > a.storage,
+.navbar-default .navbar-nav > .active > a.storage:hover,
+.navbar-default .navbar-nav > .active > a.storage:focus {
+ background-color: #feb813 !important;
+}
+
+.navbar-default .navbar-nav > .active > a.network,
+.navbar-default .navbar-nav > .active > a.network:hover,
+.navbar-default .navbar-nav > .active > a.network:focus {
+ background-color: #7f1c7d !important;
+}
+
+.navbar-default .navbar-nav > .active > a.administration,
+.navbar-default .navbar-nav > .active > a.administration:hover,
+.navbar-default .navbar-nav > .active > a.administration:focus {
+ background-color: #d9182d !important;
+}
+
+.navbar-default .navbar-nav > .hostname {
+ margin: 0;
+ padding: 8px 0;
+ vertical-align: top;
+ width: 180px;
+ padding-right: 24px;
+ box-sizing: border-box;
+}
+
+.navbar-default .navbar-nav > .hostname .host-location {
+ display: block;
+ font-family: "Helvetica Neue LT W1G 55 Roman", "Helvetica Neue LT
W1G", "HelveticaNeue Roman", "HelveticaNeue-Roman",
"Helvetica Neue Roman", "Helvetica Neue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ color: #fff;
+ font-size: 13pt;
+ font-weight: 400;
+ width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.navbar-default .navbar-toggle {
+ border-color: #ddd;
+}
+
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+ background-color: #ddd;
+}
+
+.navbar-default .navbar-toggle .icon-bar {
+ background-color: #888;
+}
+
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+ border-color: #3a393b;
+}
+
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+ background-color: transparent;
+ color: #fff;
+}
+
+@media (max-width: 991px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #fff;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #999;
+ background-color: transparent;
+ }
+}
+
+.navbar-default .navbar-link {
+ color: #fff;
+}
+
+.navbar-default .navbar-link:hover {
+ color: #fff;
+}
+
+.navbar-default .btn-link {
+ color: #fff;
+}
+
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+ color: #fff;
+}
+
+.navbar-default .btn-link[disabled]:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:hover,
+fieldset[disabled] .navbar-default .btn-link:focus {
+ color: #999;
+}
+
+.navbar-inverse {
+ background-color: #222;
+ border-color: #222;
+}
+
+.navbar-inverse .navbar-brand {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-text {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-nav > li > a {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #999;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-toggle {
+ border-color: #333;
+}
+
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #fff;
+}
+
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #101010;
+}
+
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+ background-color: transparent;
+ color: #fff;
+}
+
+@media (max-width: 991px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #222;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #222;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #fff;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #999;
+ background-color: transparent;
+ }
+}
+
+.navbar-inverse .navbar-link {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-link:hover {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link[disabled]:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+ color: #999;
+}
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 3px;
+}
+
+.breadcrumb > li {
+ display: inline-block;
+}
+
+.breadcrumb > li + li:before {
+ content: "/\\00a0";
+ padding: 0 5px;
+ color: #ccc;
+}
+
+.breadcrumb > .active {
+ color: #999;
+}
+
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 3px;
+}
+
+.pagination > li {
+ display: inline;
+}
+
+.pagination > li > a,
+.pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ line-height: 1.428571429;
+ text-decoration: none;
+ color: #3a393b;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ margin-left: -1px;
+}
+
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+ margin-left: 0;
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.pagination > li > a:hover,
+.pagination > li > a:focus,
+.pagination > li > span:hover,
+.pagination > li > span:focus {
+ z-index: 3;
+ color: #141314;
+ background-color: #fff;
+ border-color: #ddd;
+}
+
+.pagination > .active > a,
+.pagination > .active > a:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span,
+.pagination > .active > span:hover,
+.pagination > .active > span:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+ cursor: default;
+}
+
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+ color: #999;
+ background-color: #fff;
+ border-color: #ddd;
+ cursor: not-allowed;
+}
+
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.pager {
+ padding-left: 0;
+ margin: 20px 0;
+ list-style: none;
+ text-align: center;
+}
+
+.pager:before,
+.pager:after {
+ content: " ";
+ display: table;
+}
+
+.pager:after {
+ clear: both;
+}
+
+.pager li {
+ display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #fff;
+}
+
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #999;
+ background-color: #fff;
+ cursor: not-allowed;
+}
+
+.label {
+ display: inline;
+ padding: 0.2em 0.6em 0.3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+
+.label:empty {
+ display: none;
+}
+
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+
+a.label:hover,
+a.label:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.label-default {
+ background-color: #999;
+}
+
+.label-default[href]:hover,
+.label-default[href]:focus {
+ background-color: gray;
+}
+
+.label-primary {
+ background-color: #3a393b;
+}
+
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+ background-color: #212021;
+}
+
+.label-success {
+ background-color: #5cb85c;
+}
+
+.label-success[href]:hover,
+.label-success[href]:focus {
+ background-color: #449d44;
+}
+
+.label-info {
+ background-color: #5bc0de;
+}
+
+.label-info[href]:hover,
+.label-info[href]:focus {
+ background-color: #31b0d5;
+}
+
+.label-warning {
+ background-color: #f0ad4e;
+}
+
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+ background-color: #ec971f;
+}
+
+.label-danger {
+ background-color: #d9534f;
+}
+
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+ background-color: #c9302c;
+}
+
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ color: #fff;
+ line-height: 1;
+ vertical-align: middle;
+ white-space: nowrap;
+ text-align: center;
+ background-color: #999;
+ border-radius: 10px;
+}
+
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.btn-xs .badge,
+.btn-group-xs > .btn .badge,
+.btn-group-xs > .btn .badge {
+ top: 0;
+ padding: 1px 5px;
+}
+
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+ color: #3a393b;
+ background-color: #fff;
+}
+
+.list-group-item > .badge {
+ float: right;
+}
+
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+
+a.badge:hover,
+a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.jumbotron {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ margin-bottom: 30px;
+ color: inherit;
+ background-color: #fff;
+}
+
+.jumbotron h1,
+.jumbotron .h1 {
+ color: inherit;
+}
+
+.jumbotron p {
+ margin-bottom: 15px;
+ font-size: 21px;
+ font-weight: 200;
+}
+
+.jumbotron > hr {
+ border-top-color: #e6e6e6;
+}
+
+.container .jumbotron,
+.container-fluid .jumbotron {
+ border-radius: 3px;
+}
+
+.jumbotron .container {
+ max-width: 100%;
+}
+
+@media screen and (min-width: 992px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px;
+ }
+ .container .jumbotron,
+ .container-fluid .jumbotron {
+ padding-left: 60px;
+ padding-right: 60px;
+ }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px;
+ }
+}
+
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ transition: border 0.2s ease-in-out;
+}
+
+.thumbnail > img,
+.thumbnail a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.thumbnail .caption {
+ padding: 9px;
+ color: #222;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #3a393b;
+}
+
+.alert {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 0;
+}
+
+.alert h4 {
+ margin-top: 0;
+ color: inherit;
+}
+
+.alert .alert-link {
+ font-weight: bold;
+}
+
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+
+.alert > p + p {
+ margin-top: 5px;
+}
+
+.alert-dismissable, .alert-dismissible {
+ padding-right: 8px 15px20;
+}
+
+.alert-dismissable .close, .alert-dismissible .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+}
+
+.alert-success {
+ background-color: #dae6cb;
+ border-color: #8cc63f;
+ color: #6c6c6c;
+}
+
+.alert-success hr {
+ border-top-color: #7fb636;
+}
+
+.alert-success .alert-link {
+ color: #525252;
+}
+
+.alert-info {
+ background-color: #d9edf7;
+ border-color: #008abf;
+ color: #6c6c6c;
+}
+
+.alert-info hr {
+ border-top-color: #0078a6;
+}
+
+.alert-info .alert-link {
+ color: #525252;
+}
+
+.alert-warning {
+ background-color: #f1e3c2;
+ border-color: #fdb813;
+ color: #6c6c6c;
+}
+
+.alert-warning hr {
+ border-top-color: #f4ad02;
+}
+
+.alert-warning .alert-link {
+ color: #525252;
+}
+
+.alert-danger {
+ background-color: #eac3c7;
+ border-color: #d9182d;
+ color: #6c6c6c;
+}
+
+.alert-danger hr {
+ border-top-color: #c21528;
+}
+
+.alert-danger .alert-link {
+ color: #525252;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+.progress {
+ overflow: hidden;
+ height: 20px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress-bar {
+ float: left;
+ width: 0%;
+ height: 100%;
+ font-size: 12px;
+ line-height: 20px;
+ color: #fff;
+ text-align: center;
+ background-color: #3a393b;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ transition: width 0.6s ease;
+}
+
+.progress-striped .progress-bar,
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+ background-size: 40px 40px;
+}
+
+.progress.active .progress-bar,
+.progress-bar.active {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-bar-success {
+ background-color: #5cb85c;
+}
+
+.progress-striped .progress-bar-success {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-info {
+ background-color: #5bc0de;
+}
+
+.progress-striped .progress-bar-info {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-warning {
+ background-color: #f0ad4e;
+}
+
+.progress-striped .progress-bar-warning {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-danger {
+ background-color: #d9534f;
+}
+
+.progress-striped .progress-bar-danger {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.media {
+ margin-top: 15px;
+}
+
+.media:first-child {
+ margin-top: 0;
+}
+
+.media,
+.media-body {
+ zoom: 1;
+ overflow: hidden;
+}
+
+.media-body {
+ width: 10000px;
+}
+
+.media-object {
+ display: block;
+}
+
+.media-object.img-thumbnail {
+ max-width: none;
+}
+
+.media-right,
+.media > .pull-right {
+ padding-left: 10px;
+}
+
+.media-left,
+.media > .pull-left {
+ padding-right: 10px;
+}
+
+.media-left,
+.media-right,
+.media-body {
+ display: table-cell;
+ vertical-align: top;
+}
+
+.media-middle {
+ vertical-align: middle;
+}
+
+.media-bottom {
+ vertical-align: bottom;
+}
+
+.media-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.media-list {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-group {
+ margin-bottom: 20px;
+ padding-left: 0;
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+}
+
+.list-group-item:first-child {
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+a.list-group-item,
+button.list-group-item {
+ color: #555;
+}
+
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+ color: #333;
+}
+
+a.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:hover,
+button.list-group-item:focus {
+ text-decoration: none;
+ color: #555;
+ background-color: #f5f5f5;
+}
+
+button.list-group-item {
+ width: 100%;
+ text-align: left;
+}
+
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+ background-color: #fff;
+ color: #999;
+ cursor: not-allowed;
+}
+
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+ color: inherit;
+}
+
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+ color: #999;
+}
+
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+ color: inherit;
+}
+
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+ color: #a09ea2;
+}
+
+.list-group-item-success {
+ color: #6c6c6c;
+ background-color: #dae6cb;
+}
+
+a.list-group-item-success,
+button.list-group-item-success {
+ color: #6c6c6c;
+}
+
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:hover,
+button.list-group-item-success:focus {
+ color: #6c6c6c;
+ background-color: #cedeba;
+}
+
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active,
+button.list-group-item-success.active:hover,
+button.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-info {
+ color: #6c6c6c;
+ background-color: #d9edf7;
+}
+
+a.list-group-item-info,
+button.list-group-item-info {
+ color: #6c6c6c;
+}
+
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:hover,
+button.list-group-item-info:focus {
+ color: #6c6c6c;
+ background-color: #c4e3f3;
+}
+
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active,
+button.list-group-item-info.active:hover,
+button.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-warning {
+ color: #6c6c6c;
+ background-color: #f1e3c2;
+}
+
+a.list-group-item-warning,
+button.list-group-item-warning {
+ color: #6c6c6c;
+}
+
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:hover,
+button.list-group-item-warning:focus {
+ color: #6c6c6c;
+ background-color: #ecd9ad;
+}
+
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active,
+button.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-danger {
+ color: #6c6c6c;
+ background-color: #eac3c7;
+}
+
+a.list-group-item-danger,
+button.list-group-item-danger {
+ color: #6c6c6c;
+}
+
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:hover,
+button.list-group-item-danger:focus {
+ color: #6c6c6c;
+ background-color: #e3b0b5;
+}
+
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active,
+button.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
+
+.panel {
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 3px;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.panel-body {
+ padding: 15px;
+}
+
+.panel-body:before,
+.panel-body:after {
+ content: " ";
+ display: table;
+}
+
+.panel-body:after {
+ clear: both;
+}
+
+.panel-heading {
+ padding: 10px 15px;
+ border-bottom: 1px solid transparent;
+ border-top-right-radius: 2px;
+ border-top-left-radius: 2px;
+}
+
+.panel-heading > .dropdown .dropdown-toggle {
+ color: inherit;
+}
+
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 16px;
+ color: inherit;
+}
+
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+ color: inherit;
+}
+
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+ margin-bottom: 0;
+}
+
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+}
+
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+ border-top: 0;
+ border-top-right-radius: 2px;
+ border-top-left-radius: 2px;
+}
+
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+ border-bottom: 0;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .panel-heading + .panel-collapse > .list-group
.list-group-item:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0;
+}
+
+.list-group + .panel-footer {
+ border-top-width: 0;
+}
+
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+ margin-bottom: 0;
+}
+
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+ border-top-right-radius: 2px;
+ border-top-left-radius: 2px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child
td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child
th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child
td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child
th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child th:first-child {
+ border-top-left-radius: 2px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child th:last-child {
+ border-top-right-radius: 2px;
+}
+
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child {
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child th:first-child {
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child th:last-child {
+ border-bottom-right-radius: 2px;
+}
+
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+ border-top: 1px solid #ddd;
+}
+
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+ border-top: 0;
+}
+
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child
{
+ border-left: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child
{
+ border-right: 0;
+}
+
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child >
td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child >
th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child >
td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th
{
+ border-bottom: 0;
+}
+
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child >
td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child >
th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child >
td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th
{
+ border-bottom: 0;
+}
+
+.panel > .table-responsive {
+ border: 0;
+ margin-bottom: 0;
+}
+
+.panel-group {
+ margin-bottom: 20px;
+}
+
+.panel-group .panel {
+ margin-bottom: 0;
+ border-radius: 3px;
+}
+
+.panel-group .panel + .panel {
+ margin-top: 5px;
+}
+
+.panel-group .panel-heading {
+ border-bottom: 0;
+}
+
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+ border-top: 1px solid #ddd;
+}
+
+.panel-group .panel-footer {
+ border-top: 0;
+}
+
+.panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd;
+}
+
+.panel-default {
+ border-color: #ddd;
+}
+
+.panel-default > .panel-heading {
+ color: #222;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ddd;
+}
+
+.panel-default > .panel-heading .badge {
+ color: #f5f5f5;
+ background-color: #222;
+}
+
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ddd;
+}
+
+.panel-primary {
+ border-color: #3a393b;
+}
+
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #3a393b;
+}
+
+.panel-primary > .panel-heading .badge {
+ color: #3a393b;
+ background-color: #fff;
+}
+
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #3a393b;
+}
+
+.panel-success {
+ border-color: #8cc63f;
+}
+
+.panel-success > .panel-heading {
+ color: #6c6c6c;
+ background-color: #dae6cb;
+ border-color: #8cc63f;
+}
+
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #8cc63f;
+}
+
+.panel-success > .panel-heading .badge {
+ color: #dae6cb;
+ background-color: #6c6c6c;
+}
+
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #8cc63f;
+}
+
+.panel-info {
+ border-color: #008abf;
+}
+
+.panel-info > .panel-heading {
+ color: #6c6c6c;
+ background-color: #d9edf7;
+ border-color: #008abf;
+}
+
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #008abf;
+}
+
+.panel-info > .panel-heading .badge {
+ color: #d9edf7;
+ background-color: #6c6c6c;
+}
+
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #008abf;
+}
+
+.panel-warning {
+ border-color: #fdb813;
+}
+
+.panel-warning > .panel-heading {
+ color: #6c6c6c;
+ background-color: #f1e3c2;
+ border-color: #fdb813;
+}
+
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #fdb813;
+}
+
+.panel-warning > .panel-heading .badge {
+ color: #f1e3c2;
+ background-color: #6c6c6c;
+}
+
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #fdb813;
+}
+
+.panel-danger {
+ border-color: #d9182d;
+}
+
+.panel-danger > .panel-heading {
+ color: #6c6c6c;
+ background-color: #eac3c7;
+ border-color: #d9182d;
+}
+
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #d9182d;
+}
+
+.panel-danger > .panel-heading .badge {
+ color: #eac3c7;
+ background-color: #6c6c6c;
+}
+
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #d9182d;
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden;
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ height: 100%;
+ width: 100%;
+ border: 0;
+}
+
+.embed-responsive-16by9 {
+ padding-bottom: 56.25%;
+}
+
+.embed-responsive-4by3 {
+ padding-bottom: 75%;
+}
+
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-lg {
+ padding: 24px;
+ border-radius: 3px;
+}
+
+.well-sm {
+ padding: 9px;
+ border-radius: 3px;
+}
+
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+.modal-open {
+ overflow: hidden;
+}
+
+.modal {
+ display: none;
+ overflow: hidden;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1050;
+ -webkit-overflow-scrolling: touch;
+ outline: 0;
+}
+
+.modal.fade .modal-dialog {
+ -webkit-transform: translate(0, -25%);
+ -ms-transform: translate(0, -25%);
+ transform: translate(0, -25%);
+ transition: -webkit-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+}
+
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+ border: 6px solid #aaa;
+ border: 6px solid rgba(170, 170, 170, 0.3);
+ border-radius: 5px;
+ background-clip: padding-box;
+}
+
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ border-radius: 0;
+ border: 3px solid #999;
+ background-clip: padding-box;
+ box-shadow: none !important;
+ border-radius: 0;
+ outline: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #fff;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.modal-backdrop.in {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+.modal-header {
+ padding: 27px 14px 14px 30px;
+ border-bottom: 1px solid transparent;
+ min-height: 27px 14px 14px 30px23px;
+}
+
+.modal-header .close {
+ margin-top: -2px;
+}
+
+.modal-title {
+ margin: 0;
+ line-height: 23px;
+ font-size: 27px;
+ font-family: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-weight: 300 !important;
+}
+
+.modal-body {
+ position: relative;
+ padding: 10px 30px;
+}
+
+.modal-footer {
+ padding: 10px 30px;
+ text-align: left !important;
+ border-top: 0;
+ margin-top: 20px;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+ content: " ";
+ display: table;
+}
+
+.modal-footer:after {
+ clear: both;
+}
+
+.modal-footer .btn {
+ padding: 6px 12px;
+ min-width: 75px;
+}
+
+.modal-footer .btn + .btn {
+ margin-left: 5px;
+ margin-bottom: 0;
+}
+
+.modal-footer .btn-group .btn + .btn {
+ margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+ margin-left: 0;
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+@media (min-width: 992px) {
+ .modal-dialog {
+ width: 824px;
+ margin: 30px auto;
+ }
+ .modal-content {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+ }
+ .modal-sm {
+ width: 524px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .modal-lg {
+ width: 1124px;
+ }
+}
+
+.modal {
+ text-align: center;
+}
+
+@media screen and (min-width: 768px) {
+ .modal:before {
+ display: inline-block;
+ vertical-align: middle;
+ content: " ";
+ height: 100%;
+ }
+}
+
+.modal-dialog {
+ display: inline-block;
+ text-align: left;
+ vertical-align: middle;
+}
+
+#host-root-container .modal-footer, .host-modal .modal-footer {
+ background: #008abf !important;
+}
+
+#guests-root-container .modal-footer, .guests-modal .modal-footer {
+ background: #8cc63f !important;
+}
+
+#templates-root-container .modal-footer, .templates-modal .modal-footer {
+ background: #00a6a0 !important;
+}
+
+#storage-root-container .modal-footer, .storage-modal .modal-footer {
+ background: #feb813 !important;
+}
+
+#network-root-container .modal-footer, .network-modal .modal-footer {
+ background: #7f1c7d !important;
+}
+
+#administration-root-container .modal-footer, .administration-modal .modal-footer {
+ background: #d9182d !important;
+}
+
+.modal label {
+ color: #222;
+ font-weight: 400;
+ font-family: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 20px;
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.428571429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 12px;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.tooltip.in {
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.tooltip.top {
+ margin-top: -3px;
+ padding: 5px 0;
+}
+
+.tooltip.right {
+ margin-left: 3px;
+ padding: 0 5px;
+}
+
+.tooltip.bottom {
+ margin-top: 3px;
+ padding: 5px 0;
+}
+
+.tooltip.left {
+ margin-left: -3px;
+ padding: 0 5px;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 3px;
+}
+
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.top-left .tooltip-arrow {
+ bottom: 0;
+ right: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.top-right .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000;
+}
+
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.428571429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 14px;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 3px;
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+
+.popover.top {
+ margin-top: -10px;
+}
+
+.popover.right {
+ margin-left: 10px;
+}
+
+.popover.bottom {
+ margin-top: 10px;
+}
+
+.popover.left {
+ margin-left: -10px;
+}
+
+.popover-title {
+ margin: 0;
+ padding: 8px 14px;
+ font-size: 14px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 2px 2px 0 0;
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+.popover > .arrow,
+.popover > .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.popover > .arrow {
+ border-width: 11px;
+}
+
+.popover > .arrow:after {
+ border-width: 10px;
+ content: "";
+}
+
+.popover.top > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-bottom-width: 0;
+ border-top-color: #999999;
+ border-top-color: rgba(0, 0, 0, 0.25);
+ bottom: -11px;
+}
+
+.popover.top > .arrow:after {
+ content: " ";
+ bottom: 1px;
+ margin-left: -10px;
+ border-bottom-width: 0;
+ border-top-color: #fff;
+}
+
+.popover.right > .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-left-width: 0;
+ border-right-color: #999999;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.right > .arrow:after {
+ content: " ";
+ left: 1px;
+ bottom: -10px;
+ border-left-width: 0;
+ border-right-color: #fff;
+}
+
+.popover.bottom > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-top-width: 0;
+ border-bottom-color: #999999;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+ top: -11px;
+}
+
+.popover.bottom > .arrow:after {
+ content: " ";
+ top: 1px;
+ margin-left: -10px;
+ border-top-width: 0;
+ border-bottom-color: #fff;
+}
+
+.popover.left > .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-right-width: 0;
+ border-left-color: #999999;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.left > .arrow:after {
+ content: " ";
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: #fff;
+ bottom: -10px;
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel-inner {
+ position: relative;
+ overflow: hidden;
+ width: 100%;
+}
+
+.carousel-inner > .item {
+ display: none;
+ position: relative;
+ transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ line-height: 1;
+}
+
+@media all and (transform-3d), (-webkit-transform-3d) {
+ .carousel-inner > .item {
+ transition: -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000px;
+ perspective: 1000px;
+ }
+ .carousel-inner > .item.next,
+ .carousel-inner > .item.active.right {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ left: 0;
+ }
+ .carousel-inner > .item.prev,
+ .carousel-inner > .item.active.left {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ left: 0;
+ }
+ .carousel-inner > .item.next.left,
+ .carousel-inner > .item.prev.right,
+ .carousel-inner > .item.active {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ left: 0;
+ }
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ display: block;
+}
+
+.carousel-inner > .active {
+ left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+.carousel-inner > .next {
+ left: 100%;
+}
+
+.carousel-inner > .prev {
+ left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+ left: 0;
+}
+
+.carousel-inner > .active.left {
+ left: -100%;
+}
+
+.carousel-inner > .active.right {
+ left: 100%;
+}
+
+.carousel-control {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 15%;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ font-size: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+
+.carousel-control.left {
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0,
0.0001) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',
endColorstr='#00000000', GradientType=1);
+}
+
+.carousel-control.right {
+ left: auto;
+ right: 0;
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0,
0.5) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',
endColorstr='#80000000', GradientType=1);
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+ outline: 0;
+ color: #fff;
+ text-decoration: none;
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ margin-top: -10px;
+ z-index: 5;
+ display: inline-block;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+ left: 50%;
+ margin-left: -10px;
+}
+
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+ right: 50%;
+ margin-right: -10px;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ line-height: 1;
+ font-family: serif;
+}
+
+.carousel-control .icon-prev:before {
+ content: '\2039';
+}
+
+.carousel-control .icon-next:before {
+ content: '\203a';
+}
+
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ margin-left: -30%;
+ padding-left: 0;
+ list-style: none;
+ text-align: center;
+}
+
+.carousel-indicators li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ border: 1px solid #fff;
+ border-radius: 10px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: transparent;
+}
+
+.carousel-indicators .active {
+ margin: 0;
+ width: 12px;
+ height: 12px;
+ background-color: #fff;
+}
+
+.carousel-caption {
+ position: absolute;
+ left: 15%;
+ right: 15%;
+ bottom: 20px;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+
+.carousel-caption .btn {
+ text-shadow: none;
+}
+
+@media screen and (min-width: 992px) {
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ font-size: 30px;
+ }
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .icon-prev {
+ margin-left: -15px;
+ }
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-next {
+ margin-right: -15px;
+ }
+ .carousel-caption {
+ left: 20%;
+ right: 20%;
+ padding-bottom: 30px;
+ }
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+
+.clearfix:before,
+.clearfix:after {
+ content: " ";
+ display: table;
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+.pull-left {
+ float: left !important;
+}
+
+.hide {
+ display: none !important;
+}
+
+.show {
+ display: block !important;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.hidden {
+ display: none !important;
+}
+
+.affix {
+ position: fixed;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+.visible-xs {
+ display: none !important;
+}
+
+.visible-sm {
+ display: none !important;
+}
+
+.visible-md {
+ display: none !important;
+}
+
+.visible-lg {
+ display: none !important;
+}
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+
+@media (max-width: 991px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table !important;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .visible-xs-block {
+ display: block !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .visible-xs-inline {
+ display: inline !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table !important;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table !important;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table !important;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .hidden-xs {
+ display: none !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-sm {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .hidden-md {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .hidden-lg {
+ display: none !important;
+ }
+}
+
+.visible-print {
+ display: none !important;
+}
+
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table !important;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+}
+
+.visible-print-block {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-block {
+ display: block !important;
+ }
+}
+
+.visible-print-inline {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-inline {
+ display: inline !important;
+ }
+}
+
+.visible-print-inline-block {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media print {
+ .hidden-print {
+ display: none !important;
+ }
+}
+
+/*
+The MIT License (MIT)
+
+Copyright (c) 2013-2015 bootstrap-select
+
+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. */
+.bootstrap-select {
+ /*width: 220px\9; IE8 and below*/
+ width: 220px \0;
+ /*IE9 and below*/
+}
+
+.bootstrap-select > .btn {
+ width: 100%;
+ height: 40px;
+ padding-right: 25px;
+}
+
+.error .bootstrap-select .btn {
+ border: 1px solid #b94a48;
+}
+
+.control-group.error .bootstrap-select .dropdown-toggle {
+ border-color: #b94a48;
+}
+
+.bootstrap-select.fit-width {
+ width: auto !important;
+}
+
+.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn)
{
+ width: 220px;
+}
+
+.bootstrap-select .btn:focus {
+ outline: thin dotted #333333 !important;
+ outline: 5px auto -webkit-focus-ring-color !important;
+ outline-offset: -2px;
+}
+
+.bootstrap-select.form-control {
+ margin-bottom: 0;
+ padding: 0;
+ border: none;
+}
+
+.bootstrap-select.form-control:not([class*="col-"]) {
+ width: 100%;
+}
+
+.bootstrap-select.btn-group:not(.input-group-btn),
+.bootstrap-select.btn-group[class*="col-"] {
+ float: none;
+ display: inline-block;
+ margin-left: 0;
+}
+
+.bootstrap-select.btn-group.dropdown-menu-right,
+.bootstrap-select.btn-group[class*="col-"].dropdown-menu-right,
+.row-fluid .bootstrap-select.btn-group[class*="col-"].dropdown-menu-right {
+ float: right;
+}
+
+.form-search .bootstrap-select.btn-group,
+.form-inline .bootstrap-select.btn-group,
+.form-horizontal .bootstrap-select.btn-group,
+.form-group .bootstrap-select.btn-group {
+ margin-bottom: 0;
+}
+
+.form-group-lg .bootstrap-select.btn-group.form-control,
+.form-group-sm .bootstrap-select.btn-group.form-control {
+ padding: 0;
+}
+
+.form-inline .bootstrap-select.btn-group .form-control {
+ width: 100%;
+}
+
+.input-append .bootstrap-select.btn-group {
+ margin-left: -1px;
+}
+
+.input-prepend .bootstrap-select.btn-group {
+ margin-right: -1px;
+}
+
+.bootstrap-select.btn-group > .disabled {
+ cursor: not-allowed;
+}
+
+.bootstrap-select.btn-group > .disabled:focus {
+ outline: none !important;
+}
+
+.bootstrap-select.btn-group .btn .filter-option {
+ display: inline-block;
+ overflow: hidden;
+ width: 100%;
+ text-align: left;
+}
+
+.bootstrap-select.btn-group .btn .caret {
+ position: absolute;
+ top: 0;
+ right: 40px;
+ margin-top: 0;
+ vertical-align: top;
+ border: 0;
+ border-left: 1px solid #ccc;
+ height: 38px;
+}
+
+.bootstrap-select.btn-group .btn .caret:before {
+ content: '\f078';
+ font-family: "FontAwesome";
+ font-size: 15px;
+ color: #666666;
+ position: absolute;
+ left: 12px;
+ top: 9px;
+ display: block;
+}
+
+.bootstrap-select.btn-group .btn:hover .caret {
+ border-color: #adadad;
+}
+
+.bootstrap-select.btn-group .btn:focus .caret {
+ border-color: #8c8c8c;
+}
+
+.bootstrap-select.btn-group[class*="col-"] .btn {
+ width: 100%;
+}
+
+.bootstrap-select.btn-group .dropdown-menu {
+ min-width: 100%;
+ z-index: 1035;
+ box-sizing: border-box;
+}
+
+.bootstrap-select.btn-group .dropdown-menu.inner {
+ position: static;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ border-radius: 0;
+ box-shadow: none;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li {
+ position: relative;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:hover small,
+.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:focus small,
+.bootstrap-select.btn-group .dropdown-menu li.active:not(.disabled) a small {
+ color: #64b1d8;
+ color: fade(#64b1d8, 40%);
+}
+
+.bootstrap-select.btn-group .dropdown-menu li.disabled a {
+ cursor: not-allowed;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a {
+ outline: none;
+ cursor: pointer;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a.opt {
+ position: relative;
+ padding-left: 2.25em;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {
+ display: none;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a span.text {
+ display: inline-block;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li small {
+ padding-left: 0.5em;
+}
+
+.bootstrap-select.btn-group .dropdown-menu .notify {
+ position: absolute;
+ bottom: 5px;
+ width: 96%;
+ margin: 0 2%;
+ min-height: 26px;
+ padding: 3px 5px;
+ background: whitesmoke;
+ border: 1px solid #e3e3e3;
+ box-shadow: inset 0 1px 1px fade(black, 5%);
+ pointer-events: none;
+ opacity: 0.9;
+ box-sizing: border-box;
+}
+
+.bootstrap-select.btn-group .no-results {
+ padding: 3px;
+ background: #f5f5f5;
+ margin: 0 5px;
+}
+
+.bootstrap-select.btn-group.fit-width .btn .filter-option {
+ position: static;
+}
+
+.bootstrap-select.btn-group.fit-width .btn .caret {
+ position: static;
+ top: auto;
+ margin-top: -1px;
+}
+
+.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {
+ position: absolute;
+ display: inline-block;
+ right: 15px;
+ margin-top: 5px;
+}
+
+.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {
+ margin-right: 34px;
+}
+
+.bootstrap-select.show-menu-arrow.open > .btn {
+ z-index: 1036;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle:before {
+ content: '';
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom-width: 7px;
+ border-bottom-style: solid;
+ border-bottom-color: #cccccc;
+ border-bottom-color: fade(#cccccc, 20%);
+ position: absolute;
+ bottom: -4px;
+ left: 9px;
+ display: none;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle:after {
+ content: '';
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid white;
+ position: absolute;
+ bottom: -4px;
+ left: 10px;
+ display: none;
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {
+ bottom: auto;
+ top: -3px;
+ border-bottom: 0;
+ border-top-width: 7px;
+ border-top-style: solid;
+ border-top-color: #cccccc;
+ border-top-color: fade(#cccccc, 20%);
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {
+ bottom: auto;
+ top: -3px;
+ border-top: 6px solid white;
+ border-bottom: 0;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {
+ right: 12px;
+ left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {
+ right: 13px;
+ left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {
+ display: block;
+}
+
+.bootstrap-select.btn-group.open .btn .caret {
+ border-left-color: #adadad;
+}
+
+.bootstrap-select.btn-group.open .btn:hover .caret {
+ border-left-color: #8c8c8c;
+}
+
+.bs-searchbox,
+.bs-actionsbox {
+ padding: 4px 8px;
+}
+
+.bs-actionsbox {
+ float: left;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.bs-actionsbox .btn-group button {
+ width: 50%;
+}
+
+.bs-searchbox + .bs-actionsbox {
+ padding: 0 8px 4px;
+}
+
+.bs-searchbox input.form-control {
+ margin-bottom: 0;
+ width: 100%;
+}
+
+.mobile-device {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block !important;
+ width: 100%;
+ height: 100% !important;
+ opacity: 0;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 80px !important;
+ padding-right: 60px !important;
+}
+
+.alert {
+ border-width: 0 0 0 5px;
+}
+
+.hide-content {
+ display: none !important;
+}
+
+.help-block {
+ color: #444;
+}
+
+.login-area {
+ margin: 90px auto 0;
+ width: 300px;
+}
+
+.login-area .btn-login {
+ display: block;
+ position: static;
+ float: none;
+ margin-bottom: 50px;
+}
+
+.login-area .col-md-12, .login-area .col-lg-12 {
+ width: 100%;
+}
+
+.login-area .bootstrap-select,
+.login-area .selectpicker {
+ font-family: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+}
+
+.login-area .dropdown-toggle.selectpicker {
+ height: 40px;
+}
+
+.login-area .form-group {
+ margin-bottom: 20px;
+}
+
+.login-area .form-group:last-child {
+ margin-bottom: 0;
+}
+
+.toolbar {
+ height: 40px;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ background: #3a393b;
+}
+
+.toolbar .tools {
+ height: 40px;
+}
+
+.toolbar a {
+ font-family: "Helvetica Neue LT W1G 55 Roman", "Helvetica Neue LT
W1G", "HelveticaNeue Roman", "HelveticaNeue-Roman",
"Helvetica Neue Roman", "Helvetica Neue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ display: inline-block;
+ color: #fff;
+ text-decoration: none;
+ font-size: 13pt;
+ vertical-align: middle;
+ padding: 6px 0;
+ margin-left: 50px;
+}
+
+.toolbar span, .toolbar .fa {
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.toolbar .fa {
+ font-size: 24px;
+ margin-right: 15px;
+}
+
+#host-root-container .toolbar {
+ background-color: #008abf !important;
+}
+
+#guests-root-container .toolbar {
+ background-color: #8cc63f !important;
+}
+
+#templates-root-container .toolbar {
+ background-color: #00a6a0 !important;
+}
+
+#storage-root-container .toolbar {
+ background-color: #feb813 !important;
+}
+
+#network-root-container .toolbar {
+ background-color: #7f1c7d !important;
+}
+
+#administration-root-container .toolbar {
+ background-color: #d9182d !important;
+}
+
+.btn {
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+}
+
+.btn-login {
+ color: #fff;
+ background-color: #008abf;
+ border-color: #008abf;
+}
+
+.btn-login:focus,
+.btn-login.focus {
+ color: #fff;
+ background-color: #00658c;
+ border-color: #002e40;
+}
+
+.btn-login:hover {
+ color: #fff;
+ background-color: #00658c;
+ border-color: #005e82;
+}
+
+.btn-login:active,
+.btn-login.active,
+.open > .btn-login.dropdown-toggle {
+ color: #fff;
+ background-color: #00658c;
+ border-color: #005e82;
+}
+
+.btn-login:active:hover,
+.btn-login:active:focus,
+.btn-login:active.focus,
+.btn-login.active:hover,
+.btn-login.active:focus,
+.btn-login.active.focus,
+.open > .btn-login.dropdown-toggle:hover,
+.open > .btn-login.dropdown-toggle:focus,
+.open > .btn-login.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #004b68;
+ border-color: #002e40;
+}
+
+.btn-login:active,
+.btn-login.active,
+.open > .btn-login.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-login.disabled,
+.btn-login.disabled:hover,
+.btn-login.disabled:focus,
+.btn-login.disabled.focus,
+.btn-login.disabled:active,
+.btn-login.disabled.active,
+.btn-login[disabled],
+.btn-login[disabled]:hover,
+.btn-login[disabled]:focus,
+.btn-login[disabled].focus,
+.btn-login[disabled]:active,
+.btn-login[disabled].active,
+fieldset[disabled] .btn-login,
+fieldset[disabled] .btn-login:hover,
+fieldset[disabled] .btn-login:focus,
+fieldset[disabled] .btn-login.focus,
+fieldset[disabled] .btn-login:active,
+fieldset[disabled] .btn-login.active {
+ background-color: #008abf;
+ border-color: #008abf;
+}
+
+.btn-login .badge {
+ color: #008abf;
+ background-color: #fff;
+}
+
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+.dialog-border-grey {
+ background-clip: border-box;
+ border: 6px solid rgba(170, 170, 170, 0.3);
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ border-radius: 5px;
+}
+
+.dialog-container {
+ border: 3px solid #999999;
+ background: white;
+}
+
+.dialog-container .dialog-title {
+ height: 60px;
+ padding: 20px 0 20px 20px;
+ margin: 0;
+ float: left;
+ font-size: 27px;
+ font-family: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-weight: 300 !important;
+}
+
+.dialog-container .dialog-body {
+ position: relative;
+}
+
+.dialog-container .dialog-footer {
+ height: 50px;
+ background-color: #008ABF;
+}
+
+.dialog-container .dialog-footer .dialog-button {
+ display: inline-block;
+ background-color: white;
+ width: 75px;
+ height: 30px;
+ line-height: 30px;
+ position: relative;
+ margin-left: 10px;
+ margin-top: 10px;
+ text-align: center;
+ vertical-align: middle;
+}
+
+.dialog-container .dialog-footer .dialog-button:hover {
+ background-color: #EEEEEE;
+ cursor: pointer;
+}
+
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+.menu-flat .btn {
+ background: #4d4c4e !important;
+ min-width: 160px;
+ border: 0 !important;
+ font-family: "HelveticaNeueBold", "HelveticaNeue-Bold",
"HelveticaNeue Bold", "Helvetica Neue Bold", "Helvetica
Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande",
sans-serif;
+ font-weight: 700;
+ font-size: 13.5pt;
+ position: relative;
+ height: 40px;
+ padding: 4px 45px 5px 38px;
+}
+
+.menu-flat .btn > i {
+ font-size: 22px;
+ vertical-align: bottom;
+ width: 26px;
+ height: 40px;
+ text-align: left;
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 6px;
+}
+
+.menu-flat .btn > i:before {
+ line-height: 40px;
+}
+
+.menu-flat .caret {
+ position: absolute;
+ top: 0;
+ right: 0;
+ display: block;
+ width: 40px;
+ height: 40px;
+ margin-left: 0;
+ vertical-align: middle;
+ border-top: 0;
+ border-top: 0 \9;
+ border-right: 0;
+ border-left: 0;
+}
+
+.menu-flat .caret:before {
+ font-family: "fontello";
+ font-style: normal;
+ font-weight: normal;
+ font-size: 13px;
+ speak: none;
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1.2em;
+ height: 1.2em;
+ margin: .5em;
+ text-align: center;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 2em;
+ content: '\e861';
+}
+
+.menu-flat.dropup,
+.menu-flat.dropdown {
+ position: relative;
+}
+
+.menu-flat .dropdown-toggle:focus {
+ outline: 0;
+}
+
+.menu-flat .dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ font-size: 13.5pt;
+ text-align: left;
+ background-color: #3a393b;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none !important;
+ background-clip: padding-box;
+}
+
+.menu-flat .dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.menu-flat .dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #404042;
+}
+
+.menu-flat .dropdown-menu > li > a {
+ border-top: 1px solid #2e2e2e;
+ box-shadow: inset 0px 1px 0px 0px #404042;
+}
+
+.menu-flat .dropdown-menu > li:first-child > a {
+ border-top: 1px solid #3a393b;
+ box-shadow: none;
+}
+
+.menu-flat .dropdown-menu > li.critical:last-child > a {
+ box-shadow: none;
+}
+
+.menu-flat .dropdown-menu > li > a {
+ display: block;
+ padding: 4px 6px;
+ clear: both;
+ font-weight: normal;
+ line-height: 31px;
+ color: #fff;
+ white-space: nowrap;
+}
+
+.menu-flat .dropdown-menu > li > a > i {
+ font-size: 22px;
+ margin-right: 10px;
+ vertical-align: top;
+ width: 26px;
+ height: 26px;
+ text-align: left;
+ display: inline-block;
+}
+
+.menu-flat .dropdown-menu > li > a:hover,
+.menu-flat .dropdown-menu > li > a:focus {
+ text-decoration: none;
+ color: #fff;
+ background-color: #3a393b;
+}
+
+.menu-flat .dropdown-menu > .active > a,
+.menu-flat .dropdown-menu > .active > a:hover,
+.menu-flat .dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ background-color: #3a393b;
+}
+
+.menu-flat .dropdown-menu > li.critical > a {
+ background: #d9182d;
+}
+
+.menu-flat .dropdown-menu > .disabled > a,
+.menu-flat .dropdown-menu > .disabled > a:hover,
+.menu-flat .dropdown-menu > .disabled > a:focus {
+ color: #999;
+}
+
+.menu-flat .dropdown-menu > .disabled > a:hover,
+.menu-flat .dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ cursor: not-allowed;
+}
+
+.menu-flat.open .btn {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.menu-flat.open > .dropdown-menu {
+ display: block;
+}
+
+.menu-flat.open .caret {
+ background: #3a393b;
+}
+
+.menu-flat.open .caret:before {
+ content: '\e864';
+}
+
+.menu-flat.open > a {
+ outline: 0;
+}
+
+.dropdown-menu-right {
+ left: auto;
+ right: 0;
+}
+
+.dropdown-menu-left {
+ left: 0;
+ right: auto;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.428571429;
+ color: #999;
+ white-space: nowrap;
+}
+
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: 990;
+}
+
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ border-top: 0;
+ border-bottom: 4px dashed;
+ border-bottom: 4px solid \9;
+ content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+}
+
+@media (min-width: 992px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .navbar-right .dropdown-menu-left {
+ left: 0;
+ right: auto;
+ }
+}
+
+pre {
+ margin-top: 20px;
+}
+
+@media screen and (min-width: 768px) {
+ .container {
+ width: 1540px;
+ }
+}
+
+@media screen and (min-width: 1680px) {
+ .container {
+ width: 1540px;
+ }
+}
+
+/*#
sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb3RzdHJhcC5jdXN0b20uc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvY29tcGFzcy1taXhpbnMvbGliL2NvbXBhc3MvZnVuY3Rpb25zL19saXN0cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9jb21wYXNzLW1peGlucy9saWIvY29tcGFzcy9mdW5jdGlvbnMvX2NvbnN0YW50cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9jb21wYXNzLW1peGlucy9saWIvY29tcGFzcy9mdW5jdGlvbnMvX2Rpc3BsYXkuc2NzcyIsInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9fYm9vdHN0cmFwLXdvay5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19ub3JtYWxpemUuc2NzcyIsImJvb3RzdHJhcC5jdXN0b20uY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19wcmludC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19zY2FmZm9sZGluZy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdmVuZG9yLXByZWZpeGVzLnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX3dvay12YXJpYWJsZXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3RhYi1mb2N1cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9faW1hZ2Uuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fdHlwZS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdGV4dC1lbXBoYXNpcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fYmFja2dyb3VuZC12YXJpYW50LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19jbGVhcmZpeC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdGV4dC1vdmVyZmxvdy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19jb2RlLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2dyaWQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2dyaWQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2dyaWQtZnJhbWV3b3JrLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3RhYmxlcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdGFibGUtcm93LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2Zvcm1zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19mb3Jtcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19idXR0b25zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19idXR0b25zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19vcGFjaXR5LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2NvbXBvbmVudC1hbmltYXRpb25zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2Ryb3Bkb3ducy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fbmF2LWRpdmlkZXIuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3Jlc2V0LWZpbHRlci5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19idXR0b24tZ3JvdXBzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19ib3JkZXItcmFkaXVzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2lucHV0LWdyb3Vwcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19uYXZzLnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX25hdmJhci1mbGF0LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2NvbXBhc3MtbWl4aW5zL2xpYi9jb21wYXNzL2NzczMvX3NoYXJlZC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9jb21wYXNzLW1peGlucy9saWIvY29tcGFzcy9jc3MzL191c2VyLWludGVyZmFjZS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fbmF2LXZlcnRpY2FsLWFsaWduLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2JyZWFkY3J1bWJzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3BhZ2luYXRpb24uc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3BhZ2luYXRpb24uc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcGFnZXIuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fbGFiZWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19sYWJlbHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fYmFkZ2VzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2p1bWJvdHJvbi5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL190aHVtYm5haWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2FsZXJ0cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fYWxlcnRzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3Byb2dyZXNzLWJhcnMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2dyYWRpZW50cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fcHJvZ3Jlc3MtYmFyLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX21lZGlhLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2xpc3QtZ3JvdXAuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2xpc3QtZ3JvdXAuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcGFuZWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19wYW5lbHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcmVzcG9uc2l2ZS1lbWJlZC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL193ZWxscy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19jbG9zZS5zY3NzIiwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL19tb2RhbC1mbGF0LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3Rvb2x0aXAuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3Jlc2V0LXRleHQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcG9wb3ZlcnMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fY2Fyb3VzZWwuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fdXRpbGl0aWVzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19jZW50ZXItYmxvY2suc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2hpZGUtdGV4dC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19yZXNwb25zaXZlLXV0aWxpdGllcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fcmVzcG9uc2l2ZS12aXNpYmlsaXR5LnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX2Jvb3RzdHJhcC1zZWxlY3Quc2NzcyIsInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9fbG9naW4uc2NzcyIsInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9fdG9vbGJhci5zY3NzIiwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL19idXR0b25zLnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX2RpYWxvZy1mbGF0LnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX21lbnUtZmxhdC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FDaEJIOzs7R0FHRztBQ0hIOzs7R0FHRztBQ0hIOzs7R0FHRztBQ0hIOzs7O0dBSUc7QUNKSCw0RUFBNEU7QUFRNUU7RUFDRSx3QkFBd0I7RUFDeEIsMkJBQTJCO0VBQzNCLCtCQUErQjtDQUgzQjs7QUFVTjtFQUNFLFVBQVU7Q0FETjs7QUEwQk47Ozs7Ozs7Ozs7Ozs7RUFDRSxlQUFlO0NBRFI7O0FBWVQ7Ozs7RUFDRSxzQkFBc0I7RUFDdEIseUJBQXlCO0NBRnBCOztBQVVhO0VBQ2xCLGNBQWM7RUFDZCxVQUFVO0NBRlc7O0FDUXZCOztFRElFLGNBQWM7Q0FETjs7QUFXVjtFQUNFLDhCQUE4QjtDQUQ3Qjs7QUFVRjs7RUFDQyxXQUFXO0NBREo7O0FBV0M7RUFDUiwwQkFBMEI7Q0FEZjs7QUFTYjs7RUFDRSxrQkFBa0I7Q0FEWjs7QUFRUjtFQUNFLG1CQUFtQjtDQURoQjs7QUFTTDtFQUNFLGVBQWU7RUFDZixpQkFBaUI7Q0FGZjs7QUFTSjtFQUNFLGlCQUFpQjtFQUNqQixZQUFZO0NBRlI7O0FBU047RUFDRSxlQUFlO0NBRFY7O0FBU1A7O0VBQ0UsZUFBZTtFQUNmLGVBQWU7RUFDZixtQkFBbUI7RUFDbkIseUJBQXlCO0NBSnRCOztBQU9MO0VBQ0UsWUFBWTtDQURUOztBQUlMO0VBQ0UsZ0JBQWdCO0NBRGI7O0FBV0w7RUFDRSxVQUFVO0NBRFA7O0FBUVE7RUFDWCxpQkFBaUI7Q0FESDs7QUFXaEI7RUFDRSxpQkFBZ0I7Q0FEVjs7QUFRUjtFQUNFLHdCQUF3QjtFQUN4QixVQUFVO0NBRlI7O0FBU0o7RUFDRSxlQUFlO0NBRFo7O0FBV0w7Ozs7RUFDRSxrQ0FBa0M7RUFDbEMsZUFBZTtDQUZYOztBQXdCTjs7Ozs7RUFDRSxlQUFlO0VBQ2YsY0FBYztFQUNkLFVBQVU7Q0FIRjs7QUFVVjtFQUNFLGtCQUFrQjtDQURaOztBQVlSOztFQUNFLHFCQUFxQjtDQURmOztBQWVXOzs7RUFDakIsMkJBQTJCO0VBQzNCLGdCQUFnQjtDQUZJOztBQVVIOztFQUNqQixnQkFBZ0I7Q0FESTs7QUFTakI7O0VBQ0gsVUFBVTtFQUNWLFdBQVc7Q0FGWTs7QUFVekI7RUFDRSxvQkFBb0I7Q0FEZjs7QUFhVzs7RUFDaEIsdUJBQXVCO0VBQ3ZCLFdBQVc7Q0FGUTs7QUFZRDs7RUFDbEIsYUFBYTtDQURrQzs7QUFTOUI7RUFDakIsOEJBQThCO0VBQzlCLHdCQUF3QjtDQUZKOztBQVlGOztFQUNsQix5QkFBeUI7Q0FEc0I7O0FBUWpEO0VBQ0UsMEJBQTBCO0VBQzFCLGNBQWE7RUFDYiwrQkFBOEI7Q0FIdEI7O0FBV1Y7RUFDRSxVQUFVO0VBQ1YsV0FBVztDQUZMOztBQVNSO0VBQ0UsZUFBZTtDQURQOztBQVNWO0VBQ0Usa0JBQWtCO0NBRFY7O0FBV1Y7RUFDRSwwQkFBMEI7RUFDMUIsa0JBQWtCO0NBRmI7O0FBTVA7O0VBQ0UsV0FBVztDQURUOztBRXJhSixxRkFBcUY7QUFPckY7RUFHSzs7O0lBQ0csbUNBQW1DO0lBQ25DLHVCQUF1QjtJQUN2Qiw0QkFBNEI7SUFDNUIsNkJBQTZCO0dBSnhCO0VBUVI7O0lBQ0csMkJBQTJCO0dBRHBCO0VBSUo7SUFDSCw2QkFBNEI7R0FEakI7RUFJSjtJQUNQLDhCQUE2QjtHQURkO0VBT0c7O0lBQ2xCLFlBQVk7R0FEYztFQUs5Qjs7SUFDSSx1QkFBdUI7SUFDdkIseUJBQXlCO0dBRmpCO0VBS1o7SUFDSSw0QkFBNEI7R0FEekI7RUFLUDs7SUFDSSx5QkFBeUI7R0FEeEI7RUFJTDtJQUNJLDJCQUEyQjtHQUQxQjtFQU1MOzs7SUFDSSxXQUFXO0lBQ1gsVUFBVTtHQUZWO0VBTUo7O0lBQ0ksd0JBQXdCO0dBRHhCO0VBT0o7SUFDSSxjQUFjO0dBRFQ7RUFLSDs7SUFDRSxrQ0FBa0M7R0FENUI7RUFJZDtJQUNJLHVCQUF1QjtHQURuQjtFQUlSO0lBQ0kscUNBQXFDO0dBRGpDO0VBSUo7O0lBQ0ksa0NBQWtDO0dBRGxDO0VBTUo7O0lBQ0ksa0NBQWtDO0dBRGxDO0NEbU9YOztBRXZURDtFQ2tFVSx1QkRqRXNCO0NBRDdCOztBQUlGOztFQzhEUyx1QkQ3RHNCO0NBRHZCOztBQU9UO0VBQ0UsZ0JBQWdCO0VBQ2hCLHlDQUFpQztDQUY3Qjs7QUFLTjtFQUNFLHNLRTBDZ0w7RUZ6Q2hMLGdCRW1ENEI7RUZsRDVCLHlCRStEbUM7RUY5RG5DLFlFakIyQjtFRmtCM0IsdUJFb0IwQjtDRnpCdEI7O0FBWU47Ozs7RUFDRSxxQkFBcUI7RUFDckIsbUJBQW1CO0VBQ25CLHFCQUFxQjtDQUhiOztBQVNWO0VBQ0UsZUU3QjZCO0VGOEI3QixzQkFBc0I7Q0FGckI7O0FBS0E7O0VBQ0MsZUVPMEI7RUZOMUIsMkJFUTZCO0NGVnRCOztBQUtSO0VHckRELHFCQUFxQjtFQUVyQiwyQ0FBMkM7RUFDM0MscUJBQXFCO0NIa0RaOztBQVdYO0VBQ0UsVUFBVTtDQURKOztBQU9SO0VBQ0UsdUJBQXVCO0NBRHBCOztBQUtMO0VJdkVFLGVBRG1DO0VBRW5DLGdCQUFnQjtFQUNoQixhQUFhO0NKcUVFOztBQUtqQjtFQUNFLG1CRXFENkI7Q0Z0RGpCOztBQU9kO0VBQ0UsYUV5c0IrQjtFRnhzQi9CLHlCRUZtQztFRkduQyx1QkU1QzBCO0VGNkMxQix1QkUwc0JnQztFRnpzQmhDLG1CRXlDNkI7RURpRHJCLGlDRHpGK0I7RUl6RnZDLHNCSjRGb0M7RUkzRnBDLGdCQUFnQjtFQUNoQixhQUFhO0NKaUZDOztBQWFoQjtFQUNFLG1CQUFtQjtDQURSOztBQU9iO0VBQ0UsaUJFbkI2QjtFRm9CN0Isb0JFcEI2QjtFRnFCN0IsVUFBVTtFQUNWLDJCRW5HNEI7Q0YrRjFCOztBQVlKO0VBQ0UsbUJBQW1CO0VBQ25CLFdBQVc7RUFDWCxZQUFZO0VBQ1osYUFBYTtFQUNiLFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsdUJBQVU7RUFDVixVQUFVO0NBUkY7O0FBaUJQOztFQUNDLGlCQUFpQjtFQUNqQixZQUFZO0VBQ1osYUFBYTtFQUNiLFVBQVU7RUFDVixrQkFBa0I7RUFDbEIsV0FBVztDQU5KOztBRjBTWDtFRXhSRSxnQkFBZ0I7Q0FERDs7QUtySlE7O0VBQ3ZCLHFCSHVGK0I7RUd0Ri9CLGlCSHVGMkI7RUd0RjNCLGlCSHVGMkI7RUd0RjNCLGVIdUYrQjtDRzNGSDs7QUFPNUI7Ozs7Ozs7Ozs7Ozs7O0VBQ0Usb0JBQW9CO0VBQ3BCLGVBQWU7RUFDZixZSEgyQjtDR0FyQjs7QUFTTjs7O0VBQ0YsaUJIb0U2QjtFR25FN0Isb0JBQXFDO0NBRjlCOztBQUtQOzs7Ozs7Ozs7RUFDRSxlQUFlO0NBRFQ7O0FBTU47OztFQUNGLGlCQUFrQztFQUNsQyxvQkFBcUM7Q0FGOUI7O0FBS1A7Ozs7Ozs7OztFQUNFLGVBQWU7Q0FEVDs7QUFLTjtFQUFNLG1CSHNDdUI7Q0d0Q3hCOztBQUNMO0VBQU0sZ0JIc0NvQjtDR3RDckI7O0FBQ0w7RUFBTSxnQkhzQ29CO0NHdENyQjs7QUFDTDtFQUFNLGdCSDhCb0I7Q0c5QnJCOztBQUNMO0VBQU0sZ0JINkJvQjtDRzdCckI7O0FBQ0w7RUFBTSxnQkg0Qm9CO0NHNUJyQjs7QUFNVDtFQUNFLGlCQUFrQztDQURqQzs7QUFJSDtFQUNFLG9CSGdDNkI7RUcvQjdCLGdCQUFnQjtFQUNoQixpQkFBaUI7RUFDakIsaUJBQWlCO0NBSlo7O0FBTUw7RUFORjtJQU9JLGdCQUEyQjtHQVB4QjtDUHNlTjs7QU9yZEQ7O0VBQ0UsZUFBZ0I7Q0FEVjs7QUFLUjs7RUFDRSwwQkhtZXNDO0VHbGV0QyxjQUFjO0NBRlQ7O0FBTVA7RUFBdUIsaUJBQWlCO0NBQWxCOztBQUN0QjtFQUF1QixrQkFBa0I7Q0FBbkI7O0FBQ3RCO0VBQXVCLG1CQUFtQjtDQUFwQjs7QUFDdEI7RUFBdUIsb0JBQW9CO0NBQXJCOztBQUN0QjtFQUF1QixvQkFBb0I7Q0FBckI7O0FBR3RCO0VBQXVCLDBCQUEwQjtDQUEzQjs7QUFDdEI7RUFBdUIsMEJBQTBCO0NBQTNCOztBQUN0QjtFQUF1QiwyQkFBMkI7Q0FBNUI7O0FBR3RCO0VBQ0UsWUh0RjZCO0NHcUZsQjs7QUNsR2tDO0VBRTNDLGVKYzJCO0NJZjNCOztBQUVEOztFQUVDLGVBQWE7Q0FEYjs7QUFKMkM7RUFFM0MsZUp5aUJvQztDSTFpQnBDOztBQUVEOztFQUVDLGVBQWE7Q0FEYjs7QUFKMkM7RUFFM0MsZUo2aUJvQztDSTlpQnBDOztBQUVEOztFQUVDLGVBQWE7Q0FEYjs7QUFKMkM7RUFFM0MsZUppakJvQztDSWxqQnBDOztBQUVEOztFQUVDLGVBQWE7Q0FEYjs7QUFKMkM7RUFFM0MsZUpxakJvQztDSXRqQnBDOztBQUVEOztFQUVDLGVBQWE7Q0FEYjs7QUQrR0o7RUFHRSxZQUFZO0NBSEQ7O0FFbkh1QjtFQUVoQywwQkxjMkI7Q0tmM0I7O0FBRUQ7O0VBRUMsMEJBQXdCO0NBRHhCOztBQUpnQztFQUVoQywwQkwwaUJvQztDSzNpQnBDOztBQUVEOztFQUVDLDBCQUF3QjtDQUR4Qjs7QUFKZ0M7RUFFaEMsMEJMOGlCb0M7Q0svaUJwQzs7QUFFRDs7RUFFQywwQkFBd0I7Q0FEeEI7O0FBSmdDO0VBRWhDLDBCTGtqQm9DO0NLbmpCcEM7O0FBRUQ7O0VBRUMsMEJBQXdCO0NBRHhCOztBQUpnQztFQUVoQywwQkxzakJxQztDS3ZqQnJDOztBQUVEOztFQUVDLDBCQUF3QjtDQUR4Qjs7QUZrSUo7RUFDRSxvQkFBdUM7RUFDdkMsb0JIN0M2QjtFRzhDN0IsOEJIM0g0QjtDR3dIaEI7O0FBWWQ7O0VBQ0UsY0FBYztFQUNkLG9CQUFxQztDQUZuQzs7QUFJRjs7OztFQUNFLGlCQUFpQjtDQURmOztBQWFOO0VBSkUsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtDQUdIOztBQU1oQjtFQVZFLGdCQUFnQjtFQUNoQixpQkFBaUI7RUFXakIsa0JBQWtCO0NBRk47O0FBSVY7RUFDQSxzQkFBc0I7RUFDdEIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtDQUhmOztBQVFSO0VBQ0UsY0FBYztFQUNkLG9CSDVGNkI7Q0cwRjNCOztBQUtKOztFQUNFLHlCSGxHbUM7Q0dpR2pDOztBQUdKO0VBQ0Usa0JBQWtCO0NBRGhCOztBQUdKO0VBQ0UsZUFBZTtDQURiOztBR3JMRDs7RUFDQyxhQUFhO0VBQ2IsZUFBZTtDQUZSOztBQUlSO0VBQ0MsWUFBWTtDQURMOztBSCtMVDtFQUNFO0lBQ0UsWUFBWTtJQUNaLGFBQTZCO0lBQzdCLFlBQVk7SUFDWixrQkFBa0I7SUlsTnRCLGlCQUFpQjtJQUNqQix3QkFBd0I7SUFDeEIsb0JBQW9CO0dKNE1kO0VBT0o7SUFDRSxtQkhvckI2QjtHR3JyQjNCO0NQc2lCUDs7QU96aEJ1Qjs7RUFDdEIsYUFBYTtFQUNiLCtCSHhONkI7Q0dzTko7O0FBSTNCO0VBQ0UsZUFBZTtDQURKOztBQU1iO0VBQ0UsbUJIbko2QjtFR29KN0IsaUJIcEo2QjtFR3FKN0Isa0JIcXFCNEM7RUdwcUI1Qyw0QkhuTzRCO0NHK05sQjs7QUFTUDs7O0VBQ0MsaUJBQWlCO0NBREw7O0FBU2hCOzs7RUFDRSxlQUFlO0VBQ2YsZUFBZTtFQUNmLHlCSHpLaUM7RUcwS2pDLFlIdFAyQjtDR2tQckI7O0FBTUw7OztFQUNDLHVCQUF1QjtDQURmOztBQVVKOztFQUNSLG9CQUFvQjtFQUNwQixnQkFBZ0I7RUFDaEIsNkJIcFE0QjtFR3FRNUIsZUFBZTtFQUNmLGtCQUFrQjtDQUxHOztBQVdsQjs7Ozs7O0VBQVUsWUFBWTtDQUFiOztBQUNUOzs7Ozs7RUFDQyx1QkFBdUI7Q0FEaEI7O0FBT2I7RUFDRSxvQkh4TTZCO0VHeU03QixtQkFBbUI7RUFDbkIseUJINU1tQztDR3lNNUI7O0FLNVJUOzs7O0VBQ0UsK0RSOER5RTtDUS9EckU7O0FBS047RUFDRSxpQkFBZ0I7RUFDaEIsZUFBZTtFQUNmLGVSNDJCbUM7RVEzMkJuQywwQlI0MkJtQztFUTMyQm5DLG1CUnVINkI7Q1E1SHpCOztBQVNOO0VBQ0UsaUJBQWdCO0VBQ2hCLGVBQWU7RUFDZixZUnMyQmdDO0VRcjJCaEMsdUJSczJCZ0M7RVFyMkJoQyxtQlJnSDZCO0VRL0c3QiwrQ0FBK0I7Q0FONUI7O0FBUUg7RUFDRSxXQUFXO0VBQ1gsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtFQUNsQixpQkFBaUI7Q0FKZDs7QUFTUDtFQUNFLGVBQWU7RUFDZixlQUFnQztFQUNoQyxpQkFBa0M7RUFDbEMsZ0JBQTJCO0VBQzNCLHlCUitDbUM7RVE5Q25DLHNCQUFzQjtFQUN0QixzQkFBc0I7RUFDdEIsWVJuQzJCO0VRb0MzQiwwQlJrMUJtQztFUWoxQm5DLHVCUm0xQmdDO0VRbDFCaEMsbUJSdUY2QjtDUWxHMUI7O0FBY0g7RUFDRSxXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLGVBQWU7RUFDZixzQkFBc0I7RUFDdEIsOEJBQThCO0VBQzlCLGlCQUFpQjtDQU5iOztBQVdSO0VBQ0Usa0JSbzBCaUM7RVFuMEJqQyxtQkFBbUI7Q0FGSjs7QUN4RGpCO0VDSEUsbUJBQW1CO0VBQ25CLGtCQUFrQjtFQUNsQixnQkFBdUI7RUFDdkIsaUJBQXVCO0NEQWI7O0FIS1Q7O0VBQ0MsYUFBYTtFQUNiLGVBQWU7Q0FGUjs7QUFJUjtFQUNDLFlBQVk7Q0FETDs7QUdOVDtFQUhGO0lBSUksYVRrWWlDO0dTdFl6QjtDYis0Qlg7O0FhejRCQztFQU5GO0lBT0ksY1RvWWtDO0dTM1kxQjtDYnE1Qlg7O0FhNTRCQztFQVRGO0lBVUksY1RzWWtDO0dTaFoxQjtDYjI1Qlg7O0FhdjRCRDtFQ3ZCRSxtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLGdCQUF1QjtFQUN2QixpQkFBdUI7Q0RvQlA7O0FIZmY7O0VBQ0MsYUFBYTtFQUNiLGVBQWU7Q0FGUjs7QUFJUjtFQUNDLFlBQVk7Q0FETDs7QUdvQlg7RUN2QkUsZUFBa0I7RUFDbEIsZ0JBQW1CO0NEc0JmOztBSHhCSDs7RUFDQyxhQUFhO0VBQ2IsZUFBZTtDQUZSOztBQUlSO0VBQ0MsWUFBWTtDQURMOztBS1RSO0VBRUMsbUJBQW1CO0VBRW5CLGdCQUFnQjtFQUVoQixnQkFBbUI7RUFDbkIsaUJBQW9CO0NBTnBCOztBQWVEO0VBRUMsWUFBWTtDQURaOztBQU9xQztFQUVuQyxxQkFBaUI7Q0FEakI7O0FBRG1DO0VBRW5DLHNCQUFpQjtDQURqQjs7QUFEbUM7RUFFbkMsV0FBaUI7Q0FEakI7O0FBRG1DO0VBRW5DLHNCQUFpQjtDQURqQjs7QUFEbUM7RUFFbkMsc0JBQWlCO0NBRGpCOztBQURtQztFQUVuQyxXQUFpQjtDQURqQjs7QUFEbUM7RUFFbkMsc0JBQWlCO0NBRGpCOztBQURtQztFQUVuQyxzQkFBaUI7Q0FEakI7O0FBRG1DO0VBRW5DLFdBQWlCO0NBRGpCOztBQURtQztFQUVuQyxzQkFBaUI7Q0FEakI7O0FBRG1DO0VBRW5DLHNCQUFpQjtDQURqQjs7QUFEbUM7RUFFbkMsWUFBaUI7Q0FEakI7O0FBbUJtQztFQUVuQyxZQUFZO0NBRFo7O0FBTmtDO0VBRWxDLHFCQUFpQjtDQURqQjs7QUFEa0M7RUFFbEMsc0JBQWlCO0NBRGpCOztBQURrQztFQUVsQyxXQUFpQjtDQURqQjs7QUFEa0M7RUFFbEMsc0JBQWlCO0NBRGpCOztBQURrQztFQUVsQyxzQkFBaUI7Q0FEakI7O0FBRGtDO0VBRWxDLFdBQWlCO0NBRGpCOztBQURrQztFQUVsQyxzQkFBaUI7Q0FEakI7O0FBRGtDO0VBRWxDLHNCQUFpQjtDQURqQjs7QUFEa0M7RUFFbEMsV0FBaUI7Q0FEakI7O0FBRGtDO0VBRWxDLHNCQUFpQjtDQURqQjs7QUFEa0M7RUFFbEMsc0JBQWlCO0NBRGpCOztBQURrQztFQUVsQyxZQUFpQjtDQURqQjs7QUFObUM7RUFFbkMsV0FBVztDQURYOztBQU5rQztFQUVsQyxvQkFBZ0I7Q0FEaEI7O0FBRGtDO0VBRWxDLHFCQUFnQjtDQURoQjs7QUFEa0M7RUFFbEMsVUFBZ0I7Q0FEaEI7O0FBRGtDO0VBRWxDLHFCQUFnQjtDQURoQjs7QUFEa0M7RUFFbEMscUJBQWdCO0NBRGhCOztBQURrQztFQUVsQyxVQUFnQjtDQURoQjs7QUFEa0M7RUFFbEMscUJBQWdCO0NBRGhCOztBQURrQztFQUVsQyxxQkFBZ0I7Q0FEaEI7O0FBRGtDO0VBRWxDLFVBQWdCO0NBRGhCOztBQURrQztFQUVsQyxxQkFBZ0I7Q0FEaEI7O0FBRGtDO0VBRWxDLHFCQUFnQjtDQURoQjs7QUFEa0M7RUFFbEMsV0FBZ0I7Q0FEaEI7O0FBbUJtQjtFQUVuQixnQkFBdUI7Q0FEdkI7O0FBRG1CO0VBRW5CLDJCQUF1QjtDQUR2Qjs7QUFEbUI7RUFFbkIsNEJBQXVCO0NBRHZCOztBQURtQjtFQUVuQixpQkFBdUI7Q0FEdkI7O0FBRG1CO0VBRW5CLDRCQUF1QjtDQUR2Qjs7QUFEbUI7RUFFbkIsNEJBQXVCO0NBRHZCOztBQURtQjtFQUVuQixpQkFBdUI7Q0FEdkI7O0FBRG1CO0VBRW5CLDRCQUF1QjtDQUR2Qjs7QUFEbUI7RUFFbkIsNEJBQXVCO0NBRHZCOztBQURtQjtFQUVuQixpQkFBdUI7Q0FEdkI7O0FBRG1CO0VBRW5CLDRCQUF1QjtDQUR2Qjs7QUFEbUI7RUFFbkIsNEJBQXVCO0NBRHZCOztBQURtQjtFQUVuQixrQkFBdUI7Q0FEdkI7O0FGSU47RUV0Q0c7SUFFQyxZQUFZO0dBRFo7RUFPcUM7SUFFbkMscUJBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLHNCQUFpQjtHQURqQjtFQURtQztJQUVuQyxXQUFpQjtHQURqQjtFQURtQztJQUVuQyxzQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsc0JBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLFdBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLHNCQUFpQjtHQURqQjtFQURtQztJQUVuQyxzQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsV0FBaUI7R0FEakI7RUFEbUM7SUFFbkMsc0JBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLHNCQUFpQjtHQURqQjtFQURtQztJQUVuQyxZQUFpQjtHQURqQjtFQW1CbUM7SUFFbkMsWUFBWTtHQURaO0VBTmtDO0lBRWxDLHFCQUFpQjtHQURqQjtFQURrQztJQUVsQyxzQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsV0FBaUI7R0FEakI7RUFEa0M7SUFFbEMsc0JBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLHNCQUFpQjtHQURqQjtFQURrQztJQUVsQyxXQUFpQjtHQURqQjtFQURrQztJQUVsQyxzQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsc0JBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLFdBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLHNCQUFpQjtHQURqQjtFQURrQztJQUVsQyxzQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsWUFBaUI7R0FEakI7RUFObUM7SUFFbkMsV0FBVztHQURYO0VBTmtDO0lBRWxDLG9CQUFnQjtHQURoQjtFQURrQztJQUVsQyxxQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMsVUFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMscUJBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLHFCQUFnQjtHQURoQjtFQURrQztJQUVsQyxVQUFnQjtHQURoQjtFQURrQztJQUVsQyxxQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMscUJBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLFVBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLHFCQUFnQjtHQURoQjtFQURrQztJQUVsQyxxQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMsV0FBZ0I7R0FEaEI7RUFtQm1CO0lBRW5CLGdCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiwyQkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsNEJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLGlCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiw0QkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsNEJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLGlCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiw0QkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsNEJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLGlCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiw0QkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsNEJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLGtCQUF1QjtHQUR2QjtDZit2Q0w7O0FhbHZDRDtFRS9DRztJQUVDLFlBQVk7R0FEWjtFQU9xQztJQUVuQyxxQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsc0JBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLFdBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLHNCQUFpQjtHQURqQjtFQURtQztJQUVuQyxzQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsV0FBaUI7R0FEakI7RUFEbUM7SUFFbkMsc0JBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLHNCQUFpQjtHQURqQjtFQURtQztJQUVuQyxXQUFpQjtHQURqQjtFQURtQztJQUVuQyxzQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsc0JBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLFlBQWlCO0dBRGpCO0VBbUJtQztJQUVuQyxZQUFZO0dBRFo7RUFOa0M7SUFFbEMscUJBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLHNCQUFpQjtHQURqQjtFQURrQztJQUVsQyxXQUFpQjtHQURqQjtFQURrQztJQUVsQyxzQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsc0JBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLFdBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLHNCQUFpQjtHQURqQjtFQURrQztJQUVsQyxzQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsV0FBaUI7R0FEakI7RUFEa0M7SUFFbEMsc0JBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLHNCQUFpQjtHQURqQjtFQURrQztJQUVsQyxZQUFpQjtHQURqQjtFQU5tQztJQUVuQyxXQUFXO0dBRFg7RUFOa0M7SUFFbEMsb0JBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLHFCQUFnQjtHQURoQjtFQURrQztJQUVsQyxVQUFnQjtHQURoQjtFQURrQztJQUVsQyxxQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMscUJBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLFVBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLHFCQUFnQjtHQURoQjtFQURrQztJQUVsQyxxQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMsVUFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMscUJBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLHFCQUFnQjtHQURoQjtFQURrQztJQUVsQyxXQUFnQjtHQURoQjtFQW1CbUI7SUFFbkIsZ0JBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDJCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiw0QkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsaUJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDRCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiw0QkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsaUJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDRCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiw0QkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsaUJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDRCQUF1QjtHQUR2QjtFQURtQjtJQUVuQiw0QkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsa0JBQXVCO0dBRHZCO0NmODVDTDs7QWF4NENEO0VFeERHO0lBRUMsWUFBWTtHQURaO0VBT3FDO0lBRW5DLHFCQUFpQjtHQURqQjtFQURtQztJQUVuQyxzQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsV0FBaUI7R0FEakI7RUFEbUM7SUFFbkMsc0JBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLHNCQUFpQjtHQURqQjtFQURtQztJQUVuQyxXQUFpQjtHQURqQjtFQURtQztJQUVuQyxzQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsc0JBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLFdBQWlCO0dBRGpCO0VBRG1DO0lBRW5DLHNCQUFpQjtHQURqQjtFQURtQztJQUVuQyxzQkFBaUI7R0FEakI7RUFEbUM7SUFFbkMsWUFBaUI7R0FEakI7RUFtQm1DO0lBRW5DLFlBQVk7R0FEWjtFQU5rQztJQUVsQyxxQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsc0JBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLFdBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLHNCQUFpQjtHQURqQjtFQURrQztJQUVsQyxzQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsV0FBaUI7R0FEakI7RUFEa0M7SUFFbEMsc0JBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLHNCQUFpQjtHQURqQjtFQURrQztJQUVsQyxXQUFpQjtHQURqQjtFQURrQztJQUVsQyxzQkFBaUI7R0FEakI7RUFEa0M7SUFFbEMsc0JBQWlCO0dBRGpCO0VBRGtDO0lBRWxDLFlBQWlCO0dBRGpCO0VBTm1DO0lBRW5DLFdBQVc7R0FEWDtFQU5rQztJQUVsQyxvQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMscUJBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLFVBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLHFCQUFnQjtHQURoQjtFQURrQztJQUVsQyxxQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMsVUFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMscUJBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLHFCQUFnQjtHQURoQjtFQURrQztJQUVsQyxVQUFnQjtHQURoQjtFQURrQztJQUVsQyxxQkFBZ0I7R0FEaEI7RUFEa0M7SUFFbEMscUJBQWdCO0dBRGhCO0VBRGtDO0lBRWxDLFdBQWdCO0dBRGhCO0VBbUJtQjtJQUVuQixnQkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsMkJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDRCQUF1QjtHQUR2QjtFQURtQjtJQUVuQixpQkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsNEJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDRCQUF1QjtHQUR2QjtFQURtQjtJQUVuQixpQkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsNEJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDRCQUF1QjtHQUR2QjtFQURtQjtJQUVuQixpQkFBdUI7R0FEdkI7RUFEbUI7SUFFbkIsNEJBQXVCO0dBRHZCO0VBRG1CO0lBRW5CLDRCQUF1QjtHQUR2QjtFQURtQjtJQUVuQixrQkFBdUI7R0FEdkI7Q2Y2akRMOztBZ0JubkREO0VBQ0UsOEJaNkp5QztDWTlKcEM7O0FBR1A7RUFDRSxpQlpxSmlDO0VZcEpqQyxvQlpvSmlDO0VZbkpqQyxZWks2QjtFWUo3QixpQkFBaUI7Q0FKVjs7QUFNVDtFQUNFLGlCQUFpQjtDQURmOztBQU9KO0VBQ0UsWUFBWTtFQUNaLGdCQUFnQjtFQUNoQixvQlpzRTZCO0NZekV2Qjs7QUFVQTs7Ozs7O0VBQ0EsYVo4SDJCO0VZN0gzQix5QloyRDZCO0VZMUQ3QixvQkFBb0I7RUFDcEIsMkJad0k0QjtDWTVJeEI7O0FBU0s7RUFDYix1QkFBdUI7RUFDdkIsOEJaaUlnQztDWW5JZjs7QUFVYjs7Ozs7O0VBQ0EsY0FBYztDQURWOztBQU1BO0VBQ1IsMkJaa0hnQztDWW5IakI7O0FBS2pCO0VBQ0UsdUJaWHdCO0NZVWxCOztBQWNGOzs7Ozs7RUFDQSxhWm9GMkI7Q1lyRnZCOztBQVlaO0VBQ0UsdUJabUZrQztDWXBGbkI7O0FBT1Q7Ozs7OztFQUNBLHVCWjRFNEI7Q1k3RXhCOztBQU9OOztFQUNBLHlCQUF5QjtDQURyQjs7QUFZb0I7RUFDMUIsMEJabURtQztDWXBETjs7QUFXbkI7RUFDViwwQlowQ21DO0NZM0NqQjs7QUFVQztFQUNyQixpQkFBaUI7RUFDakIsWUFBWTtFQUNaLHNCQUFzQjtDQUhFOztBQVFQOztFQUNiLGlCQUFpQjtFQUNqQixZQUFZO0VBQ1osb0JBQW9CO0NBSEo7O0FDdklDOzs7Ozs7Ozs7Ozs7RUFFakIsMEJiOEppQztDYS9KakM7O0FBT3VCOzs7OztFQUV2QiwwQkFBd0I7Q0FEeEI7O0FBVGlCOzs7Ozs7Ozs7Ozs7RUFFakIsMEJic2lCa0M7Q2F2aUJsQzs7QUFPdUI7Ozs7O0VBRXZCLDBCQUF3QjtDQUR4Qjs7QUFUaUI7Ozs7Ozs7Ozs7OztFQUVqQiwwQmIwaUJrQztDYTNpQmxDOztBQU91Qjs7Ozs7RUFFdkIsMEJBQXdCO0NBRHhCOztBQVRpQjs7Ozs7Ozs7Ozs7O0VBRWpCLDBCYjhpQmtDO0NhL2lCbEM7O0FBT3VCOzs7OztFQUV2QiwwQkFBd0I7Q0FEeEI7O0FBVGlCOzs7Ozs7Ozs7Ozs7RUFFakIsMEJia2pCbUM7Q2FuakJuQzs7QUFPdUI7Ozs7O0VBRXZCLDBCQUF3QjtDQUR4Qjs7QUQwSk47RUFDRSxpQkFBaUI7RUFDakIsa0JBQWtCO0NBRkQ7O0FBSWpCO0VBSkY7SUFLSSxZQUFZO0lBQ1osb0JBQXFDO0lBQ3JDLG1CQUFtQjtJQUNuQiw2Q0FBNkM7SUFDN0MsdUJaUmdDO0dZRGpCO0VBWWI7SUFDQSxpQkFBaUI7R0FEVDtFQVNGOzs7Ozs7SUFDQSxvQkFBb0I7R0FEaEI7RUFRVjtJQUNBLFVBQVU7R0FETztFQVNUOzs7Ozs7SUFDRixlQUFlO0dBREM7RUFJZDs7Ozs7O0lBQ0YsZ0JBQWdCO0dBREQ7RUFhZjs7OztJQUNBLGlCQUFpQjtHQURiO0NoQm9xRGY7O0FrQjUzREQ7RUFDRSxXQUFXO0VBQ1gsVUFBVTtFQUNWLFVBQVU7RUFJVixhQUFhO0NBUEw7O0FBVVY7RUFDRSxlQUFlO0VBQ2YsWUFBWTtFQUNaLFdBQVc7RUFDWCxvQmR1RTZCO0VjdEU3QixnQkFBMkI7RUFDM0IscUJBQXFCO0VBQ3JCLFlkYjJCO0VjYzNCLFVBQVU7RUFDVixpQ2RvT3NDO0NjN09oQzs7QUFZUjtFQUNFLHNCQUFzQjtFQUN0QixnQkFBZ0I7RUFDaEIsbUJBQW1CO0VBQ25CLGtCQUFrQjtDQUpiOztBQWVZO0VmOEJULHVCZTdCc0I7Q0FEVjs7QUFNRDs7RUFDbkIsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixvQkFBb0I7Q0FIRTs7QUFNUDtFQUNmLGVBQWU7Q0FERzs7QUFLRjtFQUNoQixlQUFlO0VBQ2YsWUFBWTtDQUZPOztBQU9WOztFQUNULGFBQWE7Q0FERDs7QUFPUTs7O0ViekVwQixxQkFBcUI7RUFFckIsMkNBQTJDO0VBQzNDLHFCQUFxQjtDYXNFTzs7QUFLOUI7RUFDRSxlQUFlO0VBQ2YsaUJBQW9DO0VBQ3BDLGdCZE40QjtFY081Qix5QmRNbUM7RWNMbkMsWWR4RThCO0NjbUV4Qjs7QUErQlI7RUFDRSxlQUFlO0VBQ2YsWUFBWTtFQUNaLGFka0lxRDtFY2pJckQsa0JkTzhCO0VjTjlCLGdCZHZDNEI7RWN3QzVCLHlCZDNCbUM7RWM0Qm5DLFlkekc4QjtFYzBHOUIsdUJkb0dtQztFY25HbkMsdUJBQXVCO0VBQ3ZCLHVCZHlHbUM7RWN4R25DLG1CZGM2QjtFRHJFckIsaURld0RnQztFZjhEaEMseUVlN0RzRTtDQWJqRTs7QUN6RFo7RUFDQyxzQmZ1TG9DO0VldExwQyxXQUFXO0VoQldMLG1GZ0JkUztDQUNSOztBaEI4Q1I7RUFDQyxZQzRJaUM7RUQzSWpDLFdBQVc7Q0FGUTs7QUFJcEI7RUFBeUIsWUN5SVM7Q0R6SVY7O0FBQ3hCO0VBQStCLFlDd0lHO0NEeElKOztBZWtDWjs7O0VBQ2pCLHVCZDdIMEI7RWM4SDFCLFdBQVc7Q0FGUzs7QUFNSDs7RUFDakIsb0Jkb0h3QztDY3JIcEI7O0FBUWhCO0VBQ04sYUFBYTtDQURROztBQVlKO0VBQ2pCLHlCQUF5QjtDQURMOztBQWN0QjtFQUtLOzs7O0lBQ0Msa0JkMkRpRDtHYzVEbkM7RUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFDZCxrQmQwRGlDO0djM0RoQjtFQUtIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNkLGtCZG1EZ0M7R2NwRGY7Q2xCczNEdEI7O0FrQjEyREQ7RUFDRSxvQmQ0Q21DO0NjN0N4Qjs7QUFVYjs7RUFDRSxtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixvQkFBb0I7Q0FKWDs7QUFNVDs7RUFDRSxpQmRuSTJCO0Vjb0kzQixtQkFBbUI7RUFDbkIsaUJBQWlCO0VBQ2pCLG9CQUFvQjtFQUNwQixnQkFBZ0I7Q0FMWDs7QUFXNkI7Ozs7RUFDcEMsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7Q0FIb0I7O0FBTzdCOztFQUNWLGlCQUFpQjtDQURJOztBQU12Qjs7RUFDRSxtQkFBbUI7RUFDbkIsc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQixpQkFBaUI7RUFDakIsdUJBQXVCO0VBQ3ZCLG9CQUFvQjtFQUNwQixnQkFBZ0I7Q0FQQTs7QUFVQzs7RUFDakIsY0FBYztFQUNkLGtCQUFrQjtDQUZpQjs7QUFhaEI7Ozs7OztFQUNqQixvQmRSd0M7Q2NPcEI7O0FBUUg7Ozs7RUFDakIsb0JkaEJ3QztDY2VwQjs7QUFTcEI7Ozs7RUFDRSxvQmR6QnNDO0Njd0JqQzs7QUFZWDtFQUVFLGlCQUFvQztFQUNwQyxvQkFBdUM7RUFFdkMsaUJBQWlCO0VBQ2pCLGlCQUFrQztDQU5kOztBQVNuQjs7Ozs7OztFQUNDLGdCQUFnQjtFQUNoQixpQkFBaUI7Q0FGUDs7QUNoUCtHOzs7RUFFekgsYWZtTG1DO0VlbExuQyxrQmYwRDRCO0VlekQ1QixnQmZRMEI7RWVQMUIsaUJmOEQyQjtFZTdEM0IsbUJmaUUyQjtDZXRFM0I7O0FBTUQ7OztFQUdDLGFmMkttQztFZTFLbkMsa0JmMEttQztDZTVLbkM7O0FBR0Q7Ozs7Ozs7RUFHQyxhQUFhO0NBRGI7O0FEbVBGO0VBQ0UsYWQ3RW1DO0VjOEVuQyxrQmR0TTRCO0VjdU01QixnQmR4UDBCO0VjeVAxQixpQmRsTTJCO0VjbU0zQixtQmQvTDJCO0NjMExkOztBQU9UO0VBQ0osYWRwRm1DO0VjcUZuQyxrQmRyRm1DO0NjbUZoQjs7QUFLTDs7RUFDZCxhQUFhO0NBRGdCOztBQUcvQjtFQUNFLGFkNUZtQztFYzZGbkMsaUJBQWtDO0VBQ2xDLGtCZHRONEI7RWN1TjVCLGdCZHhRMEI7RWN5UTFCLGlCZGxOMkI7Q2M2TVA7O0FDaFJxRzs7O0VBRXpILGFmaUxrQztFZWhMbEMsbUJmdUQ0QjtFZXRENUIsZ0JmTzBCO0VlTjFCLHVCZjZEaUM7RWU1RGpDLG1CZmdFMkI7Q2VyRTNCOztBQU1EOzs7RUFHQyxhZnlLa0M7RWV4S2xDLGtCZndLa0M7Q2UxS2xDOztBQUdEOzs7Ozs7O0VBR0MsYUFBYTtDQURiOztBRDZRRjtFQUNFLGFkekdrQztFYzBHbEMsbUJkbk80QjtFY29PNUIsZ0JkblIwQjtFY29SMUIsdUJkN05pQztFYzhOakMsbUJkMU4yQjtDY3FOZDs7QUFPVDtFQUNKLGFkaEhrQztFY2lIbEMsa0JkakhrQztDYytHZjs7QUFLTDs7RUFDZCxhQUFhO0NBRGdCOztBQUcvQjtFQUNFLGFkeEhrQztFY3lIbEMsaUJBQWtDO0VBQ2xDLG1CZG5QNEI7RWNvUDVCLGdCZG5TMEI7RWNvUzFCLHVCZDdPaUM7Q2N3T2I7O0FBY3hCO0VBRUUsbUJBQW1CO0NBRk47O0FBS2I7RUFDRSxzQkFBa0M7Q0FEckI7O0FBS2pCO0VBQ0UsbUJBQW1CO0VBQ25CLE9BQU87RUFDUCxTQUFTO0VBQ1QsV0FBVztFQUNYLGVBQWU7RUFDZixZZHZKcUQ7RWN3SnJELGFkeEpxRDtFY3lKckQsa0JkekpxRDtFYzBKckQsbUJBQW1CO0VBQ25CLHFCQUFxQjtDQVZDOztBQWNPOzs7Ozs7RUFDN0IsWWQ5Sm9DO0VjK0pwQyxhZC9Kb0M7RWNnS3BDLGtCZGhLb0M7Q2M2SmlCOztBQU94Qjs7Ozs7O0VBQzdCLFlkbktxQztFY29LckMsYWRwS3FDO0VjcUtyQyxrQmRyS3FDO0Nja0tnQjs7QUM1WW5DOzs7Ozs7Ozs7O0VBQ2hCLGVmNmhCb0M7Q2U5aEJaOztBQUkxQjtFQUNFLHNCZnloQm9DO0VEemU5QixpRGdCL0NrQztDQUYzQjs7QUFHWjtFQUNDLHNCQUFvQjtFaEI2Q2hCLGtFZ0I1Q3NEO0NBRm5EOztBQU9YO0VBQ0UsZWYrZ0JvQztFZTlnQnBDLHNCZjhnQm9DO0VlN2dCcEMsMEJmOGdCb0M7Q2VqaEJsQjs7QUFNcEI7RUFDRSxlZnlnQm9DO0NlMWdCZDs7QUFwQk47Ozs7Ozs7Ozs7RUFDaEIsZWZxaUJvQztDZXRpQlo7O0FBSTFCO0VBQ0Usc0JmaWlCb0M7RURqZjlCLGlEZ0IvQ2tD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d0I7Q0FUVjs7QUFnQnBCO0VBQ0UsbUIzQmpOMkM7QzJCZ043Qjs7QUFHYjs7RUFDQyx1QjNCdE55QztDMkJxTmxDOztBQUdUO0VBQ0UsdUIzQnhOeUM7QzJCdU5oQzs7QUFNYjs7RUFDRSxzQjNCem9CMkI7QzJCd29CZjs7QUFVVDs7O0VBQ0MsOEIzQm5QOEM7RTJCb1A5QyxZM0JqbkJtQjtDMkIrbUJaOztBQU1YO0VBR1c7SUFDTCxZM0J6bkJpQjtHMkJ3bkJUO0VBR1A7O0lBQ0MsWTNCNW5CZTtJMkI2bkJmLDhCM0JsUTBDO0cyQmdRbkM7RUFRUjs7O0lBQ0MsWTNCcG9CZTtJMkJxb0JmLDhCM0J4UTBDO0cyQnNRbkM7RUFRUjs7O0lBQ0MsWTNCM29CZTtJMkI0b0JmLDhCM0I5UTBDO0cyQjRRbkM7Qy9CNDBIbEI7O0ErQjl6SEM7RUFDRSxZM0IxcEJ1QjtDMkJ5cEJYOztBQUVYO0VBQ0MsWTNCNXBCcUI7QzJCMnBCZDs7QUFLWDtFQUNFLFkzQmpxQnVCO0MyQmdxQmQ7O0FBR1I7O0VBQ0MsWTNCcHFCcUI7QzJCbXFCZDs7QUFNTjs7OztFQUNDLFkzQnpxQm1CO0MyQndxQlo7O0FBU2Y7RUFDRSx1QjNCcFM4QztFMkJxUzlDLG1CM0JyUzhDO0MyQm1TL0I7O0FBSWY7RUFDRSxZM0J2ckJ1QjtDMkJzckJWOztBQUdaOztFQUNDLFkzQjFyQnFCO0UyQjJyQnJCLDhCM0I3UmlEO0MyQjJSMUM7O0FBTVg7RUFDRSxZM0Joc0J1QjtDMkIrckJYOztBQUtMO0VBQ0wsWTNCcnNCcUI7QzJCb3NCYjs7QUFJUDs7RUFDQyxZM0J6c0JtQjtFMkIwc0JuQiw4QjNCclQrQztDMkJtVHhDOztBQVFSOzs7RUFDQyxZM0JqdEJtQjtFMkJrdEJuQiw4QjNCN1QrQztDMkIyVHhDOztBQVFSOzs7RUFDQyxZM0JqVXdDO0UyQmtVeEMsOEIzQmpVK0M7QzJCK1R4Qzs7QUFRYjtFQUNFLG1CM0I5VDRDO0MyQjZUOUI7O0FBR2I7O0VBQ0MsOEIzQm5VaUQ7QzJCa1UxQzs7QUFHVDtFQUNFLHVCM0JyVTBDO0MyQm9VakM7O0FBTWI7O0VBQ0Usc0JBQW9CO0NBRFI7O0FBU1Q7OztFQUNDLDhCM0JqVytDO0UyQmtXL0MsWTNCdnZCbUI7QzJCcXZCWjs7QUFNWDtFQUdNO0lBQ0EsbUIzQmhYc0M7RzJCK1dwQjtFQUdwQjtJQUNFLHVCM0JuWHNDO0cyQmtYOUI7RUFHSDtJQUNMLFkzQnJ3QmlCO0cyQm93QlQ7RUFHUDs7SUFDQyxZM0J4d0JlO0kyQnl3QmYsOEIzQnBYMkM7RzJCa1hwQztFQVFSOzs7SUFDQyxZM0JoeEJlO0kyQml4QmYsOEIzQjVYMkM7RzJCMFhwQztFQVFSOzs7SUFDQyxZM0JoWW9DO0kyQmlZcEMsOEIzQmhZMkM7RzJCOFhwQztDL0J5ekhsQjs7QStCaHpIQztFQUNFLFkzQmp5QnVCO0MyQmd5Qlg7O0FBRVg7RUFDQyxZM0JueUJxQjtDMkJreUJkOztBQUtYO0VBQ0UsWTNCeHlCdUI7QzJCdXlCZDs7QUFHUjs7RUFDQyxZM0IzeUJxQjtDMkIweUJkOztBQU1OOzs7O0VBQ0MsWTNCelp3QztDMkJ3WmpDOztBSWoyQmY7RUFDRSxrQi9CODBCa0M7RStCNzBCbEMsb0IvQnVGNkI7RStCdEY3QixpQkFBaUI7RUFDakIsMEIvQjYwQnFDO0UrQjUwQnJDLG1CL0JnSTZCO0MrQnJJbEI7O0FBT1Q7RUFDQSxzQkFBc0I7Q0FEbEI7O0FBR0E7RUFDRixtQkFBd0M7RUFDeEMsZUFBYztFQUNkLFkvQnMwQjhCO0MrQnowQm5COztBQU9iO0VBQ0EsWS9CUDJCO0MrQk1sQjs7QUNuQmI7RUFDRSxzQkFBc0I7RUFDdEIsZ0JBQWdCO0VBQ2hCLGVBQStCO0VBQy9CLG1CaENtSTZCO0NnQ3ZJbEI7O0FBTVQ7RUFDQSxnQkFBZ0I7Q0FEWjs7QUFHRjs7RUFDQSxtQkFBbUI7RUFDbkIsWUFBWTtFQUNaLGtCaEM2RzBCO0VnQzVHMUIseUJoQzRFK0I7RWdDM0UvQixzQkFBc0I7RUFDdEIsZWhDQ3lCO0VnQ0F6Qix1QmhDMmVxQztFZ0MxZXJDLHVCaEMyZXFDO0VnQzFlckMsa0JBQWtCO0NBVFo7O0FBYUo7O0VBQ0EsZUFBZTtFUlhyQiwrQnhCMkg2QjtFd0IxSDFCLDRCeEIwSDBCO0NnQ2pIakI7O0FBT047O0VSekJOLGdDeEJtSTZCO0V3QmxJMUIsNkJ4QmtJMEI7Q2dDMUdqQjs7QUFTVDs7OztFQUNDLFdBQVc7RUFDWCxlaENpQndCO0VnQ2hCeEIsdUJoQzNCd0I7RWdDNEJ4QixtQmhDc2RxQztDZ0MxZDlCOztBQVlSOzs7Ozs7RUFDQyxXQUFXO0VBQ1gsWWhDOGNxQztFZ0M3Y3JDLDBCaENyQ3lCO0VnQ3NDekIsc0JoQ3RDeUI7RWdDdUN6QixnQkFBZ0I7Q0FMVDs7QUFlTjs7Ozs7O0VBQ0QsWWhDckR5QjtFZ0NzRHpCLHVCaENvY3FDO0VnQ25jckMsbUJoQ29jcUM7RWdDbmNyQyxvQmhDZ01zQztDZ0NwTTdCOztBQy9EVDs7RUFDQSxtQmpDeUgwQjtFaUN4SDFCLGdCakN5RXdCO0VpQ3hFeEIsdUJqQytIK0I7Q2lDbEl6Qjs7QUFPSjs7RVRHTiwrQnhCNEg2QjtFd0IzSDFCLDRCeEIySDBCO0NpQy9IakI7O0FBTU47O0VUWE4sZ0N4Qm9JNkI7RXdCbkkxQiw2QnhCbUkwQjtDaUN6SGpCOztBQWJSOztFQUNBLGtCakM0SDBCO0VpQzNIMUIsZ0JqQzBFd0I7RWlDekV4QixpQmpDZ0l5QjtDaUNuSW5COztBQU9KOztFVEdOLCtCeEI2SDZCO0V3QjVIMUIsNEJ4QjRIMEI7Q2lDaElqQjs7QUFNTjs7RVRYTixnQ3hCcUk2QjtFd0JwSTFCLDZCeEJvSTBCO0NpQzFIakI7O0FDYmQ7RUFDRSxnQkFBZ0I7RUFDaEIsZUFBK0I7RUFDL0IsaUJBQWlCO0VBQ2pCLG1CQUFtQjtDQUpiOztBNUJTTDs7RUFDQyxhQUFhO0VBQ2IsZUFBZTtDQUZSOztBQUlSO0VBQ0MsWUFBWTtDQURMOztBNEJQVDtFQUNFLGdCQUFnQjtDQURkOztBQUdBOztFQUNBLHNCQUFzQjtFQUN0QixrQkFBaUI7RUFDakIsdUJsQzZlcUM7RWtDNWVyQyx1QmxDNmVxQztFa0M1ZXJDLG9CbENpZ0JxQztDa0N0Z0IvQjs7QUFTTDs7RUFDRCxzQkFBc0I7RUFDdEIsdUJsQ1J3QjtD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Qm9DO0NpRDNpQmxCOztBQUtFO0VBQ2xCLDBCakRxaUJrQztDaUR0aUJIOztBQUdqQztFQUNFLGVqRGlpQmtDO0VpRGhpQmxDLDBCakQraEJrQztDaURqaUI1Qjs7QUFNWTtFQUNsQiw2QmpENGhCa0M7Q2lEN2hCSDs7QURtUHJDO0VDblFFLHNCakRpakJzQztDZ0Q5UzNCOztBQ2pRUDtFQUNGLGVqRDRpQm9DO0VpRDNpQnBDLDBCakQ0aUJvQztFaUQzaUJwQyxzQmpENGlCb0M7Q2lEL2lCbEI7O0FBS0U7RUFDbEIsMEJqRHlpQmtDO0NpRDFpQkg7O0FBR2pDO0VBQ0UsZWpEcWlCa0M7RWlEcGlCbEMsMEJqRG1pQmtDO0NpRHJpQjVCOztBQU1ZO0VBQ2xCLDZCakRnaUJrQztDaURqaUJIOztBRHNQckM7RUN0UUUsc0JqRHFqQnNDO0NnRC9TeEI7O0FDcFFWO0VBQ0YsZWpEZ2pCb0M7RWlEL2lCcEMsMEJqRGdqQm9DO0VpRC9pQnBDLHNCakRnakJvQztDaURuakJsQjs7QUFLRTtFQUNsQiwwQmpENmlCa0M7Q2lEOWlCSDs7QUFHakM7RUFDRSxlakR5aUJrQztFaUR4aUJsQywwQmpEdWlCa0M7Q2lEemlCNUI7O0FBTVk7RUFDbEIsNkJqRG9pQmtDO0NpRHJpQkg7O0FEeVByQztFQ3pRRSxzQmpEeWpCcUM7Q2dEaFR4Qjs7QUN2UVQ7RUFDRixlakRvakJvQztFaURuakJwQywwQmpEb2pCcUM7RWlEbmpCckMsc0JqRG9qQm1DO0NpRHZqQmpCOztBQUtFO0VBQ2xCLDBCakRpakJpQztDaURsakJGOztBQUdqQztFQUNFLGVqRDZpQm1DO0VpRDVpQm5DLDBCakQyaUJrQztDaUQ3aUI1Qjs7QUFNWTtFQUNsQiw2QmpEd2lCaUM7Q2lEemlCRjs7QUNmckM7RUFDRSxtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLFVBQVU7RUFDVixXQUFXO0VBQ1gsaUJBQWlCO0NBTEE7O0FBV2pCOzs7OztFQUNFLG1CQUFtQjtFQUNuQixPQUFPO0VBQ1AsUUFBUTtFQUNSLFVBQVU7RUFDVixhQUFhO0VBQ2IsWUFBWTtFQUNaLFVBQVU7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O0VvRXVRN0Isb0JBQW9CO0NBTko7O0FBVWxCO0VBQ0UsZ0JBQWdCO0VBQ2hCLFFBQVE7RUFDUixTQUFTO0VBQ1QsVUFBVTtFQUNWLE9BQU87RUFDUCxhQUEwQjtDQU5SOztBQVVOO0VBQ1osU0FBUztFQUNULFdBQVc7Q0FGaUI7O0FBYTVCOztFQUNFLGNBQWM7RUFDZCwwQkFBdUM7RUFDdkMsNEJBQXlDO0VBQ3pDLFlBQVk7Q0FKTjs7QUFPUjs7RUFDRSxVQUFVO0VBQ1YsYUFBYTtFQUNiLG1CQUFtQjtDQUhMOztBQVlsQjtFQUVJO0lBQ0UsU0FBUztJQUFFLFdBQVc7R0FEUjtFQUtoQjtJQUNFLFFBQVE7SUFBRSxZQUFZO0dBREg7Q3hFbW5QeEI7O0FOMTNQRDtFQUNFLGlCQUFpQjtDQURkOztBQU1MO0VBRUU7SUFDRSxjQUFjO0dBREo7Q000M1BiOztBTnQzUEQ7RUFFRTtJQUNFLGNBQWM7R0FESjtDTTAzUGIiLCJmaWxlIjoiYm9vdHN0cmFwLmN1c3RvbS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHJvamVjdCBLaW1jaGlcbiAqXG4gKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDE1XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIE92ZXJyaWRlIEJvb3RzdHJhcCBTQVNTIHZhcmlhYmxlc1xuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy93b2stdmFyaWFibGVzXCI7XG5cbi8vIGJvd2VyOnNjc3NcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2NvbXBhc3MtbWl4aW5zL2xpYi9jb21wYXNzXCI7XG4vLyBlbmRib3dlclxuXG4vLyBCb290c3RyYXAgY3VzdG9tIGltcG9ydHNcbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvYm9vdHN0cmFwLXdva1wiO1xuXG4vLyBCb290c3RyYXAgc2VsZWN0IHBsdWdpblxuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9ib290c3RyYXAtc2VsZWN0XCI7XG5cbi8vIE92ZXJyaWRlIEJvb3RzdHJhcCBtaXhpblxuLmNvbnRhaW5lciB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogIDgwcHggIWltcG9ydGFudDtcbiAgcGFkZGluZy1yaWdodDogNjBweCAhaW1wb3J0YW50O1xufVxuXG4vLyBPdmVycmlkZSBhbGVydFxuXG4uYWxlcnQge1xuICBib3JkZXItd2lkdGg6ICRhbGVydC1ib3JkZXItd2lkdGg7XG59XG5cbi5oaWRlLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLmhlbHAtYmxvY2sge1xuICBjb2xvcjogJGdyYXk7XG59XG5cblxuLy8gTG9naW5cbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvbG9naW5cIjtcblxuLy8gVG9wYmFyIGFuZCBuYXZpZ2F0aW9uXG5AaW1wb3J0IFwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL3Rvb2xiYXJcIjtcblxuLy8gQnV0dG9uc1xuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9idXR0b25zXCI7XG5cbi8vIERpYWxvZyBGbGF0XG5AaW1wb3J0IFwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL2RpYWxvZy1mbGF0XCI7XG5cbi8vIERyb3Bkb3duIEJ1dHRvbiAtIEZsYXRcbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvbWVudS1mbGF0XCI7XG5cbnByZSB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi8vIE1lZGlhIHF1ZXJpZXNcblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTU0MHB4O1xuICB9XG5cbn1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTY4MHB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDE1NDBweDtcbiAgfVxuXG59IiwiLypcbiAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUnVieSBsaXN0IGZ1bmN0aW9ucyBmcm9tIENvbXBhc3M6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vQ29tcGFzcy9jb21wYXNzL2Jsb2Ivc3RhYmxlL2xpYi9jb21wYXNzL3Nhc3NfZXh0ZW5zaW9ucy9mdW5jdGlvbnMvbGlzdHMucmJcbiAqL1xuXG5cbi8vIGNvbXBhY3QgaXMgcGFydCBvZiBsaWJzYXNzXG5cbkBmdW5jdGlvbiAtY29tcGFzcy1udGgoJGxpc3QsICRwbGFjZSkge1xuICAvLyBZZXAsIFNhc3MtbGlzdHMgYXJlIDEtaW5kZXhlZC5cbiAgQGlmICRwbGFjZSA9PSBcImZpcnN0XCIge1xuICAgICRwbGFjZTogMTtcbiAgfVxuICBAaWYgJHBsYWNlID09IFwibGFzdFwiIHtcbiAgICAkcGxhY2U6IGxlbmd0aCgkbGlzdCk7XG4gIH1cbiAgQHJldHVybiBudGgoJGxpc3QsICRwbGFjZSk7XG59XG5cbi8vIGNvbXBhc3NfbGlzdCBhbmQgY29tcGFzc19zcGFjZV9saXN0IGNhbid0IGJlIGltcGxlbWVudGVkIGluIHNhc3Mgc2NyaXB0XG5cbkBmdW5jdGlvbiAtY29tcGFzcy1saXN0LXNpemUoJGxpc3QpIHtcbiAgQHJldHVybiBsZW5ndGgoJGxpc3QpO1xufVxuXG5AZnVuY3Rpb24gLWNvbXBhc3Mtc2xpY2UoJGxpc3QsICRzdGFydCwgJGVuZDogZmFsc2UpIHtcbiAgQGlmICRlbmQgPT0gZmFsc2Uge1xuICAgICRlbmQ6IGxlbmd0aCgkbGlzdCk7XG4gIH1cbiAgJGZ1bGw6IG50aCgkbGlzdCwgJHN0YXJ0KTtcbiAgQGZvciAkaSBmcm9tICRzdGFydCArIDEgdGhyb3VnaCAkZW5kIHtcbiAgICAkZnVsbDogJGZ1bGwsIG50aCgkbGlzdCwgJGkpO1xuICB9XG4gIEByZXR1cm4gJGZ1bGw7XG59XG5cbkBmdW5jdGlvbiByZWplY3QoJGxpc3QsICRyZWplY3QxLCAkcmVqZWN0MjpudWxsLCAkcmVqZWN0MzpudWxsLCAkcmVqZWN0NDpudWxsLCAkcmVqZWN0NTpudWxsLCAkcmVqZWN0NjpudWxsLCAkcmVqZWN0NzpudWxsLCAkcmVqZWN0ODpudWxsLCAkcmVqZWN0OTpudWxsKSB7XG4gICRyZWplY3RzOiAkcmVqZWN0MSwgJHJlamVjdDIsICRyZWplY3QzLCAkcmVqZWN0NCwgJHJlamVjdDUsICRyZWplY3Q2LCAkcmVqZWN0NywgJHJlamVjdDgsICRyZWplY3Q5O1xuXG4gICRmdWxsOiBmYWxzZTtcbiAgQGVhY2ggJGl0ZW0gaW4gJGxpc3Qge1xuICAgIEBpZiBpbmRleCgkcmVqZWN0cywgJGl0ZW0pIHt9XG4gICAgQGVsc2Uge1xuICAgICAgQGlmICRmdWxsIHtcbiAgICAgICAgJGZ1bGw6ICRmdWxsLCAkaXRlbTtcbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgJGZ1bGw6ICRpdGVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAcmV0dXJuICRmdWxsO1xufVxuIiwiLypcbiAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUnVieSBjb25zdGFudHMgZnVuY3Rpb25zIGZyb20gQ29tcGFzczpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Db21wYXNzL2NvbXBhc3MvYmxvYi9zdGFibGUvbGliL2NvbXBhc3Mvc2Fzc19leHRlbnNpb25zL2Z1bmN0aW9ucy9jb25zdGFudHMucmJcbiAqL1xuXG5AZnVuY3Rpb24gb3Bwb3NpdGUtcG9zaXRpb24oJGZyb20pIHtcbiAgICBAaWYgKCRmcm9tID09IHRvcCkge1xuICAgICAgICBAcmV0dXJuIGJvdHRvbTtcbiAgICB9IEBlbHNlIGlmICgkZnJvbSA9PSBib3R0b20pIHtcbiAgICAgICAgQHJldHVybiB0b3A7XG4gICAgfSBAZWxzZSBpZiAoJGZyb20gPT0gbGVmdCkge1xuICAgICAgICBAcmV0dXJuIHJpZ2h0O1xuICAgIH0gQGVsc2UgaWYgKCRmcm9tID09IHJpZ2h0KSB7XG4gICAgICAgIEByZXR1cm4gbGVmdDtcbiAgICB9IEBlbHNlIGlmICgkZnJvbSA9PSBjZW50ZXIpIHtcbiAgICAgICAgQHJldHVybiBjZW50ZXI7XG4gICAgfVxufVxuIiwiLypcbiAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUnVieSBkaXNwbGF5IGZ1bmN0aW9ucyBmcm9tIENvbXBhc3M6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vQ29tcGFzcy9jb21wYXNzL2Jsb2Ivc3RhYmxlL2NvcmUvbGliL2NvbXBhc3MvY29yZS9zYXNzX2V4dGVuc2lvbnMvZnVuY3Rpb25zL2Rpc3BsYXkucmJcbiAqL1xuXG5AZnVuY3Rpb24gZWxlbWVudHMtb2YtdHlwZSgkdHlwZSl7XG4gICAgQGlmICgkdHlwZSA9PSBibG9jayl7XG4gICAgICAgIEByZXR1cm4gYWRkcmVzcywgYXJ0aWNsZSwgYXNpZGUsIGJsb2NrcXVvdGUsIGNlbnRlciwgZGlyLCBkaXYsIGRkLCBkZXRhaWxzLCBkbCwgZHQsIGZpZWxkc2V0LCBmaWdjYXB0aW9uLCBmaWd1cmUsIGZvcm0sIGZvb3RlciwgZnJhbWVzZXQsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGhyLCBoZWFkZXIsIGhncm91cCwgaXNpbmRleCwgbWFpbiwgbWVudSwgbmF2LCBub2ZyYW1lcywgbm9zY3JpcHQsIG9sLCBwLCBwcmUsIHNlY3Rpb24sIHN1bW1hcnksIHVsO1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IGlubGluZSl7XG4gICAgICAgIEByZXR1cm4gYSwgYWJiciwgYWNyb255bSwgYXVkaW8sIGIsIGJhc2Vmb250LCBiZG8sIGJpZywgYnIsIGNhbnZhcywgY2l0ZSwgY29kZSwgY29tbWFuZCwgZGF0YWxpc3QsIGRmbiwgZW0sIGVtYmVkLCBmb250LCBpLCBpbWcsIGlucHV0LCBrZXlnZW4sIGtiZCwgbGFiZWwsIG1hcmssIG1ldGVyLCBvdXRwdXQsIHByb2dyZXNzLCBxLCBycCwgcnQsIHJ1YnksIHMsIHNhbXAsIHNlbGVjdCwgc21hbGwsIHNwYW4sIHN0cmlrZSwgc3Ryb25nLCBzdWIsIHN1cCwgdGV4dGFyZWEsIHRpbWUsIHR0LCB1LCB2YXIsIHZpZGVvLCB3YnI7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gaW5saW5lLWJsb2NrKXtcbiAgICAgICAgQHJldHVybiBpbWc7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gdGFibGUpe1xuICAgICAgICBAcmV0dXJuIHRhYmxlO1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IGxpc3QtaXRlbSl7XG4gICAgICAgIEByZXR1cm4gbGk7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gdGFibGUtcm93LWdyb3VwKXtcbiAgICAgICAgQHJldHVybiB0Ym9keTtcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSB0YWJsZS1oZWFkZXItZ3JvdXApe1xuICAgICAgICBAcmV0dXJuIHRoZWFkO1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IHRhYmxlLWZvb3Rlci1ncm91cCl7XG4gICAgICAgIEByZXR1cm4gdGZvb3Q7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gdGFibGUtcm93KXtcbiAgICAgICAgQHJldHVybiB0cjtcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSB0YWJsZS1jZWxsKXtcbiAgICAgICAgQHJldHVybiB0aCwgdGQ7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gaHRtbDUtYmxvY2spe1xuICAgICAgICBAcmV0dXJuIGFydGljbGUsIGFzaWRlLCBkZXRhaWxzLCBmaWdjYXB0aW9uLCBmaWd1cmUsIGZvb3RlciwgaGVhZGVyLCBoZ3JvdXAsIG1haW4sIG1lbnUsIG5hdiwgc2VjdGlvbiwgc3VtbWFyeTtcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSBodG1sNS1pbmxpbmUpe1xuICAgICAgICBAcmV0dXJuIGF1ZGlvLCBjYW52YXMsIGNvbW1hbmQsIGRhdGFsaXN0LCBlbWJlZCwga2V5Z2VuLCBtYXJrLCBtZXRlciwgb3V0cHV0LCBwcm9ncmVzcywgcnAsIHJ0LCBydWJ5LCB0aW1lLCB2aWRlbywgd2JyO1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IGh0bWw1KXtcbiAgICAgICAgQHJldHVybiBhcnRpY2xlLCBhc2lkZSwgYXVkaW8sIGNhbnZhcywgY29tbWFuZCwgZGF0YWxpc3QsIGRldGFpbHMsIGVtYmVkLCBmaWdjYXB0aW9uLCBmaWd1cmUsIGZvb3RlciwgaGVhZGVyLCBoZ3JvdXAsIGtleWdlbiwgbWFpbiwgbWFyaywgbWVudSwgbWV0ZXIsIG5hdiwgb3V0cHV0LCBwcm9ncmVzcywgcnAsIHJ0LCBydWJ5LCBzZWN0aW9uLCBzdW1tYXJ5LCB0aW1lLCB2aWRlbywgd2JyO1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IHRleHQtaW5wdXQpe1xuICAgICAgICBAcmV0dXJuIGlucHV0LCB0ZXh0YXJlYTtcbiAgICB9XG59XG4iLCIvKiFcbiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNSBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG5cbi8vIENvcmUgdmFyaWFibGVzIGFuZCBtaXhpbnNcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zXCI7XG5cbi8vIFJlc2V0IGFuZCBkZXBlbmRlbmNpZXNcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbm9ybWFsaXplXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3ByaW50XCI7XG4vL0BpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvZ2x5cGhpY29uc1wiOyAvLyBSZW1vdmluZyBHbHlwaGljb25zIGR1ZSB0byBGZWRvcmEgZm9udCBmaWxlcyBsZWdhbCBpc3N1ZVxuXG4vLyBDb3JlIENTU1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9zY2FmZm9sZGluZ1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC90eXBlXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2NvZGVcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvZ3JpZFwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC90YWJsZXNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvZm9ybXNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvYnV0dG9uc1wiO1xuXG4vLyBDb21wb25lbnRzXG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2NvbXBvbmVudC1hbmltYXRpb25zXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2Ryb3Bkb3duc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9idXR0b24tZ3JvdXBzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2lucHV0LWdyb3Vwc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9uYXZzXCI7XG5AaW1wb3J0IFwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL25hdmJhci1mbGF0XCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2JyZWFkY3J1bWJzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3BhZ2luYXRpb25cIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcGFnZXJcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbGFiZWxzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2JhZGdlc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9qdW1ib3Ryb25cIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvdGh1bWJuYWlsc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9hbGVydHNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcHJvZ3Jlc3MtYmFyc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9tZWRpYVwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9saXN0LWdyb3VwXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3BhbmVsc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9yZXNwb25zaXZlLWVtYmVkXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3dlbGxzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2Nsb3NlXCI7XG5cbi8vIENvbXBvbmVudHMgdy8gSmF2YVNjcmlwdFxuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9tb2RhbC1mbGF0XCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3Rvb2x0aXBcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcG9wb3ZlcnNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvY2Fyb3VzZWxcIjtcblxuLy8gVXRpbGl0eSBjbGFzc2VzXG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3V0aWxpdGllc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9yZXNwb25zaXZlLXV0aWxpdGllc1wiO1xuIiwiLyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4zIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuXG4vL1xuLy8gMS4gU2V0IGRlZmF1bHQgZm9udCBmYW1pbHkgdG8gc2Fucy1zZXJpZi5cbi8vIDIuIFByZXZlbnQgaU9TIGFuZCBJRSB0ZXh0IHNpemUgYWRqdXN0IGFmdGVyIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2UsXG4vLyAgICB3aXRob3V0IGRpc2FibGluZyB1c2VyIHpvb20uXG4vL1xuXG5odG1sIHtcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IC8vIDFcbiAgLW1zLXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IC8vIDJcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvLyAyXG59XG5cbi8vXG4vLyBSZW1vdmUgZGVmYXVsdCBtYXJnaW4uXG4vL1xuXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuXG4vLyBIVE1MNSBkaXNwbGF5IGRlZmluaXRpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gQ29ycmVjdCBgYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgZm9yIGFueSBIVE1MNSBlbGVtZW50IGluIElFIDgvOS5cbi8vIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBgZGV0YWlsc2Agb3IgYHN1bW1hcnlgIGluIElFIDEwLzExXG4vLyBhbmQgRmlyZWZveC5cbi8vIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBgbWFpbmAgaW4gSUUgMTEuXG4vL1xuXG5hcnRpY2xlLFxuYXNpZGUsXG5kZXRhaWxzLFxuZmlnY2FwdGlvbixcbmZpZ3VyZSxcbmZvb3RlcixcbmhlYWRlcixcbmhncm91cCxcbm1haW4sXG5tZW51LFxubmF2LFxuc2VjdGlvbixcbnN1bW1hcnkge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLy9cbi8vIDEuIENvcnJlY3QgYGlubGluZS1ibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBpbiBJRSA4LzkuXG4vLyAyLiBOb3JtYWxpemUgdmVydGljYWwgYWxpZ25tZW50IG9mIGBwcm9ncmVzc2AgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4vL1xuXG5hdWRpbyxcbmNhbnZhcyxcbnByb2dyZXNzLFxudmlkZW8ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IC8vIDFcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOyAvLyAyXG59XG5cbi8vXG4vLyBQcmV2ZW50IG1vZGVybiBicm93c2VycyBmcm9tIGRpc3BsYXlpbmcgYGF1ZGlvYCB3aXRob3V0IGNvbnRyb2xzLlxuLy8gUmVtb3ZlIGV4Y2VzcyBoZWlnaHQgaW4gaU9TIDUgZGV2aWNlcy5cbi8vXG5cbmF1ZGlvOm5vdChbY29udHJvbHNdKSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGhlaWdodDogMDtcbn1cblxuLy9cbi8vIEFkZHJlc3MgYFtoaWRkZW5dYCBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS8xMC5cbi8vIEhpZGUgdGhlIGB0ZW1wbGF0ZWAgZWxlbWVudCBpbiBJRSA4LzkvMTAvMTEsIFNhZmFyaSwgYW5kIEZpcmVmb3ggPCAyMi5cbi8vXG5cbltoaWRkZW5dLFxudGVtcGxhdGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vLyBMaW5rc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxuLy9cblxuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4vL1xuLy8gSW1wcm92ZSByZWFkYWJpbGl0eSBvZiBmb2N1c2VkIGVsZW1lbnRzIHdoZW4gdGhleSBhcmUgYWxzbyBpbiBhblxuLy8gYWN0aXZlL2hvdmVyIHN0YXRlLlxuLy9cblxuYTphY3RpdmUsXG5hOmhvdmVyIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLy8gVGV4dC1sZXZlbCBzZW1hbnRpY3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gSUUgOC85LzEwLzExLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQ7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxlIHNldCB0byBgYm9sZGVyYCBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4vL1xuXG5kZm4ge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHZhcmlhYmxlIGBoMWAgZm9udC1zaXplIGFuZCBtYXJnaW4gd2l0aGluIGBzZWN0aW9uYCBhbmQgYGFydGljbGVgXG4vLyBjb250ZXh0cyBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS5cbi8vXG5cbm1hcmsge1xuICBiYWNrZ3JvdW5kOiAjZmYwO1xuICBjb2xvcjogIzAwMDtcbn1cblxuLy9cbi8vIEFkZHJlc3MgaW5jb25zaXN0ZW50IGFuZCB2YXJpYWJsZSBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuLy9cbi8vIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGFmZmVjdGluZyBgbGluZS1oZWlnaHRgIGluIGFsbCBicm93c2Vycy5cbi8vXG5cbnN1YixcbnN1cCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbi8vIEVtYmVkZGVkIGNvbnRlbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgYm9yZGVyIHdoZW4gaW5zaWRlIGBhYCBlbGVtZW50IGluIElFIDgvOS8xMC5cbi8vXG5cbmltZyB7XG4gIGJvcmRlcjogMDtcbn1cblxuLy9cbi8vIENvcnJlY3Qgb3ZlcmZsb3cgbm90IGhpZGRlbiBpbiBJRSA5LzEwLzExLlxuLy9cblxuc3ZnOm5vdCg6cm9vdCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vLyBHcm91cGluZyBjb250ZW50XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gQWRkcmVzcyBtYXJnaW4gbm90IHByZXNlbnQgaW4gSUUgOC85IGFuZCBTYWZhcmkuXG4vL1xuXG5maWd1cmUge1xuICBtYXJnaW46IDFlbSA0MHB4O1xufVxuXG4vL1xuLy8gQWRkcmVzcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIEZpcmVmb3ggYW5kIG90aGVyIGJyb3dzZXJzLlxuLy9cblxuaHIge1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgaGVpZ2h0OiAwO1xufVxuXG4vL1xuLy8gQ29udGFpbiBvdmVyZmxvdyBpbiBhbGwgYnJvd3NlcnMuXG4vL1xuXG5wcmUge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLy9cbi8vIEFkZHJlc3Mgb2RkIGBlbWAtdW5pdCBmb250IHNpemUgcmVuZGVyaW5nIGluIGFsbCBicm93c2Vycy5cbi8vXG5cbmNvZGUsXG5rYmQsXG5wcmUsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDFlbTtcbn1cblxuLy8gRm9ybXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBLbm93biBsaW1pdGF0aW9uOiBieSBkZWZhdWx0LCBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYIGFsbG93IHZlcnkgbGltaXRlZFxuLy8gc3R5bGluZyBvZiBgc2VsZWN0YCwgdW5sZXNzIGEgYGJvcmRlcmAgcHJvcGVydHkgaXMgc2V0LlxuLy9cblxuLy9cbi8vIDEuIENvcnJlY3QgY29sb3Igbm90IGJlaW5nIGluaGVyaXRlZC5cbi8vICAgIEtub3duIGlzc3VlOiBhZmZlY3RzIGNvbG9yIG9mIGRpc2FibGVkIGVsZW1lbnRzLlxuLy8gMi4gQ29ycmVjdCBmb250IHByb3BlcnRpZXMgbm90IGJlaW5nIGluaGVyaXRlZC5cbi8vIDMuIEFkZHJlc3MgbWFyZ2lucyBzZXQgZGlmZmVyZW50bHkgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuLy9cblxuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgY29sb3I6IGluaGVyaXQ7IC8vIDFcbiAgZm9udDogaW5oZXJpdDsgLy8gMlxuICBtYXJnaW46IDA7IC8vIDNcbn1cblxuLy9cbi8vIEFkZHJlc3MgYG92ZXJmbG93YCBzZXQgdG8gYGhpZGRlbmAgaW4gSUUgOC85LzEwLzExLlxuLy9cblxuYnV0dG9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGluY29uc2lzdGVudCBgdGV4dC10cmFuc2Zvcm1gIGluaGVyaXRhbmNlIGZvciBgYnV0dG9uYCBhbmQgYHNlbGVjdGAuXG4vLyBBbGwgb3RoZXIgZm9ybSBjb250cm9sIGVsZW1lbnRzIGRvIG5vdCBpbmhlcml0IGB0ZXh0LXRyYW5zZm9ybWAgdmFsdWVzLlxuLy8gQ29ycmVjdCBgYnV0dG9uYCBzdHlsZSBpbmhlcml0YW5jZSBpbiBGaXJlZm94LCBJRSA4LzkvMTAvMTEsIGFuZCBPcGVyYS5cbi8vIENvcnJlY3QgYHNlbGVjdGAgc3R5bGUgaW5oZXJpdGFuY2UgaW4gRmlyZWZveC5cbi8vXG5cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vL1xuLy8gMS4gQXZvaWQgdGhlIFdlYktpdCBidWcgaW4gQW5kcm9pZCA0LjAuKiB3aGVyZSAoMikgZGVzdHJveXMgbmF0aXZlIGBhdWRpb2Bcbi8vICAgIGFuZCBgdmlkZW9gIGNvbnRyb2xzLlxuLy8gMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLlxuLy8gMy4gSW1wcm92ZSB1c2FiaWxpdHkgYW5kIGNvbnNpc3RlbmN5IG9mIGN1cnNvciBzdHlsZSBiZXR3ZWVuIGltYWdlLXR5cGVcbi8vICAgIGBpbnB1dGAgYW5kIG90aGVycy5cbi8vXG5cbmJ1dHRvbixcbmh0bWwgaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgLy8gMVxuaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxuaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvLyAyXG4gIGN1cnNvcjogcG9pbnRlcjsgLy8gM1xufVxuXG4vL1xuLy8gUmUtc2V0IGRlZmF1bHQgY3Vyc29yIGZvciBkaXNhYmxlZCBlbGVtZW50cy5cbi8vXG5cbmJ1dHRvbltkaXNhYmxlZF0sXG5odG1sIGlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLy9cbi8vIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBib3JkZXIgaW4gRmlyZWZveCA0Ky5cbi8vXG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0OjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBGaXJlZm94IDQrIHNldHRpbmcgYGxpbmUtaGVpZ2h0YCBvbiBgaW5wdXRgIHVzaW5nIGAhaW1wb3J0YW50YCBpblxuLy8gdGhlIFVBIHN0eWxlc2hlZXQuXG4vL1xuXG5pbnB1dCB7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi8vXG4vLyBJdCdzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvbid0IGF0dGVtcHQgdG8gc3R5bGUgdGhlc2UgZWxlbWVudHMuXG4vLyBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLlxuLy9cbi8vIDEuIEFkZHJlc3MgYm94IHNpemluZyBzZXQgdG8gYGNvbnRlbnQtYm94YCBpbiBJRSA4LzkvMTAuXG4vLyAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLlxuLy9cblxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLy8gMVxuICBwYWRkaW5nOiAwOyAvLyAyXG59XG5cbi8vXG4vLyBGaXggdGhlIGN1cnNvciBzdHlsZSBmb3IgQ2hyb21lJ3MgaW5jcmVtZW50L2RlY3JlbWVudCBidXR0b25zLiBGb3IgY2VydGFpblxuLy8gYGZvbnQtc2l6ZWAgdmFsdWVzIG9mIHRoZSBgaW5wdXRgLCBpdCBjYXVzZXMgdGhlIGN1cnNvciBzdHlsZSBvZiB0aGVcbi8vIGRlY3JlbWVudCBidXR0b24gdG8gY2hhbmdlIGZyb20gYGRlZmF1bHRgIHRvIGB0ZXh0YC5cbi8vXG5cbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vL1xuLy8gMS4gQWRkcmVzcyBgYXBwZWFyYW5jZWAgc2V0IHRvIGBzZWFyY2hmaWVsZGAgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4vLyAyLiBBZGRyZXNzIGBib3gtc2l6aW5nYCBzZXQgdG8gYGJvcmRlci1ib3hgIGluIFNhZmFyaSBhbmQgQ2hyb21lLlxuLy9cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGZpZWxkOyAvLyAxXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvLzJcbn1cblxuLy9cbi8vIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBpbiBTYWZhcmkgYW5kIENocm9tZSBvbiBPUyBYLlxuLy8gU2FmYXJpIChidXQgbm90IENocm9tZSkgY2xpcHMgdGhlIGNhbmNlbCBidXR0b24gd2hlbiB0aGUgc2VhcmNoIGlucHV0IGhhc1xuLy8gcGFkZGluZyAoYW5kIGB0ZXh0ZmllbGRgIGFwcGVhcmFuY2UpLlxuLy9cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbixcbmlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG5cbi8vXG4vLyBEZWZpbmUgY29uc2lzdGVudCBib3JkZXIsIG1hcmdpbiwgYW5kIHBhZGRpbmcuXG4vL1xuXG5maWVsZHNldCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIG1hcmdpbjogMCAycHg7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjYyNWVtIDAuNzVlbTtcbn1cblxuLy9cbi8vIDEuIENvcnJlY3QgYGNvbG9yYCBub3QgYmVpbmcgaW5oZXJpdGVkIGluIElFIDgvOS8xMC8xMS5cbi8vIDIuIFJlbW92ZSBwYWRkaW5nIHNvIHBlb3BsZSBhcmVuJ3QgY2F1Z2h0IG91dCBpZiB0aGV5IHplcm8gb3V0IGZpZWxkc2V0cy5cbi8vXG5cbmxlZ2VuZCB7XG4gIGJvcmRlcjogMDsgLy8gMVxuICBwYWRkaW5nOiAwOyAvLyAyXG59XG5cbi8vXG4vLyBSZW1vdmUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgOC85LzEwLzExLlxuLy9cblxudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLy9cbi8vIERvbid0IGluaGVyaXQgdGhlIGBmb250LXdlaWdodGAgKGFwcGxpZWQgYnkgYSBydWxlIGFib3ZlKS5cbi8vIE5PVEU6IHRoZSBkZWZhdWx0IGNhbm5vdCBzYWZlbHkgYmUgY2hhbmdlZCBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYLlxuLy9cblxub3B0Z3JvdXAge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLy8gVGFibGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gUmVtb3ZlIG1vc3Qgc3BhY2luZyBiZXR3ZWVuIHRhYmxlIGNlbGxzLlxuLy9cblxudGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICBib3JkZXItc3BhY2luZzogMDtcbn1cblxudGQsXG50aCB7XG4gIHBhZGRpbmc6IDA7XG59XG4iLCIvKlxuICogUHJvamVjdCBLaW1jaGlcbiAqXG4gKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDE1XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKlxuICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSdWJ5IGxpc3QgZnVuY3Rpb25zIGZyb20gQ29tcGFzczpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Db21wYXNzL2NvbXBhc3MvYmxvYi9zdGFibGUvbGliL2NvbXBhc3Mvc2Fzc19leHRlbnNpb25zL2Z1bmN0aW9ucy9saXN0cy5yYlxuICovXG4vKlxuICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSdWJ5IGNvbnN0YW50cyBmdW5jdGlvbnMgZnJvbSBDb21wYXNzOlxuICogaHR0cHM6Ly9naXRodWIuY29tL0NvbXBhc3MvY29tcGFzcy9ibG9iL3N0YWJsZS9saWIvY29tcGFzcy9zYXNzX2V4dGVuc2lvbnMvZnVuY3Rpb25zL2NvbnN0YW50cy5yYlxuICovXG4vKlxuICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSdWJ5IGRpc3BsYXkgZnVuY3Rpb25zIGZyb20gQ29tcGFzczpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Db21wYXNzL2NvbXBhc3MvYmxvYi9zdGFibGUvY29yZS9saWIvY29tcGFzcy9jb3JlL3Nhc3NfZXh0ZW5zaW9ucy9mdW5jdGlvbnMvZGlzcGxheS5yYlxuICovXG4vKiFcbiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNSBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG4vKiEgbm9ybWFsaXplLmNzcyB2My4wLjMgfCBNSVQgTGljZW5zZSB8IGdpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzICovXG5odG1sIHtcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG4gIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG59XG5cbmJvZHkge1xuICBtYXJnaW46IDA7XG59XG5cbmFydGljbGUsXG5hc2lkZSxcbmRldGFpbHMsXG5maWdjYXB0aW9uLFxuZmlndXJlLFxuZm9vdGVyLFxuaGVhZGVyLFxuaGdyb3VwLFxubWFpbixcbm1lbnUsXG5uYXYsXG5zZWN0aW9uLFxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5hdWRpbyxcbmNhbnZhcyxcbnByb2dyZXNzLFxudmlkZW8ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuYXVkaW86bm90KFtjb250cm9sc10pIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgaGVpZ2h0OiAwO1xufVxuXG5baGlkZGVuXSxcbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG5hOmFjdGl2ZSxcbmE6aG92ZXIge1xuICBvdXRsaW5lOiAwO1xufVxuXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQ7XG59XG5cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuZGZuIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuXG5tYXJrIHtcbiAgYmFja2dyb3VuZDogI2ZmMDtcbiAgY29sb3I6ICMwMDA7XG59XG5cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbnN1YixcbnN1cCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbmltZyB7XG4gIGJvcmRlcjogMDtcbn1cblxuc3ZnOm5vdCg6cm9vdCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG5maWd1cmUge1xuICBtYXJnaW46IDFlbSA0MHB4O1xufVxuXG5ociB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICBoZWlnaHQ6IDA7XG59XG5cbnByZSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG5jb2RlLFxua2JkLFxucHJlLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxZW07XG59XG5cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBmb250OiBpbmhlcml0O1xuICBtYXJnaW46IDA7XG59XG5cbmJ1dHRvbiB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG5idXR0b24sXG5zZWxlY3Qge1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbn1cblxuYnV0dG9uLFxuaHRtbCBpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwicmVzZXRcIl0sXG5pbnB1dFt0eXBlPVwic3VibWl0XCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuYnV0dG9uW2Rpc2FibGVkXSxcbmh0bWwgaW5wdXRbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5pbnB1dDo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlcjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuaW5wdXQge1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xufVxuXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAwO1xufVxuXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbn1cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbixcbmlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG5cbmZpZWxkc2V0IHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgbWFyZ2luOiAwIDJweDtcbiAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtO1xufVxuXG5sZWdlbmQge1xuICBib3JkZXI6IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbnRleHRhcmVhIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbm9wdGdyb3VwIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbnRhYmxlIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgYm9yZGVyLXNwYWNpbmc6IDA7XG59XG5cbnRkLFxudGgge1xuICBwYWRkaW5nOiAwO1xufVxuXG4vKiEgU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaDVicC9odG1sNS1ib2lsZXJwbGF0ZS9ibG9iL21hc3Rlci9zcmMvY3NzL21haW4uY3NzICovXG5AbWVkaWEgcHJpbnQge1xuICAqLFxuICAqOmJlZm9yZSxcbiAgKjphZnRlciB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzAwMCAhaW1wb3J0YW50O1xuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIGEsXG4gIGE6dmlzaXRlZCB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIH1cbiAgYVtocmVmXTphZnRlciB7XG4gICAgY29udGVudDogXCIgKFwiIGF0dHIoaHJlZikgXCIpXCI7XG4gIH1cbiAgYWJiclt0aXRsZV06YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIChcIiBhdHRyKHRpdGxlKSBcIilcIjtcbiAgfVxuICBhW2hyZWZePVwiI1wiXTphZnRlcixcbiAgYVtocmVmXj1cImphdmFzY3JpcHQ6XCJdOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICB9XG4gIHByZSxcbiAgYmxvY2txdW90ZSB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcbiAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgdGhlYWQge1xuICAgIGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cDtcbiAgfVxuICB0cixcbiAgaW1nIHtcbiAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgfVxuICBwLFxuICBoMixcbiAgaDMge1xuICAgIG9ycGhhbnM6IDM7XG4gICAgd2lkb3dzOiAzO1xuICB9XG4gIGgyLFxuICBoMyB7XG4gICAgcGFnZS1icmVhay1hZnRlcjogYXZvaWQ7XG4gIH1cbiAgLm5hdmJhciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuICAuYnRuID4gLmNhcmV0LFxuICAuZHJvcHVwID4gLmJ0biA+IC5jYXJldCB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogIzAwMCAhaW1wb3J0YW50O1xuICB9XG4gIC5sYWJlbCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcbiAgfVxuICAudGFibGUge1xuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDtcbiAgfVxuICAudGFibGUgdGQsXG4gIC50YWJsZSB0aCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICB9XG4gIC50YWJsZS1ib3JkZXJlZCB0aCxcbiAgLnRhYmxlLWJvcmRlcmVkIHRkIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuKiB7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4qOmJlZm9yZSxcbio6YWZ0ZXIge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuaHRtbCB7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVNZWRpdW1cIiwgXCJIZWx2ZXRpY2FOZXVlLU1lZGl1bVwiLCBcIkhlbHZldGljYSBOZXVlIE1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWVcIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGNvbG9yOiAjMjIyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG5pbnB1dCxcbmJ1dHRvbixcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG5cbmEge1xuICBjb2xvcjogIzNhMzkzYjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG5hOmhvdmVyLFxuYTpmb2N1cyB7XG4gIGNvbG9yOiAjMTQxMzE0O1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuYTpmb2N1cyB7XG4gIG91dGxpbmU6IHRoaW4gZG90dGVkO1xuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuXG5maWd1cmUge1xuICBtYXJnaW46IDA7XG59XG5cbmltZyB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5pbWctcmVzcG9uc2l2ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLmltZy1yb3VuZGVkIHtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uaW1nLXRodW1ibmFpbCB7XG4gIHBhZGRpbmc6IDRweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG4gIC1vLXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLmltZy1jaXJjbGUge1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5cbmhyIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYm9yZGVyOiAwO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2ZmZjtcbn1cblxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IC0xcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIGJvcmRlcjogMDtcbn1cblxuLnNyLW9ubHktZm9jdXNhYmxlOmFjdGl2ZSxcbi5zci1vbmx5LWZvY3VzYWJsZTpmb2N1cyB7XG4gIHBvc2l0aW9uOiBzdGF0aWM7XG4gIHdpZHRoOiBhdXRvO1xuICBoZWlnaHQ6IGF1dG87XG4gIG1hcmdpbjogMDtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIGNsaXA6IGF1dG87XG59XG5cbltyb2xlPVwiYnV0dG9uXCJdIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5oMSwgaDIsIGgzLCBoNCwgaDUsIGg2LFxuLmgxLCAuaDIsIC5oMywgLmg0LCAuaDUsIC5oNiB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXdlaWdodDogNTAwO1xuICBsaW5lLWhlaWdodDogMS4xO1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuaDEgc21hbGwsXG5oMSAuc21hbGwsIGgyIHNtYWxsLFxuaDIgLnNtYWxsLCBoMyBzbWFsbCxcbmgzIC5zbWFsbCwgaDQgc21hbGwsXG5oNCAuc21hbGwsIGg1IHNtYWxsLFxuaDUgLnNtYWxsLCBoNiBzbWFsbCxcbmg2IC5zbWFsbCxcbi5oMSBzbWFsbCxcbi5oMSAuc21hbGwsIC5oMiBzbWFsbCxcbi5oMiAuc21hbGwsIC5oMyBzbWFsbCxcbi5oMyAuc21hbGwsIC5oNCBzbWFsbCxcbi5oNCAuc21hbGwsIC5oNSBzbWFsbCxcbi5oNSAuc21hbGwsIC5oNiBzbWFsbCxcbi5oNiAuc21hbGwge1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICM5OTk7XG59XG5cbmgxLCAuaDEsXG5oMiwgLmgyLFxuaDMsIC5oMyB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbmgxIHNtYWxsLFxuaDEgLnNtYWxsLCAuaDEgc21hbGwsXG4uaDEgLnNtYWxsLFxuaDIgc21hbGwsXG5oMiAuc21hbGwsIC5oMiBzbWFsbCxcbi5oMiAuc21hbGwsXG5oMyBzbWFsbCxcbmgzIC5zbWFsbCwgLmgzIHNtYWxsLFxuLmgzIC5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogNjUlO1xufVxuXG5oNCwgLmg0LFxuaDUsIC5oNSxcbmg2LCAuaDYge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufVxuXG5oNCBzbWFsbCxcbmg0IC5zbWFsbCwgLmg0IHNtYWxsLFxuLmg0IC5zbWFsbCxcbmg1IHNtYWxsLFxuaDUgLnNtYWxsLCAuaDUgc21hbGwsXG4uaDUgLnNtYWxsLFxuaDYgc21hbGwsXG5oNiAuc21hbGwsIC5oNiBzbWFsbCxcbi5oNiAuc21hbGwge1xuICBmb250LXNpemU6IDc1JTtcbn1cblxuaDEsIC5oMSB7XG4gIGZvbnQtc2l6ZTogMS41NzFlbTtcbn1cblxuaDIsIC5oMiB7XG4gIGZvbnQtc2l6ZTogMjJweDtcbn1cblxuaDMsIC5oMyB7XG4gIGZvbnQtc2l6ZTogMTdweDtcbn1cblxuaDQsIC5oNCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuaDUsIC5oNSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuaDYsIC5oNiB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxucCB7XG4gIG1hcmdpbjogMCAwIDEwcHg7XG59XG5cbi5sZWFkIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogMzAwO1xuICBsaW5lLWhlaWdodDogMS40O1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmxlYWQge1xuICAgIGZvbnQtc2l6ZTogMjFweDtcbiAgfVxufVxuXG5zbWFsbCxcbi5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogODUlO1xufVxuXG5tYXJrLFxuLm1hcmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFlM2MyO1xuICBwYWRkaW5nOiAuMmVtO1xufVxuXG4udGV4dC1sZWZ0IHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLnRleHQtcmlnaHQge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLnRleHQtY2VudGVyIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4udGV4dC1qdXN0aWZ5IHtcbiAgdGV4dC1hbGlnbjoganVzdGlmeTtcbn1cblxuLnRleHQtbm93cmFwIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnRleHQtbG93ZXJjYXNlIHtcbiAgdGV4dC10cmFuc2Zvcm06IGxvd2VyY2FzZTtcbn1cblxuLnRleHQtdXBwZXJjYXNlLCAuaW5pdGlhbGlzbSB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG59XG5cbi50ZXh0LWNhcGl0YWxpemUge1xuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbn1cblxuLnRleHQtbXV0ZWQge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLnRleHQtcHJpbWFyeSB7XG4gIGNvbG9yOiAjM2EzOTNiO1xufVxuXG5hLnRleHQtcHJpbWFyeTpob3ZlcixcbmEudGV4dC1wcmltYXJ5OmZvY3VzIHtcbiAgY29sb3I6ICMyMTIwMjE7XG59XG5cbi50ZXh0LXN1Y2Nlc3Mge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuYS50ZXh0LXN1Y2Nlc3M6aG92ZXIsXG5hLnRleHQtc3VjY2Vzczpmb2N1cyB7XG4gIGNvbG9yOiAjNTI1MjUyO1xufVxuXG4udGV4dC1pbmZvIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbmEudGV4dC1pbmZvOmhvdmVyLFxuYS50ZXh0LWluZm86Zm9jdXMge1xuICBjb2xvcjogIzUyNTI1Mjtcbn1cblxuLnRleHQtd2FybmluZyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG5hLnRleHQtd2FybmluZzpob3ZlcixcbmEudGV4dC13YXJuaW5nOmZvY3VzIHtcbiAgY29sb3I6ICM1MjUyNTI7XG59XG5cbi50ZXh0LWRhbmdlciB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG5hLnRleHQtZGFuZ2VyOmhvdmVyLFxuYS50ZXh0LWRhbmdlcjpmb2N1cyB7XG4gIGNvbG9yOiAjNTI1MjUyO1xufVxuXG4uYmctcHJpbWFyeSB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4uYmctcHJpbWFyeSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG59XG5cbmEuYmctcHJpbWFyeTpob3ZlcixcbmEuYmctcHJpbWFyeTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTIwMjE7XG59XG5cbi5iZy1zdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZTZjYjtcbn1cblxuYS5iZy1zdWNjZXNzOmhvdmVyLFxuYS5iZy1zdWNjZXNzOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2MxZDVhOTtcbn1cblxuLmJnLWluZm8ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xufVxuXG5hLmJnLWluZm86aG92ZXIsXG5hLmJnLWluZm86Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWZkOWVlO1xufVxuXG4uYmctd2FybmluZyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMWUzYzI7XG59XG5cbmEuYmctd2FybmluZzpob3ZlcixcbmEuYmctd2FybmluZzpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlN2QwOTk7XG59XG5cbi5iZy1kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWFjM2M3O1xufVxuXG5hLmJnLWRhbmdlcjpob3ZlcixcbmEuYmctZGFuZ2VyOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkOWRhNDtcbn1cblxuLnBhZ2UtaGVhZGVyIHtcbiAgcGFkZGluZy1ib3R0b206IDlweDtcbiAgbWFyZ2luOiA0MHB4IDAgMjBweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmY7XG59XG5cbnVsLFxub2wge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufVxuXG51bCB1bCxcbnVsIG9sLFxub2wgdWwsXG5vbCBvbCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5saXN0LXVuc3R5bGVkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG4ubGlzdC1pbmxpbmUge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4O1xufVxuXG4ubGlzdC1pbmxpbmUgPiBsaSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbn1cblxuZGwge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG5kdCxcbmRkIHtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xufVxuXG5kdCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5kZCB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4uZGwtaG9yaXpvbnRhbCBkZDpiZWZvcmUsXG4uZGwtaG9yaXpvbnRhbCBkZDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmRsLWhvcml6b250YWwgZGQ6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5kbC1ob3Jpem9udGFsIGR0IHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogMTYwcHg7XG4gICAgY2xlYXI6IGxlZnQ7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG4gIC5kbC1ob3Jpem9udGFsIGRkIHtcbiAgICBtYXJnaW4tbGVmdDogMTgwcHg7XG4gIH1cbn1cblxuYWJiclt0aXRsZV0sXG5hYmJyW2RhdGEtb3JpZ2luYWwtdGl0bGVdIHtcbiAgY3Vyc29yOiBoZWxwO1xuICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICM5OTk7XG59XG5cbi5pbml0aWFsaXNtIHtcbiAgZm9udC1zaXplOiA5MCU7XG59XG5cbmJsb2NrcXVvdGUge1xuICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gIG1hcmdpbjogMCAwIDIwcHg7XG4gIGZvbnQtc2l6ZTogMTcuNXB4O1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZmY7XG59XG5cbmJsb2NrcXVvdGUgcDpsYXN0LWNoaWxkLFxuYmxvY2txdW90ZSB1bDpsYXN0LWNoaWxkLFxuYmxvY2txdW90ZSBvbDpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuYmxvY2txdW90ZSBmb290ZXIsXG5ibG9ja3F1b3RlIHNtYWxsLFxuYmxvY2txdW90ZSAuc21hbGwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiA4MCU7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICM5OTk7XG59XG5cbmJsb2NrcXVvdGUgZm9vdGVyOmJlZm9yZSxcbmJsb2NrcXVvdGUgc21hbGw6YmVmb3JlLFxuYmxvY2txdW90ZSAuc21hbGw6YmVmb3JlIHtcbiAgY29udGVudDogJ1xcMjAxNCBcXDAwQTAnO1xufVxuXG4uYmxvY2txdW90ZS1yZXZlcnNlLFxuYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHtcbiAgcGFkZGluZy1yaWdodDogMTVweDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCAjZmZmO1xuICBib3JkZXItbGVmdDogMDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG59XG5cbi5ibG9ja3F1b3RlLXJldmVyc2UgZm9vdGVyOmJlZm9yZSxcbi5ibG9ja3F1b3RlLXJldmVyc2Ugc21hbGw6YmVmb3JlLFxuLmJsb2NrcXVvdGUtcmV2ZXJzZSAuc21hbGw6YmVmb3JlLFxuYmxvY2txdW90ZS5wdWxsLXJpZ2h0IGZvb3RlcjpiZWZvcmUsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgc21hbGw6YmVmb3JlLFxuYmxvY2txdW90ZS5wdWxsLXJpZ2h0IC5zbWFsbDpiZWZvcmUge1xuICBjb250ZW50OiAnJztcbn1cblxuLmJsb2NrcXVvdGUtcmV2ZXJzZSBmb290ZXI6YWZ0ZXIsXG4uYmxvY2txdW90ZS1yZXZlcnNlIHNtYWxsOmFmdGVyLFxuLmJsb2NrcXVvdGUtcmV2ZXJzZSAuc21hbGw6YWZ0ZXIsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgZm9vdGVyOmFmdGVyLFxuYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxsOmFmdGVyLFxuYmxvY2txdW90ZS5wdWxsLXJpZ2h0IC5zbWFsbDphZnRlciB7XG4gIGNvbnRlbnQ6ICdcXDAwQTAgXFwyMDE0Jztcbn1cblxuYWRkcmVzcyB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xufVxuXG5jb2RlLFxua2JkLFxucHJlLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgXCJDb3VyaWVyIE5ld1wiLCBtb25vc3BhY2U7XG59XG5cbmNvZGUge1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBmb250LXNpemU6IDkwJTtcbiAgY29sb3I6ICNjNzI1NGU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWYyZjQ7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxua2JkIHtcbiAgcGFkZGluZzogMnB4IDRweDtcbiAgZm9udC1zaXplOiA5MCU7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7XG59XG5cbmtiZCBrYmQge1xuICBwYWRkaW5nOiAwO1xuICBmb250LXNpemU6IDEwMCU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG5wcmUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogOS41cHg7XG4gIG1hcmdpbjogMCAwIDEwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICB3b3JkLWJyZWFrOiBicmVhay1hbGw7XG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgY29sb3I6ICMyMjI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxucHJlIGNvZGUge1xuICBwYWRkaW5nOiAwO1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4ucHJlLXNjcm9sbGFibGUge1xuICBtYXgtaGVpZ2h0OiAzNDBweDtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxuXG4uY29udGFpbmVyIHtcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBwYWRkaW5nLXJpZ2h0OiAwO1xufVxuXG4uY29udGFpbmVyOmJlZm9yZSxcbi5jb250YWluZXI6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5jb250YWluZXI6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5jb250YWluZXIge1xuICAgIHdpZHRoOiA5NDBweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XG4gIC5jb250YWluZXIge1xuICAgIHdpZHRoOiAxMTQwcHg7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDE2ODApIHtcbiAgLmNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDE1NDBweDtcbiAgfVxufVxuXG4uY29udGFpbmVyLWZsdWlkIHtcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBwYWRkaW5nLXJpZ2h0OiAwO1xufVxuXG4uY29udGFpbmVyLWZsdWlkOmJlZm9yZSxcbi5jb250YWluZXItZmx1aWQ6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5jb250YWluZXItZmx1aWQ6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLnJvdyB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xuICBtYXJnaW4tcmlnaHQ6IDA7XG59XG5cbi5yb3c6YmVmb3JlLFxuLnJvdzphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLnJvdzphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4uY29sLXhzLTEsIC5jb2wtc20tMSwgLmNvbC1tZC0xLCAuY29sLWxnLTEsIC5jb2wteHMtMiwgLmNvbC1zbS0yLCAuY29sLW1kLTIsIC5jb2wtbGctMiwgLmNvbC14cy0zLCAuY29sLXNtLTMsIC5jb2wtbWQtMywgLmNvbC1sZy0zLCAuY29sLXhzLTQsIC5jb2wtc20tNCwgLmNvbC1tZC00LCAuY29sLWxnLTQsIC5jb2wteHMtNSwgLmNvbC1zbS01LCAuY29sLW1kLTUsIC5jb2wtbGctNSwgLmNvbC14cy02LCAuY29sLXNtLTYsIC5jb2wtbWQtNiwgLmNvbC1sZy02LCAuY29sLXhzLTcsIC5jb2wtc20tNywgLmNvbC1tZC03LCAuY29sLWxnLTcsIC5jb2wteHMtOCwgLmNvbC1zbS04LCAuY29sLW1kLTgsIC5jb2wtbGctOCwgLmNvbC14cy05LCAuY29sLXNtLTksIC5jb2wtbWQtOSwgLmNvbC1sZy05LCAuY29sLXhzLTEwLCAuY29sLXNtLTEwLCAuY29sLW1kLTEwLCAuY29sLWxnLTEwLCAuY29sLXhzLTExLCAuY29sLXNtLTExLCAuY29sLW1kLTExLCAuY29sLWxnLTExLCAuY29sLXhzLTEyLCAuY29sLXNtLTEyLCAuY29sLW1kLTEyLCAuY29sLWxnLTEyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgcGFkZGluZy1yaWdodDogMDtcbn1cblxuLmNvbC14cy0xLCAuY29sLXhzLTIsIC5jb2wteHMtMywgLmNvbC14cy00LCAuY29sLXhzLTUsIC5jb2wteHMtNiwgLmNvbC14cy03LCAuY29sLXhzLTgsIC5jb2wteHMtOSwgLmNvbC14cy0xMCwgLmNvbC14cy0xMSwgLmNvbC14cy0xMiB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4uY29sLXhzLTEge1xuICB3aWR0aDogOC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy0yIHtcbiAgd2lkdGg6IDE2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLTMge1xuICB3aWR0aDogMjUlO1xufVxuXG4uY29sLXhzLTQge1xuICB3aWR0aDogMzMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtNSB7XG4gIHdpZHRoOiA0MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy02IHtcbiAgd2lkdGg6IDUwJTtcbn1cblxuLmNvbC14cy03IHtcbiAgd2lkdGg6IDU4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLTgge1xuICB3aWR0aDogNjYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtOSB7XG4gIHdpZHRoOiA3NSU7XG59XG5cbi5jb2wteHMtMTAge1xuICB3aWR0aDogODMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtMTEge1xuICB3aWR0aDogOTEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtMTIge1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmNvbC14cy1wdWxsLTAge1xuICByaWdodDogYXV0bztcbn1cblxuLmNvbC14cy1wdWxsLTEge1xuICByaWdodDogOC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdWxsLTIge1xuICByaWdodDogMTYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVsbC0zIHtcbiAgcmlnaHQ6IDI1JTtcbn1cblxuLmNvbC14cy1wdWxsLTQge1xuICByaWdodDogMzMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVsbC01IHtcbiAgcmlnaHQ6IDQxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1bGwtNiB7XG4gIHJpZ2h0OiA1MCU7XG59XG5cbi5jb2wteHMtcHVsbC03IHtcbiAgcmlnaHQ6IDU4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1bGwtOCB7XG4gIHJpZ2h0OiA2Ni42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdWxsLTkge1xuICByaWdodDogNzUlO1xufVxuXG4uY29sLXhzLXB1bGwtMTAge1xuICByaWdodDogODMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVsbC0xMSB7XG4gIHJpZ2h0OiA5MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdWxsLTEyIHtcbiAgcmlnaHQ6IDEwMCU7XG59XG5cbi5jb2wteHMtcHVzaC0wIHtcbiAgbGVmdDogYXV0bztcbn1cblxuLmNvbC14cy1wdXNoLTEge1xuICBsZWZ0OiA4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1c2gtMiB7XG4gIGxlZnQ6IDE2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1c2gtMyB7XG4gIGxlZnQ6IDI1JTtcbn1cblxuLmNvbC14cy1wdXNoLTQge1xuICBsZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdXNoLTUge1xuICBsZWZ0OiA0MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdXNoLTYge1xuICBsZWZ0OiA1MCU7XG59XG5cbi5jb2wteHMtcHVzaC03IHtcbiAgbGVmdDogNTguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVzaC04IHtcbiAgbGVmdDogNjYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVzaC05IHtcbiAgbGVmdDogNzUlO1xufVxuXG4uY29sLXhzLXB1c2gtMTAge1xuICBsZWZ0OiA4My4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdXNoLTExIHtcbiAgbGVmdDogOTEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVzaC0xMiB7XG4gIGxlZnQ6IDEwMCU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTAge1xuICBtYXJnaW4tbGVmdDogMCU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTEge1xuICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1vZmZzZXQtMiB7XG4gIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1vZmZzZXQtMyB7XG4gIG1hcmdpbi1sZWZ0OiAyNSU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTQge1xuICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTUge1xuICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTYge1xuICBtYXJnaW4tbGVmdDogNTAlO1xufVxuXG4uY29sLXhzLW9mZnNldC03IHtcbiAgbWFyZ2luLWxlZnQ6IDU4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLW9mZnNldC04IHtcbiAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLW9mZnNldC05IHtcbiAgbWFyZ2luLWxlZnQ6IDc1JTtcbn1cblxuLmNvbC14cy1vZmZzZXQtMTAge1xuICBtYXJnaW4tbGVmdDogODMuMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTExIHtcbiAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLW9mZnNldC0xMiB7XG4gIG1hcmdpbi1sZWZ0OiAxMDAlO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmNvbC1zbS0xLCAuY29sLXNtLTIsIC5jb2wtc20tMywgLmNvbC1zbS00LCAuY29sLXNtLTUsIC5jb2wtc20tNiwgLmNvbC1zbS03LCAuY29sLXNtLTgsIC5jb2wtc20tOSwgLmNvbC1zbS0xMCwgLmNvbC1zbS0xMSwgLmNvbC1zbS0xMiB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbiAgLmNvbC1zbS0xIHtcbiAgICB3aWR0aDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLTIge1xuICAgIHdpZHRoOiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLTMge1xuICAgIHdpZHRoOiAyNSU7XG4gIH1cbiAgLmNvbC1zbS00IHtcbiAgICB3aWR0aDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS01IHtcbiAgICB3aWR0aDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS02IHtcbiAgICB3aWR0aDogNTAlO1xuICB9XG4gIC5jb2wtc20tNyB7XG4gICAgd2lkdGg6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tOCB7XG4gICAgd2lkdGg6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tOSB7XG4gICAgd2lkdGg6IDc1JTtcbiAgfVxuICAuY29sLXNtLTEwIHtcbiAgICB3aWR0aDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS0xMSB7XG4gICAgd2lkdGg6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tMTIge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIC5jb2wtc20tcHVsbC0wIHtcbiAgICByaWdodDogYXV0bztcbiAgfVxuICAuY29sLXNtLXB1bGwtMSB7XG4gICAgcmlnaHQ6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTIge1xuICAgIHJpZ2h0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1bGwtMyB7XG4gICAgcmlnaHQ6IDI1JTtcbiAgfVxuICAuY29sLXNtLXB1bGwtNCB7XG4gICAgcmlnaHQ6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVsbC01IHtcbiAgICByaWdodDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTYge1xuICAgIHJpZ2h0OiA1MCU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTcge1xuICAgIHJpZ2h0OiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1bGwtOCB7XG4gICAgcmlnaHQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVsbC05IHtcbiAgICByaWdodDogNzUlO1xuICB9XG4gIC5jb2wtc20tcHVsbC0xMCB7XG4gICAgcmlnaHQ6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVsbC0xMSB7XG4gICAgcmlnaHQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVsbC0xMiB7XG4gICAgcmlnaHQ6IDEwMCU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTAge1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTEge1xuICAgIGxlZnQ6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTIge1xuICAgIGxlZnQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVzaC0zIHtcbiAgICBsZWZ0OiAyNSU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTQge1xuICAgIGxlZnQ6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVzaC01IHtcbiAgICBsZWZ0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1c2gtNiB7XG4gICAgbGVmdDogNTAlO1xuICB9XG4gIC5jb2wtc20tcHVzaC03IHtcbiAgICBsZWZ0OiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1c2gtOCB7XG4gICAgbGVmdDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTkge1xuICAgIGxlZnQ6IDc1JTtcbiAgfVxuICAuY29sLXNtLXB1c2gtMTAge1xuICAgIGxlZnQ6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVzaC0xMSB7XG4gICAgbGVmdDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTEyIHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwJTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC0xIHtcbiAgICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC0yIHtcbiAgICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtMyB7XG4gICAgbWFyZ2luLWxlZnQ6IDI1JTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC00IHtcbiAgICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtNSB7XG4gICAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTYge1xuICAgIG1hcmdpbi1sZWZ0OiA1MCU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtNyB7XG4gICAgbWFyZ2luLWxlZnQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTgge1xuICAgIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC05IHtcbiAgICBtYXJnaW4tbGVmdDogNzUlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTEwIHtcbiAgICBtYXJnaW4tbGVmdDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtMTEge1xuICAgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC0xMiB7XG4gICAgbWFyZ2luLWxlZnQ6IDEwMCU7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkge1xuICAuY29sLW1kLTEsIC5jb2wtbWQtMiwgLmNvbC1tZC0zLCAuY29sLW1kLTQsIC5jb2wtbWQtNSwgLmNvbC1tZC02LCAuY29sLW1kLTcsIC5jb2wtbWQtOCwgLmNvbC1tZC05LCAuY29sLW1kLTEwLCAuY29sLW1kLTExLCAuY29sLW1kLTEyIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxuICAuY29sLW1kLTEge1xuICAgIHdpZHRoOiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtMiB7XG4gICAgd2lkdGg6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtMyB7XG4gICAgd2lkdGg6IDI1JTtcbiAgfVxuICAuY29sLW1kLTQge1xuICAgIHdpZHRoOiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLTUge1xuICAgIHdpZHRoOiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLTYge1xuICAgIHdpZHRoOiA1MCU7XG4gIH1cbiAgLmNvbC1tZC03IHtcbiAgICB3aWR0aDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC04IHtcbiAgICB3aWR0aDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC05IHtcbiAgICB3aWR0aDogNzUlO1xuICB9XG4gIC5jb2wtbWQtMTAge1xuICAgIHdpZHRoOiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLTExIHtcbiAgICB3aWR0aDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC0xMiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTAge1xuICAgIHJpZ2h0OiBhdXRvO1xuICB9XG4gIC5jb2wtbWQtcHVsbC0xIHtcbiAgICByaWdodDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1bGwtMiB7XG4gICAgcmlnaHQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtcHVsbC0zIHtcbiAgICByaWdodDogMjUlO1xuICB9XG4gIC5jb2wtbWQtcHVsbC00IHtcbiAgICByaWdodDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTUge1xuICAgIHJpZ2h0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1bGwtNiB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgfVxuICAuY29sLW1kLXB1bGwtNyB7XG4gICAgcmlnaHQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtcHVsbC04IHtcbiAgICByaWdodDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTkge1xuICAgIHJpZ2h0OiA3NSU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTEwIHtcbiAgICByaWdodDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTExIHtcbiAgICByaWdodDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTEyIHtcbiAgICByaWdodDogMTAwJTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMCB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxuICAuY29sLW1kLXB1c2gtMSB7XG4gICAgbGVmdDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMiB7XG4gICAgbGVmdDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTMge1xuICAgIGxlZnQ6IDI1JTtcbiAgfVxuICAuY29sLW1kLXB1c2gtNCB7XG4gICAgbGVmdDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTUge1xuICAgIGxlZnQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtcHVzaC02IHtcbiAgICBsZWZ0OiA1MCU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTcge1xuICAgIGxlZnQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtcHVzaC04IHtcbiAgICBsZWZ0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1c2gtOSB7XG4gICAgbGVmdDogNzUlO1xuICB9XG4gIC5jb2wtbWQtcHVzaC0xMCB7XG4gICAgbGVmdDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTExIHtcbiAgICBsZWZ0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMTIge1xuICAgIGxlZnQ6IDEwMCU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDAlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTEge1xuICAgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC0zIHtcbiAgICBtYXJnaW4tbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTQge1xuICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC01IHtcbiAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtNiB7XG4gICAgbWFyZ2luLWxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC03IHtcbiAgICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtOCB7XG4gICAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTkge1xuICAgIG1hcmdpbi1sZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtMTAge1xuICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC0xMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTEyIHtcbiAgICBtYXJnaW4tbGVmdDogMTAwJTtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAuY29sLWxnLTEsIC5jb2wtbGctMiwgLmNvbC1sZy0zLCAuY29sLWxnLTQsIC5jb2wtbGctNSwgLmNvbC1sZy02LCAuY29sLWxnLTcsIC5jb2wtbGctOCwgLmNvbC1sZy05LCAuY29sLWxnLTEwLCAuY29sLWxnLTExLCAuY29sLWxnLTEyIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxuICAuY29sLWxnLTEge1xuICAgIHdpZHRoOiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctMiB7XG4gICAgd2lkdGg6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctMyB7XG4gICAgd2lkdGg6IDI1JTtcbiAgfVxuICAuY29sLWxnLTQge1xuICAgIHdpZHRoOiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLTUge1xuICAgIHdpZHRoOiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLTYge1xuICAgIHdpZHRoOiA1MCU7XG4gIH1cbiAgLmNvbC1sZy03IHtcbiAgICB3aWR0aDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy04IHtcbiAgICB3aWR0aDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy05IHtcbiAgICB3aWR0aDogNzUlO1xuICB9XG4gIC5jb2wtbGctMTAge1xuICAgIHdpZHRoOiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLTExIHtcbiAgICB3aWR0aDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy0xMiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTAge1xuICAgIHJpZ2h0OiBhdXRvO1xuICB9XG4gIC5jb2wtbGctcHVsbC0xIHtcbiAgICByaWdodDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMiB7XG4gICAgcmlnaHQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVsbC0zIHtcbiAgICByaWdodDogMjUlO1xuICB9XG4gIC5jb2wtbGctcHVsbC00IHtcbiAgICByaWdodDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTUge1xuICAgIHJpZ2h0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1bGwtNiB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtNyB7XG4gICAgcmlnaHQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctcHVsbC04IHtcbiAgICByaWdodDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTkge1xuICAgIHJpZ2h0OiA3NSU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTEwIHtcbiAgICByaWdodDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTExIHtcbiAgICByaWdodDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTEyIHtcbiAgICByaWdodDogMTAwJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtMCB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxuICAuY29sLWxnLXB1c2gtMSB7XG4gICAgbGVmdDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtMiB7XG4gICAgbGVmdDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTMge1xuICAgIGxlZnQ6IDI1JTtcbiAgfVxuICAuY29sLWxnLXB1c2gtNCB7XG4gICAgbGVmdDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTUge1xuICAgIGxlZnQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVzaC02IHtcbiAgICBsZWZ0OiA1MCU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTcge1xuICAgIGxlZnQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctcHVzaC04IHtcbiAgICBsZWZ0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1c2gtOSB7XG4gICAgbGVmdDogNzUlO1xuICB9XG4gIC5jb2wtbGctcHVzaC0xMCB7XG4gICAgbGVmdDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTExIHtcbiAgICBsZWZ0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1c2gtMTIge1xuICAgIGxlZnQ6IDEwMCU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDAlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTEge1xuICAgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC0zIHtcbiAgICBtYXJnaW4tbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTQge1xuICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC01IHtcbiAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtNiB7XG4gICAgbWFyZ2luLWxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC03IHtcbiAgICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtOCB7XG4gICAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTkge1xuICAgIG1hcmdpbi1sZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMTAge1xuICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC0xMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTEyIHtcbiAgICBtYXJnaW4tbGVmdDogMTAwJTtcbiAgfVxufVxuXG50YWJsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG5jYXB0aW9uIHtcbiAgcGFkZGluZy10b3A6IDhweDtcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cbnRoIHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLnRhYmxlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRoLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRkIHtcbiAgcGFkZGluZzogOHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGgge1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICBib3JkZXItYm90dG9tOiAycHggc29saWQgI2RkZDtcbn1cblxuLnRhYmxlID4gY2FwdGlvbiArIHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0aCxcbi50YWJsZSA+IGNhcHRpb24gKyB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkID4gdGQsXG4udGFibGUgPiBjb2xncm91cCArIHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0aCxcbi50YWJsZSA+IGNvbGdyb3VwICsgdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRkLFxuLnRhYmxlID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnRhYmxlID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCA+IHRkIHtcbiAgYm9yZGVyLXRvcDogMDtcbn1cblxuLnRhYmxlID4gdGJvZHkgKyB0Ym9keSB7XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCAjZGRkO1xufVxuXG4udGFibGUgLnRhYmxlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLnRhYmxlLWNvbmRlbnNlZCA+IHRoZWFkID4gdHIgPiB0aCxcbi50YWJsZS1jb25kZW5zZWQgPiB0aGVhZCA+IHRyID4gdGQsXG4udGFibGUtY29uZGVuc2VkID4gdGJvZHkgPiB0ciA+IHRoLFxuLnRhYmxlLWNvbmRlbnNlZCA+IHRib2R5ID4gdHIgPiB0ZCxcbi50YWJsZS1jb25kZW5zZWQgPiB0Zm9vdCA+IHRyID4gdGgsXG4udGFibGUtY29uZGVuc2VkID4gdGZvb3QgPiB0ciA+IHRkIHtcbiAgcGFkZGluZzogNXB4O1xufVxuXG4udGFibGUtYm9yZGVyZWQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4udGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGgsXG4udGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQsXG4udGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGgsXG4udGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQsXG4udGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGgsXG4udGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4udGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGgsXG4udGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQge1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAycHg7XG59XG5cbi50YWJsZS1zdHJpcGVkID4gdGJvZHkgPiB0cjpudGgtb2YtdHlwZShvZGQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcbn1cblxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0cjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG5cbnRhYmxlIGNvbFtjbGFzcyo9XCJjb2wtXCJdIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbiAgZmxvYXQ6IG5vbmU7XG4gIGRpc3BsYXk6IHRhYmxlLWNvbHVtbjtcbn1cblxudGFibGUgdGRbY2xhc3MqPVwiY29sLVwiXSxcbnRhYmxlIHRoW2NsYXNzKj1cImNvbC1cIl0ge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICBmbG9hdDogbm9uZTtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbn1cblxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRkLmFjdGl2ZSxcbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0aC5hY3RpdmUsXG4udGFibGUgPiB0aGVhZCA+IHRyLmFjdGl2ZSA+IHRkLFxuLnRhYmxlID4gdGhlYWQgPiB0ci5hY3RpdmUgPiB0aCxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0ZC5hY3RpdmUsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGguYWN0aXZlLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5hY3RpdmUgPiB0ZCxcbi50YWJsZSA+IHRib2R5ID4gdHIuYWN0aXZlID4gdGgsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGQuYWN0aXZlLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRoLmFjdGl2ZSxcbi50YWJsZSA+IHRmb290ID4gdHIuYWN0aXZlID4gdGQsXG4udGFibGUgPiB0Zm9vdCA+IHRyLmFjdGl2ZSA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cblxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRkLmFjdGl2ZTpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0aC5hY3RpdmU6aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLmFjdGl2ZTpob3ZlciA+IHRkLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0cjpob3ZlciA+IC5hY3RpdmUsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLmFjdGl2ZTpob3ZlciA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZThlODtcbn1cblxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRkLnN1Y2Nlc3MsXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGguc3VjY2Vzcyxcbi50YWJsZSA+IHRoZWFkID4gdHIuc3VjY2VzcyA+IHRkLFxuLnRhYmxlID4gdGhlYWQgPiB0ci5zdWNjZXNzID4gdGgsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGQuc3VjY2Vzcyxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0aC5zdWNjZXNzLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5zdWNjZXNzID4gdGQsXG4udGFibGUgPiB0Ym9keSA+IHRyLnN1Y2Nlc3MgPiB0aCxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0ZC5zdWNjZXNzLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRoLnN1Y2Nlc3MsXG4udGFibGUgPiB0Zm9vdCA+IHRyLnN1Y2Nlc3MgPiB0ZCxcbi50YWJsZSA+IHRmb290ID4gdHIuc3VjY2VzcyA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZTZjYjtcbn1cblxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRkLnN1Y2Nlc3M6aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGguc3VjY2Vzczpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuc3VjY2Vzczpob3ZlciA+IHRkLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0cjpob3ZlciA+IC5zdWNjZXNzLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ci5zdWNjZXNzOmhvdmVyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2VkZWJhO1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQuaW5mbyxcbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0aC5pbmZvLFxuLnRhYmxlID4gdGhlYWQgPiB0ci5pbmZvID4gdGQsXG4udGFibGUgPiB0aGVhZCA+IHRyLmluZm8gPiB0aCxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0ZC5pbmZvLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRoLmluZm8sXG4udGFibGUgPiB0Ym9keSA+IHRyLmluZm8gPiB0ZCxcbi50YWJsZSA+IHRib2R5ID4gdHIuaW5mbyA+IHRoLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRkLmluZm8sXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGguaW5mbyxcbi50YWJsZSA+IHRmb290ID4gdHIuaW5mbyA+IHRkLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5pbmZvID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGQuaW5mbzpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0aC5pbmZvOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ci5pbmZvOmhvdmVyID4gdGQsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyID4gLmluZm8sXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLmluZm86aG92ZXIgPiB0aCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjNGUzZjM7XG59XG5cbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0ZC53YXJuaW5nLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLndhcm5pbmcsXG4udGFibGUgPiB0aGVhZCA+IHRyLndhcm5pbmcgPiB0ZCxcbi50YWJsZSA+IHRoZWFkID4gdHIud2FybmluZyA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLndhcm5pbmcsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGgud2FybmluZyxcbi50YWJsZSA+IHRib2R5ID4gdHIud2FybmluZyA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ci53YXJuaW5nID4gdGgsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGQud2FybmluZyxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0aC53YXJuaW5nLFxuLnRhYmxlID4gdGZvb3QgPiB0ci53YXJuaW5nID4gdGQsXG4udGFibGUgPiB0Zm9vdCA+IHRyLndhcm5pbmcgPiB0aCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMWUzYzI7XG59XG5cbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0ZC53YXJuaW5nOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRoLndhcm5pbmc6aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLndhcm5pbmc6aG92ZXIgPiB0ZCxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHI6aG92ZXIgPiAud2FybmluZyxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIud2FybmluZzpob3ZlciA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZDlhZDtcbn1cblxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRkLmRhbmdlcixcbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0aC5kYW5nZXIsXG4udGFibGUgPiB0aGVhZCA+IHRyLmRhbmdlciA+IHRkLFxuLnRhYmxlID4gdGhlYWQgPiB0ci5kYW5nZXIgPiB0aCxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0ZC5kYW5nZXIsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGguZGFuZ2VyLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5kYW5nZXIgPiB0ZCxcbi50YWJsZSA+IHRib2R5ID4gdHIuZGFuZ2VyID4gdGgsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGQuZGFuZ2VyLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRoLmRhbmdlcixcbi50YWJsZSA+IHRmb290ID4gdHIuZGFuZ2VyID4gdGQsXG4udGFibGUgPiB0Zm9vdCA+IHRyLmRhbmdlciA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VhYzNjNztcbn1cblxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRkLmRhbmdlcjpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0aC5kYW5nZXI6aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLmRhbmdlcjpob3ZlciA+IHRkLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0cjpob3ZlciA+IC5kYW5nZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLmRhbmdlcjpob3ZlciA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UzYjBiNTtcbn1cblxuLnRhYmxlLXJlc3BvbnNpdmUge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBtaW4taGVpZ2h0OiAwLjAxJTtcbn1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLnRhYmxlLXJlc3BvbnNpdmUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogLW1zLWF1dG9oaWRpbmctc2Nyb2xsYmFyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIH1cbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUgPiB0aGVhZCA+IHRyID4gdGgsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSA+IHRib2R5ID4gdHIgPiB0aCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUgPiB0Ym9keSA+IHRyID4gdGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRoLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSA+IHRmb290ID4gdHIgPiB0ZCB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCB7XG4gICAgYm9yZGVyOiAwO1xuICB9XG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgIGJvcmRlci1sZWZ0OiAwO1xuICB9XG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRkOmxhc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRkOmxhc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRkOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci1yaWdodDogMDtcbiAgfVxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRoLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHI6bGFzdC1jaGlsZCA+IHRoLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHI6bGFzdC1jaGlsZCA+IHRkIHtcbiAgICBib3JkZXItYm90dG9tOiAwO1xuICB9XG59XG5cbmZpZWxkc2V0IHtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xuICBib3JkZXI6IDA7XG4gIG1pbi13aWR0aDogMDtcbn1cblxubGVnZW5kIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBmb250LXNpemU6IDIxcHg7XG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICBjb2xvcjogIzIyMjtcbiAgYm9yZGVyOiAwO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcbn1cblxubGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW46IDRweCAwIDA7XG4gIG1hcmdpbi10b3A6IDFweCBcXDk7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbmlucHV0W3R5cGU9XCJmaWxlXCJdIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbmlucHV0W3R5cGU9XCJyYW5nZVwiXSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbn1cblxuc2VsZWN0W211bHRpcGxlXSxcbnNlbGVjdFtzaXplXSB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuaW5wdXRbdHlwZT1cImZpbGVcIl06Zm9jdXMsXG5pbnB1dFt0eXBlPVwicmFkaW9cIl06Zm9jdXMsXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Zm9jdXMge1xuICBvdXRsaW5lOiB0aGluIGRvdHRlZDtcbiAgb3V0bGluZTogNXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO1xuICBvdXRsaW5lLW9mZnNldDogLTJweDtcbn1cblxub3V0cHV0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBjb2xvcjogIzQ0NDtcbn1cblxuLmZvcm0tY29udHJvbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzNHB4O1xuICBwYWRkaW5nOiA2cHggMTJweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGNvbG9yOiAjNDQ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIGVhc2UtaW4tb3V0IDAuMTVzLCBib3gtc2hhZG93IGVhc2UtaW4tb3V0IDAuMTVzO1xuICAtby10cmFuc2l0aW9uOiBib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgMC4xNXMsIGJveC1zaGFkb3cgZWFzZS1pbi1vdXQgMC4xNXM7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciBlYXNlLWluLW91dCAwLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAwLjE1cztcbn1cblxuLmZvcm0tY29udHJvbDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOTtcbiAgb3V0bGluZTogMDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA4cHggcmdiYSgxMDIsIDE3NSwgMjMzLCAwLjYpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA4cHggcmdiYSgxMDIsIDE3NSwgMjMzLCAwLjYpO1xufVxuXG4uZm9ybS1jb250cm9sOjotbW96LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi5mb3JtLWNvbnRyb2w6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6ICM5OTk7XG59XG5cbi5mb3JtLWNvbnRyb2w6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLmZvcm0tY29udHJvbFtkaXNhYmxlZF0sXG4uZm9ybS1jb250cm9sW3JlYWRvbmx5XSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuZm9ybS1jb250cm9sIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMTtcbn1cblxuLmZvcm0tY29udHJvbFtkaXNhYmxlZF0sXG5maWVsZHNldFtkaXNhYmxlZF0gLmZvcm0tY29udHJvbCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbnRleHRhcmVhLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMCkge1xuICBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5mb3JtLWNvbnRyb2wsXG4gIGlucHV0W3R5cGU9XCJ0aW1lXCJdLmZvcm0tY29udHJvbCxcbiAgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLmZvcm0tY29udHJvbCxcbiAgaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmZvcm0tY29udHJvbCB7XG4gICAgbGluZS1oZWlnaHQ6IDM0cHg7XG4gIH1cbiAgaW5wdXRbdHlwZT1cImRhdGVcIl0uaW5wdXQtc20sXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJkYXRlXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cImRhdGVcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1zbSBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0uaW5wdXQtc20sXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJ0aW1lXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cInRpbWVcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwidGltZVwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1zbSBpbnB1dFt0eXBlPVwidGltZVwiXSxcbiAgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLmlucHV0LXNtLFxuICAuaW5wdXQtZ3JvdXAtc20gPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtc20gPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uYnRuLFxuICAuaW5wdXQtZ3JvdXAtc20gaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLFxuICBpbnB1dFt0eXBlPVwibW9udGhcIl0uaW5wdXQtc20sXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5mb3JtLWNvbnRyb2wsXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1zbSBpbnB1dFt0eXBlPVwibW9udGhcIl0ge1xuICAgIGxpbmUtaGVpZ2h0OiAzMHB4O1xuICB9XG4gIGlucHV0W3R5cGU9XCJkYXRlXCJdLmlucHV0LWxnLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5mb3JtLWNvbnRyb2wsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJkYXRlXCJdLmlucHV0LWdyb3VwLWFkZG9uLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gaW5wdXRbdHlwZT1cImRhdGVcIl0uYnRuLFxuICAuaW5wdXQtZ3JvdXAtbGcgaW5wdXRbdHlwZT1cImRhdGVcIl0sXG4gIGlucHV0W3R5cGU9XCJ0aW1lXCJdLmlucHV0LWxnLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwidGltZVwiXS5mb3JtLWNvbnRyb2wsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJ0aW1lXCJdLmlucHV0LWdyb3VwLWFkZG9uLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gaW5wdXRbdHlwZT1cInRpbWVcIl0uYnRuLFxuICAuaW5wdXQtZ3JvdXAtbGcgaW5wdXRbdHlwZT1cInRpbWVcIl0sXG4gIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXS5pbnB1dC1sZyxcbiAgLmlucHV0LWdyb3VwLWxnID4gaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLWxnID4gaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLmlucHV0LWdyb3VwLWFkZG9uLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLmJ0bixcbiAgLmlucHV0LWdyb3VwLWxnIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbiAgaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmlucHV0LWxnLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwibW9udGhcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwibW9udGhcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwibW9udGhcIl0uYnRuLFxuICAuaW5wdXQtZ3JvdXAtbGcgaW5wdXRbdHlwZT1cIm1vbnRoXCJdIHtcbiAgICBsaW5lLWhlaWdodDogNDZweDtcbiAgfVxufVxuXG4uZm9ybS1ncm91cCB7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG59XG5cbi5yYWRpbyxcbi5jaGVja2JveCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbi5yYWRpbyBsYWJlbCxcbi5jaGVja2JveCBsYWJlbCB7XG4gIG1pbi1oZWlnaHQ6IDIwcHg7XG4gIHBhZGRpbmctbGVmdDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4ucmFkaW8gaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuLnJhZGlvLWlubGluZSBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4uY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi1sZWZ0OiAtMjBweDtcbiAgbWFyZ2luLXRvcDogNHB4IFxcOTtcbn1cblxuLnJhZGlvICsgLnJhZGlvLFxuLmNoZWNrYm94ICsgLmNoZWNrYm94IHtcbiAgbWFyZ2luLXRvcDogLTVweDtcbn1cblxuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5yYWRpby1pbmxpbmUgKyAucmFkaW8taW5saW5lLFxuLmNoZWNrYm94LWlubGluZSArIC5jaGVja2JveC1pbmxpbmUge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tbGVmdDogMTBweDtcbn1cblxuaW5wdXRbdHlwZT1cInJhZGlvXCJdW2Rpc2FibGVkXSxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXS5kaXNhYmxlZCxcbmZpZWxkc2V0W2Rpc2FibGVkXSBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl1bZGlzYWJsZWRdLFxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLmRpc2FibGVkLFxuZmllbGRzZXRbZGlzYWJsZWRdIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5yYWRpby1pbmxpbmUuZGlzYWJsZWQsXG5maWVsZHNldFtkaXNhYmxlZF0gLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUuZGlzYWJsZWQsXG5maWVsZHNldFtkaXNhYmxlZF0gLmNoZWNrYm94LWlubGluZSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5yYWRpby5kaXNhYmxlZCBsYWJlbCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAucmFkaW8gbGFiZWwsXG4uY2hlY2tib3guZGlzYWJsZWQgbGFiZWwsXG5maWVsZHNldFtkaXNhYmxlZF0gLmNoZWNrYm94IGxhYmVsIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLmZvcm0tY29udHJvbC1zdGF0aWMge1xuICBwYWRkaW5nLXRvcDogN3B4O1xuICBwYWRkaW5nLWJvdHRvbTogN3B4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBtaW4taGVpZ2h0OiAzNHB4O1xufVxuXG4uZm9ybS1jb250cm9sLXN0YXRpYy5pbnB1dC1sZyxcbi5pbnB1dC1ncm91cC1sZyA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1sZyA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmJ0bixcbi5mb3JtLWNvbnRyb2wtc3RhdGljLmlucHV0LXNtLCAuaW5wdXQtZ3JvdXAtc20gPiAuZm9ybS1jb250cm9sLXN0YXRpYy5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtc20gPiAuZm9ybS1jb250cm9sLXN0YXRpYy5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiAuZm9ybS1jb250cm9sLXN0YXRpYy5idG4ge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIHBhZGRpbmctcmlnaHQ6IDA7XG59XG5cbi5pbnB1dC1zbSwgLmlucHV0LWdyb3VwLXNtID4gLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiAuYnRuIHtcbiAgaGVpZ2h0OiAzMHB4O1xuICBwYWRkaW5nOiA1cHggMTBweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbnNlbGVjdC5pbnB1dC1zbSwgLmlucHV0LWdyb3VwLXNtID4gc2VsZWN0LmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1zbSA+IHNlbGVjdC5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiBzZWxlY3QuYnRuIHtcbiAgaGVpZ2h0OiAzMHB4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbn1cblxudGV4dGFyZWEuaW5wdXQtc20sXG4uaW5wdXQtZ3JvdXAtc20gPiB0ZXh0YXJlYS5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtc20gPiB0ZXh0YXJlYS5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiB0ZXh0YXJlYS5idG4sXG5zZWxlY3RbbXVsdGlwbGVdLmlucHV0LXNtLCAuaW5wdXQtZ3JvdXAtc20gPiBzZWxlY3RbbXVsdGlwbGVdLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1zbSA+IHNlbGVjdFttdWx0aXBsZV0uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gc2VsZWN0W211bHRpcGxlXS5idG4ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wge1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmZvcm0tZ3JvdXAtc20gc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogMzBweDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG59XG5cbi5mb3JtLWdyb3VwLXNtIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbi5mb3JtLWdyb3VwLXNtIHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4uZm9ybS1ncm91cC1zbSAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gIGhlaWdodDogMzBweDtcbiAgbWluLWhlaWdodDogMzJweDtcbiAgcGFkZGluZzogNnB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbn1cblxuLmlucHV0LWxnLCAuaW5wdXQtZ3JvdXAtbGcgPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICBoZWlnaHQ6IDQ2cHg7XG4gIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBsaW5lLWhlaWdodDogMS4zMzMzMzMzO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbnNlbGVjdC5pbnB1dC1sZywgLmlucHV0LWdyb3VwLWxnID4gc2VsZWN0LmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1sZyA+IHNlbGVjdC5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBzZWxlY3QuYnRuIHtcbiAgaGVpZ2h0OiA0NnB4O1xuICBsaW5lLWhlaWdodDogNDZweDtcbn1cblxudGV4dGFyZWEuaW5wdXQtbGcsXG4uaW5wdXQtZ3JvdXAtbGcgPiB0ZXh0YXJlYS5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtbGcgPiB0ZXh0YXJlYS5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiB0ZXh0YXJlYS5idG4sXG5zZWxlY3RbbXVsdGlwbGVdLmlucHV0LWxnLCAuaW5wdXQtZ3JvdXAtbGcgPiBzZWxlY3RbbXVsdGlwbGVdLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1sZyA+IHNlbGVjdFttdWx0aXBsZV0uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gc2VsZWN0W211bHRpcGxlXS5idG4ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi5mb3JtLWdyb3VwLWxnIC5mb3JtLWNvbnRyb2wge1xuICBoZWlnaHQ6IDQ2cHg7XG4gIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBsaW5lLWhlaWdodDogMS4zMzMzMzMzO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5mb3JtLWdyb3VwLWxnIHNlbGVjdC5mb3JtLWNvbnRyb2wge1xuICBoZWlnaHQ6IDQ2cHg7XG4gIGxpbmUtaGVpZ2h0OiA0NnB4O1xufVxuXG4uZm9ybS1ncm91cC1sZyB0ZXh0YXJlYS5mb3JtLWNvbnRyb2wsXG4uZm9ybS1ncm91cC1sZyBzZWxlY3RbbXVsdGlwbGVdLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLmZvcm0tZ3JvdXAtbGcgLmZvcm0tY29udHJvbC1zdGF0aWMge1xuICBoZWlnaHQ6IDQ2cHg7XG4gIG1pbi1oZWlnaHQ6IDM4cHg7XG4gIHBhZGRpbmc6IDExcHggMTZweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBsaW5lLWhlaWdodDogMS4zMzMzMzMzO1xufVxuXG4uaGFzLWZlZWRiYWNrIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wge1xuICBwYWRkaW5nLXJpZ2h0OiA0Mi41cHg7XG59XG5cbi5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIHotaW5kZXg6IDI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMzRweDtcbiAgaGVpZ2h0OiAzNHB4O1xuICBsaW5lLWhlaWdodDogMzRweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmlucHV0LWxnICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1sZyA+IC5mb3JtLWNvbnRyb2wgKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWFkZG9uICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiAuYnRuICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1sZyArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHdpZHRoOiA0NnB4O1xuICBoZWlnaHQ6IDQ2cHg7XG4gIGxpbmUtaGVpZ2h0OiA0NnB4O1xufVxuXG4uaW5wdXQtc20gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLXNtID4gLmZvcm0tY29udHJvbCArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYWRkb24gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLXNtICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wgKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgd2lkdGg6IDMwcHg7XG4gIGhlaWdodDogMzBweDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG59XG5cbi5oYXMtc3VjY2VzcyAuaGVscC1ibG9jayxcbi5oYXMtc3VjY2VzcyAuY29udHJvbC1sYWJlbCxcbi5oYXMtc3VjY2VzcyAucmFkaW8sXG4uaGFzLXN1Y2Nlc3MgLmNoZWNrYm94LFxuLmhhcy1zdWNjZXNzIC5yYWRpby1pbmxpbmUsXG4uaGFzLXN1Y2Nlc3MgLmNoZWNrYm94LWlubGluZSxcbi5oYXMtc3VjY2Vzcy5yYWRpbyBsYWJlbCxcbi5oYXMtc3VjY2Vzcy5jaGVja2JveCBsYWJlbCxcbi5oYXMtc3VjY2Vzcy5yYWRpby1pbmxpbmUgbGFiZWwsXG4uaGFzLXN1Y2Nlc3MuY2hlY2tib3gtaW5saW5lIGxhYmVsIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbi5oYXMtc3VjY2VzcyAuZm9ybS1jb250cm9sIHtcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xufVxuXG4uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogIzUyNTI1MjtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggIzlmOWY5ZjtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpLCAwIDAgNnB4ICM5ZjlmOWY7XG59XG5cbi5oYXMtc3VjY2VzcyAuaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFlNmNiO1xufVxuXG4uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG4uaGFzLXdhcm5pbmcgLmhlbHAtYmxvY2ssXG4uaGFzLXdhcm5pbmcgLmNvbnRyb2wtbGFiZWwsXG4uaGFzLXdhcm5pbmcgLnJhZGlvLFxuLmhhcy13YXJuaW5nIC5jaGVja2JveCxcbi5oYXMtd2FybmluZyAucmFkaW8taW5saW5lLFxuLmhhcy13YXJuaW5nIC5jaGVja2JveC1pbmxpbmUsXG4uaGFzLXdhcm5pbmcucmFkaW8gbGFiZWwsXG4uaGFzLXdhcm5pbmcuY2hlY2tib3ggbGFiZWwsXG4uaGFzLXdhcm5pbmcucmFkaW8taW5saW5lIGxhYmVsLFxuLmhhcy13YXJuaW5nLmNoZWNrYm94LWlubGluZSBsYWJlbCB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG4uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbCB7XG4gIGJvcmRlci1jb2xvcjogIzZjNmM2YztcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbn1cblxuLmhhcy13YXJuaW5nIC5mb3JtLWNvbnRyb2w6Zm9jdXMge1xuICBib3JkZXItY29sb3I6ICM1MjUyNTI7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpLCAwIDAgNnB4ICM5ZjlmOWY7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjOWY5ZjlmO1xufVxuXG4uaGFzLXdhcm5pbmcgLmlucHV0LWdyb3VwLWFkZG9uIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJvcmRlci1jb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZTNjMjtcbn1cblxuLmhhcy13YXJuaW5nIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuLmhhcy1lcnJvciAuaGVscC1ibG9jayxcbi5oYXMtZXJyb3IgLmNvbnRyb2wtbGFiZWwsXG4uaGFzLWVycm9yIC5yYWRpbyxcbi5oYXMtZXJyb3IgLmNoZWNrYm94LFxuLmhhcy1lcnJvciAucmFkaW8taW5saW5lLFxuLmhhcy1lcnJvciAuY2hlY2tib3gtaW5saW5lLFxuLmhhcy1lcnJvci5yYWRpbyBsYWJlbCxcbi5oYXMtZXJyb3IuY2hlY2tib3ggbGFiZWwsXG4uaGFzLWVycm9yLnJhZGlvLWlubGluZSBsYWJlbCxcbi5oYXMtZXJyb3IuY2hlY2tib3gtaW5saW5lIGxhYmVsIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbi5oYXMtZXJyb3IgLmZvcm0tY29udHJvbCB7XG4gIGJvcmRlci1jb2xvcjogIzZjNmM2YztcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbn1cblxuLmhhcy1lcnJvciAuZm9ybS1jb250cm9sOmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjNTI1MjUyO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjOWY5ZjlmO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggIzlmOWY5Zjtcbn1cblxuLmhhcy1lcnJvciAuaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWFjM2M3O1xufVxuXG4uaGFzLWVycm9yIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuLmhhcy1mZWVkYmFjayBsYWJlbCB+IC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB0b3A6IDI1cHg7XG59XG5cbi5oYXMtZmVlZGJhY2sgbGFiZWwuc3Itb25seSB+IC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB0b3A6IDA7XG59XG5cbi5oZWxwLWJsb2NrIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgY29sb3I6ICM2MjYyNjI7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuZm9ybS1pbmxpbmUgLmZvcm0tZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5mb3JtLWNvbnRyb2wge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogYXV0bztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5mb3JtLWlubGluZSAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIC5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS10YWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXAgLmlucHV0LWdyb3VwLWFkZG9uLFxuICAuZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwIC5pbnB1dC1ncm91cC1idG4sXG4gIC5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IGF1dG87XG4gIH1cbiAgLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cCA+IC5mb3JtLWNvbnRyb2wge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIC5mb3JtLWlubGluZSAuY29udHJvbC1sYWJlbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5mb3JtLWlubGluZSAucmFkaW8sXG4gIC5mb3JtLWlubGluZSAuY2hlY2tib3gge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuICAuZm9ybS1pbmxpbmUgLnJhZGlvIGxhYmVsLFxuICAuZm9ybS1pbmxpbmUgLmNoZWNrYm94IGxhYmVsIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4gIC5mb3JtLWlubGluZSAuY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5oYXMtZmVlZGJhY2sgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gICAgdG9wOiAwO1xuICB9XG59XG5cbi5mb3JtLWhvcml6b250YWwgLnJhZGlvLFxuLmZvcm0taG9yaXpvbnRhbCAuY2hlY2tib3gsXG4uZm9ybS1ob3Jpem9udGFsIC5yYWRpby1pbmxpbmUsXG4uZm9ybS1ob3Jpem9udGFsIC5jaGVja2JveC1pbmxpbmUge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBwYWRkaW5nLXRvcDogN3B4O1xufVxuXG4uZm9ybS1ob3Jpem9udGFsIC5yYWRpbyxcbi5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94IHtcbiAgbWluLWhlaWdodDogMjdweDtcbn1cblxuLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cCB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xuICBtYXJnaW4tcmlnaHQ6IDA7XG59XG5cbi5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXA6YmVmb3JlLFxuLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cDphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmZvcm0taG9yaXpvbnRhbCAuY29udHJvbC1sYWJlbCB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICBwYWRkaW5nLXRvcDogN3B4O1xuICB9XG59XG5cbi5mb3JtLWhvcml6b250YWwgLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgcmlnaHQ6IDA7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwLWxnIC5jb250cm9sLWxhYmVsIHtcbiAgICBwYWRkaW5nLXRvcDogMTQuMzMzMzMzcHg7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwLXNtIC5jb250cm9sLWxhYmVsIHtcbiAgICBwYWRkaW5nLXRvcDogNnB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgfVxufVxuXG4uYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBwYWRkaW5nOiA2cHggMTJweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLmJ0bjpmb2N1cyxcbi5idG4uZm9jdXMsXG4uYnRuOmFjdGl2ZTpmb2N1cyxcbi5idG46YWN0aXZlLmZvY3VzLFxuLmJ0bi5hY3RpdmU6Zm9jdXMsXG4uYnRuLmFjdGl2ZS5mb2N1cyB7XG4gIG91dGxpbmU6IHRoaW4gZG90dGVkO1xuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuXG4uYnRuOmhvdmVyLFxuLmJ0bjpmb2N1cyxcbi5idG4uZm9jdXMge1xuICBjb2xvcjogIzQ0NDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uYnRuOmFjdGl2ZSxcbi5idG4uYWN0aXZlIHtcbiAgb3V0bGluZTogMDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDNweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyNSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgM3B4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTI1KTtcbn1cblxuLmJ0bi5kaXNhYmxlZCxcbi5idG5bZGlzYWJsZWRdLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBvcGFjaXR5OiAwLjY1O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NjUpO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbmEuYnRuLmRpc2FibGVkLFxuZmllbGRzZXRbZGlzYWJsZWRdIGEuYnRuIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5idG4tZGVmYXVsdCB7XG4gIGNvbG9yOiAjNDQ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItY29sb3I6ICNjY2M7XG59XG5cbi5idG4tZGVmYXVsdDpmb2N1cyxcbi5idG4tZGVmYXVsdC5mb2N1cyB7XG4gIGNvbG9yOiAjNDQ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2O1xuICBib3JkZXItY29sb3I6ICM4YzhjOGM7XG59XG5cbi5idG4tZGVmYXVsdDpob3ZlciB7XG4gIGNvbG9yOiAjNDQ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2O1xuICBib3JkZXItY29sb3I6ICNhZGFkYWQ7XG59XG5cbi5idG4tZGVmYXVsdDphY3RpdmUsXG4uYnRuLWRlZmF1bHQuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLWRlZmF1bHQuZHJvcGRvd24tdG9nZ2xlIHtcbiAgY29sb3I6ICM0NDQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNmU2ZTY7XG4gIGJvcmRlci1jb2xvcjogI2FkYWRhZDtcbn1cblxuLmJ0bi1kZWZhdWx0OmFjdGl2ZTpob3Zlcixcbi5idG4tZGVmYXVsdDphY3RpdmU6Zm9jdXMsXG4uYnRuLWRlZmF1bHQ6YWN0aXZlLmZvY3VzLFxuLmJ0bi1kZWZhdWx0LmFjdGl2ZTpob3Zlcixcbi5idG4tZGVmYXVsdC5hY3RpdmU6Zm9jdXMsXG4uYnRuLWRlZmF1bHQuYWN0aXZlLmZvY3VzLFxuLm9wZW4gPiAuYnRuLWRlZmF1bHQuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLWRlZmF1bHQuZHJvcGRvd24tdG9nZ2xlOmZvY3VzLFxuLm9wZW4gPiAuYnRuLWRlZmF1bHQuZHJvcGRvd24tdG9nZ2xlLmZvY3VzIHtcbiAgY29sb3I6ICM0NDQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7XG4gIGJvcmRlci1jb2xvcjogIzhjOGM4Yztcbn1cblxuLmJ0bi1kZWZhdWx0OmFjdGl2ZSxcbi5idG4tZGVmYXVsdC5hY3RpdmUsXG4ub3BlbiA+IC5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xufVxuXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQsXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQ6aG92ZXIsXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQ6Zm9jdXMsXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQ6YWN0aXZlLFxuLmJ0bi1kZWZhdWx0LmRpc2FibGVkLmFjdGl2ZSxcbi5idG4tZGVmYXVsdFtkaXNhYmxlZF0sXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmhvdmVyLFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTpmb2N1cyxcbi5idG4tZGVmYXVsdFtkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmFjdGl2ZSxcbi5idG4tZGVmYXVsdFtkaXNhYmxlZF0uYWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQ6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdC5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQ6YWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdC5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItY29sb3I6ICNjY2M7XG59XG5cbi5idG4tZGVmYXVsdCAuYmFkZ2Uge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDtcbn1cblxuLmJ0bi1wcmltYXJ5IHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG4gIGJvcmRlci1jb2xvcjogIzNhMzkzYjtcbn1cblxuLmJ0bi1wcmltYXJ5OmZvY3VzLFxuLmJ0bi1wcmltYXJ5LmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTIwMjE7XG4gIGJvcmRlci1jb2xvcjogYmxhY2s7XG59XG5cbi5idG4tcHJpbWFyeTpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjEyMDIxO1xuICBib3JkZXItY29sb3I6ICMxYjFiMWM7XG59XG5cbi5idG4tcHJpbWFyeTphY3RpdmUsXG4uYnRuLXByaW1hcnkuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTIwMjE7XG4gIGJvcmRlci1jb2xvcjogIzFiMWIxYztcbn1cblxuLmJ0bi1wcmltYXJ5OmFjdGl2ZTpob3Zlcixcbi5idG4tcHJpbWFyeTphY3RpdmU6Zm9jdXMsXG4uYnRuLXByaW1hcnk6YWN0aXZlLmZvY3VzLFxuLmJ0bi1wcmltYXJ5LmFjdGl2ZTpob3Zlcixcbi5idG4tcHJpbWFyeS5hY3RpdmU6Zm9jdXMsXG4uYnRuLXByaW1hcnkuYWN0aXZlLmZvY3VzLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlOmZvY3VzLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwZjBlMGY7XG4gIGJvcmRlci1jb2xvcjogYmxhY2s7XG59XG5cbi5idG4tcHJpbWFyeTphY3RpdmUsXG4uYnRuLXByaW1hcnkuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLmJ0bi1wcmltYXJ5LmRpc2FibGVkLFxuLmJ0bi1wcmltYXJ5LmRpc2FibGVkOmhvdmVyLFxuLmJ0bi1wcmltYXJ5LmRpc2FibGVkOmZvY3VzLFxuLmJ0bi1wcmltYXJ5LmRpc2FibGVkLmZvY3VzLFxuLmJ0bi1wcmltYXJ5LmRpc2FibGVkOmFjdGl2ZSxcbi5idG4tcHJpbWFyeS5kaXNhYmxlZC5hY3RpdmUsXG4uYnRuLXByaW1hcnlbZGlzYWJsZWRdLFxuLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXTpob3Zlcixcbi5idG4tcHJpbWFyeVtkaXNhYmxlZF06Zm9jdXMsXG4uYnRuLXByaW1hcnlbZGlzYWJsZWRdLmZvY3VzLFxuLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXTphY3RpdmUsXG4uYnRuLXByaW1hcnlbZGlzYWJsZWRdLmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnksXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5OmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeTpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnkuZm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5OmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnkuYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4uYnRuLXByaW1hcnkgLmJhZGdlIHtcbiAgY29sb3I6ICMzYTM5M2I7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5idG4tc3VjY2VzcyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWNiODVjO1xuICBib3JkZXItY29sb3I6ICM1Y2I4NWM7XG59XG5cbi5idG4tc3VjY2Vzczpmb2N1cyxcbi5idG4tc3VjY2Vzcy5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ5ZDQ0O1xuICBib3JkZXItY29sb3I6ICMyZDY3MmQ7XG59XG5cbi5idG4tc3VjY2Vzczpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ5ZDQ0O1xuICBib3JkZXItY29sb3I6ICM0MTk2NDE7XG59XG5cbi5idG4tc3VjY2VzczphY3RpdmUsXG4uYnRuLXN1Y2Nlc3MuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xlIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0NDlkNDQ7XG4gIGJvcmRlci1jb2xvcjogIzQxOTY0MTtcbn1cblxuLmJ0bi1zdWNjZXNzOmFjdGl2ZTpob3Zlcixcbi5idG4tc3VjY2VzczphY3RpdmU6Zm9jdXMsXG4uYnRuLXN1Y2Nlc3M6YWN0aXZlLmZvY3VzLFxuLmJ0bi1zdWNjZXNzLmFjdGl2ZTpob3Zlcixcbi5idG4tc3VjY2Vzcy5hY3RpdmU6Zm9jdXMsXG4uYnRuLXN1Y2Nlc3MuYWN0aXZlLmZvY3VzLFxuLm9wZW4gPiAuYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xlOmZvY3VzLFxuLm9wZW4gPiAuYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xlLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzOTg0Mzk7XG4gIGJvcmRlci1jb2xvcjogIzJkNjcyZDtcbn1cblxuLmJ0bi1zdWNjZXNzOmFjdGl2ZSxcbi5idG4tc3VjY2Vzcy5hY3RpdmUsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xufVxuXG4uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQsXG4uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQ6aG92ZXIsXG4uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQ6Zm9jdXMsXG4uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQ6YWN0aXZlLFxuLmJ0bi1zdWNjZXNzLmRpc2FibGVkLmFjdGl2ZSxcbi5idG4tc3VjY2Vzc1tkaXNhYmxlZF0sXG4uYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdOmhvdmVyLFxuLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXTpmb2N1cyxcbi5idG4tc3VjY2Vzc1tkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdOmFjdGl2ZSxcbi5idG4tc3VjY2Vzc1tkaXNhYmxlZF0uYWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2VzcyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3M6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzOmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2Vzcy5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3M6YWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2Vzcy5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWNiODVjO1xuICBib3JkZXItY29sb3I6ICM1Y2I4NWM7XG59XG5cbi5idG4tc3VjY2VzcyAuYmFkZ2Uge1xuICBjb2xvcjogIzVjYjg1YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1pbmZvIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1YmMwZGU7XG4gIGJvcmRlci1jb2xvcjogIzViYzBkZTtcbn1cblxuLmJ0bi1pbmZvOmZvY3VzLFxuLmJ0bi1pbmZvLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMWIwZDU7XG4gIGJvcmRlci1jb2xvcjogIzFmN2U5YTtcbn1cblxuLmJ0bi1pbmZvOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMWIwZDU7XG4gIGJvcmRlci1jb2xvcjogIzJhYWJkMjtcbn1cblxuLmJ0bi1pbmZvOmFjdGl2ZSxcbi5idG4taW5mby5hY3RpdmUsXG4ub3BlbiA+IC5idG4taW5mby5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMxYjBkNTtcbiAgYm9yZGVyLWNvbG9yOiAjMmFhYmQyO1xufVxuXG4uYnRuLWluZm86YWN0aXZlOmhvdmVyLFxuLmJ0bi1pbmZvOmFjdGl2ZTpmb2N1cyxcbi5idG4taW5mbzphY3RpdmUuZm9jdXMsXG4uYnRuLWluZm8uYWN0aXZlOmhvdmVyLFxuLmJ0bi1pbmZvLmFjdGl2ZTpmb2N1cyxcbi5idG4taW5mby5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4taW5mby5kcm9wZG93bi10b2dnbGU6aG92ZXIsXG4ub3BlbiA+IC5idG4taW5mby5kcm9wZG93bi10b2dnbGU6Zm9jdXMsXG4ub3BlbiA+IC5idG4taW5mby5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzI2OWFiYztcbiAgYm9yZGVyLWNvbG9yOiAjMWY3ZTlhO1xufVxuXG4uYnRuLWluZm86YWN0aXZlLFxuLmJ0bi1pbmZvLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5idG4taW5mby5kaXNhYmxlZCxcbi5idG4taW5mby5kaXNhYmxlZDpob3Zlcixcbi5idG4taW5mby5kaXNhYmxlZDpmb2N1cyxcbi5idG4taW5mby5kaXNhYmxlZC5mb2N1cyxcbi5idG4taW5mby5kaXNhYmxlZDphY3RpdmUsXG4uYnRuLWluZm8uZGlzYWJsZWQuYWN0aXZlLFxuLmJ0bi1pbmZvW2Rpc2FibGVkXSxcbi5idG4taW5mb1tkaXNhYmxlZF06aG92ZXIsXG4uYnRuLWluZm9bZGlzYWJsZWRdOmZvY3VzLFxuLmJ0bi1pbmZvW2Rpc2FibGVkXS5mb2N1cyxcbi5idG4taW5mb1tkaXNhYmxlZF06YWN0aXZlLFxuLmJ0bi1pbmZvW2Rpc2FibGVkXS5hY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mbzpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm86Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvLmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mbzphY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvLmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1YmMwZGU7XG4gIGJvcmRlci1jb2xvcjogIzViYzBkZTtcbn1cblxuLmJ0bi1pbmZvIC5iYWRnZSB7XG4gIGNvbG9yOiAjNWJjMGRlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4uYnRuLXdhcm5pbmcge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwYWQ0ZTtcbiAgYm9yZGVyLWNvbG9yOiAjZjBhZDRlO1xufVxuXG4uYnRuLXdhcm5pbmc6Zm9jdXMsXG4uYnRuLXdhcm5pbmcuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjOTcxZjtcbiAgYm9yZGVyLWNvbG9yOiAjYjA2ZDBmO1xufVxuXG4uYnRuLXdhcm5pbmc6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjOTcxZjtcbiAgYm9yZGVyLWNvbG9yOiAjZWI5MzE2O1xufVxuXG4uYnRuLXdhcm5pbmc6YWN0aXZlLFxuLmJ0bi13YXJuaW5nLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi13YXJuaW5nLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmO1xuICBib3JkZXItY29sb3I6ICNlYjkzMTY7XG59XG5cbi5idG4td2FybmluZzphY3RpdmU6aG92ZXIsXG4uYnRuLXdhcm5pbmc6YWN0aXZlOmZvY3VzLFxuLmJ0bi13YXJuaW5nOmFjdGl2ZS5mb2N1cyxcbi5idG4td2FybmluZy5hY3RpdmU6aG92ZXIsXG4uYnRuLXdhcm5pbmcuYWN0aXZlOmZvY3VzLFxuLmJ0bi13YXJuaW5nLmFjdGl2ZS5mb2N1cyxcbi5vcGVuID4gLmJ0bi13YXJuaW5nLmRyb3Bkb3duLXRvZ2dsZTpob3Zlcixcbi5vcGVuID4gLmJ0bi13YXJuaW5nLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyxcbi5vcGVuID4gLmJ0bi13YXJuaW5nLmRyb3Bkb3duLXRvZ2dsZS5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDU4NTEyO1xuICBib3JkZXItY29sb3I6ICNiMDZkMGY7XG59XG5cbi5idG4td2FybmluZzphY3RpdmUsXG4uYnRuLXdhcm5pbmcuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLmJ0bi13YXJuaW5nLmRpc2FibGVkLFxuLmJ0bi13YXJuaW5nLmRpc2FibGVkOmhvdmVyLFxuLmJ0bi13YXJuaW5nLmRpc2FibGVkOmZvY3VzLFxuLmJ0bi13YXJuaW5nLmRpc2FibGVkLmZvY3VzLFxuLmJ0bi13YXJuaW5nLmRpc2FibGVkOmFjdGl2ZSxcbi5idG4td2FybmluZy5kaXNhYmxlZC5hY3RpdmUsXG4uYnRuLXdhcm5pbmdbZGlzYWJsZWRdLFxuLmJ0bi13YXJuaW5nW2Rpc2FibGVkXTpob3Zlcixcbi5idG4td2FybmluZ1tkaXNhYmxlZF06Zm9jdXMsXG4uYnRuLXdhcm5pbmdbZGlzYWJsZWRdLmZvY3VzLFxuLmJ0bi13YXJuaW5nW2Rpc2FibGVkXTphY3RpdmUsXG4uYnRuLXdhcm5pbmdbZGlzYWJsZWRdLmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmcsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZzpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmcuZm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nOmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmcuYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwYWQ0ZTtcbiAgYm9yZGVyLWNvbG9yOiAjZjBhZDRlO1xufVxuXG4uYnRuLXdhcm5pbmcgLmJhZGdlIHtcbiAgY29sb3I6ICNmMGFkNGU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5idG4tZGFuZ2VyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7XG4gIGJvcmRlci1jb2xvcjogI2Q5NTM0Zjtcbn1cblxuLmJ0bi1kYW5nZXI6Zm9jdXMsXG4uYnRuLWRhbmdlci5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzkzMDJjO1xuICBib3JkZXItY29sb3I6ICM4YjIxMWU7XG59XG5cbi5idG4tZGFuZ2VyOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjOTMwMmM7XG4gIGJvcmRlci1jb2xvcjogI2MxMmUyYTtcbn1cblxuLmJ0bi1kYW5nZXI6YWN0aXZlLFxuLmJ0bi1kYW5nZXIuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLWRhbmdlci5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M5MzAyYztcbiAgYm9yZGVyLWNvbG9yOiAjYzEyZTJhO1xufVxuXG4uYnRuLWRhbmdlcjphY3RpdmU6aG92ZXIsXG4uYnRuLWRhbmdlcjphY3RpdmU6Zm9jdXMsXG4uYnRuLWRhbmdlcjphY3RpdmUuZm9jdXMsXG4uYnRuLWRhbmdlci5hY3RpdmU6aG92ZXIsXG4uYnRuLWRhbmdlci5hY3RpdmU6Zm9jdXMsXG4uYnRuLWRhbmdlci5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZTpob3Zlcixcbi5vcGVuID4gLmJ0bi1kYW5nZXIuZHJvcGRvd24tdG9nZ2xlOmZvY3VzLFxuLm9wZW4gPiAuYnRuLWRhbmdlci5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2FjMjkyNTtcbiAgYm9yZGVyLWNvbG9yOiAjOGIyMTFlO1xufVxuXG4uYnRuLWRhbmdlcjphY3RpdmUsXG4uYnRuLWRhbmdlci5hY3RpdmUsXG4ub3BlbiA+IC5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5idG4tZGFuZ2VyLmRpc2FibGVkLFxuLmJ0bi1kYW5nZXIuZGlzYWJsZWQ6aG92ZXIsXG4uYnRuLWRhbmdlci5kaXNhYmxlZDpmb2N1cyxcbi5idG4tZGFuZ2VyLmRpc2FibGVkLmZvY3VzLFxuLmJ0bi1kYW5nZXIuZGlzYWJsZWQ6YWN0aXZlLFxuLmJ0bi1kYW5nZXIuZGlzYWJsZWQuYWN0aXZlLFxuLmJ0bi1kYW5nZXJbZGlzYWJsZWRdLFxuLmJ0bi1kYW5nZXJbZGlzYWJsZWRdOmhvdmVyLFxuLmJ0bi1kYW5nZXJbZGlzYWJsZWRdOmZvY3VzLFxuLmJ0bi1kYW5nZXJbZGlzYWJsZWRdLmZvY3VzLFxuLmJ0bi1kYW5nZXJbZGlzYWJsZWRdOmFjdGl2ZSxcbi5idG4tZGFuZ2VyW2Rpc2FibGVkXS5hY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXI6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXI6Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXIuZm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXI6YWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGFuZ2VyLmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7XG4gIGJvcmRlci1jb2xvcjogI2Q5NTM0Zjtcbn1cblxuLmJ0bi1kYW5nZXIgLmJhZGdlIHtcbiAgY29sb3I6ICNkOTUzNGY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5idG4tbGluayB7XG4gIGNvbG9yOiAjM2EzOTNiO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uYnRuLWxpbmssXG4uYnRuLWxpbms6YWN0aXZlLFxuLmJ0bi1saW5rLmFjdGl2ZSxcbi5idG4tbGlua1tkaXNhYmxlZF0sXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1saW5rIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLmJ0bi1saW5rLFxuLmJ0bi1saW5rOmhvdmVyLFxuLmJ0bi1saW5rOmZvY3VzLFxuLmJ0bi1saW5rOmFjdGl2ZSB7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5idG4tbGluazpob3Zlcixcbi5idG4tbGluazpmb2N1cyB7XG4gIGNvbG9yOiAjMTQxMzE0O1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5idG4tbGlua1tkaXNhYmxlZF06aG92ZXIsXG4uYnRuLWxpbmtbZGlzYWJsZWRdOmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbGluazpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxpbms6Zm9jdXMge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uYnRuLWxnLCAuYnRuLWdyb3VwLWxnID4gLmJ0biB7XG4gIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBsaW5lLWhlaWdodDogMS4zMzMzMzMzO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5idG4tc20sIC5idG4tZ3JvdXAtc20gPiAuYnRuIHtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYnRuLXhzLCAuYnRuLWdyb3VwLXhzID4gLmJ0biB7XG4gIHBhZGRpbmc6IDFweCA1cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYnRuLWJsb2NrIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uYnRuLWJsb2NrICsgLmJ0bi1ibG9jayB7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuaW5wdXRbdHlwZT1cInN1Ym1pdFwiXS5idG4tYmxvY2ssXG5pbnB1dFt0eXBlPVwicmVzZXRcIl0uYnRuLWJsb2NrLFxuaW5wdXRbdHlwZT1cImJ1dHRvblwiXS5idG4tYmxvY2sge1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmZhZGUge1xuICBvcGFjaXR5OiAwO1xuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgbGluZWFyO1xuICAtby10cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGxpbmVhcjtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBsaW5lYXI7XG59XG5cbi5mYWRlLmluIHtcbiAgb3BhY2l0eTogMTtcbn1cblxuLmNvbGxhcHNlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmNvbGxhcHNlLmluIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbnRyLmNvbGxhcHNlLmluIHtcbiAgZGlzcGxheTogdGFibGUtcm93O1xufVxuXG50Ym9keS5jb2xsYXBzZS5pbiB7XG4gIGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cDtcbn1cblxuLmNvbGxhcHNpbmcge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBoZWlnaHQsIHZpc2liaWxpdHk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGhlaWdodCwgdmlzaWJpbGl0eTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjM1cztcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zNXM7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlO1xufVxuXG4uY2FyZXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlci10b3A6IDRweCBkYXNoZWQ7XG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXDk7XG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xufVxuXG4uZHJvcHVwLFxuLmRyb3Bkb3duIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZHJvcGRvd24tdG9nZ2xlOmZvY3VzIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLmRyb3Bkb3duLW1lbnUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTAwJTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTAwMDtcbiAgZGlzcGxheTogbm9uZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1pbi13aWR0aDogMTYwcHg7XG4gIHBhZGRpbmc6IDVweCAwO1xuICBtYXJnaW46IDJweCAwIDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmNmYztcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE3NSk7XG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE3NSk7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG59XG5cbi5kcm9wZG93bi1tZW51LnB1bGwtcmlnaHQge1xuICByaWdodDogMDtcbiAgbGVmdDogYXV0bztcbn1cblxuLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXIge1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiA5cHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbn1cblxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogM3B4IDIwcHg7XG4gIGNsZWFyOiBib3RoO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGNvbG9yOiAjMjIyO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uZHJvcGRvd24tbWVudSA+IGxpID4gYTpob3Zlcixcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzE1MTUxNTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cblxuLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSxcbi5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4uZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3V0bGluZTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhLFxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICM5OTk7XG59XG5cbi5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpob3Zlcixcbi5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQgPSBmYWxzZSk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5vcGVuID4gLmRyb3Bkb3duLW1lbnUge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLm9wZW4gPiBhIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogMDtcbn1cblxuLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiBhdXRvO1xufVxuXG4uZHJvcGRvd24taGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDNweCAyMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICM5OTk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5kcm9wZG93bi1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiA5OTA7XG59XG5cbi5wdWxsLXJpZ2h0ID4gLmRyb3Bkb3duLW1lbnUge1xuICByaWdodDogMDtcbiAgbGVmdDogYXV0bztcbn1cblxuLmRyb3B1cCAuY2FyZXQsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24gLmNhcmV0IHtcbiAgYm9yZGVyLXRvcDogMDtcbiAgYm9yZGVyLWJvdHRvbTogNHB4IGRhc2hlZDtcbiAgYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIFxcOTtcbiAgY29udGVudDogXCJcIjtcbn1cblxuLmRyb3B1cCAuZHJvcGRvd24tbWVudSxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuZHJvcGRvd24tbWVudSB7XG4gIHRvcDogYXV0bztcbiAgYm90dG9tOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLXJpZ2h0IC5kcm9wZG93bi1tZW51IHtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG4gIC5uYXZiYXItcmlnaHQgLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogYXV0bztcbiAgfVxufVxuXG4uYnRuLWdyb3VwLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bixcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbG9hdDogbGVmdDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG46aG92ZXIsXG4uYnRuLWdyb3VwID4gLmJ0bjpmb2N1cyxcbi5idG4tZ3JvdXAgPiAuYnRuOmFjdGl2ZSxcbi5idG4tZ3JvdXAgPiAuYnRuLmFjdGl2ZSxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuOmhvdmVyLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46Zm9jdXMsXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjphY3RpdmUsXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi5hY3RpdmUge1xuICB6LWluZGV4OiAyO1xufVxuXG4uYnRuLWdyb3VwIC5idG4gKyAuYnRuLFxuLmJ0bi1ncm91cCAuYnRuICsgLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAgLmJ0bi1ncm91cCArIC5idG4sXG4uYnRuLWdyb3VwIC5idG4tZ3JvdXAgKyAuYnRuLWdyb3VwIHtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5idG4tdG9vbGJhciB7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4O1xufVxuXG4uYnRuLXRvb2xiYXI6YmVmb3JlLFxuLmJ0bi10b29sYmFyOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4uYnRuLXRvb2xiYXI6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLmJ0bi10b29sYmFyIC5idG4sXG4uYnRuLXRvb2xiYXIgLmJ0bi1ncm91cCxcbi5idG4tdG9vbGJhciAuaW5wdXQtZ3JvdXAge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLmJ0bi10b29sYmFyID4gLmJ0bixcbi5idG4tdG9vbGJhciA+IC5idG4tZ3JvdXAsXG4uYnRuLXRvb2xiYXIgPiAuaW5wdXQtZ3JvdXAge1xuICBtYXJnaW4tbGVmdDogNXB4O1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpLFxuLmJ0bi1ncm91cCA+IC5kcm9wZG93bi10b2dnbGU6bm90KDpmaXJzdC1jaGlsZCkge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgPiAuYnRuOmxhc3QtY2hpbGQsXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpID4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwIC5kcm9wZG93bi10b2dnbGU6YWN0aXZlLFxuLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUge1xuICBvdXRsaW5lOiAwO1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0biArIC5kcm9wZG93bi10b2dnbGUge1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcbiAgcGFkZGluZy1yaWdodDogOHB4O1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bi1sZyArIC5kcm9wZG93bi10b2dnbGUsIC5idG4tZ3JvdXAtbGcuYnRuLWdyb3VwID4gLmJ0biArIC5kcm9wZG93bi10b2dnbGUge1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEycHg7XG59XG5cbi5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDNweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyNSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgM3B4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTI1KTtcbn1cblxuLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUuYnRuLWxpbmsge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi5idG4gLmNhcmV0IHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5idG4tbGcgLmNhcmV0LCAuYnRuLWdyb3VwLWxnID4gLmJ0biAuY2FyZXQge1xuICBib3JkZXItd2lkdGg6IDVweCA1cHggMDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbn1cblxuLmRyb3B1cCAuYnRuLWxnIC5jYXJldCwgLmRyb3B1cCAuYnRuLWdyb3VwLWxnID4gLmJ0biAuY2FyZXQge1xuICBib3JkZXItd2lkdGg6IDAgNXB4IDVweDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4sXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwID4gLmJ0biB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmbG9hdDogbm9uZTtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6YmVmb3JlLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwID4gLmJ0biB7XG4gIGZsb2F0OiBub25lO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0biArIC5idG4sXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0biArIC5idG4tZ3JvdXAsXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cCArIC5idG4sXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICBtYXJnaW4tdG9wOiAtMXB4O1xuICBtYXJnaW4tbGVmdDogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4O1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgPiAuYnRuIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSA+IC5idG46bGFzdC1jaGlsZCxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgPiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAtanVzdGlmaWVkIHtcbiAgZGlzcGxheTogdGFibGU7XG4gIHdpZHRoOiAxMDAlO1xuICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xuICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlO1xufVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCA+IC5idG4sXG4uYnRuLWdyb3VwLWp1c3RpZmllZCA+IC5idG4tZ3JvdXAge1xuICBmbG9hdDogbm9uZTtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgd2lkdGg6IDElO1xufVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCA+IC5idG4tZ3JvdXAgLmJ0biB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCA+IC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUge1xuICBsZWZ0OiBhdXRvO1xufVxuXG5bZGF0YS10b2dnbGU9XCJidXR0b25zXCJdID4gLmJ0biBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5bZGF0YS10b2dnbGU9XCJidXR0b25zXCJdID4gLmJ0biBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sXG5bZGF0YS10b2dnbGU9XCJidXR0b25zXCJdID4gLmJ0bi1ncm91cCA+IC5idG4gaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXSA+IC5idG4tZ3JvdXAgPiAuYnRuIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5pbnB1dC1ncm91cCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogdGFibGU7XG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG59XG5cbi5pbnB1dC1ncm91cFtjbGFzcyo9XCJjb2wtXCJdIHtcbiAgZmxvYXQ6IG5vbmU7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgcGFkZGluZy1yaWdodDogMDtcbn1cblxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2wge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDI7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWJ0bixcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCksXG4uaW5wdXQtZ3JvdXAtYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCksXG4uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWJ0biB7XG4gIHdpZHRoOiAxJTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uIHtcbiAgcGFkZGluZzogNnB4IDEycHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGNvbG9yOiAjNDQ0O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LXNtLCAuaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmlucHV0LWdyb3VwLWFkZG9uLmJ0biB7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LWxnLCAuaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmlucHV0LWdyb3VwLWFkZG9uLmJ0biB7XG4gIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5pbnB1dC1ncm91cC1hZGRvbiBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4uaW5wdXQtZ3JvdXAtYWRkb24gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgbWFyZ2luLXRvcDogMDtcbn1cblxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG59XG5cbi5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1yaWdodDogMDtcbn1cblxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6bGFzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1hZGRvbjpsYXN0LWNoaWxkLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXAgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmRyb3Bkb3duLXRvZ2dsZSxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuIHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQge1xuICBib3JkZXItbGVmdDogMDtcbn1cblxuLmlucHV0LWdyb3VwLWJ0biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZm9udC1zaXplOiAwO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmlucHV0LWdyb3VwLWJ0biA+IC5idG4gKyAuYnRuIHtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5pbnB1dC1ncm91cC1idG4gPiAuYnRuOmhvdmVyLFxuLmlucHV0LWdyb3VwLWJ0biA+IC5idG46Zm9jdXMsXG4uaW5wdXQtZ3JvdXAtYnRuID4gLmJ0bjphY3RpdmUge1xuICB6LWluZGV4OiAyO1xufVxuXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwIHtcbiAgbWFyZ2luLXJpZ2h0OiAtMXB4O1xufVxuXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bi1ncm91cCB7XG4gIHotaW5kZXg6IDI7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ubmF2IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG4ubmF2OmJlZm9yZSxcbi5uYXY6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5uYXY6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLm5hdiA+IGxpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLm5hdiA+IGxpID4gYSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDEwcHggMTVweDtcbn1cblxuLm5hdiA+IGxpID4gYTpob3Zlcixcbi5uYXYgPiBsaSA+IGE6Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5uYXYgPiBsaS5kaXNhYmxlZCA+IGEge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLm5hdiA+IGxpLmRpc2FibGVkID4gYTpob3Zlcixcbi5uYXYgPiBsaS5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLm5hdiAub3BlbiA+IGEsXG4ubmF2IC5vcGVuID4gYTpob3Zlcixcbi5uYXYgLm9wZW4gPiBhOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ubmF2IC5uYXYtZGl2aWRlciB7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IDlweCAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlNWU1O1xufVxuXG4ubmF2ID4gbGkgPiBhID4gaW1nIHtcbiAgbWF4LXdpZHRoOiBub25lO1xufVxuXG4ubmF2LXRhYnMge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbn1cblxuLm5hdi10YWJzID4gbGkge1xuICBmbG9hdDogbGVmdDtcbiAgbWFyZ2luLWJvdHRvbTogLTFweDtcbn1cblxuLm5hdi10YWJzID4gbGkgPiBhIHtcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwO1xufVxuXG4ubmF2LXRhYnMgPiBsaSA+IGE6aG92ZXIge1xuICBib3JkZXItY29sb3I6ICNmZmYgI2ZmZiAjZGRkO1xufVxuXG4ubmF2LXRhYnMgPiBsaS5hY3RpdmUgPiBhLFxuLm5hdi10YWJzID4gbGkuYWN0aXZlID4gYTpob3Zlcixcbi5uYXYtdGFicyA+IGxpLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzQ0NDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLm5hdi1waWxscyA+IGxpIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi5uYXYtcGlsbHMgPiBsaSA+IGEge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5uYXYtcGlsbHMgPiBsaSArIGxpIHtcbiAgbWFyZ2luLWxlZnQ6IDJweDtcbn1cblxuLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGEsXG4ubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYTpob3Zlcixcbi5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG59XG5cbi5uYXYtc3RhY2tlZCA+IGxpIHtcbiAgZmxvYXQ6IG5vbmU7XG59XG5cbi5uYXYtc3RhY2tlZCA+IGxpICsgbGkge1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4ubmF2LWp1c3RpZmllZCwgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQge1xuICB3aWR0aDogMTAwJTtcbn1cblxuLm5hdi1qdXN0aWZpZWQgPiBsaSwgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiBsaSB7XG4gIGZsb2F0OiBub25lO1xufVxuXG4ubmF2LWp1c3RpZmllZCA+IGxpID4gYSwgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiBsaSA+IGEge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLm5hdi1qdXN0aWZpZWQgPiAuZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUge1xuICB0b3A6IGF1dG87XG4gIGxlZnQ6IGF1dG87XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2LWp1c3RpZmllZCA+IGxpLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIHdpZHRoOiAxJTtcbiAgfVxuICAubmF2LWp1c3RpZmllZCA+IGxpID4gYSwgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiBsaSA+IGEge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbn1cblxuLm5hdi10YWJzLWp1c3RpZmllZCwgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQge1xuICBib3JkZXItYm90dG9tOiAwO1xufVxuXG4ubmF2LXRhYnMtanVzdGlmaWVkID4gbGkgPiBhLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpID4gYSB7XG4gIG1hcmdpbi1yaWdodDogMDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4ubmF2LXRhYnMtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGEsXG4ubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhLCAubmF2LXRhYnMtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4ubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhOmhvdmVyLCAubmF2LXRhYnMtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6Zm9jdXMsIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm5hdi10YWJzLWp1c3RpZmllZCA+IGxpID4gYSwgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiBsaSA+IGEge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwO1xuICB9XG4gIC5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYSxcbiAgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYSwgLm5hdi10YWJzLWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuICAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhOmhvdmVyLCAubmF2LXRhYnMtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6Zm9jdXMsIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICNmZmY7XG4gIH1cbn1cblxuLnRhYi1jb250ZW50ID4gLnRhYi1wYW5lIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLnRhYi1jb250ZW50ID4gLmFjdGl2ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ubmF2LXRhYnMgLmRyb3Bkb3duLW1lbnUge1xuICBtYXJnaW4tdG9wOiAtMXB4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cblxuLm5hdmJhciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogNDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgYm9yZGVyOiAwO1xufVxuXG4ubmF2YmFyOmJlZm9yZSxcbi5uYXZiYXI6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5uYXZiYXI6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLm5hdmJhci1oZWFkZXI6YmVmb3JlLFxuLm5hdmJhci1oZWFkZXI6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5uYXZiYXItaGVhZGVyOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLWhlYWRlciB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuLm5hdmJhci1jb2xsYXBzZSB7XG4gIG92ZXJmbG93LXg6IHZpc2libGU7XG4gIHBhZGRpbmctcmlnaHQ6IDA7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xufVxuXG4ubmF2YmFyLWNvbGxhcHNlOmJlZm9yZSxcbi5uYXZiYXItY29sbGFwc2U6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5uYXZiYXItY29sbGFwc2U6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLm5hdmJhci1jb2xsYXBzZS5pbiB7XG4gIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm5hdmJhci1jb2xsYXBzZS5jb2xsYXBzZSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xuICB9XG4gIC5uYXZiYXItY29sbGFwc2UuaW4ge1xuICAgIG92ZXJmbG93LXk6IHZpc2libGU7XG4gIH1cbiAgLm5hdmJhci1maXhlZC10b3AgLm5hdmJhci1jb2xsYXBzZSxcbiAgLm5hdmJhci1zdGF0aWMtdG9wIC5uYXZiYXItY29sbGFwc2UsXG4gIC5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItY29sbGFwc2Uge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG59XG5cbi5uYXZiYXItZml4ZWQtdG9wIC5uYXZiYXItY29sbGFwc2UsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2YmFyLWNvbGxhcHNlIHtcbiAgbWF4LWhlaWdodDogMzQwcHg7XG59XG5cbkBtZWRpYSAobWF4LWRldmljZS13aWR0aDogNDgwcHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkge1xuICAubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNlLFxuICAubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICBtYXgtaGVpZ2h0OiAyMDBweDtcbiAgfVxufVxuXG4uY29udGFpbmVyID4gLm5hdmJhci1oZWFkZXIsXG4uY29udGFpbmVyID4gLm5hdmJhci1jb2xsYXBzZSxcbi5jb250YWluZXItZmx1aWQgPiAubmF2YmFyLWhlYWRlcixcbi5jb250YWluZXItZmx1aWQgPiAubmF2YmFyLWNvbGxhcHNlIHtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xuICBtYXJnaW4tbGVmdDogMDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5jb250YWluZXIgPiAubmF2YmFyLWhlYWRlcixcbiAgLmNvbnRhaW5lciA+IC5uYXZiYXItY29sbGFwc2UsXG4gIC5jb250YWluZXItZmx1aWQgPiAubmF2YmFyLWhlYWRlcixcbiAgLmNvbnRhaW5lci1mbHVpZCA+IC5uYXZiYXItY29sbGFwc2Uge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxufVxuXG4ubmF2YmFyLXN0YXRpYy10b3Age1xuICB6LWluZGV4OiAxMDAwO1xuICBib3JkZXItd2lkdGg6IDAgMCAxcHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLXN0YXRpYy10b3Age1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLm5hdmJhci1maXhlZC10b3AsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwMzA7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLWZpeGVkLXRvcCxcbiAgLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLm5hdmJhci1maXhlZC10b3Age1xuICB0b3A6IDA7XG4gIGJvcmRlci13aWR0aDogMCAwIDFweDtcbn1cblxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICBib3R0b206IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGJvcmRlci13aWR0aDogMXB4IDAgMDtcbn1cblxuLm5hdmJhci1icmFuZCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgMCAwIC04MHB4O1xuICBwYWRkaW5nOiAwIDAgMCA4MHB4O1xuICBoZWlnaHQ6IDU1cHg7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybChcIi4uLy4uLy4uL2ltYWdlcy90aGVtZS1kZWZhdWx0L2xvZ28td2hpdGUucG5nXCIpIG5vLXJlcGVhdCAyNHB4IDNweDtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVCb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZS1Cb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWUgQm9sZFwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgZm9udC1zaXplOiAxLjU3MWVtO1xuICBsaW5lLWhlaWdodDogNTVweDtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLm5hdmJhci1icmFuZDpob3Zlcixcbi5uYXZiYXItYnJhbmQ6Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5uYXZiYXItYnJhbmQgPiBpbWcge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXIgPiAuY29udGFpbmVyIC5uYXZiYXItYnJhbmQsXG4gIC5uYXZiYXIgPiAuY29udGFpbmVyLWZsdWlkIC5uYXZiYXItYnJhbmQge1xuICAgIG1hcmdpbi1sZWZ0OiAtODBweDtcbiAgfVxufVxuXG4ubmF2YmFyLXRvZ2dsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBtYXJnaW4tcmlnaHQ6IDA7XG4gIHBhZGRpbmc6IDlweCAxMHB4O1xuICBtYXJnaW4tdG9wOiAzcHg7XG4gIG1hcmdpbi1ib3R0b206IDNweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5uYXZiYXItdG9nZ2xlOmZvY3VzIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLm5hdmJhci10b2dnbGUgLmljb24tYmFyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDJweDtcbiAgYm9yZGVyLXJhZGl1czogMXB4O1xufVxuXG4ubmF2YmFyLXRvZ2dsZSAuaWNvbi1iYXIgKyAuaWNvbi1iYXIge1xuICBtYXJnaW4tdG9wOiA0cHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLXRvZ2dsZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4ubmF2YmFyLW5hdiB7XG4gIG1hcmdpbjogNXB4IDA7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiBhIHtcbiAgcGFkZGluZy1sZWZ0OiA0MHB4O1xuICBwYWRkaW5nLXJpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhIE5ldWUgTFQgVzFHIDU1IFJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWUgTFQgVzFHXCIsIFwiSGVsdmV0aWNhTmV1ZSBSb21hblwiLCBcIkhlbHZldGljYU5ldWUtUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZSBSb21hblwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxM3B0O1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gYSA+IC5mYSB7XG4gIGZvbnQtc2l6ZTogMjZweDtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IGEuZHJvcGRvd24tdG9nZ2xlIHtcbiAgcGFkZGluZy1yaWdodDogMjJweDtcbiAgcGFkZGluZy1sZWZ0OiAyMnB4O1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDA7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYSxcbiAgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgcGFkZGluZzogNXB4IDE1cHggNXB4IDI1cHg7XG4gIH1cbiAgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICB9XG4gIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuICAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYTpmb2N1cyB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm5hdmJhci1uYXYge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAubmF2YmFyLW5hdiA+IGxpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxuICAubmF2YmFyLW5hdiA+IGxpID4gYSB7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gIH1cbn1cblxuLm5hdmJhci1mb3JtIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIG1hcmdpbi1yaWdodDogMDtcbiAgcGFkZGluZzogMTBweCAwO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcbiAgbWFyZ2luLXRvcDogM3B4O1xuICBtYXJnaW4tYm90dG9tOiAzcHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLWZvcm0gLmZvcm0tZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5mb3JtLWNvbnRyb2wge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogYXV0bztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5uYXZiYXItZm9ybSAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIC5uYXZiYXItZm9ybSAuaW5wdXQtZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS10YWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5uYXZiYXItZm9ybSAuaW5wdXQtZ3JvdXAgLmlucHV0LWdyb3VwLWFkZG9uLFxuICAubmF2YmFyLWZvcm0gLmlucHV0LWdyb3VwIC5pbnB1dC1ncm91cC1idG4sXG4gIC5uYXZiYXItZm9ybSAuaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IGF1dG87XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCA+IC5mb3JtLWNvbnRyb2wge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIC5uYXZiYXItZm9ybSAuY29udHJvbC1sYWJlbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5uYXZiYXItZm9ybSAucmFkaW8sXG4gIC5uYXZiYXItZm9ybSAuY2hlY2tib3gge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuICAubmF2YmFyLWZvcm0gLnJhZGlvIGxhYmVsLFxuICAubmF2YmFyLWZvcm0gLmNoZWNrYm94IGxhYmVsIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4gIC5uYXZiYXItZm9ybSAuY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5oYXMtZmVlZGJhY2sgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gICAgdG9wOiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xuICAubmF2YmFyLWZvcm0gLmZvcm0tZ3JvdXAge1xuICAgIG1hcmdpbi1ib3R0b206IDVweDtcbiAgfVxuICAubmF2YmFyLWZvcm0gLmZvcm0tZ3JvdXA6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm5hdmJhci1mb3JtIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiBhLmRyb3Bkb3duLXRvZ2dsZSA+IC5jYXJldCB7XG4gIGJvcmRlci10b3A6IDA7XG4gIGJvcmRlci1sZWZ0OiAwO1xuICBib3JkZXItcmlnaHQ6IDA7XG4gIGJvcmRlci1ib3R0b206IDA7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICB3aWR0aDogNDBweDtcbiAgaGVpZ2h0OiAzOXB4O1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gYS5kcm9wZG93bi10b2dnbGUgPiAuY2FyZXQ6YmVmb3JlIHtcbiAgY29udGVudDogJ1xcZjA3OCc7XG4gIGZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMSBGb250QXdlc29tZTtcbiAgZm9udC1zaXplOiAxM3B4O1xuICB0ZXh0LXJlbmRlcmluZzogYXV0bztcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gIGNvbG9yOiAjZmZmO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMjRweDtcbiAgbWFyZ2luLWxlZnQ6IDE0cHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpLmRyb3Bkb3duLm9wZW4gPiBhID4gLmNhcmV0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLm5hdmJhci1uYXYgPiBsaS5kcm9wZG93bi5vcGVuID4gYSA+IC5jYXJldDpiZWZvcmUge1xuICBjb250ZW50OiAnXFxmMDc3Jztcbn1cblxuLm5hdmJhci1yaWdodCA+IGxpID4gYSB7XG4gIGhlaWdodDogNDlweDtcbn1cblxuLm5hdmJhci1yaWdodCA+IGxpID4gYSAuZmEge1xuICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG59XG5cbi5uYXZiYXItcmlnaHQgPiBsaSA+IGEgLnRvcGJhci10ZXh0LCAubmF2YmFyLXJpZ2h0ID4gbGkgPiBhIC5jYXJldCwgLm5hdmJhci1yaWdodCA+IGxpID4gYSAuZmEge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW4tdG9wOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogNDAwcHg7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgLyogVHJhY2sgKi9cbiAgLyogSGFuZGxlICovXG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSA+IGxpIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSA+IGxpID4gYSxcbi5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSA+IGxpID4gc3BhbiB7XG4gIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICBkaXNwbGF5OiBibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVNZWRpdW1cIiwgXCJIZWx2ZXRpY2FOZXVlLU1lZGl1bVwiLCBcIkhlbHZldGljYSBOZXVlIE1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWVcIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxM3B0O1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMjRweDtcbiAgcGFkZGluZzogN3B4IDMwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMyZTJlMmU7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMHB4IDFweCAwcHggMHB4ICM0MDQwNDI7XG4gIGJveC1zaGFkb3c6IGluc2V0IDBweCAxcHggMHB4IDBweCAjNDA0MDQyO1xuICBjbGVhcjogYm90aDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzLFxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkgPiBzcGFuOmhvdmVyLFxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkgPiBzcGFuOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhID4gLmZhIHtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgZm9udC1zaXplOiAyNnB4O1xuICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gIG1hcmdpbi1sZWZ0OiAtMTVweDtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkuY3JpdGljYWwgPiBhIHtcbiAgYmFja2dyb3VuZDogI2Q5MTgyZDtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51Ojotd2Via2l0LXNjcm9sbGJhciB7XG4gIHdpZHRoOiAxMnB4O1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnU6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDZweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJhY2tncm91bmQ6ICM3OTc5Nzk7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI0IzQjNCMztcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCA2cHggMXB4IDZweCAjOWU5ZTllO1xuICBib3gtc2hhZG93OiBpbnNldCA2cHggMXB4IDZweCAjOWU5ZTllO1xufVxuXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5uYXZiYXItYnRuIHtcbiAgbWFyZ2luLXRvcDogM3B4O1xuICBtYXJnaW4tYm90dG9tOiAzcHg7XG59XG5cbi5uYXZiYXItYnRuLmJ0bi1zbSwgLmJ0bi1ncm91cC1zbSA+IC5uYXZiYXItYnRuLmJ0biB7XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4ubmF2YmFyLWJ0bi5idG4teHMsIC5idG4tZ3JvdXAteHMgPiAubmF2YmFyLWJ0bi5idG4ge1xuICBtYXJnaW4tdG9wOiA5cHg7XG4gIG1hcmdpbi1ib3R0b206IDlweDtcbn1cblxuLm5hdmJhci10ZXh0IHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItdGV4dCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLWxlZnQge1xuICAgIGZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm5hdmJhci1yaWdodCB7XG4gICAgZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG4gIC5uYXZiYXItcmlnaHQgfiAubmF2YmFyLXJpZ2h0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gIH1cbn1cblxuLm5hdmJhci1kZWZhdWx0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZCB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZDpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmZvY3VzIHtcbiAgY29sb3I6ICNlNmU2ZTY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10ZXh0IHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IGxpID4gYSB7XG4gIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICBmb250LXNpemU6IDEzcHQ7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVCb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZS1Cb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWUgQm9sZFwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgbWluLXdpZHRoOiAxOTBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBoZWlnaHQ6IDQwcHg7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IGxpID4gYTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IGxpID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gbGkgPiBhIC5kaWdpdC1jb250YWluZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICBtYXJnaW4tdG9wOiAtMnB4O1xuICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxNnB4O1xuICBiYWNrZ3JvdW5kOiAjNTU1O1xuICBib3JkZXI6IDJweCBzb2xpZCAjNTU1O1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhTmV1ZU1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWUtTWVkaXVtXCIsIFwiSGVsdmV0aWNhIE5ldWUgTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDAgOHB4O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYSxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhIC5kaWdpdC1jb250YWluZXIge1xuICBib3JkZXItY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuZGlzYWJsZWQgPiBhLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmRpc2FibGVkID4gYTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGNvbG9yOiAjOTk5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmRpc2FibGVkID4gYSAuZGlnaXQtY29udGFpbmVyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEuaG9zdCxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLmhvc3Q6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5ob3N0OmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwOGFiZiAhaW1wb3J0YW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5ndWVzdHMsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5ndWVzdHM6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5ndWVzdHM6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOGNjNjNmICFpbXBvcnRhbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLnRlbXBsYXRlcyxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLnRlbXBsYXRlczpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLnRlbXBsYXRlczpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMGE2YTAgIWltcG9ydGFudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEuc3RvcmFnZSxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLnN0b3JhZ2U6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5zdG9yYWdlOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZlYjgxMyAhaW1wb3J0YW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5uZXR3b3JrLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEubmV0d29yazpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLm5ldHdvcms6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2YxYzdkICFpbXBvcnRhbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLmFkbWluaXN0cmF0aW9uLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEuYWRtaW5pc3RyYXRpb246aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5hZG1pbmlzdHJhdGlvbjpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTE4MmQgIWltcG9ydGFudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmhvc3RuYW1lIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiA4cHggMDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgd2lkdGg6IDE4MHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmhvc3RuYW1lIC5ob3N0LWxvY2F0aW9uIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYSBOZXVlIExUIFcxRyA1NSBSb21hblwiLCBcIkhlbHZldGljYSBOZXVlIExUIFcxR1wiLCBcIkhlbHZldGljYU5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2FOZXVlLVJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGNvbG9yOiAjZmZmO1xuICBmb250LXNpemU6IDEzcHQ7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItdG9nZ2xlIHtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGU6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGU6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGUgLmljb24tYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4ODtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItY29sbGFwc2UsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1mb3JtIHtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAub3BlbiA+IGEsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAub3BlbiA+IGE6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAub3BlbiA+IGE6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6ICNmZmY7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICAgIGNvbG9yOiAjZmZmO1xuICB9XG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYTpob3ZlcixcbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSxcbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhLFxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHtcbiAgICBjb2xvcjogIzk5OTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1saW5rIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWxpbms6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5idG4tbGluayB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5idG4tbGluazpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rW2Rpc2FibGVkXTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbmtbZGlzYWJsZWRdOmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbms6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLm5hdmJhci1kZWZhdWx0IC5idG4tbGluazpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4ubmF2YmFyLWludmVyc2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyO1xuICBib3JkZXItY29sb3I6ICMyMjI7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItYnJhbmQ6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXRleHQge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gbGkgPiBhIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IGxpID4gYTpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IGxpID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEsXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYTpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiAuZGlzYWJsZWQgPiBhLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLmRpc2FibGVkID4gYTpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXRvZ2dsZSB7XG4gIGJvcmRlci1jb2xvcjogIzMzMztcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXRvZ2dsZSAuaWNvbi1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1jb2xsYXBzZSxcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWZvcm0ge1xuICBib3JkZXItY29sb3I6ICMxMDEwMTA7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5vcGVuID4gYSxcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5vcGVuID4gYTpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5vcGVuID4gYTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogI2ZmZjtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5kcm9wZG93bi1oZWFkZXIge1xuICAgIGJvcmRlci1jb2xvcjogIzIyMjtcbiAgfVxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMyMjI7XG4gIH1cbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgfVxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6aG92ZXIsXG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYTpmb2N1cyB7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGEsXG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYSxcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpob3ZlcixcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gICAgY29sb3I6ICM5OTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGluayB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1saW5rOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbmsge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5idG4tbGluazpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5idG4tbGlua1tkaXNhYmxlZF06aG92ZXIsXG4ubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rW2Rpc2FibGVkXTpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6Zm9jdXMge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLmJyZWFkY3J1bWIge1xuICBwYWRkaW5nOiA4cHggMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYnJlYWRjcnVtYiA+IGxpIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uYnJlYWRjcnVtYiA+IGxpICsgbGk6YmVmb3JlIHtcbiAgY29udGVudDogXCIvXFxcXDAwYTBcIjtcbiAgcGFkZGluZzogMCA1cHg7XG4gIGNvbG9yOiAjY2NjO1xufVxuXG4uYnJlYWRjcnVtYiA+IC5hY3RpdmUge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLnBhZ2luYXRpb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbWFyZ2luOiAyMHB4IDA7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLnBhZ2luYXRpb24gPiBsaSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cblxuLnBhZ2luYXRpb24gPiBsaSA+IGEsXG4ucGFnaW5hdGlvbiA+IGxpID4gc3BhbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHBhZGRpbmc6IDZweCAxMnB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICMzYTM5M2I7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ucGFnaW5hdGlvbiA+IGxpOmZpcnN0LWNoaWxkID4gYSxcbi5wYWdpbmF0aW9uID4gbGk6Zmlyc3QtY2hpbGQgPiBzcGFuIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG4ucGFnaW5hdGlvbiA+IGxpOmxhc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24gPiBsaTpsYXN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYWdpbmF0aW9uID4gbGkgPiBhOmhvdmVyLFxuLnBhZ2luYXRpb24gPiBsaSA+IGE6Zm9jdXMsXG4ucGFnaW5hdGlvbiA+IGxpID4gc3Bhbjpob3Zlcixcbi5wYWdpbmF0aW9uID4gbGkgPiBzcGFuOmZvY3VzIHtcbiAgei1pbmRleDogMztcbiAgY29sb3I6ICMxNDEzMTQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1jb2xvcjogI2RkZDtcbn1cblxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gYSxcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBhOmZvY3VzLFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gc3Bhbixcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IHNwYW46aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBzcGFuOmZvY3VzIHtcbiAgei1pbmRleDogMjtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG4gIGJvcmRlci1jb2xvcjogIzNhMzkzYjtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IHNwYW4sXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IHNwYW46aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IHNwYW46Zm9jdXMsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IGEsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsXG4ucGFnaW5hdGlvbiA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4ucGFnaW5hdGlvbi1sZyA+IGxpID4gYSxcbi5wYWdpbmF0aW9uLWxnID4gbGkgPiBzcGFuIHtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG59XG5cbi5wYWdpbmF0aW9uLWxnID4gbGk6Zmlyc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24tbGcgPiBsaTpmaXJzdC1jaGlsZCA+IHNwYW4ge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDtcbn1cblxuLnBhZ2luYXRpb24tbGcgPiBsaTpsYXN0LWNoaWxkID4gYSxcbi5wYWdpbmF0aW9uLWxnID4gbGk6bGFzdC1jaGlsZCA+IHNwYW4ge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4O1xufVxuXG4ucGFnaW5hdGlvbi1zbSA+IGxpID4gYSxcbi5wYWdpbmF0aW9uLXNtID4gbGkgPiBzcGFuIHtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbn1cblxuLnBhZ2luYXRpb24tc20gPiBsaTpmaXJzdC1jaGlsZCA+IGEsXG4ucGFnaW5hdGlvbi1zbSA+IGxpOmZpcnN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG4ucGFnaW5hdGlvbi1zbSA+IGxpOmxhc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24tc20gPiBsaTpsYXN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYWdlciB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbWFyZ2luOiAyMHB4IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnBhZ2VyOmJlZm9yZSxcbi5wYWdlcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLnBhZ2VyOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5wYWdlciBsaSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cblxuLnBhZ2VyIGxpID4gYSxcbi5wYWdlciBsaSA+IHNwYW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDVweCAxNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiAxNXB4O1xufVxuXG4ucGFnZXIgbGkgPiBhOmhvdmVyLFxuLnBhZ2VyIGxpID4gYTpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLnBhZ2VyIC5uZXh0ID4gYSxcbi5wYWdlciAubmV4dCA+IHNwYW4ge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5wYWdlciAucHJldmlvdXMgPiBhLFxuLnBhZ2VyIC5wcmV2aW91cyA+IHNwYW4ge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLnBhZ2VyIC5kaXNhYmxlZCA+IGEsXG4ucGFnZXIgLmRpc2FibGVkID4gYTpob3Zlcixcbi5wYWdlciAuZGlzYWJsZWQgPiBhOmZvY3VzLFxuLnBhZ2VyIC5kaXNhYmxlZCA+IHNwYW4ge1xuICBjb2xvcjogIzk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLmxhYmVsIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBwYWRkaW5nOiAwLjJlbSAwLjZlbSAwLjNlbTtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICBib3JkZXItcmFkaXVzOiAuMjVlbTtcbn1cblxuLmxhYmVsOmVtcHR5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJ0biAubGFiZWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTFweDtcbn1cblxuYS5sYWJlbDpob3ZlcixcbmEubGFiZWw6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5sYWJlbC1kZWZhdWx0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTtcbn1cblxuLmxhYmVsLWRlZmF1bHRbaHJlZl06aG92ZXIsXG4ubGFiZWwtZGVmYXVsdFtocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XG59XG5cbi5sYWJlbC1wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLmxhYmVsLXByaW1hcnlbaHJlZl06aG92ZXIsXG4ubGFiZWwtcHJpbWFyeVtocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTIwMjE7XG59XG5cbi5sYWJlbC1zdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1Yztcbn1cblxuLmxhYmVsLXN1Y2Nlc3NbaHJlZl06aG92ZXIsXG4ubGFiZWwtc3VjY2Vzc1tocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0NDlkNDQ7XG59XG5cbi5sYWJlbC1pbmZvIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzViYzBkZTtcbn1cblxuLmxhYmVsLWluZm9baHJlZl06aG92ZXIsXG4ubGFiZWwtaW5mb1tocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMWIwZDU7XG59XG5cbi5sYWJlbC13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwYWQ0ZTtcbn1cblxuLmxhYmVsLXdhcm5pbmdbaHJlZl06aG92ZXIsXG4ubGFiZWwtd2FybmluZ1tocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYzk3MWY7XG59XG5cbi5sYWJlbC1kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDk1MzRmO1xufVxuXG4ubGFiZWwtZGFuZ2VyW2hyZWZdOmhvdmVyLFxuLmxhYmVsLWRhbmdlcltocmVmXTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjOTMwMmM7XG59XG5cbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAxMHB4O1xuICBwYWRkaW5nOiAzcHggN3B4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogI2ZmZjtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbn1cblxuLmJhZGdlOmVtcHR5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJ0biAuYmFkZ2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTFweDtcbn1cblxuLmJ0bi14cyAuYmFkZ2UsXG4uYnRuLWdyb3VwLXhzID4gLmJ0biAuYmFkZ2UsXG4uYnRuLWdyb3VwLXhzID4gLmJ0biAuYmFkZ2Uge1xuICB0b3A6IDA7XG4gIHBhZGRpbmc6IDFweCA1cHg7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlID4gLmJhZGdlLFxuLm5hdi1waWxscyA+IC5hY3RpdmUgPiBhID4gLmJhZGdlIHtcbiAgY29sb3I6ICMzYTM5M2I7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0gPiAuYmFkZ2Uge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0gPiAuYmFkZ2UgKyAuYmFkZ2Uge1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cblxuLm5hdi1waWxscyA+IGxpID4gYSA+IC5iYWRnZSB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG59XG5cbmEuYmFkZ2U6aG92ZXIsXG5hLmJhZGdlOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uanVtYm90cm9uIHtcbiAgcGFkZGluZy10b3A6IDMwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAzMHB4O1xuICBtYXJnaW4tYm90dG9tOiAzMHB4O1xuICBjb2xvcjogaW5oZXJpdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmp1bWJvdHJvbiBoMSxcbi5qdW1ib3Ryb24gLmgxIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5qdW1ib3Ryb24gcCB7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG4gIGZvbnQtc2l6ZTogMjFweDtcbiAgZm9udC13ZWlnaHQ6IDIwMDtcbn1cblxuLmp1bWJvdHJvbiA+IGhyIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2U2ZTZlNjtcbn1cblxuLmNvbnRhaW5lciAuanVtYm90cm9uLFxuLmNvbnRhaW5lci1mbHVpZCAuanVtYm90cm9uIHtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uanVtYm90cm9uIC5jb250YWluZXIge1xuICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5qdW1ib3Ryb24ge1xuICAgIHBhZGRpbmctdG9wOiA0OHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiA0OHB4O1xuICB9XG4gIC5jb250YWluZXIgLmp1bWJvdHJvbixcbiAgLmNvbnRhaW5lci1mbHVpZCAuanVtYm90cm9uIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDYwcHg7XG4gICAgcGFkZGluZy1yaWdodDogNjBweDtcbiAgfVxuICAuanVtYm90cm9uIGgxLFxuICAuanVtYm90cm9uIC5oMSB7XG4gICAgZm9udC1zaXplOiA2M3B4O1xuICB9XG59XG5cbi50aHVtYm5haWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogNHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBib3JkZXIgMC4ycyBlYXNlLWluLW91dDtcbiAgLW8tdHJhbnNpdGlvbjogYm9yZGVyIDAuMnMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGJvcmRlciAwLjJzIGVhc2UtaW4tb3V0O1xufVxuXG4udGh1bWJuYWlsID4gaW1nLFxuLnRodW1ibmFpbCBhID4gaW1nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuXG4udGh1bWJuYWlsIC5jYXB0aW9uIHtcbiAgcGFkZGluZzogOXB4O1xuICBjb2xvcjogIzIyMjtcbn1cblxuYS50aHVtYm5haWw6aG92ZXIsXG5hLnRodW1ibmFpbDpmb2N1cyxcbmEudGh1bWJuYWlsLmFjdGl2ZSB7XG4gIGJvcmRlci1jb2xvcjogIzNhMzkzYjtcbn1cblxuLmFsZXJ0IHtcbiAgcGFkZGluZzogOHB4IDE1cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uYWxlcnQgaDQge1xuICBtYXJnaW4tdG9wOiAwO1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmFsZXJ0IC5hbGVydC1saW5rIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5hbGVydCA+IHAsXG4uYWxlcnQgPiB1bCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5hbGVydCA+IHAgKyBwIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4uYWxlcnQtZGlzbWlzc2FibGUsIC5hbGVydC1kaXNtaXNzaWJsZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDhweCAxNXB4MjA7XG59XG5cbi5hbGVydC1kaXNtaXNzYWJsZSAuY2xvc2UsIC5hbGVydC1kaXNtaXNzaWJsZSAuY2xvc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTJweDtcbiAgcmlnaHQ6IC0yMXB4O1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmFsZXJ0LXN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFlNmNiO1xuICBib3JkZXItY29sb3I6ICM4Y2M2M2Y7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG4uYWxlcnQtc3VjY2VzcyBociB7XG4gIGJvcmRlci10b3AtY29sb3I6ICM3ZmI2MzY7XG59XG5cbi5hbGVydC1zdWNjZXNzIC5hbGVydC1saW5rIHtcbiAgY29sb3I6ICM1MjUyNTI7XG59XG5cbi5hbGVydC1pbmZvIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNztcbiAgYm9yZGVyLWNvbG9yOiAjMDA4YWJmO1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuLmFsZXJ0LWluZm8gaHIge1xuICBib3JkZXItdG9wLWNvbG9yOiAjMDA3OGE2O1xufVxuXG4uYWxlcnQtaW5mbyAuYWxlcnQtbGluayB7XG4gIGNvbG9yOiAjNTI1MjUyO1xufVxuXG4uYWxlcnQtd2FybmluZyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMWUzYzI7XG4gIGJvcmRlci1jb2xvcjogI2ZkYjgxMztcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbi5hbGVydC13YXJuaW5nIGhyIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2Y0YWQwMjtcbn1cblxuLmFsZXJ0LXdhcm5pbmcgLmFsZXJ0LWxpbmsge1xuICBjb2xvcjogIzUyNTI1Mjtcbn1cblxuLmFsZXJ0LWRhbmdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYWMzYzc7XG4gIGJvcmRlci1jb2xvcjogI2Q5MTgyZDtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbi5hbGVydC1kYW5nZXIgaHIge1xuICBib3JkZXItdG9wLWNvbG9yOiAjYzIxNTI4O1xufVxuXG4uYWxlcnQtZGFuZ2VyIC5hbGVydC1saW5rIHtcbiAgY29sb3I6ICM1MjUyNTI7XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlcyB7XG4gIGZyb20ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDtcbiAgfVxuICB0byB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXMge1xuICBmcm9tIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7XG4gIH1cbiAgdG8ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMDtcbiAgfVxufVxuXG4ucHJvZ3Jlc3Mge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IDIwcHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMC42cyBlYXNlO1xuICAtby10cmFuc2l0aW9uOiB3aWR0aCAwLjZzIGVhc2U7XG4gIHRyYW5zaXRpb246IHdpZHRoIDAuNnMgZWFzZTtcbn1cblxuLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhcixcbi5wcm9ncmVzcy1iYXItc3RyaXBlZCB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHg7XG59XG5cbi5wcm9ncmVzcy5hY3RpdmUgLnByb2dyZXNzLWJhcixcbi5wcm9ncmVzcy1iYXIuYWN0aXZlIHtcbiAgLXdlYmtpdC1hbmltYXRpb246IHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTtcbiAgLW8tYW5pbWF0aW9uOiBwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGU7XG4gIGFuaW1hdGlvbjogcHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLXN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWNiODVjO1xufVxuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLXN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG59XG5cbi5wcm9ncmVzcy1iYXItaW5mbyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1YmMwZGU7XG59XG5cbi5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItaW5mbyB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbn1cblxuLnByb2dyZXNzLWJhci13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwYWQ0ZTtcbn1cblxuLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWRhbmdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7XG59XG5cbi5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItZGFuZ2VyIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4ubWVkaWEge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4ubWVkaWE6Zmlyc3QtY2hpbGQge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG4ubWVkaWEsXG4ubWVkaWEtYm9keSB7XG4gIHpvb206IDE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5tZWRpYS1ib2R5IHtcbiAgd2lkdGg6IDEwMDAwcHg7XG59XG5cbi5tZWRpYS1vYmplY3Qge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLm1lZGlhLW9iamVjdC5pbWctdGh1bWJuYWlsIHtcbiAgbWF4LXdpZHRoOiBub25lO1xufVxuXG4ubWVkaWEtcmlnaHQsXG4ubWVkaWEgPiAucHVsbC1yaWdodCB7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cblxuLm1lZGlhLWxlZnQsXG4ubWVkaWEgPiAucHVsbC1sZWZ0IHtcbiAgcGFkZGluZy1yaWdodDogMTBweDtcbn1cblxuLm1lZGlhLWxlZnQsXG4ubWVkaWEtcmlnaHQsXG4ubWVkaWEtYm9keSB7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG5cbi5tZWRpYS1taWRkbGUge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4ubWVkaWEtYm90dG9tIHtcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbn1cblxuLm1lZGlhLWhlYWRpbmcge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5tZWRpYS1saXN0IHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG4ubGlzdC1ncm91cCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIHBhZGRpbmctbGVmdDogMDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbSxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0ge1xuICBjb2xvcjogIzU1NTtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbSAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICBjb2xvcjogIzMzMztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW06aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbTpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW06aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzU1NTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cblxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIHdpZHRoOiAxMDAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkLFxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpob3Zlcixcbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjb2xvcjogIzk5OTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZCAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LFxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpob3ZlciAubGlzdC1ncm91cC1pdGVtLXRleHQsXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMge1xuICB6LWluZGV4OiAyO1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcgPiBzbWFsbCxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nID4gLnNtYWxsLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nID4gc21hbGwsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcgPiAuc21hbGwge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgY29sb3I6ICNhMDllYTI7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2VzcyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFlNmNiO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpmb2N1cyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2VkZWJhO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZSxcbmEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNmM2YztcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLWluZm8ge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0taW5mbyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mbyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mbyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0taW5mbzpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLWluZm86Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm86aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm86Zm9jdXMge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0ZTNmMztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmUsXG5hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZTpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZSxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmU6aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM2YzZjNmM7XG4gIGJvcmRlci1jb2xvcjogIzZjNmM2Yztcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMWUzYzI7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmZvY3VzIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlY2Q5YWQ7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlLFxuYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmU6aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmUsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmM2YzZjO1xuICBib3JkZXItY29sb3I6ICM2YzZjNmM7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYWMzYzc7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWRhbmdlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWRhbmdlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpmb2N1cyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNiMGI1O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlLFxuYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZTpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmUsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNmM2YztcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0tdGV4dCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjM7XG59XG5cbi5wYW5lbCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xufVxuXG4ucGFuZWwtYm9keSB7XG4gIHBhZGRpbmc6IDE1cHg7XG59XG5cbi5wYW5lbC1ib2R5OmJlZm9yZSxcbi5wYW5lbC1ib2R5OmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4ucGFuZWwtYm9keTphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4ucGFuZWwtaGVhZGluZyB7XG4gIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7XG59XG5cbi5wYW5lbC1oZWFkaW5nID4gLmRyb3Bkb3duIC5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLnBhbmVsLXRpdGxlIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLnBhbmVsLXRpdGxlID4gYSxcbi5wYW5lbC10aXRsZSA+IHNtYWxsLFxuLnBhbmVsLXRpdGxlID4gLnNtYWxsLFxuLnBhbmVsLXRpdGxlID4gc21hbGwgPiBhLFxuLnBhbmVsLXRpdGxlID4gLnNtYWxsID4gYSB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4ucGFuZWwtZm9vdGVyIHtcbiAgcGFkZGluZzogMTBweCAxNXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAubGlzdC1ncm91cCxcbi5wYW5lbCA+IC5wYW5lbC1jb2xsYXBzZSA+IC5saXN0LWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLnBhbmVsID4gLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbSxcbi5wYW5lbCA+IC5wYW5lbC1jb2xsYXBzZSA+IC5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW0ge1xuICBib3JkZXItd2lkdGg6IDFweCAwO1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4ucGFuZWwgPiAubGlzdC1ncm91cDpmaXJzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXA6Zmlyc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci10b3A6IDA7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDtcbn1cblxuLnBhbmVsID4gLmxpc3QtZ3JvdXA6bGFzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cDpsYXN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDtcbn1cblxuLnBhbmVsID4gLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5wYW5lbC1oZWFkaW5nICsgLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDA7XG59XG5cbi5saXN0LWdyb3VwICsgLnBhbmVsLWZvb3RlciB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZSxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLFxuLnBhbmVsID4gLnBhbmVsLWNvbGxhcHNlID4gLnRhYmxlIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlIGNhcHRpb24sXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSBjYXB0aW9uLFxuLnBhbmVsID4gLnBhbmVsLWNvbGxhcHNlID4gLnRhYmxlIGNhcHRpb24ge1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4O1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRmb290Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAucGFuZWwtYm9keSArIC50YWJsZSxcbi5wYW5lbCA+IC5wYW5lbC1ib2R5ICsgLnRhYmxlLXJlc3BvbnNpdmUsXG4ucGFuZWwgPiAudGFibGUgKyAucGFuZWwtYm9keSxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlICsgLnBhbmVsLWJvZHkge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbn1cblxuLnBhbmVsID4gLnRhYmxlID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aCxcbi5wYW5lbCA+IC50YWJsZSA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQge1xuICBib3JkZXItdG9wOiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCB7XG4gIGJvcmRlcjogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRkOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLWxlZnQ6IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQ6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1yaWdodDogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpmaXJzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0aCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpmaXJzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmZpcnN0LWNoaWxkID4gdGgge1xuICBib3JkZXItYm90dG9tOiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmxhc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRoLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyOmxhc3QtY2hpbGQgPiB0aCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRoLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyOmxhc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGgge1xuICBib3JkZXItYm90dG9tOiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSB7XG4gIGJvcmRlcjogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLnBhbmVsLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLnBhbmVsLWdyb3VwIC5wYW5lbCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLnBhbmVsLWdyb3VwIC5wYW5lbCArIC5wYW5lbCB7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLnBhbmVsLWdyb3VwIC5wYW5lbC1oZWFkaW5nIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbn1cblxuLnBhbmVsLWdyb3VwIC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHksXG4ucGFuZWwtZ3JvdXAgLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ucGFuZWwtZ3JvdXAgLnBhbmVsLWZvb3RlciB7XG4gIGJvcmRlci10b3A6IDA7XG59XG5cbi5wYW5lbC1ncm91cCAucGFuZWwtZm9vdGVyICsgLnBhbmVsLWNvbGxhcHNlIC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi5wYW5lbC1kZWZhdWx0IHtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xufVxuXG4ucGFuZWwtZGVmYXVsdCA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgY29sb3I6ICMyMjI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG4gIGJvcmRlci1jb2xvcjogI2RkZDtcbn1cblxuLnBhbmVsLWRlZmF1bHQgPiAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2RkZDtcbn1cblxuLnBhbmVsLWRlZmF1bHQgPiAucGFuZWwtaGVhZGluZyAuYmFkZ2Uge1xuICBjb2xvcjogI2Y1ZjVmNTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIyMjtcbn1cblxuLnBhbmVsLWRlZmF1bHQgPiAucGFuZWwtZm9vdGVyICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjZGRkO1xufVxuXG4ucGFuZWwtcHJpbWFyeSB7XG4gIGJvcmRlci1jb2xvcjogIzNhMzkzYjtcbn1cblxuLnBhbmVsLXByaW1hcnkgPiAucGFuZWwtaGVhZGluZyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xuICBib3JkZXItY29sb3I6ICMzYTM5M2I7XG59XG5cbi5wYW5lbC1wcmltYXJ5ID4gLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci10b3AtY29sb3I6ICMzYTM5M2I7XG59XG5cbi5wYW5lbC1wcmltYXJ5ID4gLnBhbmVsLWhlYWRpbmcgLmJhZGdlIHtcbiAgY29sb3I6ICMzYTM5M2I7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5wYW5lbC1wcmltYXJ5ID4gLnBhbmVsLWZvb3RlciArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzNhMzkzYjtcbn1cblxuLnBhbmVsLXN1Y2Nlc3Mge1xuICBib3JkZXItY29sb3I6ICM4Y2M2M2Y7XG59XG5cbi5wYW5lbC1zdWNjZXNzID4gLnBhbmVsLWhlYWRpbmcge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZTZjYjtcbiAgYm9yZGVyLWNvbG9yOiAjOGNjNjNmO1xufVxuXG4ucGFuZWwtc3VjY2VzcyA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItdG9wLWNvbG9yOiAjOGNjNjNmO1xufVxuXG4ucGFuZWwtc3VjY2VzcyA+IC5wYW5lbC1oZWFkaW5nIC5iYWRnZSB7XG4gIGNvbG9yOiAjZGFlNmNiO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmM2YzZjO1xufVxuXG4ucGFuZWwtc3VjY2VzcyA+IC5wYW5lbC1mb290ZXIgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICM4Y2M2M2Y7XG59XG5cbi5wYW5lbC1pbmZvIHtcbiAgYm9yZGVyLWNvbG9yOiAjMDA4YWJmO1xufVxuXG4ucGFuZWwtaW5mbyA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XG4gIGJvcmRlci1jb2xvcjogIzAwOGFiZjtcbn1cblxuLnBhbmVsLWluZm8gPiAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogIzAwOGFiZjtcbn1cblxuLnBhbmVsLWluZm8gPiAucGFuZWwtaGVhZGluZyAuYmFkZ2Uge1xuICBjb2xvcjogI2Q5ZWRmNztcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNmM2Yztcbn1cblxuLnBhbmVsLWluZm8gPiAucGFuZWwtZm9vdGVyICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDA4YWJmO1xufVxuXG4ucGFuZWwtd2FybmluZyB7XG4gIGJvcmRlci1jb2xvcjogI2ZkYjgxMztcbn1cblxuLnBhbmVsLXdhcm5pbmcgPiAucGFuZWwtaGVhZGluZyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFlM2MyO1xuICBib3JkZXItY29sb3I6ICNmZGI4MTM7XG59XG5cbi5wYW5lbC13YXJuaW5nID4gLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNmZGI4MTM7XG59XG5cbi5wYW5lbC13YXJuaW5nID4gLnBhbmVsLWhlYWRpbmcgLmJhZGdlIHtcbiAgY29sb3I6ICNmMWUzYzI7XG4gIGJhY2tncm91bmQtY29sb3I6ICM2YzZjNmM7XG59XG5cbi5wYW5lbC13YXJuaW5nID4gLnBhbmVsLWZvb3RlciArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2ZkYjgxMztcbn1cblxuLnBhbmVsLWRhbmdlciB7XG4gIGJvcmRlci1jb2xvcjogI2Q5MTgyZDtcbn1cblxuLnBhbmVsLWRhbmdlciA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYWMzYzc7XG4gIGJvcmRlci1jb2xvcjogI2Q5MTgyZDtcbn1cblxuLnBhbmVsLWRhbmdlciA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItdG9wLWNvbG9yOiAjZDkxODJkO1xufVxuXG4ucGFuZWwtZGFuZ2VyID4gLnBhbmVsLWhlYWRpbmcgLmJhZGdlIHtcbiAgY29sb3I6ICNlYWMzYzc7XG4gIGJhY2tncm91bmQtY29sb3I6ICM2YzZjNmM7XG59XG5cbi5wYW5lbC1kYW5nZXIgPiAucGFuZWwtZm9vdGVyICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjZDkxODJkO1xufVxuXG4uZW1iZWQtcmVzcG9uc2l2ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogMDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmVtYmVkLXJlc3BvbnNpdmUgLmVtYmVkLXJlc3BvbnNpdmUtaXRlbSxcbi5lbWJlZC1yZXNwb25zaXZlIGlmcmFtZSxcbi5lbWJlZC1yZXNwb25zaXZlIGVtYmVkLFxuLmVtYmVkLXJlc3BvbnNpdmUgb2JqZWN0LFxuLmVtYmVkLXJlc3BvbnNpdmUgdmlkZW8ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgYm90dG9tOiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXI6IDA7XG59XG5cbi5lbWJlZC1yZXNwb25zaXZlLTE2Ynk5IHtcbiAgcGFkZGluZy1ib3R0b206IDU2LjI1JTtcbn1cblxuLmVtYmVkLXJlc3BvbnNpdmUtNGJ5MyB7XG4gIHBhZGRpbmctYm90dG9tOiA3NSU7XG59XG5cbi53ZWxsIHtcbiAgbWluLWhlaWdodDogMjBweDtcbiAgcGFkZGluZzogMTlweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLndlbGwgYmxvY2txdW90ZSB7XG4gIGJvcmRlci1jb2xvcjogI2RkZDtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4ud2VsbC1sZyB7XG4gIHBhZGRpbmc6IDI0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLndlbGwtc20ge1xuICBwYWRkaW5nOiA5cHg7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmNsb3NlIHtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBmb250LXNpemU6IDIxcHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICMwMDA7XG4gIHRleHQtc2hhZG93OiAwIDFweCAwICNmZmY7XG4gIG9wYWNpdHk6IDAuMjtcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTIwKTtcbn1cblxuLmNsb3NlOmhvdmVyLFxuLmNsb3NlOmZvY3VzIHtcbiAgY29sb3I6ICMwMDA7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBvcGFjaXR5OiAwLjU7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XG59XG5cbmJ1dHRvbi5jbG9zZSB7XG4gIHBhZGRpbmc6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogMDtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG4vKlxuKiBQcm9qZWN0IEtpbWNoaVxuKlxuKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDE1XG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuLm1vZGFsLW9wZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ubW9kYWwge1xuICBkaXNwbGF5OiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTA1MDtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuICBvdXRsaW5lOiAwO1xufVxuXG4ubW9kYWwuZmFkZSAubW9kYWwtZGlhbG9nIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjUlKTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0yNSUpO1xuICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjUlKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTI1JSk7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4zcyBlYXNlLW91dDtcbiAgLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0O1xuICAtby10cmFuc2l0aW9uOiAtby10cmFuc2Zvcm0gMC4zcyBlYXNlLW91dDtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZS1vdXQ7XG59XG5cbi5tb2RhbC5pbiAubW9kYWwtZGlhbG9nIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG59XG5cbi5tb2RhbC1vcGVuIC5tb2RhbCB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLm1vZGFsLWRpYWxvZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IGF1dG87XG4gIG1hcmdpbjogMTBweDtcbiAgYm9yZGVyOiA2cHggc29saWQgI2FhYTtcbiAgYm9yZGVyOiA2cHggc29saWQgcmdiYSgxNzAsIDE3MCwgMTcwLCAwLjMpO1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG59XG5cbi5tb2RhbC1jb250ZW50IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBib3JkZXI6IDNweCBzb2xpZCAjOTk5O1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBvdXRsaW5lOiAwO1xufVxuXG4ubW9kYWwtYmFja2Ryb3Age1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTA0MDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLm1vZGFsLWJhY2tkcm9wLmZhZGUge1xuICBvcGFjaXR5OiAwO1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7XG59XG5cbi5tb2RhbC1iYWNrZHJvcC5pbiB7XG4gIG9wYWNpdHk6IDAuNTtcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUwKTtcbn1cblxuLm1vZGFsLWhlYWRlciB7XG4gIHBhZGRpbmc6IDI3cHggMTRweCAxNHB4IDMwcHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgbWluLWhlaWdodDogMjdweCAxNHB4IDE0cHggMzBweDIzcHg7XG59XG5cbi5tb2RhbC1oZWFkZXIgLmNsb3NlIHtcbiAgbWFyZ2luLXRvcDogLTJweDtcbn1cblxuLm1vZGFsLXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBsaW5lLWhlaWdodDogMjNweDtcbiAgZm9udC1zaXplOiAyN3B4O1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2FOZXVlTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlLUxpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZSBMaWdodFwiLCBcIkhlbHZldGljYU5ldWVcIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogMzAwICFpbXBvcnRhbnQ7XG59XG5cbi5tb2RhbC1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiAxMHB4IDMwcHg7XG59XG5cbi5tb2RhbC1mb290ZXIge1xuICBwYWRkaW5nOiAxMHB4IDMwcHg7XG4gIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDtcbiAgYm9yZGVyLXRvcDogMDtcbiAgbWFyZ2luLXRvcDogMjBweDtcbn1cblxuLm1vZGFsLWZvb3RlcjpiZWZvcmUsXG4ubW9kYWwtZm9vdGVyOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4ubW9kYWwtZm9vdGVyOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5tb2RhbC1mb290ZXIgLmJ0biB7XG4gIHBhZGRpbmc6IDZweCAxMnB4O1xuICBtaW4td2lkdGg6IDc1cHg7XG59XG5cbi5tb2RhbC1mb290ZXIgLmJ0biArIC5idG4ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ubW9kYWwtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0biArIC5idG4ge1xuICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLm1vZGFsLWZvb3RlciAuYnRuLWJsb2NrICsgLmJ0bi1ibG9jayB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4ubW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTk5OTlweDtcbiAgd2lkdGg6IDUwcHg7XG4gIGhlaWdodDogNTBweDtcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5tb2RhbC1kaWFsb2cge1xuICAgIHdpZHRoOiA4MjRweDtcbiAgICBtYXJnaW46IDMwcHggYXV0bztcbiAgfVxuICAubW9kYWwtY29udGVudCB7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgfVxuICAubW9kYWwtc20ge1xuICAgIHdpZHRoOiA1MjRweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XG4gIC5tb2RhbC1sZyB7XG4gICAgd2lkdGg6IDExMjRweDtcbiAgfVxufVxuXG4ubW9kYWwge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5tb2RhbDpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgIGhlaWdodDogMTAwJTtcbiAgfVxufVxuXG4ubW9kYWwtZGlhbG9nIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4jaG9zdC1yb290LWNvbnRhaW5lciAubW9kYWwtZm9vdGVyLCAuaG9zdC1tb2RhbCAubW9kYWwtZm9vdGVyIHtcbiAgYmFja2dyb3VuZDogIzAwOGFiZiAhaW1wb3J0YW50O1xufVxuXG4jZ3Vlc3RzLXJvb3QtY29udGFpbmVyIC5tb2RhbC1mb290ZXIsIC5ndWVzdHMtbW9kYWwgLm1vZGFsLWZvb3RlciB7XG4gIGJhY2tncm91bmQ6ICM4Y2M2M2YgIWltcG9ydGFudDtcbn1cblxuI3RlbXBsYXRlcy1yb290LWNvbnRhaW5lciAubW9kYWwtZm9vdGVyLCAudGVtcGxhdGVzLW1vZGFsIC5tb2RhbC1mb290ZXIge1xuICBiYWNrZ3JvdW5kOiAjMDBhNmEwICFpbXBvcnRhbnQ7XG59XG5cbiNzdG9yYWdlLXJvb3QtY29udGFpbmVyIC5tb2RhbC1mb290ZXIsIC5zdG9yYWdlLW1vZGFsIC5tb2RhbC1mb290ZXIge1xuICBiYWNrZ3JvdW5kOiAjZmViODEzICFpbXBvcnRhbnQ7XG59XG5cbiNuZXR3b3JrLXJvb3QtY29udGFpbmVyIC5tb2RhbC1mb290ZXIsIC5uZXR3b3JrLW1vZGFsIC5tb2RhbC1mb290ZXIge1xuICBiYWNrZ3JvdW5kOiAjN2YxYzdkICFpbXBvcnRhbnQ7XG59XG5cbiNhZG1pbmlzdHJhdGlvbi1yb290LWNvbnRhaW5lciAubW9kYWwtZm9vdGVyLCAuYWRtaW5pc3RyYXRpb24tbW9kYWwgLm1vZGFsLWZvb3RlciB7XG4gIGJhY2tncm91bmQ6ICNkOTE4MmQgIWltcG9ydGFudDtcbn1cblxuLm1vZGFsIGxhYmVsIHtcbiAgY29sb3I6ICMyMjI7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVMaWdodFwiLCBcIkhlbHZldGljYU5ldWUtTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlIExpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cblxuLnRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwNzA7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2FOZXVlTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZS1NZWRpdW1cIiwgXCJIZWx2ZXRpY2EgTmV1ZSBNZWRpdW1cIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgbGluZS1icmVhazogYXV0bztcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIHdvcmQtYnJlYWs6IG5vcm1hbDtcbiAgd29yZC1zcGFjaW5nOiBub3JtYWw7XG4gIHdvcmQtd3JhcDogbm9ybWFsO1xuICBmb250LXNpemU6IDEycHg7XG4gIG9wYWNpdHk6IDA7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0wKTtcbn1cblxuLnRvb2x0aXAuaW4ge1xuICBvcGFjaXR5OiAwLjk7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT05MCk7XG59XG5cbi50b29sdGlwLnRvcCB7XG4gIG1hcmdpbi10b3A6IC0zcHg7XG4gIHBhZGRpbmc6IDVweCAwO1xufVxuXG4udG9vbHRpcC5yaWdodCB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xufVxuXG4udG9vbHRpcC5ib3R0b20ge1xuICBtYXJnaW4tdG9wOiAzcHg7XG4gIHBhZGRpbmc6IDVweCAwO1xufVxuXG4udG9vbHRpcC5sZWZ0IHtcbiAgbWFyZ2luLWxlZnQ6IC0zcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xufVxuXG4udG9vbHRpcC1pbm5lciB7XG4gIG1heC13aWR0aDogMjAwcHg7XG4gIHBhZGRpbmc6IDNweCA4cHg7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLnRvb2x0aXAtYXJyb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG59XG5cbi50b29sdGlwLnRvcCAudG9vbHRpcC1hcnJvdyB7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiA1cHggNXB4IDA7XG4gIGJvcmRlci10b3AtY29sb3I6ICMwMDA7XG59XG5cbi50b29sdGlwLnRvcC1sZWZ0IC50b29sdGlwLWFycm93IHtcbiAgYm90dG9tOiAwO1xuICByaWdodDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDVweCA1cHggMDtcbiAgYm9yZGVyLXRvcC1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAudG9wLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IC01cHg7XG4gIGJvcmRlci13aWR0aDogNXB4IDVweCAwO1xuICBib3JkZXItdG9wLWNvbG9yOiAjMDAwO1xufVxuXG4udG9vbHRpcC5yaWdodCAudG9vbHRpcC1hcnJvdyB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAwO1xuICBtYXJnaW4tdG9wOiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDVweCA1cHggNXB4IDA7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAubGVmdCAudG9vbHRpcC1hcnJvdyB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMDtcbiAgbWFyZ2luLXRvcDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiA1cHggMCA1cHggNXB4O1xuICBib3JkZXItbGVmdC1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAuYm90dG9tIC50b29sdGlwLWFycm93IHtcbiAgdG9wOiAwO1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDAgNXB4IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICB0b3A6IDA7XG4gIHJpZ2h0OiA1cHg7XG4gIG1hcmdpbi10b3A6IC01cHg7XG4gIGJvcmRlci13aWR0aDogMCA1cHggNXB4O1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwO1xufVxuXG4udG9vbHRpcC5ib3R0b20tcmlnaHQgLnRvb2x0aXAtYXJyb3cge1xuICB0b3A6IDA7XG4gIGxlZnQ6IDVweDtcbiAgbWFyZ2luLXRvcDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiAwIDVweCA1cHg7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDA7XG59XG5cbi5wb3BvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwNjA7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1heC13aWR0aDogMjc2cHg7XG4gIHBhZGRpbmc6IDFweDtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhTmV1ZU1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWUtTWVkaXVtXCIsIFwiSGVsdmV0aWNhIE5ldWUgTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gIGxpbmUtYnJlYWs6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgdGV4dC1hbGlnbjogc3RhcnQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gIHdvcmQtc3BhY2luZzogbm9ybWFsO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XG59XG5cbi5wb3BvdmVyLnRvcCB7XG4gIG1hcmdpbi10b3A6IC0xMHB4O1xufVxuXG4ucG9wb3Zlci5yaWdodCB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4ucG9wb3Zlci5ib3R0b20ge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4ucG9wb3Zlci5sZWZ0IHtcbiAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xufVxuXG4ucG9wb3Zlci10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogOHB4IDE0cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlYmViZWI7XG4gIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xufVxuXG4ucG9wb3Zlci1jb250ZW50IHtcbiAgcGFkZGluZzogOXB4IDE0cHg7XG59XG5cbi5wb3BvdmVyID4gLmFycm93LFxuLnBvcG92ZXIgPiAuYXJyb3c6YWZ0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xufVxuXG4ucG9wb3ZlciA+IC5hcnJvdyB7XG4gIGJvcmRlci13aWR0aDogMTFweDtcbn1cblxuLnBvcG92ZXIgPiAuYXJyb3c6YWZ0ZXIge1xuICBib3JkZXItd2lkdGg6IDEwcHg7XG4gIGNvbnRlbnQ6IFwiXCI7XG59XG5cbi5wb3BvdmVyLnRvcCA+IC5hcnJvdyB7XG4gIGxlZnQ6IDUwJTtcbiAgbWFyZ2luLWxlZnQ6IC0xMXB4O1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuICBib3JkZXItdG9wLWNvbG9yOiAjOTk5OTk5O1xuICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICBib3R0b206IC0xMXB4O1xufVxuXG4ucG9wb3Zlci50b3AgPiAuYXJyb3c6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgYm90dG9tOiAxcHg7XG4gIG1hcmdpbi1sZWZ0OiAtMTBweDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2ZmZjtcbn1cblxuLnBvcG92ZXIucmlnaHQgPiAuYXJyb3cge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogLTExcHg7XG4gIG1hcmdpbi10b3A6IC0xMXB4O1xuICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjOTk5OTk5O1xuICBib3JkZXItcmlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG59XG5cbi5wb3BvdmVyLnJpZ2h0ID4gLmFycm93OmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGxlZnQ6IDFweDtcbiAgYm90dG9tOiAtMTBweDtcbiAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogI2ZmZjtcbn1cblxuLnBvcG92ZXIuYm90dG9tID4gLmFycm93IHtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTExcHg7XG4gIGJvcmRlci10b3Atd2lkdGg6IDA7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICM5OTk5OTk7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIHRvcDogLTExcHg7XG59XG5cbi5wb3BvdmVyLmJvdHRvbSA+IC5hcnJvdzphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICB0b3A6IDFweDtcbiAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmZmO1xufVxuXG4ucG9wb3Zlci5sZWZ0ID4gLmFycm93IHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAtMTFweDtcbiAgbWFyZ2luLXRvcDogLTExcHg7XG4gIGJvcmRlci1yaWdodC13aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICM5OTk5OTk7XG4gIGJvcmRlci1sZWZ0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xufVxuXG4ucG9wb3Zlci5sZWZ0ID4gLmFycm93OmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIHJpZ2h0OiAxcHg7XG4gIGJvcmRlci1yaWdodC13aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICNmZmY7XG4gIGJvdHRvbTogLTEwcHg7XG59XG5cbi5jYXJvdXNlbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNhcm91c2VsLWlubmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLml0ZW0ge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogMC42cyBlYXNlLWluLW91dCBsZWZ0O1xuICAtby10cmFuc2l0aW9uOiAwLjZzIGVhc2UtaW4tb3V0IGxlZnQ7XG4gIHRyYW5zaXRpb246IDAuNnMgZWFzZS1pbi1vdXQgbGVmdDtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLml0ZW0gPiBpbWcsXG4uY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbSA+IGEgPiBpbWcge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG5AbWVkaWEgYWxsIGFuZCAodHJhbnNmb3JtLTNkKSwgKC13ZWJraXQtdHJhbnNmb3JtLTNkKSB7XG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtIHtcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuNnMgZWFzZS1pbi1vdXQ7XG4gICAgLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSAwLjZzIGVhc2UtaW4tb3V0O1xuICAgIC1vLXRyYW5zaXRpb246IC1vLXRyYW5zZm9ybSAwLjZzIGVhc2UtaW4tb3V0O1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjZzIGVhc2UtaW4tb3V0O1xuICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAtd2Via2l0LXBlcnNwZWN0aXZlOiAxMDAwcHg7XG4gICAgLW1vei1wZXJzcGVjdGl2ZTogMTAwMHB4O1xuICAgIHBlcnNwZWN0aXZlOiAxMDAwcHg7XG4gIH1cbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0ubmV4dCxcbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0uYWN0aXZlLnJpZ2h0IHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKTtcbiAgICBsZWZ0OiAwO1xuICB9XG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtLnByZXYsXG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtLmFjdGl2ZS5sZWZ0IHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgIGxlZnQ6IDA7XG4gIH1cbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0ubmV4dC5sZWZ0LFxuICAuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbS5wcmV2LnJpZ2h0LFxuICAuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbS5hY3RpdmUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIGxlZnQ6IDA7XG4gIH1cbn1cblxuLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZSxcbi5jYXJvdXNlbC1pbm5lciA+IC5uZXh0LFxuLmNhcm91c2VsLWlubmVyID4gLnByZXYge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZSB7XG4gIGxlZnQ6IDA7XG59XG5cbi5jYXJvdXNlbC1pbm5lciA+IC5uZXh0LFxuLmNhcm91c2VsLWlubmVyID4gLnByZXYge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5jYXJvdXNlbC1pbm5lciA+IC5uZXh0IHtcbiAgbGVmdDogMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLnByZXYge1xuICBsZWZ0OiAtMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLm5leHQubGVmdCxcbi5jYXJvdXNlbC1pbm5lciA+IC5wcmV2LnJpZ2h0IHtcbiAgbGVmdDogMDtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZS5sZWZ0IHtcbiAgbGVmdDogLTEwMCU7XG59XG5cbi5jYXJvdXNlbC1pbm5lciA+IC5hY3RpdmUucmlnaHQge1xuICBsZWZ0OiAxMDAlO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxNSU7XG4gIG9wYWNpdHk6IDAuNTtcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUwKTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC42KTtcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wubGVmdCB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoMCwgMCwgMCwgMC41KSAwJSwgcmdiYSgwLCAwLCAwLCAwLjAwMDEpIDEwMCUpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLCAwLCAwLCAwLjUpIDAlLCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMTAwJSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjUpIDAlLCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMTAwJSk7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzgwMDAwMDAwJywgZW5kQ29sb3JzdHI9JyMwMDAwMDAwMCcsIEdyYWRpZW50VHlwZT0xKTtcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wucmlnaHQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogMDtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLCAwLCAwLCAwLjAwMDEpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNSkgMTAwJSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMCUsIHJnYmEoMCwgMCwgMCwgMC41KSAxMDAlKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMCUsIHJnYmEoMCwgMCwgMCwgMC41KSAxMDAlKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDAwMDAwMDAnLCBlbmRDb2xvcnN0cj0nIzgwMDAwMDAwJywgR3JhZGllbnRUeXBlPTEpO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbDpob3Zlcixcbi5jYXJvdXNlbC1jb250cm9sOmZvY3VzIHtcbiAgb3V0bGluZTogMDtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3BhY2l0eTogMC45O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9OTApO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LFxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dCxcbi5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbWFyZ2luLXRvcDogLTEwcHg7XG4gIHotaW5kZXg6IDU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tcHJldixcbi5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0IHtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTEwcHg7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQsXG4uY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQge1xuICByaWdodDogNTAlO1xuICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LFxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dCB7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBmb250LWZhbWlseTogc2VyaWY7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXY6YmVmb3JlIHtcbiAgY29udGVudDogJ1xcMjAzOSc7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQ6YmVmb3JlIHtcbiAgY29udGVudDogJ1xcMjAzYSc7XG59XG5cbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIHdpZHRoOiA2MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmNhcm91c2VsLWluZGljYXRvcnMgbGkge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIG1hcmdpbjogMXB4O1xuICB0ZXh0LWluZGVudDogLTk5OXB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZmZmO1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDAgXFw5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmNhcm91c2VsLWluZGljYXRvcnMgLmFjdGl2ZSB7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEycHg7XG4gIGhlaWdodDogMTJweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmNhcm91c2VsLWNhcHRpb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDE1JTtcbiAgcmlnaHQ6IDE1JTtcbiAgYm90dG9tOiAyMHB4O1xuICB6LWluZGV4OiAxMDtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAyMHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC42KTtcbn1cblxuLmNhcm91c2VsLWNhcHRpb24gLmJ0biB7XG4gIHRleHQtc2hhZG93OiBub25lO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tbGVmdCxcbiAgLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0IHtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgbWFyZ2luLXRvcDogLTE1cHg7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG4gIC5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2IHtcbiAgICBtYXJnaW4tbGVmdDogLTE1cHg7XG4gIH1cbiAgLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xuICB9XG4gIC5jYXJvdXNlbC1jYXB0aW9uIHtcbiAgICBsZWZ0OiAyMCU7XG4gICAgcmlnaHQ6IDIwJTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMzBweDtcbiAgfVxuICAuY2Fyb3VzZWwtaW5kaWNhdG9ycyB7XG4gICAgYm90dG9tOiAyMHB4O1xuICB9XG59XG5cbi5jbGVhcmZpeDpiZWZvcmUsXG4uY2xlYXJmaXg6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5jbGVhcmZpeDphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4uY2VudGVyLWJsb2NrIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG5cbi5wdWxsLXJpZ2h0IHtcbiAgZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnQ7XG59XG5cbi5wdWxsLWxlZnQge1xuICBmbG9hdDogbGVmdCAhaW1wb3J0YW50O1xufVxuXG4uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLnNob3cge1xuICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG4uaW52aXNpYmxlIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xufVxuXG4udGV4dC1oaWRlIHtcbiAgZm9udDogMC8wIGE7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDA7XG59XG5cbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi5hZmZpeCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cblxuQC1tcy12aWV3cG9ydCB7XG4gIHdpZHRoOiBkZXZpY2Utd2lkdGg7XG59XG5cbi52aXNpYmxlLXhzIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4udmlzaWJsZS1zbSB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLnZpc2libGUtbWQge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi52aXNpYmxlLWxnIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4udmlzaWJsZS14cy1ibG9jayxcbi52aXNpYmxlLXhzLWlubGluZSxcbi52aXNpYmxlLXhzLWlubGluZS1ibG9jayxcbi52aXNpYmxlLXNtLWJsb2NrLFxuLnZpc2libGUtc20taW5saW5lLFxuLnZpc2libGUtc20taW5saW5lLWJsb2NrLFxuLnZpc2libGUtbWQtYmxvY2ssXG4udmlzaWJsZS1tZC1pbmxpbmUsXG4udmlzaWJsZS1tZC1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1sZy1ibG9jayxcbi52aXNpYmxlLWxnLWlubGluZSxcbi52aXNpYmxlLWxnLWlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC52aXNpYmxlLXhzIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUteHMge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS14cyB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS14cyxcbiAgdGQudmlzaWJsZS14cyB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xuICAudmlzaWJsZS14cy1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLnZpc2libGUteHMtaW5saW5lIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLnZpc2libGUteHMtaW5saW5lLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpIHtcbiAgLnZpc2libGUtc20ge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGFibGUudmlzaWJsZS1zbSB7XG4gICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDtcbiAgfVxuICB0ci52aXNpYmxlLXNtIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDtcbiAgfVxuICB0aC52aXNpYmxlLXNtLFxuICB0ZC52aXNpYmxlLXNtIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSBhbmQgKG1heC13aWR0aDogMTE5OXB4KSB7XG4gIC52aXNpYmxlLXNtLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgYW5kIChtYXgtd2lkdGg6IDExOTlweCkge1xuICAudmlzaWJsZS1zbS1pbmxpbmUge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgYW5kIChtYXgtd2lkdGg6IDExOTlweCkge1xuICAudmlzaWJsZS1zbS1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC52aXNpYmxlLW1kIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUtbWQge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS1tZCB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS1tZCxcbiAgdGQudmlzaWJsZS1tZCB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC52aXNpYmxlLW1kLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC52aXNpYmxlLW1kLWlubGluZSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgYW5kIChtYXgtd2lkdGg6IDE2NzkpIHtcbiAgLnZpc2libGUtbWQtaW5saW5lLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAudmlzaWJsZS1sZyB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxuICB0YWJsZS52aXNpYmxlLWxnIHtcbiAgICBkaXNwbGF5OiB0YWJsZSAhaW1wb3J0YW50O1xuICB9XG4gIHRyLnZpc2libGUtbGcge1xuICAgIGRpc3BsYXk6IHRhYmxlLXJvdyAhaW1wb3J0YW50O1xuICB9XG4gIHRoLnZpc2libGUtbGcsXG4gIHRkLnZpc2libGUtbGcge1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAudmlzaWJsZS1sZy1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAudmlzaWJsZS1sZy1pbmxpbmUge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxNjgwKSB7XG4gIC52aXNpYmxlLWxnLWlubGluZS1ibG9jayB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC5oaWRkZW4teHMge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpIHtcbiAgLmhpZGRlbi1zbSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC5oaWRkZW4tbWQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAuaGlkZGVuLWxnIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtcHJpbnQge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC52aXNpYmxlLXByaW50IHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUtcHJpbnQge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS1wcmludCxcbiAgdGQudmlzaWJsZS1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbi52aXNpYmxlLXByaW50LWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5AbWVkaWEgcHJpbnQge1xuICAudmlzaWJsZS1wcmludC1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG4udmlzaWJsZS1wcmludC1pbmxpbmUge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC52aXNpYmxlLXByaW50LWlubGluZSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtcHJpbnQtaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5AbWVkaWEgcHJpbnQge1xuICAudmlzaWJsZS1wcmludC1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC5oaWRkZW4tcHJpbnQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG4vKiBcblRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG5Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBib290c3RyYXAtc2VsZWN0XG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS4gKi9cbi5ib290c3RyYXAtc2VsZWN0IHtcbiAgLyp3aWR0aDogMjIwcHhcXDk7IElFOCBhbmQgYmVsb3cqL1xuICB3aWR0aDogMjIwcHggXFwwO1xuICAvKklFOSBhbmQgYmVsb3cqL1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdCA+IC5idG4ge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAyNXB4O1xufVxuXG4uZXJyb3IgLmJvb3RzdHJhcC1zZWxlY3QgLmJ0biB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNiOTRhNDg7XG59XG5cbi5jb250cm9sLWdyb3VwLmVycm9yIC5ib290c3RyYXAtc2VsZWN0IC5kcm9wZG93bi10b2dnbGUge1xuICBib3JkZXItY29sb3I6ICNiOTRhNDg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmZpdC13aWR0aCB7XG4gIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0Om5vdChbY2xhc3MqPVwiY29sLVwiXSk6bm90KFtjbGFzcyo9XCJmb3JtLWNvbnRyb2xcIl0pOm5vdCguaW5wdXQtZ3JvdXAtYnRuKSB7XG4gIHdpZHRoOiAyMjBweDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QgLmJ0bjpmb2N1cyB7XG4gIG91dGxpbmU6IHRoaW4gZG90dGVkICMzMzMzMzMgIWltcG9ydGFudDtcbiAgb3V0bGluZTogNXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yICFpbXBvcnRhbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5mb3JtLWNvbnRyb2wge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmZvcm0tY29udHJvbDpub3QoW2NsYXNzKj1cImNvbC1cIl0pIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cDpub3QoLmlucHV0LWdyb3VwLWJ0biksXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXBbY2xhc3MqPVwiY29sLVwiXSB7XG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAuZHJvcGRvd24tbWVudS1yaWdodCxcbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cFtjbGFzcyo9XCJjb2wtXCJdLmRyb3Bkb3duLW1lbnUtcmlnaHQsXG4ucm93LWZsdWlkIC5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cFtjbGFzcyo9XCJjb2wtXCJdLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5mb3JtLXNlYXJjaCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAsXG4uZm9ybS1pbmxpbmUgLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLFxuLmZvcm0taG9yaXpvbnRhbCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAsXG4uZm9ybS1ncm91cCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uZm9ybS1ncm91cC1sZyAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAuZm9ybS1jb250cm9sLFxuLmZvcm0tZ3JvdXAtc20gLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLmZvcm0tY29udHJvbCB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi5mb3JtLWlubGluZSAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmZvcm0tY29udHJvbCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uaW5wdXQtYXBwZW5kIC5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCB7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4uaW5wdXQtcHJlcGVuZCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAge1xuICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCA+IC5kaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCA+IC5kaXNhYmxlZDpmb2N1cyB7XG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5idG4gLmZpbHRlci1vcHRpb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdpZHRoOiAxMDAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmJ0biAuY2FyZXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDQwcHg7XG4gIG1hcmdpbi10b3A6IDA7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjO1xuICBoZWlnaHQ6IDM4cHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuYnRuIC5jYXJldDpiZWZvcmUge1xuICBjb250ZW50OiAnXFxmMDc4JztcbiAgZm9udC1mYW1pbHk6IFwiRm9udEF3ZXNvbWVcIjtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBjb2xvcjogIzY2NjY2NjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAxMnB4O1xuICB0b3A6IDlweDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuYnRuOmhvdmVyIC5jYXJldCB7XG4gIGJvcmRlci1jb2xvcjogI2FkYWRhZDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5idG46Zm9jdXMgLmNhcmV0IHtcbiAgYm9yZGVyLWNvbG9yOiAjOGM4YzhjO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXBbY2xhc3MqPVwiY29sLVwiXSAuYnRuIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gIG1pbi13aWR0aDogMTAwJTtcbiAgei1pbmRleDogMTAzNTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5kcm9wZG93bi1tZW51LmlubmVyIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5kcm9wZG93bi1tZW51IGxpOm5vdCguZGlzYWJsZWQpIGE6aG92ZXIgc21hbGwsXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGk6bm90KC5kaXNhYmxlZCkgYTpmb2N1cyBzbWFsbCxcbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaS5hY3RpdmU6bm90KC5kaXNhYmxlZCkgYSBzbWFsbCB7XG4gIGNvbG9yOiAjNjRiMWQ4O1xuICBjb2xvcjogZmFkZSgjNjRiMWQ4LCA0MCUpO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkuZGlzYWJsZWQgYSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaSBhIHtcbiAgb3V0bGluZTogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkgYS5vcHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHBhZGRpbmctbGVmdDogMi4yNWVtO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkgYSBzcGFuLmNoZWNrLW1hcmsge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkgYSBzcGFuLnRleHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaSBzbWFsbCB7XG4gIHBhZGRpbmctbGVmdDogMC41ZW07XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSAubm90aWZ5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDVweDtcbiAgd2lkdGg6IDk2JTtcbiAgbWFyZ2luOiAwIDIlO1xuICBtaW4taGVpZ2h0OiAyNnB4O1xuICBwYWRkaW5nOiAzcHggNXB4O1xuICBiYWNrZ3JvdW5kOiB3aGl0ZXNtb2tlO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTNlM2UzO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggZmFkZShibGFjaywgNSUpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3BhY2l0eTogMC45O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLm5vLXJlc3VsdHMge1xuICBwYWRkaW5nOiAzcHg7XG4gIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gIG1hcmdpbjogMCA1cHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5maXQtd2lkdGggLmJ0biAuZmlsdGVyLW9wdGlvbiB7XG4gIHBvc2l0aW9uOiBzdGF0aWM7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5maXQtd2lkdGggLmJ0biAuY2FyZXQge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICB0b3A6IGF1dG87XG4gIG1hcmdpbi10b3A6IC0xcHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5zaG93LXRpY2sgLmRyb3Bkb3duLW1lbnUgbGkuc2VsZWN0ZWQgYSBzcGFuLmNoZWNrLW1hcmsge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcmlnaHQ6IDE1cHg7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLnNob3ctdGljayAuZHJvcGRvd24tbWVudSBsaSBhIHNwYW4udGV4dCB7XG4gIG1hcmdpbi1yaWdodDogMzRweDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93Lm9wZW4gPiAuYnRuIHtcbiAgei1pbmRleDogMTAzNjtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93IC5kcm9wZG93bi10b2dnbGU6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGJvcmRlci1sZWZ0OiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yaWdodDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItYm90dG9tLXdpZHRoOiA3cHg7XG4gIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjY2NjY2NjO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiBmYWRlKCNjY2NjY2MsIDIwJSk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAtNHB4O1xuICBsZWZ0OiA5cHg7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LnNob3ctbWVudS1hcnJvdyAuZHJvcGRvd24tdG9nZ2xlOmFmdGVyIHtcbiAgY29udGVudDogJyc7XG4gIGJvcmRlci1sZWZ0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yaWdodDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItYm90dG9tOiA2cHggc29saWQgd2hpdGU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAtNHB4O1xuICBsZWZ0OiAxMHB4O1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5zaG93LW1lbnUtYXJyb3cuZHJvcHVwIC5kcm9wZG93bi10b2dnbGU6YmVmb3JlIHtcbiAgYm90dG9tOiBhdXRvO1xuICB0b3A6IC0zcHg7XG4gIGJvcmRlci1ib3R0b206IDA7XG4gIGJvcmRlci10b3Atd2lkdGg6IDdweDtcbiAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci10b3AtY29sb3I6ICNjY2NjY2M7XG4gIGJvcmRlci10b3AtY29sb3I6IGZhZGUoI2NjY2NjYywgMjAlKTtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93LmRyb3B1cCAuZHJvcGRvd24tdG9nZ2xlOmFmdGVyIHtcbiAgYm90dG9tOiBhdXRvO1xuICB0b3A6IC0zcHg7XG4gIGJvcmRlci10b3A6IDZweCBzb2xpZCB3aGl0ZTtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93LnB1bGwtcmlnaHQgLmRyb3Bkb3duLXRvZ2dsZTpiZWZvcmUge1xuICByaWdodDogMTJweDtcbiAgbGVmdDogYXV0bztcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93LnB1bGwtcmlnaHQgLmRyb3Bkb3duLXRvZ2dsZTphZnRlciB7XG4gIHJpZ2h0OiAxM3B4O1xuICBsZWZ0OiBhdXRvO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5zaG93LW1lbnUtYXJyb3cub3BlbiA+IC5kcm9wZG93bi10b2dnbGU6YmVmb3JlLFxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93Lm9wZW4gPiAuZHJvcGRvd24tdG9nZ2xlOmFmdGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5vcGVuIC5idG4gLmNhcmV0IHtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICNhZGFkYWQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5vcGVuIC5idG46aG92ZXIgLmNhcmV0IHtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICM4YzhjOGM7XG59XG5cbi5icy1zZWFyY2hib3gsXG4uYnMtYWN0aW9uc2JveCB7XG4gIHBhZGRpbmc6IDRweCA4cHg7XG59XG5cbi5icy1hY3Rpb25zYm94IHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uYnMtYWN0aW9uc2JveCAuYnRuLWdyb3VwIGJ1dHRvbiB7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi5icy1zZWFyY2hib3ggKyAuYnMtYWN0aW9uc2JveCB7XG4gIHBhZGRpbmc6IDAgOHB4IDRweDtcbn1cblxuLmJzLXNlYXJjaGJveCBpbnB1dC5mb3JtLWNvbnRyb2wge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLm1vYmlsZS1kZXZpY2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xuICBvcGFjaXR5OiAwO1xufVxuXG4uY29udGFpbmVyIHtcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiA4MHB4ICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmctcmlnaHQ6IDYwcHggIWltcG9ydGFudDtcbn1cblxuLmFsZXJ0IHtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMCA1cHg7XG59XG5cbi5oaWRlLWNvbnRlbnQge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi5oZWxwLWJsb2NrIHtcbiAgY29sb3I6ICM0NDQ7XG59XG5cbi5sb2dpbi1hcmVhIHtcbiAgbWFyZ2luOiA5MHB4IGF1dG8gMDtcbiAgd2lkdGg6IDMwMHB4O1xufVxuXG4ubG9naW4tYXJlYSAuYnRuLWxvZ2luIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBzdGF0aWM7XG4gIGZsb2F0OiBub25lO1xuICBtYXJnaW4tYm90dG9tOiA1MHB4O1xufVxuXG4ubG9naW4tYXJlYSAuY29sLW1kLTEyLCAubG9naW4tYXJlYSAuY29sLWxnLTEyIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5sb2dpbi1hcmVhIC5ib290c3RyYXAtc2VsZWN0LFxuLmxvZ2luLWFyZWEgLnNlbGVjdHBpY2tlciB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVMaWdodFwiLCBcIkhlbHZldGljYU5ldWUtTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlIExpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTNwdDtcbn1cblxuLmxvZ2luLWFyZWEgLmRyb3Bkb3duLXRvZ2dsZS5zZWxlY3RwaWNrZXIge1xuICBoZWlnaHQ6IDQwcHg7XG59XG5cbi5sb2dpbi1hcmVhIC5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLmxvZ2luLWFyZWEgLmZvcm0tZ3JvdXA6bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi50b29sYmFyIHtcbiAgaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQ6ICMzYTM5M2I7XG59XG5cbi50b29sYmFyIC50b29scyB7XG4gIGhlaWdodDogNDBweDtcbn1cblxuLnRvb2xiYXIgYSB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYSBOZXVlIExUIFcxRyA1NSBSb21hblwiLCBcIkhlbHZldGljYSBOZXVlIExUIFcxR1wiLCBcIkhlbHZldGljYU5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2FOZXVlLVJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgZm9udC1zaXplOiAxM3B0O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBwYWRkaW5nOiA2cHggMDtcbiAgbWFyZ2luLWxlZnQ6IDUwcHg7XG59XG5cbi50b29sYmFyIHNwYW4sIC50b29sYmFyIC5mYSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLnRvb2xiYXIgLmZhIHtcbiAgZm9udC1zaXplOiAyNHB4O1xuICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG59XG5cbiNob3N0LXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwOGFiZiAhaW1wb3J0YW50O1xufVxuXG4jZ3Vlc3RzLXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzhjYzYzZiAhaW1wb3J0YW50O1xufVxuXG4jdGVtcGxhdGVzLXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwYTZhMCAhaW1wb3J0YW50O1xufVxuXG4jc3RvcmFnZS1yb290LWNvbnRhaW5lciAudG9vbGJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZWI4MTMgIWltcG9ydGFudDtcbn1cblxuI25ldHdvcmstcm9vdC1jb250YWluZXIgLnRvb2xiYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2YxYzdkICFpbXBvcnRhbnQ7XG59XG5cbiNhZG1pbmlzdHJhdGlvbi1yb290LWNvbnRhaW5lciAudG9vbGJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTE4MmQgIWltcG9ydGFudDtcbn1cblxuLmJ0biB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVNZWRpdW1cIiwgXCJIZWx2ZXRpY2FOZXVlLU1lZGl1bVwiLCBcIkhlbHZldGljYSBOZXVlIE1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWVcIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxM3B0O1xufVxuXG4uYnRuLWxvZ2luIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDhhYmY7XG4gIGJvcmRlci1jb2xvcjogIzAwOGFiZjtcbn1cblxuLmJ0bi1sb2dpbjpmb2N1cyxcbi5idG4tbG9naW4uZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjU4YztcbiAgYm9yZGVyLWNvbG9yOiAjMDAyZTQwO1xufVxuXG4uYnRuLWxvZ2luOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDY1OGM7XG4gIGJvcmRlci1jb2xvcjogIzAwNWU4Mjtcbn1cblxuLmJ0bi1sb2dpbjphY3RpdmUsXG4uYnRuLWxvZ2luLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1sb2dpbi5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjU4YztcbiAgYm9yZGVyLWNvbG9yOiAjMDA1ZTgyO1xufVxuXG4uYnRuLWxvZ2luOmFjdGl2ZTpob3Zlcixcbi5idG4tbG9naW46YWN0aXZlOmZvY3VzLFxuLmJ0bi1sb2dpbjphY3RpdmUuZm9jdXMsXG4uYnRuLWxvZ2luLmFjdGl2ZTpob3Zlcixcbi5idG4tbG9naW4uYWN0aXZlOmZvY3VzLFxuLmJ0bi1sb2dpbi5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4tbG9naW4uZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLWxvZ2luLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyxcbi5vcGVuID4gLmJ0bi1sb2dpbi5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNGI2ODtcbiAgYm9yZGVyLWNvbG9yOiAjMDAyZTQwO1xufVxuXG4uYnRuLWxvZ2luOmFjdGl2ZSxcbi5idG4tbG9naW4uYWN0aXZlLFxuLm9wZW4gPiAuYnRuLWxvZ2luLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5idG4tbG9naW4uZGlzYWJsZWQsXG4uYnRuLWxvZ2luLmRpc2FibGVkOmhvdmVyLFxuLmJ0bi1sb2dpbi5kaXNhYmxlZDpmb2N1cyxcbi5idG4tbG9naW4uZGlzYWJsZWQuZm9jdXMsXG4uYnRuLWxvZ2luLmRpc2FibGVkOmFjdGl2ZSxcbi5idG4tbG9naW4uZGlzYWJsZWQuYWN0aXZlLFxuLmJ0bi1sb2dpbltkaXNhYmxlZF0sXG4uYnRuLWxvZ2luW2Rpc2FibGVkXTpob3Zlcixcbi5idG4tbG9naW5bZGlzYWJsZWRdOmZvY3VzLFxuLmJ0bi1sb2dpbltkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLWxvZ2luW2Rpc2FibGVkXTphY3RpdmUsXG4uYnRuLWxvZ2luW2Rpc2FibGVkXS5hY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1sb2dpbixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxvZ2luOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbG9naW46Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1sb2dpbi5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxvZ2luOmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxvZ2luLmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDhhYmY7XG4gIGJvcmRlci1jb2xvcjogIzAwOGFiZjtcbn1cblxuLmJ0bi1sb2dpbiAuYmFkZ2Uge1xuICBjb2xvcjogIzAwOGFiZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cbi5kaWFsb2ctYm9yZGVyLWdyZXkge1xuICBiYWNrZ3JvdW5kLWNsaXA6IGJvcmRlci1ib3g7XG4gIGJvcmRlcjogNnB4IHNvbGlkIHJnYmEoMTcwLCAxNzAsIDE3MCwgMC4zKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgdG9wOiAwO1xuICBib3R0b206IDA7XG4gIG1hcmdpbjogYXV0bztcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciB7XG4gIGJvcmRlcjogM3B4IHNvbGlkICM5OTk5OTk7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLXRpdGxlIHtcbiAgaGVpZ2h0OiA2MHB4O1xuICBwYWRkaW5nOiAyMHB4IDAgMjBweCAyMHB4O1xuICBtYXJnaW46IDA7XG4gIGZsb2F0OiBsZWZ0O1xuICBmb250LXNpemU6IDI3cHg7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVMaWdodFwiLCBcIkhlbHZldGljYU5ldWUtTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlIExpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiAzMDAgIWltcG9ydGFudDtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWZvb3RlciB7XG4gIGhlaWdodDogNTBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwOEFCRjtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1mb290ZXIgLmRpYWxvZy1idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICB3aWR0aDogNzVweDtcbiAgaGVpZ2h0OiAzMHB4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tbGVmdDogMTBweDtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWZvb3RlciAuZGlhbG9nLWJ1dHRvbjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNFRUVFRUU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cbi5tZW51LWZsYXQgLmJ0biB7XG4gIGJhY2tncm91bmQ6ICM0ZDRjNGUgIWltcG9ydGFudDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVCb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZS1Cb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWUgQm9sZFwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxMy41cHQ7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiA0cHggNDVweCA1cHggMzhweDtcbn1cblxuLm1lbnUtZmxhdCAuYnRuID4gaSB7XG4gIGZvbnQtc2l6ZTogMjJweDtcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgd2lkdGg6IDI2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiA2cHg7XG59XG5cbi5tZW51LWZsYXQgLmJ0biA+IGk6YmVmb3JlIHtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG59XG5cbi5tZW51LWZsYXQgLmNhcmV0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlci10b3A6IDA7XG4gIGJvcmRlci10b3A6IDAgXFw5O1xuICBib3JkZXItcmlnaHQ6IDA7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuXG4ubWVudS1mbGF0IC5jYXJldDpiZWZvcmUge1xuICBmb250LWZhbWlseTogXCJmb250ZWxsb1wiO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgc3BlYWs6IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xuICB3aWR0aDogMS4yZW07XG4gIGhlaWdodDogMS4yZW07XG4gIG1hcmdpbjogLjVlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXZhcmlhbnQ6IG5vcm1hbDtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIGxpbmUtaGVpZ2h0OiAyZW07XG4gIGNvbnRlbnQ6ICdcXGU4NjEnO1xufVxuXG4ubWVudS1mbGF0LmRyb3B1cCxcbi5tZW51LWZsYXQuZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyB7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTAwJTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTAwMDtcbiAgZGlzcGxheTogbm9uZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1pbi13aWR0aDogMTYwcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgZm9udC1zaXplOiAxMy41cHQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudS5wdWxsLXJpZ2h0IHtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IGF1dG87XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXIge1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiA5cHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQwNDA0Mjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMmUyZTJlO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDBweCAxcHggMHB4IDBweCAjNDA0MDQyO1xuICBib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCAwcHggIzQwNDA0Mjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpOmZpcnN0LWNoaWxkID4gYSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjM2EzOTNiO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiBsaS5jcml0aWNhbDpsYXN0LWNoaWxkID4gYSB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiA0cHggNnB4O1xuICBjbGVhcjogYm90aDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDMxcHg7XG4gIGNvbG9yOiAjZmZmO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhID4gaSB7XG4gIGZvbnQtc2l6ZTogMjJweDtcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICB3aWR0aDogMjZweDtcbiAgaGVpZ2h0OiAyNnB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6aG92ZXIsXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhLFxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3V0bGluZTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpLmNyaXRpY2FsID4gYSB7XG4gIGJhY2tncm91bmQ6ICNkOTE4MmQ7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhLFxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpob3Zlcixcbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZCA9IGZhbHNlKTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLm1lbnUtZmxhdC5vcGVuIC5idG4ge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG59XG5cbi5tZW51LWZsYXQub3BlbiA+IC5kcm9wZG93bi1tZW51IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5tZW51LWZsYXQub3BlbiAuY2FyZXQge1xuICBiYWNrZ3JvdW5kOiAjM2EzOTNiO1xufVxuXG4ubWVudS1mbGF0Lm9wZW4gLmNhcmV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICdcXGU4NjQnO1xufVxuXG4ubWVudS1mbGF0Lm9wZW4gPiBhIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogMDtcbn1cblxuLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiBhdXRvO1xufVxuXG4uZHJvcGRvd24taGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDNweCAyMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICM5OTk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5kcm9wZG93bi1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiA5OTA7XG59XG5cbi5wdWxsLXJpZ2h0ID4gLmRyb3Bkb3duLW1lbnUge1xuICByaWdodDogMDtcbiAgbGVmdDogYXV0bztcbn1cblxuLmRyb3B1cCAuY2FyZXQsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24gLmNhcmV0IHtcbiAgYm9yZGVyLXRvcDogMDtcbiAgYm9yZGVyLWJvdHRvbTogNHB4IGRhc2hlZDtcbiAgYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIFxcOTtcbiAgY29udGVudDogXCJcIjtcbn1cblxuLmRyb3B1cCAuZHJvcGRvd24tbWVudSxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuZHJvcGRvd24tbWVudSB7XG4gIHRvcDogYXV0bztcbiAgYm90dG9tOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLXJpZ2h0IC5kcm9wZG93bi1tZW51IHtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG4gIC5uYXZiYXItcmlnaHQgLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogYXV0bztcbiAgfVxufVxuXG5wcmUge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkge1xuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTU0MHB4O1xuICB9XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDE2ODBweCkge1xuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTU0MHB4O1xuICB9XG59XG4iLCIvKiEgU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaDVicC9odG1sNS1ib2lsZXJwbGF0ZS9ibG9iL21hc3Rlci9zcmMvY3NzL21haW4uY3NzICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcmludCBzdHlsZXMuXG4vLyBJbmxpbmVkIHRvIGF2b2lkIHRoZSBhZGRpdGlvbmFsIEhUVFAgcmVxdWVzdDogaDVicC5jb20vclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQG1lZGlhIHByaW50IHtcbiAgICAqLFxuICAgICo6YmVmb3JlLFxuICAgICo6YWZ0ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogIzAwMCAhaW1wb3J0YW50OyAvLyBCbGFjayBwcmludHMgZmFzdGVyOiBoNWJwLmNvbS9zXG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICBhLFxuICAgIGE6dmlzaXRlZCB7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIH1cblxuICAgIGFbaHJlZl06YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiBcIiAoXCIgYXR0cihocmVmKSBcIilcIjtcbiAgICB9XG5cbiAgICBhYmJyW3RpdGxlXTphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiIChcIiBhdHRyKHRpdGxlKSBcIilcIjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCBzaG93IGxpbmtzIHRoYXQgYXJlIGZyYWdtZW50IGlkZW50aWZpZXJzLFxuICAgIC8vIG9yIHVzZSB0aGUgYGphdmFzY3JpcHQ6YCBwc2V1ZG8gcHJvdG9jb2xcbiAgICBhW2hyZWZePVwiI1wiXTphZnRlcixcbiAgICBhW2hyZWZePVwiamF2YXNjcmlwdDpcIl06YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiBcIlwiO1xuICAgIH1cblxuICAgIHByZSxcbiAgICBibG9ja3F1b3RlIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcbiAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgIH1cblxuICAgIHRoZWFkIHtcbiAgICAgICAgZGlzcGxheTogdGFibGUtaGVhZGVyLWdyb3VwOyAvLyBoNWJwLmNvbS90XG4gICAgfVxuXG4gICAgdHIsXG4gICAgaW1nIHtcbiAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgIH1cblxuICAgIGltZyB7XG4gICAgICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIHAsXG4gICAgaDIsXG4gICAgaDMge1xuICAgICAgICBvcnBoYW5zOiAzO1xuICAgICAgICB3aWRvd3M6IDM7XG4gICAgfVxuXG4gICAgaDIsXG4gICAgaDMge1xuICAgICAgICBwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDtcbiAgICB9XG5cbiAgICAvLyBCb290c3RyYXAgc3BlY2lmaWMgY2hhbmdlcyBzdGFydFxuXG4gICAgLy8gQm9vdHN0cmFwIGNvbXBvbmVudHNcbiAgICAubmF2YmFyIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLmJ0bixcbiAgICAuZHJvcHVwID4gLmJ0biB7XG4gICAgICAgID4gLmNhcmV0IHtcbiAgICAgICAgICAgIGJvcmRlci10b3AtY29sb3I6ICMwMDAgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubGFiZWwge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xuICAgIH1cblxuICAgIC50YWJsZSB7XG4gICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDtcblxuICAgICAgICB0ZCxcbiAgICAgICAgdGgge1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIC50YWJsZS1ib3JkZXJlZCB7XG4gICAgICAgIHRoLFxuICAgICAgICB0ZCB7XG4gICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb290c3RyYXAgc3BlY2lmaWMgY2hhbmdlcyBlbmRcbn1cbiIsIi8vXG4vLyBTY2FmZm9sZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBSZXNldCB0aGUgYm94LXNpemluZ1xuLy9cbi8vIEhlYWRzIHVwISBUaGlzIHJlc2V0IG1heSBjYXVzZSBjb25mbGljdHMgd2l0aCBzb21lIHRoaXJkLXBhcnR5IHdpZGdldHMuXG4vLyBGb3IgcmVjb21tZW5kYXRpb25zIG9uIHJlc29sdmluZyBzdWNoIGNvbmZsaWN0cywgc2VlXG4vLyBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9nZXR0aW5nLXN0YXJ0ZWQvI3RoaXJkLWJveC1zaXppbmdcbioge1xuICBAaW5jbHVkZSBib3gtc2l6aW5nKGJvcmRlci1ib3gpO1xufVxuKjpiZWZvcmUsXG4qOmFmdGVyIHtcbiAgQGluY2x1ZGUgYm94LXNpemluZyhib3JkZXItYm94KTtcbn1cblxuXG4vLyBCb2R5IHJlc2V0XG5cbmh0bWwge1xuICBmb250LXNpemU6IDEwcHg7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLDAsMCwwKTtcbn1cblxuYm9keSB7XG4gIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktYmFzZTtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICR0ZXh0LWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iZztcbn1cblxuLy8gUmVzZXQgZm9udHMgZm9yIHJlbGV2YW50IGVsZW1lbnRzXG5pbnB1dCxcbmJ1dHRvbixcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG5cblxuLy8gTGlua3NcblxuYSB7XG4gIGNvbG9yOiAkbGluay1jb2xvcjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246ICRsaW5rLWhvdmVyLWRlY29yYXRpb247XG4gIH1cblxuICAmOmZvY3VzIHtcbiAgICBAaW5jbHVkZSB0YWItZm9jdXM7XG4gIH1cbn1cblxuXG4vLyBGaWd1cmVzXG4vL1xuLy8gV2UgcmVzZXQgdGhpcyBoZXJlIGJlY2F1c2UgcHJldmlvdXNseSBOb3JtYWxpemUgaGFkIG5vIGBmaWd1cmVgIG1hcmdpbnMuIFRoaXNcbi8vIGVuc3VyZXMgd2UgZG9uJ3QgYnJlYWsgYW55b25lJ3MgdXNlIG9mIHRoZSBlbGVtZW50LlxuXG5maWd1cmUge1xuICBtYXJnaW46IDA7XG59XG5cblxuLy8gSW1hZ2VzXG5cbmltZyB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi8vIFJlc3BvbnNpdmUgaW1hZ2VzIChlbnN1cmUgaW1hZ2VzIGRvbid0IHNjYWxlIGJleW9uZCB0aGVpciBwYXJlbnRzKVxuLmltZy1yZXNwb25zaXZlIHtcbiAgQGluY2x1ZGUgaW1nLXJlc3BvbnNpdmU7XG59XG5cbi8vIFJvdW5kZWQgY29ybmVyc1xuLmltZy1yb3VuZGVkIHtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7XG59XG5cbi8vIEltYWdlIHRodW1ibmFpbHNcbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyBpcyBtaXhpbi1lZCBpbnRvIHRodW1ibmFpbHMubGVzcyBmb3IgYC50aHVtYm5haWxgLlxuLmltZy10aHVtYm5haWwge1xuICBwYWRkaW5nOiAkdGh1bWJuYWlsLXBhZGRpbmc7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHRodW1ibmFpbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJHRodW1ibmFpbC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICR0aHVtYm5haWwtYm9yZGVyLXJhZGl1cztcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihhbGwgLjJzIGVhc2UtaW4tb3V0KTtcblxuICAvLyBLZWVwIHRoZW0gYXQgbW9zdCAxMDAlIHdpZGVcbiAgQGluY2x1ZGUgaW1nLXJlc3BvbnNpdmUoaW5saW5lLWJsb2NrKTtcbn1cblxuLy8gUGVyZmVjdCBjaXJjbGVcbi5pbWctY2lyY2xlIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlOyAvLyBzZXQgcmFkaXVzIGluIHBlcmNlbnRzXG59XG5cblxuLy8gSG9yaXpvbnRhbCBydWxlc1xuXG5ociB7XG4gIG1hcmdpbi10b3A6ICAgICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAkaHItYm9yZGVyO1xufVxuXG5cbi8vIE9ubHkgZGlzcGxheSBjb250ZW50IHRvIHNjcmVlbiByZWFkZXJzXG4vL1xuLy8gU2VlOiBodHRwOi8vYTExeXByb2plY3QuY29tL3Bvc3RzL2hvdy10by1oaWRlLWNvbnRlbnQvXG5cbi5zci1vbmx5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiAtMXB4O1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjbGlwOiByZWN0KDAsMCwwLDApO1xuICBib3JkZXI6IDA7XG59XG5cbi8vIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIC5zci1vbmx5IHRvIG9ubHkgZGlzcGxheSBjb250ZW50IHdoZW4gaXQncyBmb2N1c2VkLlxuLy8gVXNlZnVsIGZvciBcIlNraXAgdG8gbWFpbiBjb250ZW50XCIgbGlua3M7IHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL05PVEUtV0NBRzIwLVRFQ0hTLTIwMTMwOTA1L0cxXG4vLyBDcmVkaXQ6IEhUTUw1IEJvaWxlcnBsYXRlXG5cbi5zci1vbmx5LWZvY3VzYWJsZSB7XG4gICY6YWN0aXZlLFxuICAmOmZvY3VzIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBtYXJnaW46IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgY2xpcDogYXV0bztcbiAgfVxufVxuXG5cbi8vIGlPUyBcImNsaWNrYWJsZSBlbGVtZW50c1wiIGZpeCBmb3Igcm9sZT1cImJ1dHRvblwiXG4vL1xuLy8gRml4ZXMgXCJjbGlja2FiaWxpdHlcIiBpc3N1ZSAoYW5kIG1vcmUgZ2VuZXJhbGx5LCB0aGUgZmlyaW5nIG9mIGV2ZW50cyBzdWNoIGFzIGZvY3VzIGFzIHdlbGwpXG4vLyBmb3IgdHJhZGl0aW9uYWxseSBub24tZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGggcm9sZT1cImJ1dHRvblwiXG4vLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2NsaWNrI1NhZmFyaV9Nb2JpbGVcblxuW3JvbGU9XCJidXR0b25cIl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4iLCIvLyBWZW5kb3IgUHJlZml4ZXNcbi8vXG4vLyBBbGwgdmVuZG9yIG1peGlucyBhcmUgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgZHVlIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Zcbi8vIEF1dG9wcmVmaXhlciBpbiBvdXIgR3J1bnRmaWxlLiBUaGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC5cblxuLy8gLSBBbmltYXRpb25zXG4vLyAtIEJhY2tmYWNlIHZpc2liaWxpdHlcbi8vIC0gQm94IHNoYWRvd1xuLy8gLSBCb3ggc2l6aW5nXG4vLyAtIENvbnRlbnQgY29sdW1uc1xuLy8gLSBIeXBoZW5zXG4vLyAtIFBsYWNlaG9sZGVyIHRleHRcbi8vIC0gVHJhbnNmb3JtYXRpb25zXG4vLyAtIFRyYW5zaXRpb25zXG4vLyAtIFVzZXIgU2VsZWN0XG5cblxuLy8gQW5pbWF0aW9uc1xuQG1peGluIGFuaW1hdGlvbigkYW5pbWF0aW9uKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiAkYW5pbWF0aW9uO1xuICAgICAgIC1vLWFuaW1hdGlvbjogJGFuaW1hdGlvbjtcbiAgICAgICAgICBhbmltYXRpb246ICRhbmltYXRpb247XG59XG5AbWl4aW4gYW5pbWF0aW9uLW5hbWUoJG5hbWUpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogJG5hbWU7XG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6ICRuYW1lO1xufVxuQG1peGluIGFuaW1hdGlvbi1kdXJhdGlvbigkZHVyYXRpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246ICRkdXJhdGlvbjtcbiAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246ICRkdXJhdGlvbjtcbn1cbkBtaXhpbiBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uKCR0aW1pbmctZnVuY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdGltaW5nLWZ1bmN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ICR0aW1pbmctZnVuY3Rpb247XG59XG5AbWl4aW4gYW5pbWF0aW9uLWRlbGF5KCRkZWxheSkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogJGRlbGF5O1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogJGRlbGF5O1xufVxuQG1peGluIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQoJGl0ZXJhdGlvbi1jb3VudCkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6ICRpdGVyYXRpb24tY291bnQ7XG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogJGl0ZXJhdGlvbi1jb3VudDtcbn1cbkBtaXhpbiBhbmltYXRpb24tZGlyZWN0aW9uKCRkaXJlY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiAkZGlyZWN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi1kaXJlY3Rpb246ICRkaXJlY3Rpb247XG59XG5AbWl4aW4gYW5pbWF0aW9uLWZpbGwtbW9kZSgkZmlsbC1tb2RlKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogJGZpbGwtbW9kZTtcbiAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiAkZmlsbC1tb2RlO1xufVxuXG4vLyBCYWNrZmFjZSB2aXNpYmlsaXR5XG4vLyBQcmV2ZW50IGJyb3dzZXJzIGZyb20gZmxpY2tlcmluZyB3aGVuIHVzaW5nIENTUyAzRCB0cmFuc2Zvcm1zLlxuLy8gRGVmYXVsdCB2YWx1ZSBpcyBgdmlzaWJsZWAsIGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBgaGlkZGVuYFxuXG5AbWl4aW4gYmFja2ZhY2UtdmlzaWJpbGl0eSgkdmlzaWJpbGl0eSl7XG4gIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogJHZpc2liaWxpdHk7XG4gICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogJHZpc2liaWxpdHk7XG4gICAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogJHZpc2liaWxpdHk7XG59XG5cbi8vIERyb3Agc2hhZG93c1xuLy9cbi8vIE5vdGU6IERlcHJlY2F0ZWQgYC5ib3gtc2hhZG93KClgIGFzIG9mIHYzLjEuMCBzaW5jZSBhbGwgb2YgQm9vdHN0cmFwJ3Ncbi8vIHN1cHBvcnRlZCBicm93c2VycyB0aGF0IGhhdmUgYm94IHNoYWRvdyBjYXBhYmlsaXRpZXMgbm93IHN1cHBvcnQgaXQuXG5cbkBtaXhpbiBib3gtc2hhZG93KCRzaGFkb3cuLi4pIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAkc2hhZG93OyAvLyBpT1MgPDQuMyAmIEFuZHJvaWQgPDQuMVxuICAgICAgICAgIGJveC1zaGFkb3c6ICRzaGFkb3c7XG59XG5cbi8vIEJveCBzaXppbmdcbkBtaXhpbiBib3gtc2l6aW5nKCRib3htb2RlbCkge1xuICAtd2Via2l0LWJveC1zaXppbmc6ICRib3htb2RlbDtcbiAgICAgLW1vei1ib3gtc2l6aW5nOiAkYm94bW9kZWw7XG4gICAgICAgICAgYm94LXNpemluZzogJGJveG1vZGVsO1xufVxuXG4vLyBDU1MzIENvbnRlbnQgQ29sdW1uc1xuQG1peGluIGNvbnRlbnQtY29sdW1ucygkY29sdW1uLWNvdW50LCAkY29sdW1uLWdhcDogJGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIC13ZWJraXQtY29sdW1uLWNvdW50OiAkY29sdW1uLWNvdW50O1xuICAgICAtbW96LWNvbHVtbi1jb3VudDogJGNvbHVtbi1jb3VudDtcbiAgICAgICAgICBjb2x1bW4tY291bnQ6ICRjb2x1bW4tY291bnQ7XG4gIC13ZWJraXQtY29sdW1uLWdhcDogJGNvbHVtbi1nYXA7XG4gICAgIC1tb3otY29sdW1uLWdhcDogJGNvbHVtbi1nYXA7XG4gICAgICAgICAgY29sdW1uLWdhcDogJGNvbHVtbi1nYXA7XG59XG5cbi8vIE9wdGlvbmFsIGh5cGhlbmF0aW9uXG5AbWl4aW4gaHlwaGVucygkbW9kZTogYXV0bykge1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIC13ZWJraXQtaHlwaGVuczogJG1vZGU7XG4gICAgIC1tb3otaHlwaGVuczogJG1vZGU7XG4gICAgICAtbXMtaHlwaGVuczogJG1vZGU7IC8vIElFMTArXG4gICAgICAgLW8taHlwaGVuczogJG1vZGU7XG4gICAgICAgICAgaHlwaGVuczogJG1vZGU7XG59XG5cbi8vIFBsYWNlaG9sZGVyIHRleHRcbkBtaXhpbiBwbGFjZWhvbGRlcigkY29sb3I6ICRpbnB1dC1jb2xvci1wbGFjZWhvbGRlcikge1xuICAvLyBGaXJlZm94XG4gICY6Oi1tb3otcGxhY2Vob2xkZXIge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgb3BhY2l0eTogMTsgLy8gT3ZlcnJpZGUgRmlyZWZveCdzIHVudXN1YWwgZGVmYXVsdCBvcGFjaXR5OyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTE1MjZcbiAgfVxuICAmOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7IGNvbG9yOiAkY29sb3I7IH0gLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTArXG4gICY6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgIHsgY29sb3I6ICRjb2xvcjsgfSAvLyBTYWZhcmkgYW5kIENocm9tZVxufVxuXG4vLyBUcmFuc2Zvcm1hdGlvbnNcbkBtaXhpbiBzY2FsZSgkcmF0aW8uLi4pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKCRyYXRpbyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgkcmF0aW8pOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogc2NhbGUoJHJhdGlvKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKCRyYXRpbyk7XG59XG5cbkBtaXhpbiBzY2FsZVgoJHJhdGlvKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoJHJhdGlvKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlWCgkcmF0aW8pOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogc2NhbGVYKCRyYXRpbyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoJHJhdGlvKTtcbn1cbkBtaXhpbiBzY2FsZVkoJHJhdGlvKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVkoJHJhdGlvKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlWSgkcmF0aW8pOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogc2NhbGVZKCRyYXRpbyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoJHJhdGlvKTtcbn1cbkBtaXhpbiBza2V3KCR4LCAkeSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goJHgpIHNrZXdZKCR5KTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNrZXdYKCR4KSBza2V3WSgkeSk7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzQ4ODU7IElFOStcbiAgICAgICAtby10cmFuc2Zvcm06IHNrZXdYKCR4KSBza2V3WSgkeSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgkeCkgc2tld1koJHkpO1xufVxuQG1peGluIHRyYW5zbGF0ZSgkeCwgJHkpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgkeCwgJHkpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKCR4LCAkeSk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiB0cmFuc2xhdGUoJHgsICR5KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgkeCwgJHkpO1xufVxuQG1peGluIHRyYW5zbGF0ZTNkKCR4LCAkeSwgJHopIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCR4LCAkeSwgJHopO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoJHgsICR5LCAkeik7XG59XG5AbWl4aW4gcm90YXRlKCRkZWdyZWVzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoJGRlZ3JlZXMpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKCRkZWdyZWVzKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHJvdGF0ZSgkZGVncmVlcyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoJGRlZ3JlZXMpO1xufVxuQG1peGluIHJvdGF0ZVgoJGRlZ3JlZXMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVgoJGRlZ3JlZXMpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlWCgkZGVncmVlcyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiByb3RhdGVYKCRkZWdyZWVzKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoJGRlZ3JlZXMpO1xufVxuQG1peGluIHJvdGF0ZVkoJGRlZ3JlZXMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVkoJGRlZ3JlZXMpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlWSgkZGVncmVlcyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiByb3RhdGVZKCRkZWdyZWVzKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVkoJGRlZ3JlZXMpO1xufVxuQG1peGluIHBlcnNwZWN0aXZlKCRwZXJzcGVjdGl2ZSkge1xuICAtd2Via2l0LXBlcnNwZWN0aXZlOiAkcGVyc3BlY3RpdmU7XG4gICAgIC1tb3otcGVyc3BlY3RpdmU6ICRwZXJzcGVjdGl2ZTtcbiAgICAgICAgICBwZXJzcGVjdGl2ZTogJHBlcnNwZWN0aXZlO1xufVxuQG1peGluIHBlcnNwZWN0aXZlLW9yaWdpbigkcGVyc3BlY3RpdmUpIHtcbiAgLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW46ICRwZXJzcGVjdGl2ZTtcbiAgICAgLW1vei1wZXJzcGVjdGl2ZS1vcmlnaW46ICRwZXJzcGVjdGl2ZTtcbiAgICAgICAgICBwZXJzcGVjdGl2ZS1vcmlnaW46ICRwZXJzcGVjdGl2ZTtcbn1cbkBtaXhpbiB0cmFuc2Zvcm0tb3JpZ2luKCRvcmlnaW4pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAkb3JpZ2luO1xuICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46ICRvcmlnaW47XG4gICAgICAtbXMtdHJhbnNmb3JtLW9yaWdpbjogJG9yaWdpbjsgLy8gSUU5IG9ubHlcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiAkb3JpZ2luO1xufVxuXG5cbi8vIFRyYW5zaXRpb25zXG5cbkBtaXhpbiB0cmFuc2l0aW9uKCR0cmFuc2l0aW9uLi4uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogJHRyYW5zaXRpb247XG4gICAgICAgLW8tdHJhbnNpdGlvbjogJHRyYW5zaXRpb247XG4gICAgICAgICAgdHJhbnNpdGlvbjogJHRyYW5zaXRpb247XG59XG5AbWl4aW4gdHJhbnNpdGlvbi1wcm9wZXJ0eSgkdHJhbnNpdGlvbi1wcm9wZXJ0eS4uLikge1xuICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6ICR0cmFuc2l0aW9uLXByb3BlcnR5O1xuICAgICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6ICR0cmFuc2l0aW9uLXByb3BlcnR5O1xufVxuQG1peGluIHRyYW5zaXRpb24tZGVsYXkoJHRyYW5zaXRpb24tZGVsYXkpIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiAkdHJhbnNpdGlvbi1kZWxheTtcbiAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiAkdHJhbnNpdGlvbi1kZWxheTtcbn1cbkBtaXhpbiB0cmFuc2l0aW9uLWR1cmF0aW9uKCR0cmFuc2l0aW9uLWR1cmF0aW9uLi4uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogJHRyYW5zaXRpb24tZHVyYXRpb247XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogJHRyYW5zaXRpb24tZHVyYXRpb247XG59XG5AbWl4aW4gdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24oJHRpbWluZy1mdW5jdGlvbikge1xuICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdGltaW5nLWZ1bmN0aW9uO1xuICAgICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdGltaW5nLWZ1bmN0aW9uO1xufVxuQG1peGluIHRyYW5zaXRpb24tdHJhbnNmb3JtKCR0cmFuc2l0aW9uLi4uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gJHRyYW5zaXRpb247XG4gICAgIC1tb3otdHJhbnNpdGlvbjogLW1vei10cmFuc2Zvcm0gJHRyYW5zaXRpb247XG4gICAgICAgLW8tdHJhbnNpdGlvbjogLW8tdHJhbnNmb3JtICR0cmFuc2l0aW9uO1xuICAgICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAkdHJhbnNpdGlvbjtcbn1cblxuXG4vLyBVc2VyIHNlbGVjdFxuLy8gRm9yIHNlbGVjdGluZyB0ZXh0IG9uIHRoZSBwYWdlXG5cbkBtaXhpbiB1c2VyLXNlbGVjdCgkc2VsZWN0KSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6ICRzZWxlY3Q7XG4gICAgIC1tb3otdXNlci1zZWxlY3Q6ICRzZWxlY3Q7XG4gICAgICAtbXMtdXNlci1zZWxlY3Q6ICRzZWxlY3Q7IC8vIElFMTArXG4gICAgICAgICAgdXNlci1zZWxlY3Q6ICRzZWxlY3Q7XG59XG4iLCIkYm9vdHN0cmFwLXNhc3MtYXNzZXQtaGVscGVyOiBmYWxzZSAhZGVmYXVsdDtcbi8vXG4vLyBWYXJpYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiRraW1jaGktbG9nbzogXCIuLi8uLi8uLi9pbWFnZXMvdGhlbWUtZGVmYXVsdC9sb2dvLXdoaXRlLnBuZ1wiO1xuJGljb24tZm9udC1wYXRoOiAnLi4vLi4vLi4vZm9udGF3ZXNvbWUvZm9udC9mb250YXdlc29tZS50dGYnO1xuXG4vLz09IENvbG9yc1xuLy9cbi8vIyMgR3JheSBhbmQgYnJhbmQgY29sb3JzIGZvciB1c2UgYWNyb3NzIEJvb3RzdHJhcC5cblxuJGdyYXktYmFzZTogICAgICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4kZ3JheS1kYXJrZXI6ICAgICAgICAgICAgIzIyMiAhZGVmYXVsdDtcbiRncmF5LWRhcms6ICAgICAgICAgICAgICAgJGdyYXktZGFya2VyICFkZWZhdWx0O1xuJGdyYXk6ICAgICAgICAgICAgICAgICAgICAgICM0NDQgIWRlZmF1bHQ7XG4kZ3JheS1saWdodDogICAgICAgICAgICAgICAjOTk5ICFkZWZhdWx0O1xuJGdyYXktbGlnaHRlcjogICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuXG4kYnJhbmQtcHJpbWFyeTogICAgICAgICAjM2EzOTNiICFkZWZhdWx0OyAvLyAjM2EzOTNiXG4kYnJhbmQtc3VjY2VzczogICAgICAgICAjNWNiODVjICFkZWZhdWx0O1xuJGJyYW5kLWluZm86ICAgICAgICAgICAgIzViYzBkZSAhZGVmYXVsdDtcbiRicmFuZC13YXJuaW5nOiAgICAgICAgICNmMGFkNGUgIWRlZmF1bHQ7XG4kYnJhbmQtZGFuZ2VyOiAgICAgICAgICAjZDk1MzRmICFkZWZhdWx0O1xuJGtpbWNoaS1kcm9wZG93bjogICAgICAjNGQ0YzRlICFkZWZhdWx0O1xuXG5cbi8vIyMgS2ltY2hpIGRlZmF1bHQgY29sb3JzIC0gVE9ETyByZW1vdmUgdGhlc2UgcmVmZXJlbmNlcyBhbmQgbGluayBkbyBTYXNzIE1hcHMgYmVsb3dcblxuJGhvc3RzLWNvbG9yOiAgICAgICAgICAgICAgICAjMDA4YWJmICFkZWZhdWx0O1xuJGd1ZXN0cy1jb2xvcjogICAgICAgICAgICAgICM4Y2M2M2YgIWRlZmF1bHQ7XG4kdGVtcGxhdGVzLWNvbG9yOiAgICAgICAgICMwMGE2YTAgIWRlZmF1bHQ7XG4kc3RvcmFnZS1jb2xvcjogICAgICAgICAgICAgI2ZlYjgxMyAhZGVmYXVsdDtcbiRuZXR3b3Jrcy1jb2xvcjogICAgICAgICAgICM3ZjFjN2QgIWRlZmF1bHQ7XG4kYWRtaW5pc3RyYXRpb24tY29sb3I6ICAgICNkOTE4MmQgIWRlZmF1bHQ7XG5cbiRjb2xvcnM6IChcbiAgICBob3N0OiAgICAgICAgICAgICAgICAjMDA4YWJmLFxuICAgIGd1ZXN0czogICAgICAgICAgICAgICM4Y2M2M2YsXG4gICAgdGVtcGxhdGVzOiAgICAgICAgICMwMGE2YTAsIFxuICAgIHN0b3JhZ2U6ICAgICAgICAgICAgICNmZWI4MTMsXG4gICAgbmV0d29yazogICAgICAgICAgICM3ZjFjN2QsXG4gICAgYWRtaW5pc3RyYXRpb246ICAgICNkOTE4MmRcbik7XG5cblxuLy89PSBTY2FmZm9sZGluZ1xuLy9cbi8vIyMgU2V0dGluZ3MgZm9yIHNvbWUgb2YgdGhlIG1vc3QgZ2xvYmFsIHN0eWxlcy5cblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciBgPGJvZHk+YC5cbiRib2R5LWJnOiAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIEdsb2JhbCB0ZXh0IGNvbG9yIG9uIGA8Ym9keT5gLlxuJHRleHQtY29sb3I6ICAgICAgICAgICAgJGdyYXktZGFya2VyICFkZWZhdWx0O1xuJGhpZ2hsaWdodHMtY29sb3I6ICAgICAjZmZmICFkZWZhdWx0O1xuJGRpc2FibGVkLWNvbG9yOiAgICAgICAjOTk5ICFkZWZhdWx0O1xuXG4vLyoqIEdsb2JhbCB0ZXh0dWFsIGxpbmsgY29sb3IuXG4kbGluay1jb2xvcjogICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogTGluayBob3ZlciBjb2xvciBzZXQgdmlhIGBkYXJrZW4oKWAgZnVuY3Rpb24uXG4kbGluay1ob3Zlci1jb2xvcjogICAgICBkYXJrZW4oJGxpbmstY29sb3IsIDE1JSkgIWRlZmF1bHQ7XG4vLyoqIExpbmsgaG92ZXIgZGVjb3JhdGlvbi5cbiRsaW5rLWhvdmVyLWRlY29yYXRpb246IHVuZGVybGluZSAhZGVmYXVsdDtcblxuXG4vLz09IFR5cG9ncmFwaHlcbi8vXG4vLyMjIEZvbnQsIGxpbmUtaGVpZ2h0LCBhbmQgY29sb3IgZm9yIGJvZHkgdGV4dCwgaGVhZGluZ3MsIGFuZCBtb3JlLlxuXG4kZm9udC1mYW1pbHktc2Fucy1zZXJpZjogIFwiSGVsdmV0aWNhTmV1ZU1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWUtTWVkaXVtXCIsIFwiSGVsdmV0aWNhIE5ldWUgTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmICFkZWZhdWx0O1xuJGZvbnQtZmFtaWx5LXNlcmlmOiAgICAgICBHZW9yZ2lhLCBcIlRpbWVzIE5ldyBSb21hblwiLCBUaW1lcywgc2VyaWYgIWRlZmF1bHQ7XG4vLyoqIERlZmF1bHQgbW9ub3NwYWNlIGZvbnRzIGZvciBgPGNvZGU+YCwgYDxrYmQ+YCwgYW5kIGA8cHJlPmAuXG4kZm9udC1mYW1pbHktbW9ub3NwYWNlOiAgIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZSAhZGVmYXVsdDtcbiRmb250LWZhbWlseS1iYXNlOiAgICAgICAgJGZvbnQtZmFtaWx5LXNhbnMtc2VyaWYgIWRlZmF1bHQ7XG4kZm9udC1mYW1pbHktbGlnaHQ6ICAgIFwiSGVsdmV0aWNhTmV1ZUxpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZS1MaWdodFwiLCBcIkhlbHZldGljYU5ldWUgTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZiAhZGVmYXVsdDtcbiRmb250LWZhbWlseS1ib2xkOiAgICBcIkhlbHZldGljYU5ldWVCb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZS1Cb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWUgQm9sZFwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZiAhZGVmYXVsdDtcbiRmb250LWZhbWlseS1hbHRlcm5hdGU6ICBcIkhlbHZldGljYSBOZXVlIExUIFcxRyA1NSBSb21hblwiLCBcIkhlbHZldGljYSBOZXVlIExUIFcxR1wiLCBcIkhlbHZldGljYU5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2FOZXVlLVJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWYgIWRlZmF1bHQ7XG5cblxuJGZvbnQtc2l6ZS1iYXNlOiAgICAgICAgICAxNHB4ICFkZWZhdWx0O1xuJGZvbnQtc2l6ZS1sYXJnZTogICAgICAgICBjZWlsKCgkZm9udC1zaXplLWJhc2UgKiAxLjI1KSkgIWRlZmF1bHQ7IC8vIH4xOHB4XG4kZm9udC1zaXplLXNtYWxsOiAgICAgICAgIGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDAuODUpKSAhZGVmYXVsdDsgLy8gfjEycHhcbiRmb250LXNpemUtYnRuOiAgICAgICAgICAgICAxMy41cHQ7XG5cbiRmb250LXNpemUtaDE6ICAgICAgICAgICAgMS41NzFlbSAhZGVmYXVsdDtcbiRmb250LXNpemUtaDI6ICAgICAgICAgICAgMjJweCAhZGVmYXVsdDtcbiRmb250LXNpemUtaDM6ICAgICAgICAgICAgMTdweCAhZGVmYXVsdDtcbiRmb250LXNpemUtaDQ6ICAgICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICFkZWZhdWx0O1xuJGZvbnQtc2l6ZS1oNTogICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgIWRlZmF1bHQ7XG4kZm9udC1zaXplLWg2OiAgICAgICAgICAgICRmb250LXNpemUtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBVbml0LWxlc3MgYGxpbmUtaGVpZ2h0YCBmb3IgdXNlIGluIGNvbXBvbmVudHMgbGlrZSBidXR0b25zLlxuJGxpbmUtaGVpZ2h0LWJhc2U6ICAgICAgICAxLjQyODU3MTQyOSAhZGVmYXVsdDsgLy8gMjAvMTRcbi8vKiogQ29tcHV0ZWQgXCJsaW5lLWhlaWdodFwiIChgZm9udC1zaXplYCAqIGBsaW5lLWhlaWdodGApIGZvciB1c2Ugd2l0aCBgbWFyZ2luYCwgYHBhZGRpbmdgLCBldGMuXG4kbGluZS1oZWlnaHQtY29tcHV0ZWQ6ICAgIGZsb29yKCgkZm9udC1zaXplLWJhc2UgKiAkbGluZS1oZWlnaHQtYmFzZSkpICFkZWZhdWx0OyAvLyB+MjBweFxuXG4vLyoqIEJ5IGRlZmF1bHQsIHRoaXMgaW5oZXJpdHMgZnJvbSB0aGUgYDxib2R5PmAuXG4kaGVhZGluZ3MtZm9udC1mYW1pbHk6ICAgIGluaGVyaXQgIWRlZmF1bHQ7XG4kaGVhZGluZ3MtZm9udC13ZWlnaHQ6ICAgIDUwMCAhZGVmYXVsdDtcbiRoZWFkaW5ncy1saW5lLWhlaWdodDogICAgMS4xICFkZWZhdWx0O1xuJGhlYWRpbmdzLWNvbG9yOiAgICAgICAgICBpbmhlcml0ICFkZWZhdWx0O1xuXG5cbi8vPT0gSWNvbm9ncmFwaHlcbi8vXG4vLyMjIFNwZWNpZnkgY3VzdG9tIGxvY2F0aW9uIGFuZCBmaWxlbmFtZSBvZiB0aGUgaW5jbHVkZWQgR2x5cGhpY29ucyBpY29uIGZvbnQuIFVzZWZ1bCBmb3IgdGhvc2UgaW5jbHVkaW5nIEJvb3RzdHJhcCB2aWEgQm93ZXIuXG5cbi8vKiogTG9hZCBmb250cyBmcm9tIHRoaXMgZGlyZWN0b3J5LlxuXG4vLyBbY29udmVydGVyXSBJZiAkYm9vdHN0cmFwLXNhc3MtYXNzZXQtaGVscGVyIGlmIHVzZWQsIHByb3ZpZGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgYXNzZXRzIGxvYWQgcGF0aC5cbi8vIFtjb252ZXJ0ZXJdIFRoaXMgaXMgYmVjYXVzZSBzb21lIGFzc2V0IGhlbHBlcnMsIHN1Y2ggYXMgU3Byb2NrZXRzLCBkbyBub3Qgd29yayB3aXRoIGZpbGUtcmVsYXRpdmUgcGF0aHMuXG4vLyAkaWNvbi1mb250LXBhdGg6IGlmKCRib290c3RyYXAtc2Fzcy1hc3NldC1oZWxwZXIsIFwiYm9vdHN0cmFwL1wiLCBcIi4uL2ZvbnRzL2Jvb3RzdHJhcC9cIikgIWRlZmF1bHQ7XG5cbi8vKiogRmlsZSBuYW1lIGZvciBhbGwgZm9udCBmaWxlcy5cbi8vICRpY29uLWZvbnQtbmFtZTogICAgICAgICAgXCJnbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyXCIgIWRlZmF1bHQ7XG4vLyoqIEVsZW1lbnQgSUQgd2l0aGluIFNWRyBpY29uIGZpbGUuXG4vLyAkaWNvbi1mb250LXN2Zy1pZDogICAgICAgIFwiZ2x5cGhpY29uc19oYWxmbGluZ3NyZWd1bGFyXCIgIWRlZmF1bHQ7XG5cblxuLy89PSBDb21wb25lbnRzXG4vL1xuLy8jIyBEZWZpbmUgY29tbW9uIHBhZGRpbmcgYW5kIGJvcmRlciByYWRpdXMgc2l6ZXMgYW5kIG1vcmUuIFZhbHVlcyBiYXNlZCBvbiAxNHB4IHRleHQgYW5kIDEuNDI4IGxpbmUtaGVpZ2h0ICh+MjBweCB0byBzdGFydCkuXG5cbiRwYWRkaW5nLWJhc2UtdmVydGljYWw6ICAgICA2cHggIWRlZmF1bHQ7XG4kcGFkZGluZy1iYXNlLWhvcml6b250YWw6ICAgMTJweCAhZGVmYXVsdDtcblxuJHBhZGRpbmctbGFyZ2UtdmVydGljYWw6ICAgIDEwcHggIWRlZmF1bHQ7XG4kcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsOiAgMTZweCAhZGVmYXVsdDtcblxuJHBhZGRpbmctc21hbGwtdmVydGljYWw6ICAgIDVweCAhZGVmYXVsdDtcbiRwYWRkaW5nLXNtYWxsLWhvcml6b250YWw6ICAxMHB4ICFkZWZhdWx0O1xuXG4kcGFkZGluZy14cy12ZXJ0aWNhbDogICAgICAgMXB4ICFkZWZhdWx0O1xuJHBhZGRpbmcteHMtaG9yaXpvbnRhbDogICAgIDVweCAhZGVmYXVsdDtcblxuJGxpbmUtaGVpZ2h0LWxhcmdlOiAgICAgICAgIDEuMzMzMzMzMyAhZGVmYXVsdDsgLy8gZXh0cmEgZGVjaW1hbHMgZm9yIFdpbiA4LjEgQ2hyb21lXG4kbGluZS1oZWlnaHQtc21hbGw6ICAgICAgICAgMS41ICFkZWZhdWx0O1xuXG4kYm9yZGVyLXJhZGl1cy1iYXNlOiAgICAgICAgM3B4ICFkZWZhdWx0O1xuJGJvcmRlci1yYWRpdXMtbGFyZ2U6ICAgICAgIDNweCAhZGVmYXVsdDtcbiRib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICAzcHggIWRlZmF1bHQ7XG5cbi8vKiogR2xvYmFsIGNvbG9yIGZvciBhY3RpdmUgaXRlbXMgKGUuZy4sIG5hdnMgb3IgZHJvcGRvd25zKS5cbiRjb21wb25lbnQtYWN0aXZlLWNvbG9yOiAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBHbG9iYWwgYmFja2dyb3VuZCBjb2xvciBmb3IgYWN0aXZlIGl0ZW1zIChlLmcuLCBuYXZzIG9yIGRyb3Bkb3ducykuXG4kY29tcG9uZW50LWFjdGl2ZS1iZzogICAgICAgJGJyYW5kLXByaW1hcnkgIWRlZmF1bHQ7XG5cbi8vKiogV2lkdGggb2YgdGhlIGBib3JkZXJgIGZvciBnZW5lcmF0aW5nIGNhcmV0cyB0aGF0IGluZGljYXRvciBkcm9wZG93bnMuXG4kY2FyZXQtd2lkdGgtYmFzZTogICAgICAgICAgNHB4ICFkZWZhdWx0O1xuLy8qKiBDYXJldHMgaW5jcmVhc2Ugc2xpZ2h0bHkgaW4gc2l6ZSBmb3IgbGFyZ2VyIGNvbXBvbmVudHMuXG4kY2FyZXQtd2lkdGgtbGFyZ2U6ICAgICAgICAgNXB4ICFkZWZhdWx0O1xuXG5cbi8vPT0gVGFibGVzXG4vL1xuLy8jIyBDdXN0b21pemVzIHRoZSBgLnRhYmxlYCBjb21wb25lbnQgd2l0aCBiYXNpYyB2YWx1ZXMsIGVhY2ggdXNlZCBhY3Jvc3MgYWxsIHRhYmxlIHZhcmlhdGlvbnMuXG5cbi8vKiogUGFkZGluZyBmb3IgYDx0aD5gcyBhbmQgYDx0ZD5gcy5cbiR0YWJsZS1jZWxsLXBhZGRpbmc6ICAgICAgICAgICAgOHB4ICFkZWZhdWx0O1xuLy8qKiBQYWRkaW5nIGZvciBjZWxscyBpbiBgLnRhYmxlLWNvbmRlbnNlZGAuXG4kdGFibGUtY29uZGVuc2VkLWNlbGwtcGFkZGluZzogIDVweCAhZGVmYXVsdDtcblxuLy8qKiBEZWZhdWx0IGJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgYWxsIHRhYmxlcy5cbiR0YWJsZS1iZzogICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgYC50YWJsZS1zdHJpcGVkYC5cbiR0YWJsZS1iZy1hY2NlbnQ6ICAgICAgICAgICAgICAgI2Y5ZjlmOSAhZGVmYXVsdDtcbi8vKiogQmFja2dyb3VuZCBjb2xvciB1c2VkIGZvciBgLnRhYmxlLWhvdmVyYC5cbiR0YWJsZS1iZy1ob3ZlcjogICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbiR0YWJsZS1iZy1hY3RpdmU6ICAgICAgICAgICAgICAgJHRhYmxlLWJnLWhvdmVyICFkZWZhdWx0O1xuXG4vLyoqIEJvcmRlciBjb2xvciBmb3IgdGFibGUgYW5kIGNlbGwgYm9yZGVycy5cbiR0YWJsZS1ib3JkZXItY29sb3I6ICAgICAgICAgICAgI2RkZCAhZGVmYXVsdDtcblxuXG4vLz09IEJ1dHRvbnNcbi8vXG4vLyMjIEZvciBlYWNoIG9mIEJvb3RzdHJhcCdzIGJ1dHRvbnMsIGRlZmluZSB0ZXh0LCBiYWNrZ3JvdW5kIGFuZCBib3JkZXIgY29sb3IuXG5cbiRidG4tZm9udC13ZWlnaHQ6ICAgICAgICAgICAgICAgIG5vcm1hbCAhZGVmYXVsdDtcblxuJGJ0bi1kZWZhdWx0LWNvbG9yOiAgICAgICAgICAgICAgIzQ0NCAhZGVmYXVsdDtcbiRidG4tZGVmYXVsdC1iZzogICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kYnRuLWRlZmF1bHQtYm9yZGVyOiAgICAgICAgICAgICAjY2NjICFkZWZhdWx0O1xuXG4kYnRuLXByaW1hcnktY29sb3I6ICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuJGJ0bi1wcmltYXJ5LWJnOiAgICAgICAgICAgICAgICAgJGJyYW5kLXByaW1hcnkgIWRlZmF1bHQ7XG4kYnRuLXByaW1hcnktYm9yZGVyOiAgICAgICAgICAgJGJ0bi1wcmltYXJ5LWJnICFkZWZhdWx0O1xuXG4kYnRuLWxvZ2luLWNvbG9yOiAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRidG4tbG9naW4tYmc6ICAgICAgICAgICAgICAgICAjMDA4YWJmICFkZWZhdWx0O1xuJGJ0bi1sb2dpbi1ib3JkZXI6ICAgICAgICAgICAgICRidG4tbG9naW4tYmcgIWRlZmF1bHQ7XG5cbiRidG4tc3VjY2Vzcy1jb2xvcjogICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kYnRuLXN1Y2Nlc3MtYmc6ICAgICAgICAgICAgICAgICAkYnJhbmQtc3VjY2VzcyAhZGVmYXVsdDtcbiRidG4tc3VjY2Vzcy1ib3JkZXI6ICAgICAgICAgICAkYnRuLXN1Y2Nlc3MtYmcgIWRlZmF1bHQ7XG5cbiRidG4taW5mby1jb2xvcjogICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kYnRuLWluZm8tYmc6ICAgICAgICAgICAgICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcbiRidG4taW5mby1ib3JkZXI6ICAgICAgICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcblxuJGJ0bi13YXJuaW5nLWNvbG9yOiAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRidG4td2FybmluZy1iZzogICAgICAgICAgICAgICAgICRicmFuZC13YXJuaW5nICFkZWZhdWx0O1xuJGJ0bi13YXJuaW5nLWJvcmRlcjogICAgICAgICAgICRicmFuZC13YXJuaW5nICFkZWZhdWx0O1xuXG4kYnRuLWRhbmdlci1jb2xvcjogICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuJGJ0bi1kYW5nZXItYmc6ICAgICAgICAgICAgICAgICAgJGJyYW5kLWRhbmdlciAhZGVmYXVsdDtcbiRidG4tZGFuZ2VyLWJvcmRlcjogICAgICAgICAgICAkYnJhbmQtZGFuZ2VyICFkZWZhdWx0O1xuXG4kYnRuLWxpbmstZGlzYWJsZWQtY29sb3I6ICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcblxuLy8gQWxsb3dzIGZvciBjdXN0b21pemluZyBidXR0b24gcmFkaXVzIGluZGVwZW5kZW50bHkgZnJvbSBnbG9iYWwgYm9yZGVyIHJhZGl1c1xuJGJ0bi1ib3JkZXItcmFkaXVzLWJhc2U6ICAgICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcbiRidG4tYm9yZGVyLXJhZGl1cy1sYXJnZTogICAgICAgICRib3JkZXItcmFkaXVzLWxhcmdlICFkZWZhdWx0O1xuJGJ0bi1ib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICAgJGJvcmRlci1yYWRpdXMtc21hbGwgIWRlZmF1bHQ7XG5cblxuLy89PSBGb3Jtc1xuLy9cbi8vIyNcblxuLy8qKiBgPGlucHV0PmAgYmFja2dyb3VuZCBjb2xvclxuJGlucHV0LWJnOiAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogYDxpbnB1dCBkaXNhYmxlZD5gIGJhY2tncm91bmQgY29sb3JcbiRpbnB1dC1iZy1kaXNhYmxlZDogICAgICAgICAgICAgICRncmF5LWxpZ2h0ZXIgIWRlZmF1bHQ7XG5cbi8vKiogVGV4dCBjb2xvciBmb3IgYDxpbnB1dD5gc1xuJGlucHV0LWNvbG9yOiAgICAgICAgICAgICAgICAgICAgJGdyYXkgIWRlZmF1bHQ7XG4vLyoqIGA8aW5wdXQ+YCBib3JkZXIgY29sb3JcbiRpbnB1dC1ib3JkZXI6ICAgICAgICAgICAgICAgICAgICNjY2MgIWRlZmF1bHQ7XG5cbi8vIFRPRE86IFJlbmFtZSBgJGlucHV0LWJvcmRlci1yYWRpdXNgIHRvIGAkaW5wdXQtYm9yZGVyLXJhZGl1cy1iYXNlYCBpbiB2NFxuLy8qKiBEZWZhdWx0IGAuZm9ybS1jb250cm9sYCBib3JkZXIgcmFkaXVzXG4vLyBUaGlzIGhhcyBubyBlZmZlY3Qgb24gYDxzZWxlY3Q+YHMgaW4gc29tZSBicm93c2VycywgZHVlIHRvIHRoZSBsaW1pdGVkIHN0eWxhYmlsaXR5IG9mIGA8c2VsZWN0PmBzIGluIENTUy5cbiRpbnB1dC1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgICRib3JkZXItcmFkaXVzLWJhc2UgIWRlZmF1bHQ7XG4vLyoqIExhcmdlIGAuZm9ybS1jb250cm9sYCBib3JkZXIgcmFkaXVzXG4kaW5wdXQtYm9yZGVyLXJhZGl1cy1sYXJnZTogICAgICAkYm9yZGVyLXJhZGl1cy1sYXJnZSAhZGVmYXVsdDtcbi8vKiogU21hbGwgYC5mb3JtLWNvbnRyb2xgIGJvcmRlciByYWRpdXNcbiRpbnB1dC1ib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICRib3JkZXItcmFkaXVzLXNtYWxsICFkZWZhdWx0O1xuXG4vLyoqIEJvcmRlciBjb2xvciBmb3IgaW5wdXRzIG9uIGZvY3VzXG4kaW5wdXQtYm9yZGVyLWZvY3VzOiAgICAgICAgICAgICAjNjZhZmU5ICFkZWZhdWx0O1xuXG4vLyoqIFBsYWNlaG9sZGVyIHRleHQgY29sb3JcbiRpbnB1dC1jb2xvci1wbGFjZWhvbGRlcjogICAgICAgICM5OTkgIWRlZmF1bHQ7XG5cbi8vKiogRGVmYXVsdCBgLmZvcm0tY29udHJvbGAgaGVpZ2h0XG4kaW5wdXQtaGVpZ2h0LWJhc2U6ICAgICAgICAgICAgICAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICsgKCRwYWRkaW5nLWJhc2UtdmVydGljYWwgKiAyKSArIDIpICFkZWZhdWx0O1xuLy8qKiBMYXJnZSBgLmZvcm0tY29udHJvbGAgaGVpZ2h0XG4kaW5wdXQtaGVpZ2h0LWxhcmdlOiAgICAgICAgICAgICAoY2VpbCgkZm9udC1zaXplLWxhcmdlICogJGxpbmUtaGVpZ2h0LWxhcmdlKSArICgkcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCAqIDIpICsgMikgIWRlZmF1bHQ7XG4vLyoqIFNtYWxsIGAuZm9ybS1jb250cm9sYCBoZWlnaHRcbiRpbnB1dC1oZWlnaHQtc21hbGw6ICAgICAgICAgICAgIChmbG9vcigkZm9udC1zaXplLXNtYWxsICogJGxpbmUtaGVpZ2h0LXNtYWxsKSArICgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCAqIDIpICsgMikgIWRlZmF1bHQ7XG5cbi8vKiogYC5mb3JtLWdyb3VwYCBtYXJnaW5cbiRmb3JtLWdyb3VwLW1hcmdpbi1ib3R0b206ICAgICAgIDE1cHggIWRlZmF1bHQ7XG5cbiRsZWdlbmQtY29sb3I6ICAgICAgICAgICAgICAgICAgICRncmF5LWRhcmsgIWRlZmF1bHQ7XG4kbGVnZW5kLWJvcmRlci1jb2xvcjogICAgICAgICAgICAjZTVlNWU1ICFkZWZhdWx0O1xuXG4vLyoqIEJhY2tncm91bmQgY29sb3IgZm9yIHRleHR1YWwgaW5wdXQgYWRkb25zXG4kaW5wdXQtZ3JvdXAtYWRkb24tYmc6ICAgICAgICAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuLy8qKiBCb3JkZXIgY29sb3IgZm9yIHRleHR1YWwgaW5wdXQgYWRkb25zXG4kaW5wdXQtZ3JvdXAtYWRkb24tYm9yZGVyLWNvbG9yOiAkaW5wdXQtYm9yZGVyICFkZWZhdWx0O1xuXG4vLyoqIERpc2FibGVkIGN1cnNvciBmb3IgZm9ybSBjb250cm9scyBhbmQgYnV0dG9ucy5cbiRjdXJzb3ItZGlzYWJsZWQ6ICAgICAgICAgICAgICAgIG5vdC1hbGxvd2VkICFkZWZhdWx0O1xuXG5cbi8vPT0gRHJvcGRvd25zXG4vL1xuLy8jIyBEcm9wZG93biBtZW51IGNvbnRhaW5lciBhbmQgY29udGVudHMuXG5cbi8vKiogQmFja2dyb3VuZCBmb3IgdGhlIGRyb3Bkb3duIG1lbnUuXG4kZHJvcGRvd24tYmc6ICAgICAgICAgICAgICAgICAgICAjZmNmY2ZjICFkZWZhdWx0O1xuLy8qKiBEcm9wZG93biBtZW51IGBib3JkZXItY29sb3JgLlxuJGRyb3Bkb3duLWJvcmRlcjogICAgICAgICAgICAgICAgI2NjYyAhZGVmYXVsdDtcbi8vKiogRHJvcGRvd24gbWVudSBgYm9yZGVyLWNvbG9yYCAqKmZvciBJRTgqKi5cbiRkcm9wZG93bi1mYWxsYmFjay1ib3JkZXI6ICAgICAgICNjY2MgIWRlZmF1bHQ7XG4vLyoqIERpdmlkZXIgY29sb3IgZm9yIGJldHdlZW4gZHJvcGRvd24gaXRlbXMuXG4kZHJvcGRvd24tZGl2aWRlci1iZzogICAgICAgICAgICAjZWVlICFkZWZhdWx0O1xuXG4vLyoqIERyb3Bkb3duIGxpbmsgdGV4dCBjb2xvci5cbiRkcm9wZG93bi1saW5rLWNvbG9yOiAgICAgICAgICAgICRncmF5LWRhcmsgIWRlZmF1bHQ7XG4vLyoqIEhvdmVyIGNvbG9yIGZvciBkcm9wZG93biBsaW5rcy5cbiRkcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiAgICAgIGRhcmtlbigkZ3JheS1kYXJrLCA1JSkgIWRlZmF1bHQ7XG4vLyoqIEhvdmVyIGJhY2tncm91bmQgZm9yIGRyb3Bkb3duIGxpbmtzLlxuJGRyb3Bkb3duLWxpbmstaG92ZXItYmc6ICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcblxuLy8qKiBBY3RpdmUgZHJvcGRvd24gbWVudSBpdGVtIHRleHQgY29sb3IuXG4kZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3I6ICAgICAkY29tcG9uZW50LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcbi8vKiogQWN0aXZlIGRyb3Bkb3duIG1lbnUgaXRlbSBiYWNrZ3JvdW5kIGNvbG9yLlxuJGRyb3Bkb3duLWxpbmstYWN0aXZlLWJnOiAgICAgICAgJGNvbXBvbmVudC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG5cbi8vKiogRGlzYWJsZWQgZHJvcGRvd24gbWVudSBpdGVtIGJhY2tncm91bmQgY29sb3IuXG4kZHJvcGRvd24tbGluay1kaXNhYmxlZC1jb2xvcjogICAkZ3JheS1saWdodCAhZGVmYXVsdDtcblxuLy8qKiBUZXh0IGNvbG9yIGZvciBoZWFkZXJzIHdpdGhpbiBkcm9wZG93biBtZW51cy5cbiRkcm9wZG93bi1oZWFkZXItY29sb3I6ICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuXG4vLyoqIERlcHJlY2F0ZWQgYCRkcm9wZG93bi1jYXJldC1jb2xvcmAgYXMgb2YgdjMuMS4wXG4kZHJvcGRvd24tY2FyZXQtY29sb3I6ICAgICAgICAgICAjMDAwICFkZWZhdWx0O1xuXG5cbi8vPT0gTWVudS1GbGF0IERyb3Bkb3duc1xuLy9cbi8vIyMgTWVudS1GbGF0IERyb3Bkb3duIG1lbnUgY29udGFpbmVyIGFuZCBjb250ZW50cy5cblxuJG1lbnUtZmxhdC10ZXh0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kbWVudS1mbGF0LWRyb3Bkb3duLWJnOiAgICAgICAgICAgICAgICAgICAgICAgIzNhMzkzYiAhZGVmYXVsdDtcbiRsaW5lLWhlaWdodC1tZW51LWZsYXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMXB4O1xuLy8qKiBNZW51LUZsYXQgRHJvcGRvd24gbWVudSBgYm9yZGVyLWNvbG9yYC5cbiRtZW51LWZsYXQtZHJvcGRvd24tYm9yZGVyOiAgICAgICAgICAgICAgICAgIzJlMmUyZSAhZGVmYXVsdDtcbiRtZW51LWZsYXQtZHJvcGRvd24tZGl2aWRlci1iZzogICAgICAgICAgICAgIzQwNDA0MiAhZGVmYXVsdDtcbiRtZW51LWZsYXQtZHJvcGRvd24tY3JpdGljYWwtYmc6ICAgICAgICAgICAgICNkOTE4MmQgIWRlZmF1bHQ7XG4vLyoqIERyb3Bkb3duIGxpbmsgdGV4dCBjb2xvci5cbiRtZW51LWZsYXQtZHJvcGRvd24tbGluay1jb2xvcjogICAgICAgICAgICAgICRtZW51LWZsYXQtdGV4dCAhZGVmYXVsdDtcbi8vKiogSG92ZXIgY29sb3IgZm9yIGRyb3Bkb3duIGxpbmtzLlxuJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiAgICAgJG1lbnUtZmxhdC10ZXh0ICFkZWZhdWx0O1xuLy8qKiBIb3ZlciBiYWNrZ3JvdW5kIGZvciBkcm9wZG93biBsaW5rcy5cbiRtZW51LWZsYXQtZHJvcGRvd24tbGluay1ob3Zlci1iZzogICAgICAgICAkbWVudS1mbGF0LWRyb3Bkb3duLWJnICFkZWZhdWx0O1xuLy8qKiBBY3RpdmUgZHJvcGRvd24gbWVudSBpdGVtIHRleHQgY29sb3IuXG4kbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstYWN0aXZlLWNvbG9yOiAgICAgJG1lbnUtZmxhdC10ZXh0ICFkZWZhdWx0O1xuLy8qKiBBY3RpdmUgZHJvcGRvd24gbWVudSBpdGVtIGJhY2tncm91bmQgY29sb3IuXG4kbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstYWN0aXZlLWJnOiAgICAgICAgJG1lbnUtZmxhdC1kcm9wZG93bi1iZyAhZGVmYXVsdDtcblxuXG4vLy0tIFotaW5kZXggbWFzdGVyIGxpc3Rcbi8vXG4vLyBXYXJuaW5nOiBBdm9pZCBjdXN0b21pemluZyB0aGVzZSB2YWx1ZXMuIFRoZXkncmUgdXNlZCBmb3IgYSBiaXJkJ3MgZXllIHZpZXdcbi8vIG9mIGNvbXBvbmVudHMgZGVwZW5kZW50IG9uIHRoZSB6LWF4aXMgYW5kIGFyZSBkZXNpZ25lZCB0byBhbGwgd29yayB0b2dldGhlci5cbi8vXG4vLyBOb3RlOiBUaGVzZSB2YXJpYWJsZXMgYXJlIG5vdCBnZW5lcmF0ZWQgaW50byB0aGUgQ3VzdG9taXplci5cblxuJHppbmRleC1uYXZiYXI6ICAgICAgICAgICAgMTAwMCAhZGVmYXVsdDtcbiR6aW5kZXgtZHJvcGRvd246ICAgICAgICAgIDEwMDAgIWRlZmF1bHQ7XG4kemluZGV4LXBvcG92ZXI6ICAgICAgICAgICAxMDYwICFkZWZhdWx0O1xuJHppbmRleC10b29sdGlwOiAgICAgICAgICAgMTA3MCAhZGVmYXVsdDtcbiR6aW5kZXgtbmF2YmFyLWZpeGVkOiAgICAgIDEwMzAgIWRlZmF1bHQ7XG4kemluZGV4LW1vZGFsLWJhY2tncm91bmQ6ICAxMDQwICFkZWZhdWx0O1xuJHppbmRleC1tb2RhbDogICAgICAgICAgICAgMTA1MCAhZGVmYXVsdDtcblxuLy89PSBNZWRpYSBxdWVyaWVzIGJyZWFrcG9pbnRzXG4vL1xuLy8jIyBEZWZpbmUgdGhlIGJyZWFrcG9pbnRzIGF0IHdoaWNoIHlvdXIgbGF5b3V0IHdpbGwgY2hhbmdlLCBhZGFwdGluZyB0byBkaWZmZXJlbnQgc2NyZWVuIHNpemVzLlxuXG4vLyBFeHRyYSBzbWFsbCBzY3JlZW4gLyBwaG9uZVxuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLXhzYCBhcyBvZiB2My4wLjFcbiRzY3JlZW4teHM6ICAgICAgICAgICAgICAgICAgNDgwcHggIWRlZmF1bHQ7XG4vLyoqIERlcHJlY2F0ZWQgYCRzY3JlZW4teHMtbWluYCBhcyBvZiB2My4yLjBcbiRzY3JlZW4teHMtbWluOiAgICAgICAgICAgICAgJHNjcmVlbi14cyAhZGVmYXVsdDtcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1waG9uZWAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXBob25lOiAgICAgICAgICAgICAgICRzY3JlZW4teHMtbWluICFkZWZhdWx0O1xuXG4vLyBTbWFsbCBzY3JlZW4gLyB0YWJsZXRcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1zbWAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXNtOiAgICAgICAgICAgICAgICAgIDk5MnB4ICFkZWZhdWx0O1xuJHNjcmVlbi1zbS1taW46ICAgICAgICAgICAgICAkc2NyZWVuLXNtICFkZWZhdWx0O1xuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLXRhYmxldGAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXRhYmxldDogICAgICAgICAgICAgICRzY3JlZW4tc20tbWluICFkZWZhdWx0O1xuXG4vLyBNZWRpdW0gc2NyZWVuIC8gZGVza3RvcFxuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLW1kYCBhcyBvZiB2My4wLjFcbiRzY3JlZW4tbWQ6ICAgICAgICAgICAgICAgICAgMTIwMHB4ICFkZWZhdWx0O1xuJHNjcmVlbi1tZC1taW46ICAgICAgICAgICAgICAkc2NyZWVuLW1kICFkZWZhdWx0O1xuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLWRlc2t0b3BgIGFzIG9mIHYzLjAuMVxuJHNjcmVlbi1kZXNrdG9wOiAgICAgICAgICAgICAkc2NyZWVuLW1kLW1pbiAhZGVmYXVsdDtcblxuLy8gTGFyZ2Ugc2NyZWVuIC8gd2lkZSBkZXNrdG9wXG4vLyoqIERlcHJlY2F0ZWQgYCRzY3JlZW4tbGdgIGFzIG9mIHYzLjAuMVxuJHNjcmVlbi1sZzogICAgICAgICAgICAgICAgICAxNjgwICFkZWZhdWx0O1xuJHNjcmVlbi1sZy1taW46ICAgICAgICAgICAgICAkc2NyZWVuLWxnICFkZWZhdWx0O1xuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLWxnLWRlc2t0b3BgIGFzIG9mIHYzLjAuMVxuJHNjcmVlbi1sZy1kZXNrdG9wOiAgICAgICAgICAkc2NyZWVuLWxnLW1pbiAhZGVmYXVsdDtcblxuLy8gU28gbWVkaWEgcXVlcmllcyBkb24ndCBvdmVybGFwIHdoZW4gcmVxdWlyZWQsIHByb3ZpZGUgYSBtYXhpbXVtXG4kc2NyZWVuLXhzLW1heDogICAgICAgICAgICAgICgkc2NyZWVuLXNtLW1pbiAtIDEpICFkZWZhdWx0O1xuJHNjcmVlbi1zbS1tYXg6ICAgICAgICAgICAgICAoJHNjcmVlbi1tZC1taW4gLSAxKSAhZGVmYXVsdDtcbiRzY3JlZW4tbWQtbWF4OiAgICAgICAgICAgICAgKCRzY3JlZW4tbGctbWluIC0gMSkgIWRlZmF1bHQ7XG5cblxuLy89PSBHcmlkIHN5c3RlbVxuLy9cbi8vIyMgRGVmaW5lIHlvdXIgY3VzdG9tIHJlc3BvbnNpdmUgZ3JpZC5cblxuLy8qKiBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC5cbiRncmlkLWNvbHVtbnM6ICAgICAgICAgICAgICAxMiAhZGVmYXVsdDtcbi8vKiogUGFkZGluZyBiZXR3ZWVuIGNvbHVtbnMuIEdldHMgZGl2aWRlZCBpbiBoYWxmIGZvciB0aGUgbGVmdCBhbmQgcmlnaHQuXG4kZ3JpZC1ndXR0ZXItd2lkdGg6ICAgICAgICAgMCAhZGVmYXVsdDtcbi8vIE5hdmJhciBjb2xsYXBzZVxuLy8qKiBQb2ludCBhdCB3aGljaCB0aGUgbmF2YmFyIGJlY29tZXMgdW5jb2xsYXBzZWQuXG4kZ3JpZC1mbG9hdC1icmVha3BvaW50OiAgICAgJHNjcmVlbi1zbS1taW4gIWRlZmF1bHQ7XG4vLyoqIFBvaW50IGF0IHdoaWNoIHRoZSBuYXZiYXIgYmVnaW5zIGNvbGxhcHNpbmcuXG4kZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heDogKCRncmlkLWZsb2F0LWJyZWFrcG9pbnQgLSAxKSAhZGVmYXVsdDtcblxuXG4vLz09IENvbnRhaW5lciBzaXplc1xuLy9cbi8vIyMgRGVmaW5lIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGAuY29udGFpbmVyYCBmb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcy5cblxuLy8gU21hbGwgc2NyZWVuIC8gdGFibGV0XG4kY29udGFpbmVyLXRhYmxldDogICAgICAgICAgICAgKDk0MHB4ICsgJGdyaWQtZ3V0dGVyLXdpZHRoKSAhZGVmYXVsdDtcbi8vKiogRm9yIGAkc2NyZWVuLXNtLW1pbmAgYW5kIHVwLlxuJGNvbnRhaW5lci1zbTogICAgICAgICAgICAgICAgICRjb250YWluZXItdGFibGV0ICFkZWZhdWx0O1xuXG4vLyBNZWRpdW0gc2NyZWVuIC8gZGVza3RvcFxuJGNvbnRhaW5lci1kZXNrdG9wOiAgICAgICAgICAgICgxMTQwcHggKyAkZ3JpZC1ndXR0ZXItd2lkdGgpICFkZWZhdWx0O1xuLy8qKiBGb3IgYCRzY3JlZW4tbWQtbWluYCBhbmQgdXAuXG4kY29udGFpbmVyLW1kOiAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci1kZXNrdG9wICFkZWZhdWx0O1xuXG4vLyBMYXJnZSBzY3JlZW4gLyB3aWRlIGRlc2t0b3BcbiRjb250YWluZXItbGFyZ2UtZGVza3RvcDogICAgICAoMTU0MHB4ICsgJGdyaWQtZ3V0dGVyLXdpZHRoKSAhZGVmYXVsdDtcbi8vKiogRm9yIGAkc2NyZWVuLWxnLW1pbmAgYW5kIHVwLlxuJGNvbnRhaW5lci1sZzogICAgICAgICAgICAgICAgICRjb250YWluZXItbGFyZ2UtZGVza3RvcCAhZGVmYXVsdDtcblxuXG4vLz09IE5hdmJhclxuLy9cbi8vIyNcblxuLy8gQmFzaWNzIG9mIGEgbmF2YmFyXG4kbmF2YmFyLWhlaWdodDogICAgICAgICAgICAgICAgICAgIDQwcHggIWRlZmF1bHQ7XG4kbmF2YmFyLW1hcmdpbi1ib3R0b206ICAgICAgICAgIDAgIWRlZmF1bHQ7XG4kbmF2YmFyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgIDAgIWRlZmF1bHQ7XG4kbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDogICAgICAgIGZsb29yKCgkZ3JpZC1ndXR0ZXItd2lkdGggLyAyKSkgIWRlZmF1bHQ7XG4kbmF2YmFyLXBhZGRpbmctdmVydGljYWw6ICAgICAgICAgICgoJG5hdmJhci1oZWlnaHQgLSAkbGluZS1oZWlnaHQtY29tcHV0ZWQpIC8gMikgIWRlZmF1bHQ7XG4kbmF2YmFyLWNvbGxhcHNlLW1heC1oZWlnaHQ6ICAgICAgIDM0MHB4ICFkZWZhdWx0O1xuXG4kbmF2YmFyLWRlZmF1bHQtY29sb3I6ICAgICAgICAgICAgICRoaWdobGlnaHRzLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWJnOiAgICAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1ib3JkZXI6ICAgICAgICAgICAgJG5hdmJhci1kZWZhdWx0LWJnICFkZWZhdWx0O1xuXG4vLyBOYXZiYXIgbGlua3NcbiRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICAkbmF2YmFyLWRlZmF1bHQtY29sb3IgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgJG5hdmJhci1kZWZhdWx0LWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItYmc6ICAgICAgICAgICAgIHRyYW5zcGFyZW50ICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWNvbG9yOiAgICAgICAgICRuYXZiYXItZGVmYXVsdC1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZzogICAgICAgICAgICB0cmFuc3BhcmVudCAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yOiAgICAgICAkZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZzogICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIE5hdmJhciBicmFuZCBsYWJlbFxuJG5hdmJhci1kZWZhdWx0LWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWJyYW5kLWhvdmVyLWNvbG9yOiAgICAgICAgIGRhcmtlbigkbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3IsIDEwJSkgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc6ICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIE5hdmJhciB0b2dnbGVcbiRuYXZiYXItZGVmYXVsdC10b2dnbGUtaG92ZXItYmc6ICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1pY29uLWJhci1iZzogICAgICAgICM4ODggIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWJvcmRlci1jb2xvcjogICAgICAgI2RkZCAhZGVmYXVsdDtcblxuXG4vLz09PSBJbnZlcnRlZCBuYXZiYXJcbi8vIFJlc2V0IGludmVydGVkIG5hdmJhciBiYXNpY3NcbiRuYXZiYXItaW52ZXJzZS1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgJGhpZ2hsaWdodHMtY29sb3IgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtYmc6ICAgICAgICAgICAgICAgICAgICAgICAgICMyMjIgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtYm9yZGVyOiAgICAgICAgICAgICAgICAgICAgICRuYXZiYXItaW52ZXJzZS1iZyAhZGVmYXVsdDtcblxuLy8gSW52ZXJ0ZWQgbmF2YmFyIGxpbmtzXG4kbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjogICAgICAgICAgICAgICAgICAgICRoaWdobGlnaHRzLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICAkbmF2YmFyLWludmVyc2UtbGluay1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtY29sb3I6ICAgICAgICAgICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnOiAgICAgICAgICAgICAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1iZyAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yOiAgICAgICAgIzk5OSAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWJnOiAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIEludmVydGVkIG5hdmJhciBicmFuZCBsYWJlbFxuJG5hdmJhci1pbnZlcnNlLWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgICAkaGlnaGxpZ2h0cy1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1jb2xvcjogICAgICAgICAgJG5hdmJhci1pbnZlcnNlLWJyYW5kLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1pbnZlcnNlLWJyYW5kLWhvdmVyLWJnOiAgICAgICAgICAgICB0cmFuc3BhcmVudCAhZGVmYXVsdDtcblxuLy8gSW52ZXJ0ZWQgbmF2YmFyIHRvZ2dsZVxuJG5hdmJhci1pbnZlcnNlLXRvZ2dsZS1ob3Zlci1iZzogICAgICAgICAgICB0cmFuc3BhcmVudCAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS10b2dnbGUtaWNvbi1iYXItYmc6ICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS10b2dnbGUtYm9yZGVyLWNvbG9yOiAgICAgICAgIzMzMyAhZGVmYXVsdDtcblxuXG4vLz09IE5hdnNcbi8vXG4vLyMjXG5cbi8vPT09IFNoYXJlZCBuYXYgc3R5bGVzXG4kbmF2LWxpbmstcGFkZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgIDEwcHggMTVweCAhZGVmYXVsdDtcbiRuYXYtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcblxuJG5hdi1kaXNhYmxlZC1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbiRuYXYtZGlzYWJsZWQtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG5cbi8vPT0gVGFic1xuJG5hdi10YWJzLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuXG4kbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3I6ICAgICAgICAgICRncmF5LWxpZ2h0ZXIgIWRlZmF1bHQ7XG5cbiRuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgJGJvZHktYmcgIWRlZmF1bHQ7XG4kbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICRncmF5ICFkZWZhdWx0O1xuJG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjogICAjZGRkICFkZWZhdWx0O1xuXG4kbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG4kbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjogICAgICRib2R5LWJnICFkZWZhdWx0O1xuXG4vLz09IFBpbGxzXG4kbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgICRib3JkZXItcmFkaXVzLWJhc2UgIWRlZmF1bHQ7XG4kbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xuJG5hdi1waWxscy1hY3RpdmUtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAkY29tcG9uZW50LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcblxuXG4vLz09IFBhZ2luYXRpb25cbi8vXG4vLyMjXG5cbiRwYWdpbmF0aW9uLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICRsaW5rLWNvbG9yICFkZWZhdWx0O1xuJHBhZ2luYXRpb24tYmc6ICAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG5cbiRwYWdpbmF0aW9uLWhvdmVyLWNvbG9yOiAgICAgICAgICAgICAgICRsaW5rLWhvdmVyLWNvbG9yICFkZWZhdWx0O1xuJHBhZ2luYXRpb24taG92ZXItYmc6ICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWhvdmVyLWJvcmRlcjogICAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG5cbiRwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjogICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFnaW5hdGlvbi1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWFjdGl2ZS1ib3JkZXI6ICAgICAgICAgICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuXG4kcGFnaW5hdGlvbi1kaXNhYmxlZC1jb2xvcjogICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWRpc2FibGVkLWJnOiAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFnaW5hdGlvbi1kaXNhYmxlZC1ib3JkZXI6ICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuXG5cbi8vPT0gUGFnZXJcbi8vXG4vLyMjXG5cbiRwYWdlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWJnICFkZWZhdWx0O1xuJHBhZ2VyLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24tYm9yZGVyICFkZWZhdWx0O1xuJHBhZ2VyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgMTVweCAhZGVmYXVsdDtcblxuJHBhZ2VyLWhvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24taG92ZXItYmcgIWRlZmF1bHQ7XG5cbiRwYWdlci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWFjdGl2ZS1iZyAhZGVmYXVsdDtcbiRwYWdlci1hY3RpdmUtY29sb3I6ICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcblxuJHBhZ2VyLWRpc2FibGVkLWNvbG9yOiAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG5cblxuLy89PSBKdW1ib3Ryb25cbi8vXG4vLyMjXG5cbiRqdW1ib3Ryb24tcGFkZGluZzogICAgICAgICAgICAgIDMwcHggIWRlZmF1bHQ7XG4kanVtYm90cm9uLWNvbG9yOiAgICAgICAgICAgICAgICBpbmhlcml0ICFkZWZhdWx0O1xuJGp1bWJvdHJvbi1iZzogICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbiRqdW1ib3Ryb24taGVhZGluZy1jb2xvcjogICAgICAgIGluaGVyaXQgIWRlZmF1bHQ7XG4kanVtYm90cm9uLWZvbnQtc2l6ZTogICAgICAgICAgICBjZWlsKCgkZm9udC1zaXplLWJhc2UgKiAxLjUpKSAhZGVmYXVsdDtcbiRqdW1ib3Ryb24taGVhZGluZy1mb250LXNpemU6ICAgIGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDQuNSkpICFkZWZhdWx0O1xuXG5cbi8vPT0gRm9ybSBzdGF0ZXMgYW5kIGFsZXJ0c1xuLy9cbi8vIyMgRGVmaW5lIGNvbG9ycyBmb3IgZm9ybSBmZWVkYmFjayBzdGF0ZXMgYW5kLCBieSBkZWZhdWx0LCBhbGVydHMuXG5cbiRzdGF0ZS1zdWNjZXNzLXRleHQ6ICAgICAgICAgICAgICM2YzZjNmMgIWRlZmF1bHQ7XG4kc3RhdGUtc3VjY2Vzcy1iZzogICAgICAgICAgICAgICAjZGFlNmNiICFkZWZhdWx0O1xuJHN0YXRlLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgICAgIzhjYzYzZiAhZGVmYXVsdDtcblxuJHN0YXRlLWluZm8tdGV4dDogICAgICAgICAgICAgICAgIzZjNmM2YyAhZGVmYXVsdDtcbiRzdGF0ZS1pbmZvLWJnOiAgICAgICAgICAgICAgICAgICNkOWVkZjcgIWRlZmF1bHQ7XG4kc3RhdGUtaW5mby1ib3JkZXI6ICAgICAgICAgICAgICAjMDA4YWJmICFkZWZhdWx0O1xuXG4kc3RhdGUtd2FybmluZy10ZXh0OiAgICAgICAgICAgICAjNmM2YzZjICFkZWZhdWx0O1xuJHN0YXRlLXdhcm5pbmctYmc6ICAgICAgICAgICAgICAgI2YxZTNjMiAhZGVmYXVsdDtcbiRzdGF0ZS13YXJuaW5nLWJvcmRlcjogICAgICAgICAgICNmZGI4MTMgIWRlZmF1bHQ7XG5cbiRzdGF0ZS1kYW5nZXItdGV4dDogICAgICAgICAgICAgICM2YzZjNmMgIWRlZmF1bHQ7XG4kc3RhdGUtZGFuZ2VyLWJnOiAgICAgICAgICAgICAgICAgI2VhYzNjNyAhZGVmYXVsdDtcbiRzdGF0ZS1kYW5nZXItYm9yZGVyOiAgICAgICAgICAgI2Q5MTgyZCAhZGVmYXVsdDtcblxuXG4vLz09IFRvb2x0aXBzXG4vL1xuLy8jI1xuXG4vLyoqIFRvb2x0aXAgbWF4IHdpZHRoXG4kdG9vbHRpcC1tYXgtd2lkdGg6ICAgICAgICAgICAyMDBweCAhZGVmYXVsdDtcbi8vKiogVG9vbHRpcCB0ZXh0IGNvbG9yXG4kdG9vbHRpcC1jb2xvcjogICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBUb29sdGlwIGJhY2tncm91bmQgY29sb3JcbiR0b29sdGlwLWJnOiAgICAgICAgICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4kdG9vbHRpcC1vcGFjaXR5OiAgICAgICAgICAgICAuOSAhZGVmYXVsdDtcblxuLy8qKiBUb29sdGlwIGFycm93IHdpZHRoXG4kdG9vbHRpcC1hcnJvdy13aWR0aDogICAgICAgICA1cHggIWRlZmF1bHQ7XG4vLyoqIFRvb2x0aXAgYXJyb3cgY29sb3JcbiR0b29sdGlwLWFycm93LWNvbG9yOiAgICAgICAgICR0b29sdGlwLWJnICFkZWZhdWx0O1xuXG5cbi8vPT0gUG9wb3ZlcnNcbi8vXG4vLyMjXG5cbi8vKiogUG9wb3ZlciBib2R5IGJhY2tncm91bmQgY29sb3JcbiRwb3BvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogUG9wb3ZlciBtYXhpbXVtIHdpZHRoXG4kcG9wb3Zlci1tYXgtd2lkdGg6ICAgICAgICAgICAgICAgICAgIDI3NnB4ICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIGJvcmRlciBjb2xvclxuJHBvcG92ZXItYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4yKSAhZGVmYXVsdDtcbi8vKiogUG9wb3ZlciBmYWxsYmFjayBib3JkZXIgY29sb3JcbiRwb3BvdmVyLWZhbGxiYWNrLWJvcmRlci1jb2xvcjogICAgICAgI2NjYyAhZGVmYXVsdDtcblxuLy8qKiBQb3BvdmVyIHRpdGxlIGJhY2tncm91bmQgY29sb3JcbiRwb3BvdmVyLXRpdGxlLWJnOiAgICAgICAgICAgICAgICAgICAgZGFya2VuKCRwb3BvdmVyLWJnLCAzJSkgIWRlZmF1bHQ7XG5cbi8vKiogUG9wb3ZlciBhcnJvdyB3aWR0aFxuJHBvcG92ZXItYXJyb3ctd2lkdGg6ICAgICAgICAgICAgICAgICAxMHB4ICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIGFycm93IGNvbG9yXG4kcG9wb3Zlci1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICAgICRwb3BvdmVyLWJnICFkZWZhdWx0O1xuXG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgd2lkdGhcbiRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoOiAgICAgICAgICAgKCRwb3BvdmVyLWFycm93LXdpZHRoICsgMSkgIWRlZmF1bHQ7XG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgY29sb3JcbiRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yOiAgICAgICAgICAgZmFkZV9pbigkcG9wb3Zlci1ib3JkZXItY29sb3IsIDAuMDUpICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIG91dGVyIGFycm93IGZhbGxiYWNrIGNvbG9yXG4kcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjogIGRhcmtlbigkcG9wb3Zlci1mYWxsYmFjay1ib3JkZXItY29sb3IsIDIwJSkgIWRlZmF1bHQ7XG5cblxuLy89PSBMYWJlbHNcbi8vXG4vLyMjXG5cbi8vKiogRGVmYXVsdCBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtZGVmYXVsdC1iZzogICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbi8vKiogUHJpbWFyeSBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtcHJpbWFyeS1iZzogICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogU3VjY2VzcyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtc3VjY2Vzcy1iZzogICAgICAgICAgICAkYnJhbmQtc3VjY2VzcyAhZGVmYXVsdDtcbi8vKiogSW5mbyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtaW5mby1iZzogICAgICAgICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcbi8vKiogV2FybmluZyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtd2FybmluZy1iZzogICAgICAgICAgICAkYnJhbmQtd2FybmluZyAhZGVmYXVsdDtcbi8vKiogRGFuZ2VyIGxhYmVsIGJhY2tncm91bmQgY29sb3JcbiRsYWJlbC1kYW5nZXItYmc6ICAgICAgICAgICAgICRicmFuZC1kYW5nZXIgIWRlZmF1bHQ7XG5cbi8vKiogRGVmYXVsdCBsYWJlbCB0ZXh0IGNvbG9yXG4kbGFiZWwtY29sb3I6ICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBEZWZhdWx0IHRleHQgY29sb3Igb2YgYSBsaW5rZWQgbGFiZWxcbiRsYWJlbC1saW5rLWhvdmVyLWNvbG9yOiAgICAgICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBNb2RhbHNcbi8vXG4vLyMjXG5cbi8vKiogUGFkZGluZyBhcHBsaWVkIHRvIHRoZSBtb2RhbCBib2R5XG4kbW9kYWwtaW5uZXItcGFkZGluZzogICAgICAgICAxMHB4IDMwcHggIWRlZmF1bHQ7XG5cbi8vKiogUGFkZGluZyBhcHBsaWVkIHRvIHRoZSBtb2RhbCB0aXRsZVxuJG1vZGFsLXRpdGxlLXBhZGRpbmc6ICAgICAgICAgMjdweCAxNHB4IDE0cHggMzBweCAhZGVmYXVsdDtcbi8vKiogTW9kYWwgdGl0bGUgbGluZS1oZWlnaHRcbiRtb2RhbC10aXRsZS1saW5lLWhlaWdodDogICAgIDIzcHggIWRlZmF1bHQ7XG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvZiBtb2RhbCBjb250ZW50IGFyZWFcbiRtb2RhbC1jb250ZW50LWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogTW9kYWwgY29udGVudCBib3JkZXIgY29sb3JcbiRtb2RhbC1jb250ZW50LWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgICAgcmdiYSgxNzAsMTcwLDE3MCwuMykgIWRlZmF1bHQ7XG4vLyoqIE1vZGFsIGNvbnRlbnQgYm9yZGVyIGNvbG9yICoqZm9yIElFOCoqXG4kbW9kYWwtY29udGVudC1mYWxsYmFjay1ib3JkZXItY29sb3I6ICAgICAgICAgICNhYWEgIWRlZmF1bHQ7XG5cbi8vKiogTW9kYWwgYmFja2Ryb3AgYmFja2dyb3VuZCBjb2xvclxuJG1vZGFsLWJhY2tkcm9wLWJnOiAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogTW9kYWwgYmFja2Ryb3Agb3BhY2l0eVxuJG1vZGFsLWJhY2tkcm9wLW9wYWNpdHk6ICAgICAgLjUgIWRlZmF1bHQ7XG4vLyoqIE1vZGFsIGhlYWRlciBib3JkZXIgY29sb3JcbiRtb2RhbC1oZWFkZXItYm9yZGVyLWNvbG9yOiAgIHRyYW5zcGFyZW50ICFkZWZhdWx0O1xuLy8qKiBNb2RhbCBmb290ZXIgYm9yZGVyIGNvbG9yXG4kbW9kYWwtZm9vdGVyLWJvcmRlci1jb2xvcjogICAkbW9kYWwtaGVhZGVyLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcblxuJG1vZGFsLWxnOiAgICAgICAgICAgICAgICAgICAgMTEyNHB4ICFkZWZhdWx0O1xuJG1vZGFsLW1kOiAgICAgICAgICAgICAgICAgICAgODI0cHggIWRlZmF1bHQ7XG4kbW9kYWwtc206ICAgICAgICAgICAgICAgICAgICA1MjRweCAhZGVmYXVsdDtcblxuXG4vLz09IEFsZXJ0c1xuLy9cbi8vIyMgRGVmaW5lIGFsZXJ0IGNvbG9ycywgYm9yZGVyIHJhZGl1cywgYW5kIHBhZGRpbmcuXG5cbiRhbGVydC1wYWRkaW5nOiAgICAgICAgICAgICAgIDhweCAxNXB4ICFkZWZhdWx0O1xuJGFsZXJ0LWJvcmRlci1yYWRpdXM6ICAgICAgICAgMCAhZGVmYXVsdDtcbiRhbGVydC1saW5rLWZvbnQtd2VpZ2h0OiAgICAgIGJvbGQgIWRlZmF1bHQ7XG4kYWxlcnQtYm9yZGVyLXdpZHRoOiAgICAgICAgICAwIDAgMCA1cHggIWRlZmF1bHQ7XG4kYWxlcnQtZm9udC1zaXplOiAgICAgICAgICAgICAgICAxMC41cHQgIWRlZmF1bHQ7IFxuXG4kYWxlcnQtc3VjY2Vzcy1iZzogICAgICAgICAgICAkc3RhdGUtc3VjY2Vzcy1iZyAhZGVmYXVsdDtcbiRhbGVydC1zdWNjZXNzLXRleHQ6ICAgICAgICAgICRzdGF0ZS1zdWNjZXNzLXRleHQgIWRlZmF1bHQ7XG4kYWxlcnQtc3VjY2Vzcy1ib3JkZXI6ICAgICAgICAkc3RhdGUtc3VjY2Vzcy1ib3JkZXIgIWRlZmF1bHQ7XG5cbiRhbGVydC1pbmZvLWJnOiAgICAgICAgICAgICAgICRzdGF0ZS1pbmZvLWJnICFkZWZhdWx0O1xuJGFsZXJ0LWluZm8tdGV4dDogICAgICAgICAgICAgJHN0YXRlLWluZm8tdGV4dCAhZGVmYXVsdDtcbiRhbGVydC1pbmZvLWJvcmRlcjogICAgICAgICAgICRzdGF0ZS1pbmZvLWJvcmRlciAhZGVmYXVsdDtcblxuJGFsZXJ0LXdhcm5pbmctYmc6ICAgICAgICAgICAgJHN0YXRlLXdhcm5pbmctYmcgIWRlZmF1bHQ7XG4kYWxlcnQtd2FybmluZy10ZXh0OiAgICAgICAgICAkc3RhdGUtd2FybmluZy10ZXh0ICFkZWZhdWx0O1xuJGFsZXJ0LXdhcm5pbmctYm9yZGVyOiAgICAgICAgJHN0YXRlLXdhcm5pbmctYm9yZGVyICFkZWZhdWx0O1xuXG4kYWxlcnQtZGFuZ2VyLWJnOiAgICAgICAgICAgICAkc3RhdGUtZGFuZ2VyLWJnICFkZWZhdWx0O1xuJGFsZXJ0LWRhbmdlci10ZXh0OiAgICAgICAgICAgJHN0YXRlLWRhbmdlci10ZXh0ICFkZWZhdWx0O1xuJGFsZXJ0LWRhbmdlci1ib3JkZXI6ICAgICAgICAgJHN0YXRlLWRhbmdlci1ib3JkZXIgIWRlZmF1bHQ7XG5cblxuLy89PSBQcm9ncmVzcyBiYXJzXG4vL1xuLy8jI1xuXG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIHdob2xlIHByb2dyZXNzIGNvbXBvbmVudFxuJHByb2dyZXNzLWJnOiAgICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbi8vKiogUHJvZ3Jlc3MgYmFyIHRleHQgY29sb3JcbiRwcm9ncmVzcy1iYXItY29sb3I6ICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIFZhcmlhYmxlIGZvciBzZXR0aW5nIHJvdW5kZWQgY29ybmVycyBvbiBwcm9ncmVzcyBiYXIuXG4kcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogICAgICAkYm9yZGVyLXJhZGl1cy1iYXNlICFkZWZhdWx0O1xuXG4vLyoqIERlZmF1bHQgcHJvZ3Jlc3MgYmFyIGNvbG9yXG4kcHJvZ3Jlc3MtYmFyLWJnOiAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogU3VjY2VzcyBwcm9ncmVzcyBiYXIgY29sb3JcbiRwcm9ncmVzcy1iYXItc3VjY2Vzcy1iZzogICAgICRicmFuZC1zdWNjZXNzICFkZWZhdWx0O1xuLy8qKiBXYXJuaW5nIHByb2dyZXNzIGJhciBjb2xvclxuJHByb2dyZXNzLWJhci13YXJuaW5nLWJnOiAgICAgJGJyYW5kLXdhcm5pbmcgIWRlZmF1bHQ7XG4vLyoqIERhbmdlciBwcm9ncmVzcyBiYXIgY29sb3JcbiRwcm9ncmVzcy1iYXItZGFuZ2VyLWJnOiAgICAgICRicmFuZC1kYW5nZXIgIWRlZmF1bHQ7XG4vLyoqIEluZm8gcHJvZ3Jlc3MgYmFyIGNvbG9yXG4kcHJvZ3Jlc3MtYmFyLWluZm8tYmc6ICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcblxuXG4vLz09IExpc3QgZ3JvdXBcbi8vXG4vLyMjXG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvbiBgLmxpc3QtZ3JvdXAtaXRlbWBcbiRsaXN0LWdyb3VwLWJnOiAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogYC5saXN0LWdyb3VwLWl0ZW1gIGJvcmRlciBjb2xvclxuJGxpc3QtZ3JvdXAtYm9yZGVyOiAgICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuLy8qKiBMaXN0IGdyb3VwIGJvcmRlciByYWRpdXNcbiRsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXM6ICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHNpbmdsZSBsaXN0IGl0ZW1zIG9uIGhvdmVyXG4kbGlzdC1ncm91cC1ob3Zlci1iZzogICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4vLyoqIFRleHQgY29sb3Igb2YgYWN0aXZlIGxpc3QgaXRlbXNcbiRsaXN0LWdyb3VwLWFjdGl2ZS1jb2xvcjogICAgICAgJGNvbXBvbmVudC1hY3RpdmUtY29sb3IgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgYWN0aXZlIGxpc3QgaXRlbXNcbiRsaXN0LWdyb3VwLWFjdGl2ZS1iZzogICAgICAgICAgJGNvbXBvbmVudC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG4vLyoqIEJvcmRlciBjb2xvciBvZiBhY3RpdmUgbGlzdCBlbGVtZW50c1xuJGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjogICAgICAkbGlzdC1ncm91cC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG4vLyoqIFRleHQgY29sb3IgZm9yIGNvbnRlbnQgd2l0aGluIGFjdGl2ZSBsaXN0IGl0ZW1zXG4kbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjogIGxpZ2h0ZW4oJGxpc3QtZ3JvdXAtYWN0aXZlLWJnLCA0MCUpICFkZWZhdWx0O1xuXG4vLyoqIFRleHQgY29sb3Igb2YgZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtY29sb3I6ICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtYmc6ICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbi8vKiogVGV4dCBjb2xvciBmb3IgY29udGVudCB3aXRoaW4gZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtdGV4dC1jb2xvcjogJGxpc3QtZ3JvdXAtZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG5cbiRsaXN0LWdyb3VwLWxpbmstY29sb3I6ICAgICAgICAgIzU1NSAhZGVmYXVsdDtcbiRsaXN0LWdyb3VwLWxpbmstaG92ZXItY29sb3I6ICAgJGxpc3QtZ3JvdXAtbGluay1jb2xvciAhZGVmYXVsdDtcbiRsaXN0LWdyb3VwLWxpbmstaGVhZGluZy1jb2xvcjogIzMzMyAhZGVmYXVsdDtcblxuXG4vLz09IFBhbmVsc1xuLy9cbi8vIyNcblxuJHBhbmVsLWJnOiAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRwYW5lbC1ib2R5LXBhZGRpbmc6ICAgICAgICAgIDE1cHggIWRlZmF1bHQ7XG4kcGFuZWwtaGVhZGluZy1wYWRkaW5nOiAgICAgICAxMHB4IDE1cHggIWRlZmF1bHQ7XG4kcGFuZWwtZm9vdGVyLXBhZGRpbmc6ICAgICAgICAkcGFuZWwtaGVhZGluZy1wYWRkaW5nICFkZWZhdWx0O1xuJHBhbmVsLWJvcmRlci1yYWRpdXM6ICAgICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBCb3JkZXIgY29sb3IgZm9yIGVsZW1lbnRzIHdpdGhpbiBwYW5lbHNcbiRwYW5lbC1pbm5lci1ib3JkZXI6ICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG4kcGFuZWwtZm9vdGVyLWJnOiAgICAgICAgICAgICAjZjVmNWY1ICFkZWZhdWx0O1xuXG4kcGFuZWwtZGVmYXVsdC10ZXh0OiAgICAgICAgICAkZ3JheS1kYXJrICFkZWZhdWx0O1xuJHBhbmVsLWRlZmF1bHQtYm9yZGVyOiAgICAgICAgI2RkZCAhZGVmYXVsdDtcbiRwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmc6ICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG5cbiRwYW5lbC1wcmltYXJ5LXRleHQ6ICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFuZWwtcHJpbWFyeS1ib3JkZXI6ICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRwYW5lbC1wcmltYXJ5LWhlYWRpbmctYmc6ICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuXG4kcGFuZWwtc3VjY2Vzcy10ZXh0OiAgICAgICAgICAkc3RhdGUtc3VjY2Vzcy10ZXh0ICFkZWZhdWx0O1xuJHBhbmVsLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgJHN0YXRlLXN1Y2Nlc3MtYm9yZGVyICFkZWZhdWx0O1xuJHBhbmVsLXN1Y2Nlc3MtaGVhZGluZy1iZzogICAgJHN0YXRlLXN1Y2Nlc3MtYmcgIWRlZmF1bHQ7XG5cbiRwYW5lbC1pbmZvLXRleHQ6ICAgICAgICAgICAgICRzdGF0ZS1pbmZvLXRleHQgIWRlZmF1bHQ7XG4kcGFuZWwtaW5mby1ib3JkZXI6ICAgICAgICAgICAkc3RhdGUtaW5mby1ib3JkZXIgIWRlZmF1bHQ7XG4kcGFuZWwtaW5mby1oZWFkaW5nLWJnOiAgICAgICAkc3RhdGUtaW5mby1iZyAhZGVmYXVsdDtcblxuJHBhbmVsLXdhcm5pbmctdGV4dDogICAgICAgICAgJHN0YXRlLXdhcm5pbmctdGV4dCAhZGVmYXVsdDtcbiRwYW5lbC13YXJuaW5nLWJvcmRlcjogICAgICAgICRzdGF0ZS13YXJuaW5nLWJvcmRlciAhZGVmYXVsdDtcbiRwYW5lbC13YXJuaW5nLWhlYWRpbmctYmc6ICAgICRzdGF0ZS13YXJuaW5nLWJnICFkZWZhdWx0O1xuXG4kcGFuZWwtZGFuZ2VyLXRleHQ6ICAgICAgICAgICAkc3RhdGUtZGFuZ2VyLXRleHQgIWRlZmF1bHQ7XG4kcGFuZWwtZGFuZ2VyLWJvcmRlcjogICAgICAgICAkc3RhdGUtZGFuZ2VyLWJvcmRlciAhZGVmYXVsdDtcbiRwYW5lbC1kYW5nZXItaGVhZGluZy1iZzogICAgICRzdGF0ZS1kYW5nZXItYmcgIWRlZmF1bHQ7XG5cblxuLy89PSBUaHVtYm5haWxzXG4vL1xuLy8jI1xuXG4vLyoqIFBhZGRpbmcgYXJvdW5kIHRoZSB0aHVtYm5haWwgaW1hZ2VcbiR0aHVtYm5haWwtcGFkZGluZzogICAgICAgICAgIDRweCAhZGVmYXVsdDtcbi8vKiogVGh1bWJuYWlsIGJhY2tncm91bmQgY29sb3JcbiR0aHVtYm5haWwtYmc6ICAgICAgICAgICAgICAgICRib2R5LWJnICFkZWZhdWx0O1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIGNvbG9yXG4kdGh1bWJuYWlsLWJvcmRlcjogICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIHJhZGl1c1xuJHRodW1ibmFpbC1ib3JkZXItcmFkaXVzOiAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBDdXN0b20gdGV4dCBjb2xvciBmb3IgdGh1bWJuYWlsIGNhcHRpb25zXG4kdGh1bWJuYWlsLWNhcHRpb24tY29sb3I6ICAgICAkdGV4dC1jb2xvciAhZGVmYXVsdDtcbi8vKiogUGFkZGluZyBhcm91bmQgdGhlIHRodW1ibmFpbCBjYXB0aW9uXG4kdGh1bWJuYWlsLWNhcHRpb24tcGFkZGluZzogICA5cHggIWRlZmF1bHQ7XG5cblxuLy89PSBXZWxsc1xuLy9cbi8vIyNcblxuJHdlbGwtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbiR3ZWxsLWJvcmRlcjogICAgICAgICAgICAgICAgIGRhcmtlbigkd2VsbC1iZywgNyUpICFkZWZhdWx0O1xuXG5cbi8vPT0gQmFkZ2VzXG4vL1xuLy8jI1xuXG4kYmFkZ2UtY29sb3I6ICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBMaW5rZWQgYmFkZ2UgdGV4dCBjb2xvciBvbiBob3ZlclxuJGJhZGdlLWxpbmstaG92ZXItY29sb3I6ICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRiYWRnZS1iZzogICAgICAgICAgICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuXG4vLyoqIEJhZGdlIHRleHQgY29sb3IgaW4gYWN0aXZlIG5hdiBsaW5rXG4kYmFkZ2UtYWN0aXZlLWNvbG9yOiAgICAgICAgICAkbGluay1jb2xvciAhZGVmYXVsdDtcbi8vKiogQmFkZ2UgYmFja2dyb3VuZCBjb2xvciBpbiBhY3RpdmUgbmF2IGxpbmtcbiRiYWRnZS1hY3RpdmUtYmc6ICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG5cbiRiYWRnZS1mb250LXdlaWdodDogICAgICAgICAgIGJvbGQgIWRlZmF1bHQ7XG4kYmFkZ2UtbGluZS1oZWlnaHQ6ICAgICAgICAgICAxICFkZWZhdWx0O1xuJGJhZGdlLWJvcmRlci1yYWRpdXM6ICAgICAgICAgMTBweCAhZGVmYXVsdDtcblxuXG4vLz09IEJyZWFkY3J1bWJzXG4vL1xuLy8jI1xuXG4kYnJlYWRjcnVtYi1wYWRkaW5nLXZlcnRpY2FsOiAgIDhweCAhZGVmYXVsdDtcbiRicmVhZGNydW1iLXBhZGRpbmctaG9yaXpvbnRhbDogMTVweCAhZGVmYXVsdDtcbi8vKiogQnJlYWRjcnVtYiBiYWNrZ3JvdW5kIGNvbG9yXG4kYnJlYWRjcnVtYi1iZzogICAgICAgICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4vLyoqIEJyZWFkY3J1bWIgdGV4dCBjb2xvclxuJGJyZWFkY3J1bWItY29sb3I6ICAgICAgICAgICAgICAjY2NjICFkZWZhdWx0O1xuLy8qKiBUZXh0IGNvbG9yIG9mIGN1cnJlbnQgcGFnZSBpbiB0aGUgYnJlYWRjcnVtYlxuJGJyZWFkY3J1bWItYWN0aXZlLWNvbG9yOiAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbi8vKiogVGV4dHVhbCBzZXBhcmF0b3IgZm9yIGJldHdlZW4gYnJlYWRjcnVtYiBlbGVtZW50c1xuJGJyZWFkY3J1bWItc2VwYXJhdG9yOiAgICAgICAgICBcIi9cIiAhZGVmYXVsdDtcblxuXG4vLz09IENhcm91c2VsXG4vL1xuLy8jI1xuXG4kY2Fyb3VzZWwtdGV4dC1zaGFkb3c6ICAgICAgICAgICAgICAgICAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjYpICFkZWZhdWx0O1xuXG4kY2Fyb3VzZWwtY29udHJvbC1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRjYXJvdXNlbC1jb250cm9sLXdpZHRoOiAgICAgICAgICAgICAgICAgICAgICAxNSUgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtY29udHJvbC1vcGFjaXR5OiAgICAgICAgICAgICAgICAgICAgLjUgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtY29udHJvbC1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgMjBweCAhZGVmYXVsdDtcblxuJGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcblxuJGNhcm91c2VsLWNhcHRpb24tY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBDbG9zZVxuLy9cbi8vIyNcblxuJGNsb3NlLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgYm9sZCAhZGVmYXVsdDtcbiRjbG9zZS1jb2xvcjogICAgICAgICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4kY2xvc2UtdGV4dC1zaGFkb3c6ICAgICAgICAgICAwIDFweCAwICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBDb2RlXG4vL1xuLy8jI1xuXG4kY29kZS1jb2xvcjogICAgICAgICAgICAgICAgICAjYzcyNTRlICFkZWZhdWx0O1xuJGNvZGUtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y5ZjJmNCAhZGVmYXVsdDtcblxuJGtiZC1jb2xvcjogICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRrYmQtYmc6ICAgICAgICAgICAgICAgICAgICAgICMzMzMgIWRlZmF1bHQ7XG5cbiRwcmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4kcHJlLWNvbG9yOiAgICAgICAgICAgICAgICAgICAkZ3JheS1kYXJrICFkZWZhdWx0O1xuJHByZS1ib3JkZXItY29sb3I6ICAgICAgICAgICAgI2NjYyAhZGVmYXVsdDtcbiRwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0OiAgIDM0MHB4ICFkZWZhdWx0O1xuXG5cbi8vPT0gVHlwZVxuLy9cbi8vIyNcblxuLy8qKiBIb3Jpem9udGFsIG9mZnNldCBmb3IgZm9ybXMgYW5kIGxpc3RzLlxuJGNvbXBvbmVudC1vZmZzZXQtaG9yaXpvbnRhbDogMTgwcHggIWRlZmF1bHQ7XG4vLyoqIFRleHQgbXV0ZWQgY29sb3JcbiR0ZXh0LW11dGVkOiAgICAgICAgICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBBYmJyZXZpYXRpb25zIGFuZCBhY3JvbnltcyBib3JkZXIgY29sb3JcbiRhYmJyLWJvcmRlci1jb2xvcjogICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBIZWFkaW5ncyBzbWFsbCBjb2xvclxuJGhlYWRpbmdzLXNtYWxsLWNvbG9yOiAgICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG4vLyoqIEJsb2NrcXVvdGUgc21hbGwgY29sb3JcbiRibG9ja3F1b3RlLXNtYWxsLWNvbG9yOiAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBCbG9ja3F1b3RlIGZvbnQgc2l6ZVxuJGJsb2NrcXVvdGUtZm9udC1zaXplOiAgICAgICAgKCRmb250LXNpemUtYmFzZSAqIDEuMjUpICFkZWZhdWx0O1xuLy8qKiBCbG9ja3F1b3RlIGJvcmRlciBjb2xvclxuJGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yOiAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbi8vKiogUGFnZSBoZWFkZXIgYm9yZGVyIGNvbG9yXG4kcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yOiAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuLy8qKiBXaWR0aCBvZiBob3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3QgdGl0bGVzXG4kZGwtaG9yaXpvbnRhbC1vZmZzZXQ6ICAgICAgICAkY29tcG9uZW50LW9mZnNldC1ob3Jpem9udGFsICFkZWZhdWx0O1xuLy8qKiBIb3Jpem9udGFsIGxpbmUgY29sb3IuXG4kaHItYm9yZGVyOiAgICAgICAgICAgICAgICAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuXG4vLyogXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcblxuLy8gQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgYm9vdHN0cmFwLXNlbGVjdFxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuICovXG5cbiRjb2xvci1yZWQtZXJyb3I6IHJnYigxODUsIDc0LCA3Mik7XG4kY29sb3ItYmx1ZS1ob3ZlcjogcmdiKDEwMCwgMTc3LCAyMTYpO1xuJGNvbG9yLWdyZXktYXJyb3c6IHJnYigyMDQsIDIwNCwgMjA0KTtcblxuJHdpZHRoLWRlZmF1bHQ6IDIyMHB4O1xuXG4kemluZGV4LXNlbGVjdC1kcm9wZG93bjogMTAzNSAhZGVmYXVsdDsgIiwiLy8gV2ViS2l0LXN0eWxlIGZvY3VzXG5cbkBtaXhpbiB0YWItZm9jdXMoKSB7XG4gIC8vIERlZmF1bHRcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIC8vIFdlYktpdFxuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuIiwiLy8gSW1hZ2UgTWl4aW5zXG4vLyAtIFJlc3BvbnNpdmUgaW1hZ2Vcbi8vIC0gUmV0aW5hIGltYWdlXG5cblxuLy8gUmVzcG9uc2l2ZSBpbWFnZVxuLy9cbi8vIEtlZXAgaW1hZ2VzIGZyb20gc2NhbGluZyBiZXlvbmQgdGhlIHdpZHRoIG9mIHRoZWlyIHBhcmVudHMuXG5AbWl4aW4gaW1nLXJlc3BvbnNpdmUoJGRpc3BsYXk6IGJsb2NrKSB7XG4gIGRpc3BsYXk6ICRkaXNwbGF5O1xuICBtYXgtd2lkdGg6IDEwMCU7IC8vIFBhcnQgMTogU2V0IGEgbWF4aW11bSByZWxhdGl2ZSB0byB0aGUgcGFyZW50XG4gIGhlaWdodDogYXV0bzsgLy8gUGFydCAyOiBTY2FsZSB0aGUgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgd2lkdGgsIG90aGVyd2lzZSB5b3UgZ2V0IHN0cmV0Y2hpbmdcbn1cblxuXG4vLyBSZXRpbmEgaW1hZ2Vcbi8vXG4vLyBTaG9ydCByZXRpbmEgbWl4aW4gZm9yIHNldHRpbmcgYmFja2dyb3VuZC1pbWFnZSBhbmQgLXNpemUuIE5vdGUgdGhhdCB0aGVcbi8vIHNwZWxsaW5nIG9mIGBtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW9gIGlzIGludGVudGlvbmFsLlxuQG1peGluIGltZy1yZXRpbmEoJGZpbGUtMXgsICRmaWxlLTJ4LCAkd2lkdGgtMXgsICRoZWlnaHQtMXgpIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGlmKCRib290c3RyYXAtc2Fzcy1hc3NldC1oZWxwZXIsIHR3YnMtaW1hZ2UtcGF0aChcIiN7JGZpbGUtMXh9XCIpLCBcIiN7JGZpbGUtMXh9XCIpKTtcblxuICBAbWVkaWFcbiAgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgIG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyLzEpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAgICAgICAgICAgIG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgICAgICAgICBtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWYoJGJvb3RzdHJhcC1zYXNzLWFzc2V0LWhlbHBlciwgdHdicy1pbWFnZS1wYXRoKFwiI3skZmlsZS0yeH1cIiksIFwiI3skZmlsZS0yeH1cIikpO1xuICAgIGJhY2tncm91bmQtc2l6ZTogJHdpZHRoLTF4ICRoZWlnaHQtMXg7XG4gIH1cbn1cbiIsIi8vXG4vLyBUeXBvZ3JhcGh5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEhlYWRpbmdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsXG4uaDEsIC5oMiwgLmgzLCAuaDQsIC5oNSwgLmg2IHtcbiAgZm9udC1mYW1pbHk6ICRoZWFkaW5ncy1mb250LWZhbWlseTtcbiAgZm9udC13ZWlnaHQ6ICRoZWFkaW5ncy1mb250LXdlaWdodDtcbiAgbGluZS1oZWlnaHQ6ICRoZWFkaW5ncy1saW5lLWhlaWdodDtcbiAgY29sb3I6ICRoZWFkaW5ncy1jb2xvcjtcblxuICBzbWFsbCxcbiAgLnNtYWxsIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIGNvbG9yOiAkaGVhZGluZ3Mtc21hbGwtY29sb3I7XG4gIH1cbn1cblxuaDEsIC5oMSxcbmgyLCAuaDIsXG5oMywgLmgzIHtcbiAgbWFyZ2luLXRvcDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW4tYm90dG9tOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMik7XG5cbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgZm9udC1zaXplOiA2NSU7XG4gIH1cbn1cbmg0LCAuaDQsXG5oNSwgLmg1LFxuaDYsIC5oNiB7XG4gIG1hcmdpbi10b3A6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgbWFyZ2luLWJvdHRvbTogKCRsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGZvbnQtc2l6ZTogNzUlO1xuICB9XG59XG5cbmgxLCAuaDEgeyBmb250LXNpemU6ICRmb250LXNpemUtaDE7IH1cbmgyLCAuaDIgeyBmb250LXNpemU6ICRmb250LXNpemUtaDI7IH1cbmgzLCAuaDMgeyBmb250LXNpemU6ICRmb250LXNpemUtaDM7IH1cbmg0LCAuaDQgeyBmb250LXNpemU6ICRmb250LXNpemUtaDQ7IH1cbmg1LCAuaDUgeyBmb250LXNpemU6ICRmb250LXNpemUtaDU7IH1cbmg2LCAuaDYgeyBmb250LXNpemU6ICRmb250LXNpemUtaDY7IH1cblxuXG4vLyBCb2R5IHRleHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucCB7XG4gIG1hcmdpbjogMCAwICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbn1cblxuLmxlYWQge1xuICBtYXJnaW4tYm90dG9tOiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGZvbnQtc2l6ZTogZmxvb3IoKCRmb250LXNpemUtYmFzZSAqIDEuMTUpKTtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBmb250LXNpemU6ICgkZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICB9XG59XG5cblxuLy8gRW1waGFzaXMgJiBtaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEV4OiAoMTJweCBzbWFsbCBmb250IC8gMTRweCBiYXNlIGZvbnQpICogMTAwJSA9IGFib3V0IDg1JVxuc21hbGwsXG4uc21hbGwge1xuICBmb250LXNpemU6IGZsb29yKCgxMDAlICogJGZvbnQtc2l6ZS1zbWFsbCAvICRmb250LXNpemUtYmFzZSkpO1xufVxuXG5tYXJrLFxuLm1hcmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkc3RhdGUtd2FybmluZy1iZztcbiAgcGFkZGluZzogLjJlbTtcbn1cblxuLy8gQWxpZ25tZW50XG4udGV4dC1sZWZ0ICAgICAgICAgICB7IHRleHQtYWxpZ246IGxlZnQ7IH1cbi50ZXh0LXJpZ2h0ICAgICAgICAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50ZXh0LWNlbnRlciAgICAgICAgIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9XG4udGV4dC1qdXN0aWZ5ICAgICAgICB7IHRleHQtYWxpZ246IGp1c3RpZnk7IH1cbi50ZXh0LW5vd3JhcCAgICAgICAgIHsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfVxuXG4vLyBUcmFuc2Zvcm1hdGlvblxuLnRleHQtbG93ZXJjYXNlICAgICAgeyB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlOyB9XG4udGV4dC11cHBlcmNhc2UgICAgICB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH1cbi50ZXh0LWNhcGl0YWxpemUgICAgIHsgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7IH1cblxuLy8gQ29udGV4dHVhbCBjb2xvcnNcbi50ZXh0LW11dGVkIHtcbiAgY29sb3I6ICR0ZXh0LW11dGVkO1xufVxuXG5AaW5jbHVkZSB0ZXh0LWVtcGhhc2lzLXZhcmlhbnQoJy50ZXh0LXByaW1hcnknLCAkYnJhbmQtcHJpbWFyeSk7XG5cbkBpbmNsdWRlIHRleHQtZW1waGFzaXMtdmFyaWFudCgnLnRleHQtc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLXRleHQpO1xuXG5AaW5jbHVkZSB0ZXh0LWVtcGhhc2lzLXZhcmlhbnQoJy50ZXh0LWluZm8nLCAkc3RhdGUtaW5mby10ZXh0KTtcblxuQGluY2x1ZGUgdGV4dC1lbXBoYXNpcy12YXJpYW50KCcudGV4dC13YXJuaW5nJywgJHN0YXRlLXdhcm5pbmctdGV4dCk7XG5cbkBpbmNsdWRlIHRleHQtZW1waGFzaXMtdmFyaWFudCgnLnRleHQtZGFuZ2VyJywgJHN0YXRlLWRhbmdlci10ZXh0KTtcblxuLy8gQ29udGV4dHVhbCBiYWNrZ3JvdW5kc1xuLy8gRm9yIG5vdyB3ZSdsbCBsZWF2ZSB0aGVzZSBhbG9uZ3NpZGUgdGhlIHRleHQgY2xhc3NlcyB1bnRpbCB2NCB3aGVuIHdlIGNhblxuLy8gc2FmZWx5IHNoaWZ0IHRoaW5ncyBhcm91bmQgKHBlciBTZW1WZXIgcnVsZXMpLlxuLmJnLXByaW1hcnkge1xuICAvLyBHaXZlbiB0aGUgY29udHJhc3QgaGVyZSwgdGhpcyBpcyB0aGUgb25seSBjbGFzcyB0byBoYXZlIGl0cyBjb2xvciBpbnZlcnRlZFxuICAvLyBhdXRvbWF0aWNhbGx5LlxuICBjb2xvcjogI2ZmZjtcbn1cbkBpbmNsdWRlIGJnLXZhcmlhbnQoJy5iZy1wcmltYXJ5JywgJGJyYW5kLXByaW1hcnkpO1xuXG5AaW5jbHVkZSBiZy12YXJpYW50KCcuYmctc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLWJnKTtcblxuQGluY2x1ZGUgYmctdmFyaWFudCgnLmJnLWluZm8nLCAkc3RhdGUtaW5mby1iZyk7XG5cbkBpbmNsdWRlIGJnLXZhcmlhbnQoJy5iZy13YXJuaW5nJywgJHN0YXRlLXdhcm5pbmctYmcpO1xuXG5AaW5jbHVkZSBiZy12YXJpYW50KCcuYmctZGFuZ2VyJywgJHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUGFnZSBoZWFkZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnBhZ2UtaGVhZGVyIHtcbiAgcGFkZGluZy1ib3R0b206ICgoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMikgLSAxKTtcbiAgbWFyZ2luOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMikgMCAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yO1xufVxuXG5cbi8vIExpc3RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFVub3JkZXJlZCBhbmQgT3JkZXJlZCBsaXN0c1xudWwsXG5vbCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgdWwsXG4gIG9sIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIExpc3Qgb3B0aW9uc1xuXG4vLyBbY29udmVydGVyXSBleHRyYWN0ZWQgZnJvbSBgLmxpc3QtdW5zdHlsZWRgIGZvciBsaWJzYXNzIGNvbXBhdGliaWxpdHlcbkBtaXhpbiBsaXN0LXVuc3R5bGVkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGFzIGBAbWl4aW4gbGlzdC11bnN0eWxlZGAgZm9yIGxpYnNhc3MgY29tcGF0aWJpbGl0eVxuLmxpc3QtdW5zdHlsZWQge1xuICBAaW5jbHVkZSBsaXN0LXVuc3R5bGVkO1xufVxuXG5cbi8vIElubGluZSB0dXJucyBsaXN0IGl0ZW1zIGludG8gaW5saW5lLWJsb2NrXG4ubGlzdC1pbmxpbmUge1xuICBAaW5jbHVkZSBsaXN0LXVuc3R5bGVkO1xuICBtYXJnaW4tbGVmdDogLTVweDtcblxuICA+IGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xuICB9XG59XG5cbi8vIERlc2NyaXB0aW9uIExpc3RzXG5kbCB7XG4gIG1hcmdpbi10b3A6IDA7IC8vIFJlbW92ZSBicm93c2VyIGRlZmF1bHRcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xufVxuZHQsXG5kZCB7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbn1cbmR0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5kZCB7XG4gIG1hcmdpbi1sZWZ0OiAwOyAvLyBVbmRvIGJyb3dzZXIgZGVmYXVsdFxufVxuXG4vLyBIb3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3RzXG4vL1xuLy8gRGVmYXVsdHMgdG8gYmVpbmcgc3RhY2tlZCB3aXRob3V0IGFueSBvZiB0aGUgYmVsb3cgc3R5bGVzIGFwcGxpZWQsIHVudGlsIHRoZVxuLy8gZ3JpZCBicmVha3BvaW50IGlzIHJlYWNoZWQgKGRlZmF1bHQgb2Ygfjc2OHB4KS5cblxuLmRsLWhvcml6b250YWwge1xuICBkZCB7XG4gICAgQGluY2x1ZGUgY2xlYXJmaXg7IC8vIENsZWFyIHRoZSBmbG9hdGVkIGBkdGAgaWYgYW4gZW1wdHkgYGRkYCBpcyBwcmVzZW50XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGR0IHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgd2lkdGg6ICgkZGwtaG9yaXpvbnRhbC1vZmZzZXQgLSAyMCk7XG4gICAgICBjbGVhcjogbGVmdDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgQGluY2x1ZGUgdGV4dC1vdmVyZmxvdztcbiAgICB9XG4gICAgZGQge1xuICAgICAgbWFyZ2luLWxlZnQ6ICRkbC1ob3Jpem9udGFsLW9mZnNldDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBNaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEFiYnJldmlhdGlvbnMgYW5kIGFjcm9ueW1zXG5hYmJyW3RpdGxlXSxcbi8vIEFkZCBkYXRhLSogYXR0cmlidXRlIHRvIGhlbHAgb3V0IG91ciB0b29sdGlwIHBsdWdpbiwgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNTI1N1xuYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSB7XG4gIGN1cnNvcjogaGVscDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAkYWJici1ib3JkZXItY29sb3I7XG59XG4uaW5pdGlhbGlzbSB7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBAZXh0ZW5kIC50ZXh0LXVwcGVyY2FzZTtcbn1cblxuLy8gQmxvY2txdW90ZXNcbmJsb2NrcXVvdGUge1xuICBwYWRkaW5nOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMikgJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW46IDAgMCAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGZvbnQtc2l6ZTogJGJsb2NrcXVvdGUtZm9udC1zaXplO1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICRibG9ja3F1b3RlLWJvcmRlci1jb2xvcjtcblxuICBwLFxuICB1bCxcbiAgb2wge1xuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdGU6IERlcHJlY2F0ZWQgc21hbGwgYW5kIC5zbWFsbCBhcyBvZiB2My4xLjBcbiAgLy8gQ29udGV4dDogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTY2MFxuICBmb290ZXIsXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGZvbnQtc2l6ZTogODAlOyAvLyBiYWNrIHRvIGRlZmF1bHQgZm9udC1zaXplXG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICAgIGNvbG9yOiAkYmxvY2txdW90ZS1zbWFsbC1jb2xvcjtcblxuICAgICY6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6ICdcXDIwMTQgXFwwMEEwJzsgLy8gZW0gZGFzaCwgbmJzcFxuICAgIH1cbiAgfVxufVxuXG4vLyBPcHBvc2l0ZSBhbGlnbm1lbnQgb2YgYmxvY2txdW90ZVxuLy9cbi8vIEhlYWRzIHVwOiBgYmxvY2txdW90ZS5wdWxsLXJpZ2h0YCBoYXMgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHYzLjEuMC5cbi5ibG9ja3F1b3RlLXJldmVyc2UsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQge1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGJvcmRlci1yaWdodDogNXB4IHNvbGlkICRibG9ja3F1b3RlLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLWxlZnQ6IDA7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuXG4gIC8vIEFjY291bnQgZm9yIGNpdGF0aW9uXG4gIGZvb3RlcixcbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgJjpiZWZvcmUgeyBjb250ZW50OiAnJzsgfVxuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJ1xcMDBBMCBcXDIwMTQnOyAvLyBuYnNwLCBlbSBkYXNoXG4gICAgfVxuICB9XG59XG5cbi8vIEFkZHJlc3Nlc1xuYWRkcmVzcyB7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG59XG4iLCIvLyBUeXBvZ3JhcGh5XG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIHRleHQtZW1waGFzaXMtdmFyaWFudCgkcGFyZW50LCAkY29sb3IpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgY29sb3I6ICRjb2xvcjtcbiAgfVxuICBhI3skcGFyZW50fTpob3ZlcixcbiAgYSN7JHBhcmVudH06Zm9jdXMge1xuICAgIGNvbG9yOiBkYXJrZW4oJGNvbG9yLCAxMCUpO1xuICB9XG59XG4iLCIvLyBDb250ZXh0dWFsIGJhY2tncm91bmRzXG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIGJnLXZhcmlhbnQoJHBhcmVudCwgJGNvbG9yKSB7XG4gICN7JHBhcmVudH0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbiAgfVxuICBhI3skcGFyZW50fTpob3ZlcixcbiAgYSN7JHBhcmVudH06Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vIENsZWFyZml4XG4vL1xuLy8gRm9yIG1vZGVybiBicm93c2Vyc1xuLy8gMS4gVGhlIHNwYWNlIGNvbnRlbnQgaXMgb25lIHdheSB0byBhdm9pZCBhbiBPcGVyYSBidWcgd2hlbiB0aGVcbi8vICAgIGNvbnRlbnRlZGl0YWJsZSBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgYW55d2hlcmUgZWxzZSBpbiB0aGUgZG9jdW1lbnQuXG4vLyAgICBPdGhlcndpc2UgaXQgY2F1c2VzIHNwYWNlIHRvIGFwcGVhciBhdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgZWxlbWVudHNcbi8vICAgIHRoYXQgYXJlIGNsZWFyZml4ZWQuXG4vLyAyLiBUaGUgdXNlIG9mIGB0YWJsZWAgcmF0aGVyIHRoYW4gYGJsb2NrYCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB1c2luZ1xuLy8gICAgYDpiZWZvcmVgIHRvIGNvbnRhaW4gdGhlIHRvcC1tYXJnaW5zIG9mIGNoaWxkIGVsZW1lbnRzLlxuLy9cbi8vIFNvdXJjZTogaHR0cDovL25pY29sYXNnYWxsYWdoZXIuY29tL21pY3JvLWNsZWFyZml4LWhhY2svXG5cbkBtaXhpbiBjbGVhcmZpeCgpIHtcbiAgJjpiZWZvcmUsXG4gICY6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIFwiOyAvLyAxXG4gICAgZGlzcGxheTogdGFibGU7IC8vIDJcbiAgfVxuICAmOmFmdGVyIHtcbiAgICBjbGVhcjogYm90aDtcbiAgfVxufVxuIiwiLy8gVGV4dCBvdmVyZmxvd1xuLy8gUmVxdWlyZXMgaW5saW5lLWJsb2NrIG9yIGJsb2NrIGZvciBwcm9wZXIgc3R5bGluZ1xuXG5AbWl4aW4gdGV4dC1vdmVyZmxvdygpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4iLCIvL1xuLy8gQ29kZSAoaW5saW5lIGFuZCBibG9jaylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gSW5saW5lIGFuZCBibG9jayBjb2RlIHN0eWxlc1xuY29kZSxcbmtiZCxcbnByZSxcbnNhbXAge1xuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm9zcGFjZTtcbn1cblxuLy8gSW5saW5lIGNvZGVcbmNvZGUge1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBmb250LXNpemU6IDkwJTtcbiAgY29sb3I6ICRjb2RlLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29kZS1iZztcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtYmFzZTtcbn1cblxuLy8gVXNlciBpbnB1dCB0eXBpY2FsbHkgZW50ZXJlZCB2aWEga2V5Ym9hcmRcbmtiZCB7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBjb2xvcjogJGtiZC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGtiZC1iZztcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjI1KTtcblxuICBrYmQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC1zaXplOiAxMDAlO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbn1cblxuLy8gQmxvY2tzIG9mIGNvZGVcbnByZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAoKCRsaW5lLWhlaWdodC1jb21wdXRlZCAtIDEpIC8gMik7XG4gIG1hcmdpbjogMCAwICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgZm9udC1zaXplOiAoJGZvbnQtc2l6ZS1iYXNlIC0gMSk7IC8vIDE0cHggdG8gMTNweFxuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBjb2xvcjogJHByZS1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHByZS1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJHByZS1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgLy8gQWNjb3VudCBmb3Igc29tZSBjb2RlIG91dHB1dHMgdGhhdCBwbGFjZSBjb2RlIHRhZ3MgaW4gcHJlIHRhZ3NcbiAgY29kZSB7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLy8gRW5hYmxlIHNjcm9sbGFibGUgYmxvY2tzIG9mIGNvZGVcbi5wcmUtc2Nyb2xsYWJsZSB7XG4gIG1heC1oZWlnaHQ6ICRwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4iLCIvL1xuLy8gR3JpZCBzeXN0ZW1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQ29udGFpbmVyIHdpZHRoc1xuLy9cbi8vIFNldCB0aGUgY29udGFpbmVyIHdpZHRoLCBhbmQgb3ZlcnJpZGUgaXQgZm9yIGZpeGVkIG5hdmJhcnMgaW4gbWVkaWEgcXVlcmllcy5cblxuLmNvbnRhaW5lciB7XG4gIEBpbmNsdWRlIGNvbnRhaW5lci1maXhlZDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1zbTtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1tZDtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1sZztcbiAgfVxufVxuXG5cbi8vIEZsdWlkIGNvbnRhaW5lclxuLy9cbi8vIFV0aWxpemVzIHRoZSBtaXhpbiBtZWFudCBmb3IgZml4ZWQgd2lkdGggY29udGFpbmVycywgYnV0IHdpdGhvdXQgYW55IGRlZmluZWRcbi8vIHdpZHRoIGZvciBmbHVpZCwgZnVsbCB3aWR0aCBsYXlvdXRzLlxuXG4uY29udGFpbmVyLWZsdWlkIHtcbiAgQGluY2x1ZGUgY29udGFpbmVyLWZpeGVkO1xufVxuXG5cbi8vIFJvd1xuLy9cbi8vIFJvd3MgY29udGFpbiBhbmQgY2xlYXIgdGhlIGZsb2F0cyBvZiB5b3VyIGNvbHVtbnMuXG5cbi5yb3cge1xuICBAaW5jbHVkZSBtYWtlLXJvdztcbn1cblxuXG4vLyBDb2x1bW5zXG4vL1xuLy8gQ29tbW9uIHN0eWxlcyBmb3Igc21hbGwgYW5kIGxhcmdlIGdyaWQgY29sdW1uc1xuXG5AaW5jbHVkZSBtYWtlLWdyaWQtY29sdW1ucztcblxuXG4vLyBFeHRyYSBzbWFsbCBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIGV4dHJhIHNtYWxsIGRldmljZXMgbGlrZVxuLy8gc21hcnRwaG9uZXMuXG5cbkBpbmNsdWRlIG1ha2UtZ3JpZCh4cyk7XG5cblxuLy8gU21hbGwgZ3JpZFxuLy9cbi8vIENvbHVtbnMsIG9mZnNldHMsIHB1c2hlcywgYW5kIHB1bGxzIGZvciB0aGUgc21hbGwgZGV2aWNlIHJhbmdlLCBmcm9tIHBob25lc1xuLy8gdG8gdGFibGV0cy5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gIEBpbmNsdWRlIG1ha2UtZ3JpZChzbSk7XG59XG5cblxuLy8gTWVkaXVtIGdyaWRcbi8vXG4vLyBDb2x1bW5zLCBvZmZzZXRzLCBwdXNoZXMsIGFuZCBwdWxscyBmb3IgdGhlIGRlc2t0b3AgZGV2aWNlIHJhbmdlLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIHtcbiAgQGluY2x1ZGUgbWFrZS1ncmlkKG1kKTtcbn1cblxuXG4vLyBMYXJnZSBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIHRoZSBsYXJnZSBkZXNrdG9wIGRldmljZSByYW5nZS5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gIEBpbmNsdWRlIG1ha2UtZ3JpZChsZyk7XG59XG4iLCIvLyBHcmlkIHN5c3RlbVxuLy9cbi8vIEdlbmVyYXRlIHNlbWFudGljIGdyaWQgY29sdW1ucyB3aXRoIHRoZXNlIG1peGlucy5cblxuLy8gQ2VudGVyZWQgY29udGFpbmVyIGVsZW1lbnRcbkBtaXhpbiBjb250YWluZXItZml4ZWQoJGd1dHRlcjogJGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xufVxuXG4vLyBDcmVhdGVzIGEgd3JhcHBlciBmb3IgYSBzZXJpZXMgb2YgY29sdW1uc1xuQG1peGluIG1ha2Utcm93KCRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBtYXJnaW4tbGVmdDogIGNlaWwoKCRndXR0ZXIgLyAtMikpO1xuICBtYXJnaW4tcmlnaHQ6IGZsb29yKCgkZ3V0dGVyIC8gLTIpKTtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBleHRyYSBzbWFsbCBjb2x1bW5zXG5AbWl4aW4gbWFrZS14cy1jb2x1bW4oJGNvbHVtbnMsICRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKCRndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKCRndXR0ZXIgLyAyKTtcbn1cbkBtaXhpbiBtYWtlLXhzLWNvbHVtbi1vZmZzZXQoJGNvbHVtbnMpIHtcbiAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xufVxuQG1peGluIG1ha2UteHMtY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG59XG5AbWl4aW4gbWFrZS14cy1jb2x1bW4tcHVsbCgkY29sdW1ucykge1xuICByaWdodDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBzbWFsbCBjb2x1bW5zXG5AbWl4aW4gbWFrZS1zbS1jb2x1bW4oJGNvbHVtbnMsICRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKCRndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKCRndXR0ZXIgLyAyKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLXNtLWNvbHVtbi1vZmZzZXQoJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1zbS1jb2x1bW4tcHVzaCgkY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2Utc20tY29sdW1uLXB1bGwoJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgcmlnaHQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBtZWRpdW0gY29sdW1uc1xuQG1peGluIG1ha2UtbWQtY29sdW1uKCRjb2x1bW5zLCAkZ3V0dGVyOiAkZ3JpZC1ndXR0ZXItd2lkdGgpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1tZC1jb2x1bW4tb2Zmc2V0KCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikge1xuICAgIG1hcmdpbi1sZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2UtbWQtY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gICAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLW1kLWNvbHVtbi1wdWxsKCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikge1xuICAgIHJpZ2h0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuXG4vLyBHZW5lcmF0ZSB0aGUgbGFyZ2UgY29sdW1uc1xuQG1peGluIG1ha2UtbGctY29sdW1uKCRjb2x1bW5zLCAkZ3V0dGVyOiAkZ3JpZC1ndXR0ZXItd2lkdGgpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1sZy1jb2x1bW4tb2Zmc2V0KCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICAgIG1hcmdpbi1sZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2UtbGctY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLWxnLWNvbHVtbi1wdWxsKCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICAgIHJpZ2h0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuIiwiLy8gRnJhbWV3b3JrIGdyaWQgZ2VuZXJhdGlvblxuLy9cbi8vIFVzZWQgb25seSBieSBCb290c3RyYXAgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGdyaWQgY2xhc3NlcyBnaXZlblxuLy8gYW55IHZhbHVlIG9mIGAkZ3JpZC1jb2x1bW5zYC5cblxuLy8gW2NvbnZlcnRlcl0gVGhpcyBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGluIExFU1MsIGJ1dCBTYXNzIHN1cHBvcnRzIHJlYWwgbG9vcHNcbkBtaXhpbiBtYWtlLWdyaWQtY29sdW1ucygkaTogMSwgJGxpc3Q6IFwiLmNvbC14cy0jeyRpfSwgLmNvbC1zbS0jeyRpfSwgLmNvbC1tZC0jeyRpfSwgLmNvbC1sZy0jeyRpfVwiKSB7XG4gIEBmb3IgJGkgZnJvbSAoMSArIDEpIHRocm91Z2ggJGdyaWQtY29sdW1ucyB7XG4gICAgJGxpc3Q6IFwiI3skbGlzdH0sIC5jb2wteHMtI3skaX0sIC5jb2wtc20tI3skaX0sIC5jb2wtbWQtI3skaX0sIC5jb2wtbGctI3skaX1cIjtcbiAgfVxuICAjeyRsaXN0fSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC8vIFByZXZlbnQgY29sdW1ucyBmcm9tIGNvbGxhcHNpbmcgd2hlbiBlbXB0eVxuICAgIG1pbi1oZWlnaHQ6IDFweDtcbiAgICAvLyBJbm5lciBndXR0ZXIgdmlhIHBhZGRpbmdcbiAgICBwYWRkaW5nLWxlZnQ6ICBjZWlsKCgkZ3JpZC1ndXR0ZXItd2lkdGggLyAyKSk7XG4gICAgcGFkZGluZy1yaWdodDogZmxvb3IoKCRncmlkLWd1dHRlci13aWR0aCAvIDIpKTtcbiAgfVxufVxuXG5cbi8vIFtjb252ZXJ0ZXJdIFRoaXMgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBpbiBMRVNTLCBidXQgU2FzcyBzdXBwb3J0cyByZWFsIGxvb3BzXG5AbWl4aW4gZmxvYXQtZ3JpZC1jb2x1bW5zKCRjbGFzcywgJGk6IDEsICRsaXN0OiBcIi5jb2wtI3skY2xhc3N9LSN7JGl9XCIpIHtcbiAgQGZvciAkaSBmcm9tICgxICsgMSkgdGhyb3VnaCAkZ3JpZC1jb2x1bW5zIHtcbiAgICAkbGlzdDogXCIjeyRsaXN0fSwgLmNvbC0jeyRjbGFzc30tI3skaX1cIjtcbiAgfVxuICAjeyRsaXN0fSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuXG5AbWl4aW4gY2FsYy1ncmlkLWNvbHVtbigkaW5kZXgsICRjbGFzcywgJHR5cGUpIHtcbiAgQGlmICgkdHlwZSA9PSB3aWR0aCkgYW5kICgkaW5kZXggPiAwKSB7XG4gICAgLmNvbC0jeyRjbGFzc30tI3skaW5kZXh9IHtcbiAgICAgIHdpZHRoOiBwZXJjZW50YWdlKCgkaW5kZXggLyAkZ3JpZC1jb2x1bW5zKSk7XG4gICAgfVxuICB9XG4gIEBpZiAoJHR5cGUgPT0gcHVzaCkgYW5kICgkaW5kZXggPiAwKSB7XG4gICAgLmNvbC0jeyRjbGFzc30tcHVzaC0jeyRpbmRleH0ge1xuICAgICAgbGVmdDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxuICBAaWYgKCR0eXBlID09IHB1c2gpIGFuZCAoJGluZGV4ID09IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdXNoLTAge1xuICAgICAgbGVmdDogYXV0bztcbiAgICB9XG4gIH1cbiAgQGlmICgkdHlwZSA9PSBwdWxsKSBhbmQgKCRpbmRleCA+IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdWxsLSN7JGluZGV4fSB7XG4gICAgICByaWdodDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxuICBAaWYgKCR0eXBlID09IHB1bGwpIGFuZCAoJGluZGV4ID09IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdWxsLTAge1xuICAgICAgcmlnaHQ6IGF1dG87XG4gICAgfVxuICB9XG4gIEBpZiAoJHR5cGUgPT0gb2Zmc2V0KSB7XG4gICAgLmNvbC0jeyRjbGFzc30tb2Zmc2V0LSN7JGluZGV4fSB7XG4gICAgICBtYXJnaW4tbGVmdDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBbY29udmVydGVyXSBUaGlzIGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgaW4gTEVTUywgYnV0IFNhc3Mgc3VwcG9ydHMgcmVhbCBsb29wc1xuQG1peGluIGxvb3AtZ3JpZC1jb2x1bW5zKCRjb2x1bW5zLCAkY2xhc3MsICR0eXBlKSB7XG4gIEBmb3IgJGkgZnJvbSAwIHRocm91Z2ggJGNvbHVtbnMge1xuICAgIEBpbmNsdWRlIGNhbGMtZ3JpZC1jb2x1bW4oJGksICRjbGFzcywgJHR5cGUpO1xuICB9XG59XG5cblxuLy8gQ3JlYXRlIGdyaWQgZm9yIHNwZWNpZmljIGNsYXNzXG5AbWl4aW4gbWFrZS1ncmlkKCRjbGFzcykge1xuICBAaW5jbHVkZSBmbG9hdC1ncmlkLWNvbHVtbnMoJGNsYXNzKTtcbiAgQGluY2x1ZGUgbG9vcC1ncmlkLWNvbHVtbnMoJGdyaWQtY29sdW1ucywgJGNsYXNzLCB3aWR0aCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgcHVsbCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgcHVzaCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgb2Zmc2V0KTtcbn1cbiIsIi8vXG4vLyBUYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxudGFibGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdGFibGUtYmc7XG59XG5jYXB0aW9uIHtcbiAgcGFkZGluZy10b3A6ICR0YWJsZS1jZWxsLXBhZGRpbmc7XG4gIHBhZGRpbmctYm90dG9tOiAkdGFibGUtY2VsbC1wYWRkaW5nO1xuICBjb2xvcjogJHRleHQtbXV0ZWQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG50aCB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cblxuLy8gQmFzZWxpbmUgc3R5bGVzXG5cbi50YWJsZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgLy8gQ2VsbHNcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIHBhZGRpbmc6ICR0YWJsZS1jZWxsLXBhZGRpbmc7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEJvdHRvbSBhbGlnbiBmb3IgY29sdW1uIGhlYWRpbmdzXG4gID4gdGhlYWQgPiB0ciA+IHRoIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAkdGFibGUtYm9yZGVyLWNvbG9yO1xuICB9XG4gIC8vIFJlbW92ZSB0b3AgYm9yZGVyIGZyb20gdGhlYWQgYnkgZGVmYXVsdFxuICA+IGNhcHRpb24gKyB0aGVhZCxcbiAgPiBjb2xncm91cCArIHRoZWFkLFxuICA+IHRoZWFkOmZpcnN0LWNoaWxkIHtcbiAgICA+IHRyOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gdGgsXG4gICAgICA+IHRkIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gQWNjb3VudCBmb3IgbXVsdGlwbGUgdGJvZHkgaW5zdGFuY2VzXG4gID4gdGJvZHkgKyB0Ym9keSB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gIH1cblxuICAvLyBOZXN0aW5nXG4gIC50YWJsZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmc7XG4gIH1cbn1cblxuXG4vLyBDb25kZW5zZWQgdGFibGUgdy8gaGFsZiBwYWRkaW5nXG5cbi50YWJsZS1jb25kZW5zZWQge1xuICA+IHRoZWFkLFxuICA+IHRib2R5LFxuICA+IHRmb290IHtcbiAgICA+IHRyIHtcbiAgICAgID4gdGgsXG4gICAgICA+IHRkIHtcbiAgICAgICAgcGFkZGluZzogJHRhYmxlLWNvbmRlbnNlZC1jZWxsLXBhZGRpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gQm9yZGVyZWQgdmVyc2lvblxuLy9cbi8vIEFkZCBib3JkZXJzIGFsbCBhcm91bmQgdGhlIHRhYmxlIGFuZCBiZXR3ZWVuIGFsbCB0aGUgY29sdW1ucy5cblxuLnRhYmxlLWJvcmRlcmVkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgJHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gdGhlYWQgPiB0ciB7XG4gICAgPiB0aCxcbiAgICA+IHRkIHtcbiAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDJweDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBaZWJyYS1zdHJpcGluZ1xuLy9cbi8vIERlZmF1bHQgemVicmEtc3RyaXBlIHN0eWxlcyAoYWx0ZXJuYXRpbmcgZ3JheSBhbmQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZHMpXG5cbi50YWJsZS1zdHJpcGVkIHtcbiAgPiB0Ym9keSA+IHRyOm50aC1vZi10eXBlKG9kZCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR0YWJsZS1iZy1hY2NlbnQ7XG4gIH1cbn1cblxuXG4vLyBIb3ZlciBlZmZlY3Rcbi8vXG4vLyBQbGFjZWQgaGVyZSBzaW5jZSBpdCBoYXMgdG8gY29tZSBhZnRlciB0aGUgcG90ZW50aWFsIHplYnJhIHN0cmlwaW5nXG5cbi50YWJsZS1ob3ZlciB7XG4gID4gdGJvZHkgPiB0cjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHRhYmxlLWJnLWhvdmVyO1xuICB9XG59XG5cblxuLy8gVGFibGUgY2VsbCBzaXppbmdcbi8vXG4vLyBSZXNldCBkZWZhdWx0IHRhYmxlIGJlaGF2aW9yXG5cbnRhYmxlIGNvbFtjbGFzcyo9XCJjb2wtXCJdIHtcbiAgcG9zaXRpb246IHN0YXRpYzsgLy8gUHJldmVudCBib3JkZXIgaGlkaW5nIGluIEZpcmVmb3ggYW5kIElFOS0xMSAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE2MjMpXG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiB0YWJsZS1jb2x1bW47XG59XG50YWJsZSB7XG4gIHRkLFxuICB0aCB7XG4gICAgJltjbGFzcyo9XCJjb2wtXCJdIHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0aWM7IC8vIFByZXZlbnQgYm9yZGVyIGhpZGluZyBpbiBGaXJlZm94IGFuZCBJRTktMTEgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjIzKVxuICAgICAgZmxvYXQ6IG5vbmU7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIFRhYmxlIGJhY2tncm91bmRzXG4vL1xuLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbi8vIGluaGVyaXRhbmNlIHRvIG5lc3RlZCB0YWJsZXMuXG5cbi8vIEdlbmVyYXRlIHRoZSBjb250ZXh0dWFsIHZhcmlhbnRzXG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnYWN0aXZlJywgJHRhYmxlLWJnLWFjdGl2ZSk7XG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLWJnKTtcbkBpbmNsdWRlIHRhYmxlLXJvdy12YXJpYW50KCdpbmZvJywgJHN0YXRlLWluZm8tYmcpO1xuQGluY2x1ZGUgdGFibGUtcm93LXZhcmlhbnQoJ3dhcm5pbmcnLCAkc3RhdGUtd2FybmluZy1iZyk7XG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnZGFuZ2VyJywgJHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUmVzcG9uc2l2ZSB0YWJsZXNcbi8vXG4vLyBXcmFwIHlvdXIgdGFibGVzIGluIGAudGFibGUtcmVzcG9uc2l2ZWAgYW5kIHdlJ2xsIG1ha2UgdGhlbSBtb2JpbGUgZnJpZW5kbHlcbi8vIGJ5IGVuYWJsaW5nIGhvcml6b250YWwgc2Nyb2xsaW5nLiBPbmx5IGFwcGxpZXMgPDc2OHB4LiBFdmVyeXRoaW5nIGFib3ZlIHRoYXRcbi8vIHdpbGwgZGlzcGxheSBub3JtYWxseS5cblxuLnRhYmxlLXJlc3BvbnNpdmUge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBtaW4taGVpZ2h0OiAwLjAxJTsgLy8gV29ya2Fyb3VuZCBmb3IgSUU5IGJ1ZyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTQ4MzcpXG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJHNjcmVlbi14cy1tYXgpIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMC43NSk7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogLW1zLWF1dG9oaWRpbmctc2Nyb2xsYmFyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG5cbiAgICAvLyBUaWdodGVuIHVwIHNwYWNpbmdcbiAgICA+IC50YWJsZSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGNvbnRlbnQgZG9lc24ndCB3cmFwXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoLFxuICAgICAgICAgID4gdGQge1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIG92ZXJyaWRlcyBmb3IgdGhlIGJvcmRlcmVkIHRhYmxlc1xuICAgID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICAgIGJvcmRlcjogMDtcblxuICAgICAgLy8gTnVrZSB0aGUgYXBwcm9wcmlhdGUgYm9yZGVycyBzbyB0aGF0IHRoZSBwYXJlbnQgY2FuIGhhbmRsZSB0aGVtXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICAgID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgID4gdGg6bGFzdC1jaGlsZCxcbiAgICAgICAgICA+IHRkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IG51a2UgdGhlIGxhc3Qgcm93J3MgYm90dG9tLWJvcmRlciBpbiBgdGJvZHlgIGFuZCBgdGZvb3RgIHNpbmNlXG4gICAgICAvLyBjaGFuY2VzIGFyZSB0aGVyZSB3aWxsIGJlIG9ubHkgb25lIGB0cmAgaW4gYSBgdGhlYWRgIGFuZCB0aGF0IHdvdWxkXG4gICAgICAvLyByZW1vdmUgdGhlIGJvcmRlciBhbHRvZ2V0aGVyLlxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICAgID4gdGgsXG4gICAgICAgICAgPiB0ZCB7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICB9XG59XG4iLCIvLyBUYWJsZXNcblxuQG1peGluIHRhYmxlLXJvdy12YXJpYW50KCRzdGF0ZSwgJGJhY2tncm91bmQpIHtcbiAgLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbiAgLy8gaW5oZXJpdGFuY2UgdG8gbmVzdGVkIHRhYmxlcy5cbiAgLnRhYmxlID4gdGhlYWQgPiB0cixcbiAgLnRhYmxlID4gdGJvZHkgPiB0cixcbiAgLnRhYmxlID4gdGZvb3QgPiB0ciB7XG4gICAgPiB0ZC4jeyRzdGF0ZX0sXG4gICAgPiB0aC4jeyRzdGF0ZX0sXG4gICAgJi4jeyRzdGF0ZX0gPiB0ZCxcbiAgICAmLiN7JHN0YXRlfSA+IHRoIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhvdmVyIHN0YXRlcyBmb3IgYC50YWJsZS1ob3ZlcmBcbiAgLy8gTm90ZTogdGhpcyBpcyBub3QgYXZhaWxhYmxlIGZvciBjZWxscyBvciByb3dzIHdpdGhpbiBgdGhlYWRgIG9yIGB0Zm9vdGAuXG4gIC50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIge1xuICAgID4gdGQuI3skc3RhdGV9OmhvdmVyLFxuICAgID4gdGguI3skc3RhdGV9OmhvdmVyLFxuICAgICYuI3skc3RhdGV9OmhvdmVyID4gdGQsXG4gICAgJjpob3ZlciA+IC4jeyRzdGF0ZX0sXG4gICAgJi4jeyRzdGF0ZX06aG92ZXIgPiB0aCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oJGJhY2tncm91bmQsIDUlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBGb3Jtc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBOb3JtYWxpemUgbm9uLWNvbnRyb2xzXG4vL1xuLy8gUmVzdHlsZSBhbmQgYmFzZWxpbmUgbm9uLWNvbnRyb2wgZm9ybSBlbGVtZW50cy5cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlcjogMDtcbiAgLy8gQ2hyb21lIGFuZCBGaXJlZm94IHNldCBhIGBtaW4td2lkdGg6IG1pbi1jb250ZW50O2Agb24gZmllbGRzZXRzLFxuICAvLyBzbyB3ZSByZXNldCB0aGF0IHRvIGVuc3VyZSBpdCBiZWhhdmVzIG1vcmUgbGlrZSBhIHN0YW5kYXJkIGJsb2NrIGVsZW1lbnQuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEyMzU5LlxuICBtaW4td2lkdGg6IDA7XG59XG5cbmxlZ2VuZCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBmb250LXNpemU6ICgkZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgY29sb3I6ICRsZWdlbmQtY29sb3I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRsZWdlbmQtYm9yZGVyLWNvbG9yO1xufVxuXG5sYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlOyAvLyBGb3JjZSBJRTggdG8gd3JhcCBsb25nIGNvbnRlbnQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEzMTQxKVxuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5cbi8vIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2xzXG4vL1xuLy8gV2hpbGUgbW9zdCBvZiBvdXIgZm9ybSBzdHlsZXMgcmVxdWlyZSBleHRyYSBjbGFzc2VzLCBzb21lIGJhc2ljIG5vcm1hbGl6YXRpb25cbi8vIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSBvcHRpbXVtIGRpc3BsYXkgd2l0aCBvciB3aXRob3V0IHRob3NlIGNsYXNzZXMgdG8gYmV0dGVyXG4vLyBhZGRyZXNzIGJyb3dzZXIgaW5jb25zaXN0ZW5jaWVzLlxuXG4vLyBPdmVycmlkZSBjb250ZW50LWJveCBpbiBOb3JtYWxpemUgKCogaXNuJ3Qgc3BlY2lmaWMgZW5vdWdoKVxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIEBpbmNsdWRlIGJveC1zaXppbmcoYm9yZGVyLWJveCk7XG59XG5cbi8vIFBvc2l0aW9uIHJhZGlvcyBhbmQgY2hlY2tib3hlcyBiZXR0ZXJcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIG1hcmdpbjogNHB4IDAgMDtcbiAgbWFyZ2luLXRvcDogMXB4IFxcOTsgLy8gSUU4LTlcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuaW5wdXRbdHlwZT1cImZpbGVcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLy8gTWFrZSByYW5nZSBpbnB1dHMgYmVoYXZlIGxpa2UgdGV4dHVhbCBmb3JtIGNvbnRyb2xzXG5pbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi8vIE1ha2UgbXVsdGlwbGUgc2VsZWN0IGVsZW1lbnRzIGhlaWdodCBub3QgZml4ZWRcbnNlbGVjdFttdWx0aXBsZV0sXG5zZWxlY3Rbc2l6ZV0ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8vIEZvY3VzIGZvciBmaWxlLCByYWRpbywgYW5kIGNoZWNrYm94XG5pbnB1dFt0eXBlPVwiZmlsZVwiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpmb2N1cyB7XG4gIEBpbmNsdWRlIHRhYi1mb2N1cztcbn1cblxuLy8gQWRqdXN0IG91dHB1dCBlbGVtZW50XG5vdXRwdXQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7XG4gIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1iYXNlO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiAkaW5wdXQtY29sb3I7XG59XG5cblxuLy8gQ29tbW9uIGZvcm0gY29udHJvbHNcbi8vXG4vLyBTaGFyZWQgc2l6ZSBhbmQgdHlwZSByZXNldHMgZm9yIGZvcm0gY29udHJvbHMuIEFwcGx5IGAuZm9ybS1jb250cm9sYCB0byBhbnlcbi8vIG9mIHRoZSBmb2xsb3dpbmcgZm9ybSBjb250cm9sczpcbi8vXG4vLyBzZWxlY3Rcbi8vIHRleHRhcmVhXG4vLyBpbnB1dFt0eXBlPVwidGV4dFwiXVxuLy8gaW5wdXRbdHlwZT1cInBhc3N3b3JkXCJdXG4vLyBpbnB1dFt0eXBlPVwiZGF0ZXRpbWVcIl1cbi8vIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXVxuLy8gaW5wdXRbdHlwZT1cImRhdGVcIl1cbi8vIGlucHV0W3R5cGU9XCJtb250aFwiXVxuLy8gaW5wdXRbdHlwZT1cInRpbWVcIl1cbi8vIGlucHV0W3R5cGU9XCJ3ZWVrXCJdXG4vLyBpbnB1dFt0eXBlPVwibnVtYmVyXCJdXG4vLyBpbnB1dFt0eXBlPVwiZW1haWxcIl1cbi8vIGlucHV0W3R5cGU9XCJ1cmxcIl1cbi8vIGlucHV0W3R5cGU9XCJzZWFyY2hcIl1cbi8vIGlucHV0W3R5cGU9XCJ0ZWxcIl1cbi8vIGlucHV0W3R5cGU9XCJjb2xvclwiXVxuXG4uZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtYmFzZTsgLy8gTWFrZSBpbnB1dHMgYXQgbGVhc3QgdGhlIGhlaWdodCBvZiB0aGVpciBidXR0b24gY291bnRlcnBhcnQgKGJhc2UgbGluZS1oZWlnaHQgKyBwYWRkaW5nICsgYm9yZGVyKVxuICBwYWRkaW5nOiAkcGFkZGluZy1iYXNlLXZlcnRpY2FsICRwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICRpbnB1dC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0LWJnO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkICRpbnB1dC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRpbnB1dC1ib3JkZXItcmFkaXVzOyAvLyBOb3RlOiBUaGlzIGhhcyBubyBlZmZlY3Qgb24gPHNlbGVjdD5zIGluIHNvbWUgYnJvd3NlcnMsIGR1ZSB0byB0aGUgbGltaXRlZCBzdHlsYWJpbGl0eSBvZiA8c2VsZWN0PnMgaW4gQ1NTLlxuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpKTtcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAuMTVzKTtcblxuICAvLyBDdXN0b21pemUgdGhlIGA6Zm9jdXNgIHN0YXRlIHRvIGltaXRhdGUgbmF0aXZlIFdlYktpdCBzdHlsZXMuXG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC1mb2N1cztcblxuICAvLyBQbGFjZWhvbGRlclxuICBAaW5jbHVkZSBwbGFjZWhvbGRlcjtcblxuICAvLyBEaXNhYmxlZCBhbmQgcmVhZC1vbmx5IGlucHV0c1xuICAvL1xuICAvLyBIVE1MNSBzYXlzIHRoYXQgY29udHJvbHMgdW5kZXIgYSBmaWVsZHNldCA+IGxlZ2VuZDpmaXJzdC1jaGlsZCB3b24ndCBiZVxuICAvLyBkaXNhYmxlZCBpZiB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQuIER1ZSB0byBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHR5LCB3ZVxuICAvLyBkb24ndCBob25vciB0aGF0IGVkZ2UgY2FzZTsgd2Ugc3R5bGUgdGhlbSBhcyBkaXNhYmxlZCBhbnl3YXkuXG4gICZbZGlzYWJsZWRdLFxuICAmW3JlYWRvbmx5XSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1iZy1kaXNhYmxlZDtcbiAgICBvcGFjaXR5OiAxOyAvLyBpT1MgZml4IGZvciB1bnJlYWRhYmxlIGRpc2FibGVkIGNvbnRlbnQ7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjU1XG4gIH1cblxuICAmW2Rpc2FibGVkXSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxuXG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCB0ZXh0YXJlYSYgdG8gdGV4dGFyZWEuZm9ybS1jb250cm9sXG59XG5cbi8vIFJlc2V0IGhlaWdodCBmb3IgYHRleHRhcmVhYHNcbnRleHRhcmVhLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuXG4vLyBTZWFyY2ggaW5wdXRzIGluIGlPU1xuLy9cbi8vIFRoaXMgb3ZlcnJpZGVzIHRoZSBleHRyYSByb3VuZGVkIGNvcm5lcnMgb24gc2VhcmNoIGlucHV0cyBpbiBpT1Mgc28gdGhhdCBvdXJcbi8vIGAuZm9ybS1jb250cm9sYCBjbGFzcyBjYW4gcHJvcGVybHkgc3R5bGUgdGhlbS4gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHNpbXBseVxuLy8gYmUgYWRkZWQgdG8gYC5mb3JtLWNvbnRyb2xgIGFzIGl0J3Mgbm90IHNwZWNpZmljIGVub3VnaC4gRm9yIGRldGFpbHMsIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTU4Ni5cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuXG4vLyBTcGVjaWFsIHN0eWxlcyBmb3IgaU9TIHRlbXBvcmFsIGlucHV0c1xuLy9cbi8vIEluIE1vYmlsZSBTYWZhcmksIHNldHRpbmcgYGRpc3BsYXk6IGJsb2NrYCBvbiB0ZW1wb3JhbCBpbnB1dHMgY2F1c2VzIHRoZVxuLy8gdGV4dCB3aXRoaW4gdGhlIGlucHV0IHRvIGJlY29tZSB2ZXJ0aWNhbGx5IG1pc2FsaWduZWQuIEFzIGEgd29ya2Fyb3VuZCwgd2Vcbi8vIHNldCBhIHBpeGVsIGxpbmUtaGVpZ2h0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaGVpZ2h0IG9mIHRoZSBpbnB1dCwgYnV0IG9ubHlcbi8vIGZvciBTYWZhcmkuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM5ODQ4XG4vL1xuLy8gTm90ZSB0aGF0IGFzIG9mIDguMywgaU9TIGRvZXNuJ3Qgc3VwcG9ydCBgZGF0ZXRpbWVgIG9yIGB3ZWVrYC5cblxuQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMCkge1xuICBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0sXG4gIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbiAgaW5wdXRbdHlwZT1cIm1vbnRoXCJdIHtcbiAgICAmLmZvcm0tY29udHJvbCB7XG4gICAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICAgIH1cblxuICAgICYuaW5wdXQtc20sXG4gICAgLmlucHV0LWdyb3VwLXNtICYge1xuICAgICAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQtc21hbGw7XG4gICAgfVxuXG4gICAgJi5pbnB1dC1sZyxcbiAgICAuaW5wdXQtZ3JvdXAtbGcgJiB7XG4gICAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1sYXJnZTtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBGb3JtIGdyb3Vwc1xuLy9cbi8vIERlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGUgb3JnYW5pemF0aW9uIGFuZCBzcGFjaW5nIG9mIHZlcnRpY2FsIGZvcm1zLiBGb3Jcbi8vIGhvcml6b250YWwgZm9ybXMsIHVzZSB0aGUgcHJlZGVmaW5lZCBncmlkIGNsYXNzZXMuXG5cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogJGZvcm0tZ3JvdXAtbWFyZ2luLWJvdHRvbTtcbn1cblxuXG4vLyBDaGVja2JveGVzIGFuZCByYWRpb3Ncbi8vXG4vLyBJbmRlbnQgdGhlIGxhYmVscyB0byBwb3NpdGlvbiByYWRpb3MvY2hlY2tib3hlcyBhcyBoYW5naW5nIGNvbnRyb2xzLlxuXG4ucmFkaW8sXG4uY2hlY2tib3gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuXG4gIGxhYmVsIHtcbiAgICBtaW4taGVpZ2h0OiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7IC8vIEVuc3VyZSB0aGUgaW5wdXQgZG9lc24ndCBqdW1wIHdoZW4gdGhlcmUgaXMgbm8gdGV4dFxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4ucmFkaW8gaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuLnJhZGlvLWlubGluZSBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4uY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi1sZWZ0OiAtMjBweDtcbiAgbWFyZ2luLXRvcDogNHB4IFxcOTtcbn1cblxuLnJhZGlvICsgLnJhZGlvLFxuLmNoZWNrYm94ICsgLmNoZWNrYm94IHtcbiAgbWFyZ2luLXRvcDogLTVweDsgLy8gTW92ZSB1cCBzaWJsaW5nIHJhZGlvcyBvciBjaGVja2JveGVzIGZvciB0aWdodGVyIHNwYWNpbmdcbn1cblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIG9uIHNhbWUgbGluZVxuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmFkaW8taW5saW5lICsgLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUgKyAuY2hlY2tib3gtaW5saW5lIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7IC8vIHNwYWNlIG91dCBjb25zZWN1dGl2ZSBpbmxpbmUgY29udHJvbHNcbn1cblxuLy8gQXBwbHkgc2FtZSBkaXNhYmxlZCBjdXJzb3IgdHdlYWsgYXMgZm9yIGlucHV0c1xuLy8gU29tZSBzcGVjaWFsIGNhcmUgaXMgbmVlZGVkIGJlY2F1c2UgPGxhYmVsPnMgZG9uJ3QgaW5oZXJpdCB0aGVpciBwYXJlbnQncyBgY3Vyc29yYC5cbi8vXG4vLyBOb3RlOiBOZWl0aGVyIHJhZGlvcyBub3IgY2hlY2tib3hlcyBjYW4gYmUgcmVhZG9ubHkuXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAmW2Rpc2FibGVkXSxcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuLy8gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBkaXJlY3RseSBvbiA8bGFiZWw+c1xuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICAmLmRpc2FibGVkLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgY3Vyc29yOiAkY3Vyc29yLWRpc2FibGVkO1xuICB9XG59XG4vLyBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIG9uIGVsZW1lbnRzIHdpdGggPGxhYmVsPiBkZXNjZW5kYW50c1xuLnJhZGlvLFxuLmNoZWNrYm94IHtcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGxhYmVsIHtcbiAgICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBTdGF0aWMgZm9ybSBjb250cm9sIHRleHRcbi8vXG4vLyBBcHBseSBjbGFzcyB0byBhIGBwYCBlbGVtZW50IHRvIG1ha2UgYW55IHN0cmluZyBvZiB0ZXh0IGFsaWduIHdpdGggbGFiZWxzIGluXG4vLyBhIGhvcml6b250YWwgZm9ybSBsYXlvdXQuXG5cbi5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgLy8gU2l6ZSBpdCBhcHByb3ByaWF0ZWx5IG5leHQgdG8gcmVhbCBmb3JtIGNvbnRyb2xzXG4gIHBhZGRpbmctdG9wOiAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpO1xuICBwYWRkaW5nLWJvdHRvbTogKCRwYWRkaW5nLWJhc2UtdmVydGljYWwgKyAxKTtcbiAgLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luIGZyb20gYHBgXG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLWJhc2UpO1xuXG4gICYuaW5wdXQtbGcsXG4gICYuaW5wdXQtc20ge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIEJ1aWxkIG9uIGAuZm9ybS1jb250cm9sYCB3aXRoIG1vZGlmaWVyIGNsYXNzZXMgdG8gZGVjcmVhc2Ugb3IgaW5jcmVhc2UgdGhlXG4vLyBoZWlnaHQgYW5kIGZvbnQtc2l6ZSBvZiBmb3JtIGNvbnRyb2xzLlxuLy9cbi8vIFRoZSBgLmZvcm0tZ3JvdXAtKiBmb3JtLWNvbnRyb2xgIHZhcmlhdGlvbnMgYXJlIHNhZGx5IGR1cGxpY2F0ZWQgdG8gYXZvaWQgdGhlXG4vLyBpc3N1ZSBkb2N1bWVudGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTUwNzQuXG5cbkBpbmNsdWRlIGlucHV0LXNpemUoJy5pbnB1dC1zbScsICRpbnB1dC1oZWlnaHQtc21hbGwsICRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsLCAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsLCAkZm9udC1zaXplLXNtYWxsLCAkbGluZS1oZWlnaHQtc21hbGwsICRpbnB1dC1ib3JkZXItcmFkaXVzLXNtYWxsKTtcbi5mb3JtLWdyb3VwLXNtIHtcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIHBhZGRpbmc6ICRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsICRwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogJGlucHV0LWJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICB9XG4gIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbiAgc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLXNtYWxsKTtcbiAgICBwYWRkaW5nOiAoJHBhZGRpbmctc21hbGwtdmVydGljYWwgKyAxKSAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LXNtYWxsO1xuICB9XG59XG5cbkBpbmNsdWRlIGlucHV0LXNpemUoJy5pbnB1dC1sZycsICRpbnB1dC1oZWlnaHQtbGFyZ2UsICRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsLCAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsLCAkZm9udC1zaXplLWxhcmdlLCAkbGluZS1oZWlnaHQtbGFyZ2UsICRpbnB1dC1ib3JkZXItcmFkaXVzLWxhcmdlKTtcbi5mb3JtLWdyb3VwLWxnIHtcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIHBhZGRpbmc6ICRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICRwYWRkaW5nLWxhcmdlLWhvcml6b250YWw7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLWxhcmdlO1xuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogJGlucHV0LWJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cbiAgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICB9XG4gIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbiAgc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLWxhcmdlKTtcbiAgICBwYWRkaW5nOiAoJHBhZGRpbmctbGFyZ2UtdmVydGljYWwgKyAxKSAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1sYXJnZTtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWxhcmdlO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIGZlZWRiYWNrIHN0YXRlc1xuLy9cbi8vIEFwcGx5IGNvbnRleHR1YWwgYW5kIHNlbWFudGljIHN0YXRlcyB0byBpbmRpdmlkdWFsIGZvcm0gY29udHJvbHMuXG5cbi5oYXMtZmVlZGJhY2sge1xuICAvLyBFbmFibGUgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC8vIEVuc3VyZSBpY29ucyBkb24ndCBvdmVybGFwIHRleHRcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgcGFkZGluZy1yaWdodDogKCRpbnB1dC1oZWlnaHQtYmFzZSAqIDEuMjUpO1xuICB9XG59XG4vLyBGZWVkYmFjayBpY29uIChyZXF1aXJlcyAuZ2x5cGhpY29uIGNsYXNzZXMpXG4uZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICB6LWluZGV4OiAyOyAvLyBFbnN1cmUgaWNvbiBpcyBhYm92ZSBpbnB1dCBncm91cHNcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LWJhc2U7XG4gIGhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLmlucHV0LWxnICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1sZyArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtbGFyZ2U7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xufVxuLmlucHV0LXNtICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1zbSArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uZm9ybS1ncm91cC1zbSAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtc21hbGw7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xufVxuXG4vLyBGZWVkYmFjayBzdGF0ZXNcbi5oYXMtc3VjY2VzcyB7XG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCRzdGF0ZS1zdWNjZXNzLXRleHQsICRzdGF0ZS1zdWNjZXNzLXRleHQsICRzdGF0ZS1zdWNjZXNzLWJnKTtcbn1cbi5oYXMtd2FybmluZyB7XG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCRzdGF0ZS13YXJuaW5nLXRleHQsICRzdGF0ZS13YXJuaW5nLXRleHQsICRzdGF0ZS13YXJuaW5nLWJnKTtcbn1cbi5oYXMtZXJyb3Ige1xuICBAaW5jbHVkZSBmb3JtLWNvbnRyb2wtdmFsaWRhdGlvbigkc3RhdGUtZGFuZ2VyLXRleHQsICRzdGF0ZS1kYW5nZXItdGV4dCwgJHN0YXRlLWRhbmdlci1iZyk7XG59XG5cbi8vIFJlcG9zaXRpb24gZmVlZGJhY2sgaWNvbiBpZiBpbnB1dCBoYXMgdmlzaWJsZSBsYWJlbCBhYm92ZVxuLmhhcy1mZWVkYmFjayBsYWJlbCB7XG5cbiAgJiB+IC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICB0b3A6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyA1KTsgLy8gSGVpZ2h0IG9mIHRoZSBgbGFiZWxgIGFuZCBpdHMgbWFyZ2luXG4gIH1cbiAgJi5zci1vbmx5IH4gLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gICAgIHRvcDogMDtcbiAgfVxufVxuXG5cbi8vIEhlbHAgdGV4dFxuLy9cbi8vIEFwcGx5IHRvIGFueSBlbGVtZW50IHlvdSB3aXNoIHRvIGNyZWF0ZSBsaWdodCB0ZXh0IGZvciBwbGFjZW1lbnQgaW1tZWRpYXRlbHlcbi8vIGJlbG93IGEgZm9ybSBjb250cm9sLiBVc2UgZm9yIGdlbmVyYWwgaGVscCwgZm9ybWF0dGluZywgb3IgaW5zdHJ1Y3Rpb25hbCB0ZXh0LlxuXG4uaGVscC1ibG9jayB7XG4gIGRpc3BsYXk6IGJsb2NrOyAvLyBhY2NvdW50IGZvciBhbnkgZWxlbWVudCB1c2luZyBoZWxwLWJsb2NrXG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgY29sb3I6IGxpZ2h0ZW4oJHRleHQtY29sb3IsIDI1JSk7IC8vIGxpZ2h0ZW4gdGhlIHRleHQgc29tZSBmb3IgY29udHJhc3Rcbn1cblxuXG4vLyBJbmxpbmUgZm9ybXNcbi8vXG4vLyBNYWtlIGZvcm1zIGFwcGVhciBpbmxpbmUoLWJsb2NrKSBieSBhZGRpbmcgdGhlIGAuZm9ybS1pbmxpbmVgIGNsYXNzLiBJbmxpbmVcbi8vIGZvcm1zIGJlZ2luIHN0YWNrZWQgb24gZXh0cmEgc21hbGwgKG1vYmlsZSkgZGV2aWNlcyBhbmQgdGhlbiBnbyBpbmxpbmUgd2hlblxuLy8gdmlld3BvcnRzIHJlYWNoIDw3NjhweC5cbi8vXG4vLyBSZXF1aXJlcyB3cmFwcGluZyBpbnB1dHMgYW5kIGxhYmVscyB3aXRoIGAuZm9ybS1ncm91cGAgZm9yIHByb3BlciBkaXNwbGF5IG9mXG4vLyBkZWZhdWx0IEhUTUwgZm9ybSBjb250cm9scyBhbmQgb3VyIGN1c3RvbSBmb3JtIGNvbnRyb2xzIChlLmcuLCBpbnB1dCBncm91cHMpLlxuLy9cbi8vIEhlYWRzIHVwISBUaGlzIGlzIG1peGluLWVkIGludG8gYC5uYXZiYXItZm9ybWAgaW4gbmF2YmFycy5sZXNzLlxuXG4vLyBbY29udmVydGVyXSBleHRyYWN0ZWQgZnJvbSBgLmZvcm0taW5saW5lYCBmb3IgbGlic2FzcyBjb21wYXRpYmlsaXR5XG5AbWl4aW4gZm9ybS1pbmxpbmUge1xuXG4gIC8vIEtpY2sgaW4gdGhlIGlubGluZVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICAvLyBJbmxpbmUtYmxvY2sgYWxsIHRoZSB0aGluZ3MgZm9yIFwiaW5saW5lXCJcbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBJbiBuYXZiYXItZm9ybSwgYWxsb3cgZm9sa3MgdG8gKm5vdCogdXNlIGAuZm9ybS1ncm91cGBcbiAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiBhdXRvOyAvLyBQcmV2ZW50IGxhYmVscyBmcm9tIHN0YWNraW5nIGFib3ZlIGlucHV0cyBpbiBgLmZvcm0tZ3JvdXBgXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3RhdGljIGNvbnRyb2xzIGJlaGF2ZSBsaWtlIHJlZ3VsYXIgb25lc1xuICAgIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG5cbiAgICAuaW5wdXQtZ3JvdXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgICAgLmlucHV0LWdyb3VwLWFkZG9uLFxuICAgICAgLmlucHV0LWdyb3VwLWJ0bixcbiAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnB1dCBncm91cHMgbmVlZCB0aGF0IDEwMCUgd2lkdGggdGhvdWdoXG4gICAgLmlucHV0LWdyb3VwID4gLmZvcm0tY29udHJvbCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuY29udHJvbC1sYWJlbCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZGVmYXVsdCBtYXJnaW4gb24gcmFkaW9zL2NoZWNrYm94ZXMgdGhhdCB3ZXJlIHVzZWQgZm9yIHN0YWNraW5nLCBhbmRcbiAgICAvLyB0aGVuIHVuZG8gdGhlIGZsb2F0aW5nIG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlcyB0byBtYXRjaC5cbiAgICAucmFkaW8sXG4gICAgLmNoZWNrYm94IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgICAgbGFiZWwge1xuICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuICAgIC5yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4gICAgLmNoZWNrYm94IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICB9XG5cbiAgICAvLyBSZS1vdmVycmlkZSB0aGUgZmVlZGJhY2sgaWNvbi5cbiAgICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICAgdG9wOiAwO1xuICAgIH1cbiAgfVxufVxuLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGFzIGBAbWl4aW4gZm9ybS1pbmxpbmVgIGZvciBsaWJzYXNzIGNvbXBhdGliaWxpdHlcbi5mb3JtLWlubGluZSB7XG4gIEBpbmNsdWRlIGZvcm0taW5saW5lO1xufVxuXG5cblxuLy8gSG9yaXpvbnRhbCBmb3Jtc1xuLy9cbi8vIEhvcml6b250YWwgZm9ybXMgYXJlIGJ1aWx0IG9uIGdyaWQgY2xhc3NlcyBhbmQgYWxsb3cgeW91IHRvIGNyZWF0ZSBmb3JtcyB3aXRoXG4vLyBsYWJlbHMgb24gdGhlIGxlZnQgYW5kIGlucHV0cyBvbiB0aGUgcmlnaHQuXG5cbi5mb3JtLWhvcml6b250YWwge1xuXG4gIC8vIENvbnNpc3RlbnQgdmVydGljYWwgYWxpZ25tZW50IG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlc1xuICAvL1xuICAvLyBMYWJlbHMgYWxzbyBnZXQgc29tZSByZXNldCBzdHlsZXMsIGJ1dCB0aGF0IGlzIHNjb3BlZCB0byBhIG1lZGlhIHF1ZXJ5IGJlbG93LlxuICAucmFkaW8sXG4gIC5jaGVja2JveCxcbiAgLnJhZGlvLWlubGluZSxcbiAgLmNoZWNrYm94LWlubGluZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHBhZGRpbmctdG9wOiAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpOyAvLyBEZWZhdWx0IHBhZGRpbmcgcGx1cyBhIGJvcmRlclxuICB9XG4gIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgd2UncmUgYWRkaW5nIHRvIGVuc3VyZSB0aGUgYWxpZ25tZW50IGFuZCBvZiBoZWxwIHRleHRcbiAgLy8gYW5kIG90aGVyIGNvbnRlbnQgYmVsb3cgaXRlbXNcbiAgLnJhZGlvLFxuICAuY2hlY2tib3gge1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpKTtcbiAgfVxuXG4gIC8vIE1ha2UgZm9ybSBncm91cHMgYmVoYXZlIGxpa2Ugcm93c1xuICAuZm9ybS1ncm91cCB7XG4gICAgQGluY2x1ZGUgbWFrZS1yb3c7XG4gIH1cblxuICAvLyBSZXNldCBzcGFjaW5nIGFuZCByaWdodCBhbGlnbiBsYWJlbHMsIGJ1dCBzY29wZSB0byBtZWRpYSBxdWVyaWVzIHNvIHRoYXRcbiAgLy8gbGFiZWxzIG9uIG5hcnJvdyB2aWV3cG9ydHMgc3RhY2sgdGhlIHNhbWUgYXMgYSBkZWZhdWx0IGZvcm0gZXhhbXBsZS5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgLmNvbnRyb2wtbGFiZWwge1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7IC8vIERlZmF1bHQgcGFkZGluZyBwbHVzIGEgYm9yZGVyXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGlvbiBzdGF0ZXNcbiAgLy9cbiAgLy8gUmVwb3NpdGlvbiB0aGUgaWNvbiBiZWNhdXNlIGl0J3Mgbm93IHdpdGhpbiBhIGdyaWQgY29sdW1uIGFuZCBjb2x1bW5zIGhhdmVcbiAgLy8gYHBvc2l0aW9uOiByZWxhdGl2ZTtgIG9uIHRoZW0uIEFsc28gYWNjb3VudHMgZm9yIHRoZSBncmlkIGd1dHRlciBwYWRkaW5nLlxuICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIHJpZ2h0OiBmbG9vcigoJGdyaWQtZ3V0dGVyLXdpZHRoIC8gMikpO1xuICB9XG5cbiAgLy8gRm9ybSBncm91cCBzaXplc1xuICAvL1xuICAvLyBRdWljayB1dGlsaXR5IGNsYXNzIGZvciBhcHBseWluZyBgLmlucHV0LWxnYCBhbmQgYC5pbnB1dC1zbWAgc3R5bGVzIHRvIHRoZVxuICAvLyBpbnB1dHMgYW5kIGxhYmVscyB3aXRoaW4gYSBgLmZvcm0tZ3JvdXBgLlxuICAuZm9ybS1ncm91cC1sZyB7XG4gICAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgICAuY29udHJvbC1sYWJlbCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAoKCRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICogJGxpbmUtaGVpZ2h0LWxhcmdlKSArIDEpO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtbGFyZ2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC5mb3JtLWdyb3VwLXNtIHtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICAgIC5jb250cm9sLWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCArIDEpO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3JtIHZhbGlkYXRpb24gc3RhdGVzXG4vL1xuLy8gVXNlZCBpbiBmb3Jtcy5sZXNzIHRvIGdlbmVyYXRlIHRoZSBmb3JtIHZhbGlkYXRpb24gQ1NTIGZvciB3YXJuaW5ncywgZXJyb3JzLFxuLy8gYW5kIHN1Y2Nlc3Nlcy5cblxuQG1peGluIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCR0ZXh0LWNvbG9yOiAjNTU1LCAkYm9yZGVyLWNvbG9yOiAjY2NjLCAkYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNSkge1xuICAvLyBDb2xvciB0aGUgbGFiZWwgYW5kIGhlbHAgdGV4dFxuICAuaGVscC1ibG9jayxcbiAgLmNvbnRyb2wtbGFiZWwsXG4gIC5yYWRpbyxcbiAgLmNoZWNrYm94LFxuICAucmFkaW8taW5saW5lLFxuICAuY2hlY2tib3gtaW5saW5lLFxuICAmLnJhZGlvIGxhYmVsLFxuICAmLmNoZWNrYm94IGxhYmVsLFxuICAmLnJhZGlvLWlubGluZSBsYWJlbCxcbiAgJi5jaGVja2JveC1pbmxpbmUgbGFiZWwgIHtcbiAgICBjb2xvcjogJHRleHQtY29sb3I7XG4gIH1cbiAgLy8gU2V0IHRoZSBib3JkZXIgYW5kIGJveCBzaGFkb3cgb24gc3BlY2lmaWMgaW5wdXRzIHRvIG1hdGNoXG4gIC5mb3JtLWNvbnRyb2wge1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpKTsgLy8gUmVkZWNsYXJlIHNvIHRyYW5zaXRpb25zIHdvcmtcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogZGFya2VuKCRib3JkZXItY29sb3IsIDEwJSk7XG4gICAgICAkc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwgMCAwIDZweCBsaWdodGVuKCRib3JkZXItY29sb3IsIDIwJSk7XG4gICAgICBAaW5jbHVkZSBib3gtc2hhZG93KCRzaGFkb3cpO1xuICAgIH1cbiAgfVxuICAvLyBTZXQgdmFsaWRhdGlvbiBzdGF0ZXMgYWxzbyBmb3IgYWRkb25zXG4gIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gICAgY29sb3I6ICR0ZXh0LWNvbG9yO1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZC1jb2xvcjtcbiAgfVxuICAvLyBPcHRpb25hbCBmZWVkYmFjayBpY29uXG4gIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIGNvbG9yOiAkdGV4dC1jb2xvcjtcbiAgfVxufVxuXG5cbi8vIEZvcm0gY29udHJvbCBmb2N1cyBzdGF0ZVxuLy9cbi8vIEdlbmVyYXRlIGEgY3VzdG9taXplZCBmb2N1cyBzdGF0ZSBhbmQgZm9yIGFueSBpbnB1dCB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IsXG4vLyB3aGljaCBkZWZhdWx0cyB0byB0aGUgYCRpbnB1dC1ib3JkZXItZm9jdXNgIHZhcmlhYmxlLlxuLy9cbi8vIFdlIGhpZ2hseSBlbmNvdXJhZ2UgeW91IHRvIG5vdCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdmFsdWUsIGJ1dCBpbnN0ZWFkIHVzZVxuLy8gdGhpcyB0byB0d2VhayBjb2xvcnMgb24gYW4gYXMtbmVlZGVkIGJhc2lzLiBUaGlzIGFlc3RoZXRpYyBjaGFuZ2UgaXMgYmFzZWQgb25cbi8vIFdlYktpdCdzIGRlZmF1bHQgc3R5bGVzLCBidXQgYXBwbGljYWJsZSB0byBhIHdpZGVyIHJhbmdlIG9mIGJyb3dzZXJzLiBJdHNcbi8vIHVzYWJpbGl0eSBhbmQgYWNjZXNzaWJpbGl0eSBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IHdpdGggYW55IGNoYW5nZS5cbi8vXG4vLyBFeGFtcGxlIHVzYWdlOiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmx1ZSBib3JkZXIgYW5kIHNoYWRvdyB0byB3aGl0ZSBmb3IgYmV0dGVyXG4vLyBjb250cmFzdCBhZ2FpbnN0IGEgZGFyayBncmF5IGJhY2tncm91bmQuXG5AbWl4aW4gZm9ybS1jb250cm9sLWZvY3VzKCRjb2xvcjogJGlucHV0LWJvcmRlci1mb2N1cykge1xuICAkY29sb3ItcmdiYTogcmdiYShyZWQoJGNvbG9yKSwgZ3JlZW4oJGNvbG9yKSwgYmx1ZSgkY29sb3IpLCAuNik7XG4gICY6Zm9jdXMge1xuICAgIGJvcmRlci1jb2xvcjogJGNvbG9yO1xuICAgIG91dGxpbmU6IDA7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwgMCAwIDhweCAkY29sb3ItcmdiYSk7XG4gIH1cbn1cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIFJlbGF0aXZlIHRleHQgc2l6ZSwgcGFkZGluZywgYW5kIGJvcmRlci1yYWRpaSBjaGFuZ2VzIGZvciBmb3JtIGNvbnRyb2xzLiBGb3Jcbi8vIGhvcml6b250YWwgc2l6aW5nLCB3cmFwIGNvbnRyb2xzIGluIHRoZSBwcmVkZWZpbmVkIGdyaWQgY2xhc3Nlcy4gYDxzZWxlY3Q+YFxuLy8gZWxlbWVudCBnZXRzIHNwZWNpYWwgbG92ZSBiZWNhdXNlIGl0J3Mgc3BlY2lhbCwgYW5kIHRoYXQncyBhIGZhY3QhXG4vLyBbY29udmVydGVyXSAkcGFyZW50IGhhY2tcbkBtaXhpbiBpbnB1dC1zaXplKCRwYXJlbnQsICRpbnB1dC1oZWlnaHQsICRwYWRkaW5nLXZlcnRpY2FsLCAkcGFkZGluZy1ob3Jpem9udGFsLCAkZm9udC1zaXplLCAkbGluZS1oZWlnaHQsICRib3JkZXItcmFkaXVzKSB7XG4gICN7JHBhcmVudH0ge1xuICAgIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgICBwYWRkaW5nOiAkcGFkZGluZy12ZXJ0aWNhbCAkcGFkZGluZy1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZTtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICB9XG5cbiAgc2VsZWN0I3skcGFyZW50fSB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICB9XG5cbiAgdGV4dGFyZWEjeyRwYXJlbnR9LFxuICBzZWxlY3RbbXVsdGlwbGVdI3skcGFyZW50fSB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICB9XG59XG4iLCIvL1xuLy8gQnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWJvdHRvbTogMDsgLy8gRm9yIGlucHV0LmJ0blxuICBmb250LXdlaWdodDogJGJ0bi1mb250LXdlaWdodDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBAaW5jbHVkZSBidXR0b24tc2l6ZSgkcGFkZGluZy1iYXNlLXZlcnRpY2FsLCAkcGFkZGluZy1iYXNlLWhvcml6b250YWwsICRmb250LXNpemUtYmFzZSwgJGxpbmUtaGVpZ2h0LWJhc2UsICRidG4tYm9yZGVyLXJhZGl1cy1iYXNlKTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJixcbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgQGluY2x1ZGUgdGFiLWZvY3VzO1xuICAgIH1cbiAgfVxuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICYuZm9jdXMge1xuICAgIGNvbG9yOiAkYnRuLWRlZmF1bHQtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG5cbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICBvdXRsaW5lOiAwO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhpbnNldCAwIDNweCA1cHggcmdiYSgwLDAsMCwuMTI1KSk7XG4gIH1cblxuICAmLmRpc2FibGVkLFxuICAmW2Rpc2FibGVkXSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICBAaW5jbHVkZSBvcGFjaXR5KC42NSk7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgfVxuXG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCBhJiB0byBhLmJ0blxufVxuXG5hLmJ0biB7XG4gICYuZGlzYWJsZWQsXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgLy8gRnV0dXJlLXByb29mIGRpc2FibGluZyBvZiBjbGlja3Mgb24gYDxhPmAgZWxlbWVudHNcbiAgfVxufVxuXG5cbi8vIEFsdGVybmF0ZSBidXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWRlZmF1bHQge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWRlZmF1bHQtY29sb3IsICRidG4tZGVmYXVsdC1iZywgJGJ0bi1kZWZhdWx0LWJvcmRlcik7XG59XG4uYnRuLXByaW1hcnkge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLXByaW1hcnktY29sb3IsICRidG4tcHJpbWFyeS1iZywgJGJ0bi1wcmltYXJ5LWJvcmRlcik7XG59XG4vLyBTdWNjZXNzIGFwcGVhcnMgYXMgZ3JlZW5cbi5idG4tc3VjY2VzcyB7XG4gIEBpbmNsdWRlIGJ1dHRvbi12YXJpYW50KCRidG4tc3VjY2Vzcy1jb2xvciwgJGJ0bi1zdWNjZXNzLWJnLCAkYnRuLXN1Y2Nlc3MtYm9yZGVyKTtcbn1cbi8vIEluZm8gYXBwZWFycyBhcyBibHVlLWdyZWVuXG4uYnRuLWluZm8ge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWluZm8tY29sb3IsICRidG4taW5mby1iZywgJGJ0bi1pbmZvLWJvcmRlcik7XG59XG4vLyBXYXJuaW5nIGFwcGVhcnMgYXMgb3JhbmdlXG4uYnRuLXdhcm5pbmcge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLXdhcm5pbmctY29sb3IsICRidG4td2FybmluZy1iZywgJGJ0bi13YXJuaW5nLWJvcmRlcik7XG59XG4vLyBEYW5nZXIgYW5kIGVycm9yIGFwcGVhciBhcyByZWRcbi5idG4tZGFuZ2VyIHtcbiAgQGluY2x1ZGUgYnV0dG9uLXZhcmlhbnQoJGJ0bi1kYW5nZXItY29sb3IsICRidG4tZGFuZ2VyLWJnLCAkYnRuLWRhbmdlci1ib3JkZXIpO1xufVxuXG5cbi8vIExpbmsgYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBNYWtlIGEgYnV0dG9uIGxvb2sgYW5kIGJlaGF2ZSBsaWtlIGEgbGlua1xuLmJ0bi1saW5rIHtcbiAgY29sb3I6ICRsaW5rLWNvbG9yO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBib3JkZXItcmFkaXVzOiAwO1xuXG4gICYsXG4gICY6YWN0aXZlLFxuICAmLmFjdGl2ZSxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KG5vbmUpO1xuICB9XG4gICYsXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICY6YWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246ICRsaW5rLWhvdmVyLWRlY29yYXRpb247XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRidG4tbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBCdXR0b24gU2l6ZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tbGcge1xuICAvLyBsaW5lLWhlaWdodDogZW5zdXJlIGV2ZW4tbnVtYmVyZWQgaGVpZ2h0IG9mIGJ1dHRvbiBuZXh0IHRvIGxhcmdlIGlucHV0XG4gIEBpbmNsdWRlIGJ1dHRvbi1zaXplKCRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsLCAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsLCAkZm9udC1zaXplLWxhcmdlLCAkbGluZS1oZWlnaHQtbGFyZ2UsICRidG4tYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG4uYnRuLXNtIHtcbiAgLy8gbGluZS1oZWlnaHQ6IGVuc3VyZSBwcm9wZXIgaGVpZ2h0IG9mIGJ1dHRvbiBuZXh0IHRvIHNtYWxsIGlucHV0XG4gIEBpbmNsdWRlIGJ1dHRvbi1zaXplKCRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsLCAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsLCAkZm9udC1zaXplLXNtYWxsLCAkbGluZS1oZWlnaHQtc21hbGwsICRidG4tYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG4uYnRuLXhzIHtcbiAgQGluY2x1ZGUgYnV0dG9uLXNpemUoJHBhZGRpbmcteHMtdmVydGljYWwsICRwYWRkaW5nLXhzLWhvcml6b250YWwsICRmb250LXNpemUtc21hbGwsICRsaW5lLWhlaWdodC1zbWFsbCwgJGJ0bi1ib3JkZXItcmFkaXVzLXNtYWxsKTtcbn1cblxuXG4vLyBCbG9jayBidXR0b25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi8vIFZlcnRpY2FsbHkgc3BhY2Ugb3V0IG11bHRpcGxlIGJsb2NrIGJ1dHRvbnNcbi5idG4tYmxvY2sgKyAuYnRuLWJsb2NrIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4vLyBTcGVjaWZpY2l0eSBvdmVycmlkZXNcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl0sXG5pbnB1dFt0eXBlPVwicmVzZXRcIl0sXG5pbnB1dFt0eXBlPVwiYnV0dG9uXCJdIHtcbiAgJi5idG4tYmxvY2sge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG4iLCIvLyBCdXR0b24gdmFyaWFudHNcbi8vXG4vLyBFYXNpbHkgcHVtcCBvdXQgZGVmYXVsdCBzdHlsZXMsIGFzIHdlbGwgYXMgOmhvdmVyLCA6Zm9jdXMsIDphY3RpdmUsXG4vLyBhbmQgZGlzYWJsZWQgb3B0aW9ucyBmb3IgYWxsIGJ1dHRvbnNcblxuQG1peGluIGJ1dHRvbi12YXJpYW50KCRjb2xvciwgJGJhY2tncm91bmQsICRib3JkZXIpIHtcbiAgY29sb3I6ICRjb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQ7XG4gIGJvcmRlci1jb2xvcjogJGJvcmRlcjtcblxuICAmOmZvY3VzLFxuICAmLmZvY3VzIHtcbiAgICBjb2xvcjogJGNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTAlKTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJvcmRlciwgMjUlKTtcbiAgfVxuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogJGNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTAlKTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJvcmRlciwgMTIlKTtcbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gJi5kcm9wZG93bi10b2dnbGUge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogZGFya2VuKCRiYWNrZ3JvdW5kLCAxMCUpO1xuICAgICAgICBib3JkZXItY29sb3I6IGRhcmtlbigkYm9yZGVyLCAxMiUpO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTclKTtcbiAgICAgICAgICBib3JkZXItY29sb3I6IGRhcmtlbigkYm9yZGVyLCAyNSUpO1xuICAgIH1cbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gJi5kcm9wZG93bi10b2dnbGUge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIH1cbiAgJi5kaXNhYmxlZCxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmLmZvY3VzLFxuICAgICY6YWN0aXZlLFxuICAgICYuYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kO1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogJGJvcmRlcjtcbiAgICB9XG4gIH1cblxuICAuYmFkZ2Uge1xuICAgIGNvbG9yOiAkYmFja2dyb3VuZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3I7XG4gIH1cbn1cblxuLy8gQnV0dG9uIHNpemVzXG5AbWl4aW4gYnV0dG9uLXNpemUoJHBhZGRpbmctdmVydGljYWwsICRwYWRkaW5nLWhvcml6b250YWwsICRmb250LXNpemUsICRsaW5lLWhlaWdodCwgJGJvcmRlci1yYWRpdXMpIHtcbiAgcGFkZGluZzogJHBhZGRpbmctdmVydGljYWwgJHBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbn1cbiIsIi8vIE9wYWNpdHlcblxuQG1peGluIG9wYWNpdHkoJG9wYWNpdHkpIHtcbiAgb3BhY2l0eTogJG9wYWNpdHk7XG4gIC8vIElFOCBmaWx0ZXJcbiAgJG9wYWNpdHktaWU6ICgkb3BhY2l0eSAqIDEwMCk7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0kb3BhY2l0eS1pZSk7XG59XG4iLCIvL1xuLy8gQ29tcG9uZW50IGFuaW1hdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhlYWRzIHVwIVxuLy9cbi8vIFdlIGRvbid0IHVzZSB0aGUgYC5vcGFjaXR5KClgIG1peGluIGhlcmUgc2luY2UgaXQgY2F1c2VzIGEgYnVnIHdpdGggdGV4dFxuLy8gZmllbGRzIGluIElFNy04LiBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzM1NTIuXG5cbi5mYWRlIHtcbiAgb3BhY2l0eTogMDtcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihvcGFjaXR5IC4xNXMgbGluZWFyKTtcbiAgJi5pbiB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuXG4uY29sbGFwc2Uge1xuICBkaXNwbGF5OiBub25lO1xuXG4gICYuaW4gICAgICB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCB0ciYuaW4gdG8gdHIuY29sbGFwc2UuaW5cbiAgLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIHRib2R5Ji5pbiB0byB0Ym9keS5jb2xsYXBzZS5pblxufVxuXG50ci5jb2xsYXBzZS5pbiAgICB7IGRpc3BsYXk6IHRhYmxlLXJvdzsgfVxuXG50Ym9keS5jb2xsYXBzZS5pbiB7IGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cDsgfVxuXG4uY29sbGFwc2luZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBAaW5jbHVkZSB0cmFuc2l0aW9uLXByb3BlcnR5KGhlaWdodCwgdmlzaWJpbGl0eSk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tZHVyYXRpb24oLjM1cyk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uKGVhc2UpO1xufVxuIiwiLy9cbi8vIERyb3Bkb3duIG1lbnVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIERyb3Bkb3duIGFycm93L2NhcmV0XG4uY2FyZXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlci10b3A6ICAgJGNhcmV0LXdpZHRoLWJhc2UgZGFzaGVkO1xuICBib3JkZXItdG9wOiAgICRjYXJldC13aWR0aC1iYXNlIHNvbGlkIFxcOTsgLy8gSUU4XG4gIGJvcmRlci1yaWdodDogJGNhcmV0LXdpZHRoLWJhc2Ugc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiAgJGNhcmV0LXdpZHRoLWJhc2Ugc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi8vIFRoZSBkcm9wZG93biB3cmFwcGVyIChkaXYpXG4uZHJvcHVwLFxuLmRyb3Bkb3duIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4vLyBQcmV2ZW50IHRoZSBmb2N1cyBvbiB0aGUgZHJvcGRvd24gdG9nZ2xlIHdoZW4gY2xvc2luZyBkcm9wZG93bnNcbi5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBUaGUgZHJvcGRvd24gbWVudSAodWwpXG4uZHJvcGRvd24tbWVudSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LWRyb3Bkb3duO1xuICBkaXNwbGF5OiBub25lOyAvLyBub25lIGJ5IGRlZmF1bHQsIGJ1dCBibG9jayBvbiBcIm9wZW5cIiBvZiB0aGUgbWVudVxuICBmbG9hdDogbGVmdDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIG1hcmdpbjogMnB4IDAgMDsgLy8gb3ZlcnJpZGUgZGVmYXVsdCB1bFxuICBsaXN0LXN0eWxlOiBub25lO1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRW5zdXJlcyBwcm9wZXIgYWxpZ25tZW50IGlmIHBhcmVudCBoYXMgaXQgY2hhbmdlZCAoZS5nLiwgbW9kYWwgZm9vdGVyKVxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkZHJvcGRvd24tYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRkcm9wZG93bi1mYWxsYmFjay1ib3JkZXI7IC8vIElFOCBmYWxsYmFja1xuICBib3JkZXI6IDFweCBzb2xpZCAkZHJvcGRvd24tYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgNnB4IDEycHggcmdiYSgwLDAsMCwuMTc1KSk7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG5cbiAgLy8gQWxpZ25zIHRoZSBkcm9wZG93biBtZW51IHRvIHJpZ2h0XG4gIC8vXG4gIC8vIERlcHJlY2F0ZWQgYXMgb2YgMy4xLjAgaW4gZmF2b3Igb2YgYC5kcm9wZG93bi1tZW51LVtkaXJdYFxuICAmLnB1bGwtcmlnaHQge1xuICAgIHJpZ2h0OiAwO1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cblxuICAvLyBEaXZpZGVycyAoYmFzaWNhbGx5IGFuIGhyKSB3aXRoaW4gdGhlIGRyb3Bkb3duXG4gIC5kaXZpZGVyIHtcbiAgICBAaW5jbHVkZSBuYXYtZGl2aWRlcigkZHJvcGRvd24tZGl2aWRlci1iZyk7XG4gIH1cblxuICAvLyBMaW5rcyB3aXRoaW4gdGhlIGRyb3Bkb3duIG1lbnVcbiAgPiBsaSA+IGEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBhZGRpbmc6IDNweCAyMHB4O1xuICAgIGNsZWFyOiBib3RoO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1jb2xvcjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOyAvLyBwcmV2ZW50IGxpbmtzIGZyb20gcmFuZG9tbHkgYnJlYWtpbmcgb250byBuZXcgbGluZXNcbiAgfVxufVxuXG4vLyBIb3Zlci9Gb2N1cyBzdGF0ZVxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6ICRkcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRkcm9wZG93bi1saW5rLWhvdmVyLWJnO1xuICB9XG59XG5cbi8vIEFjdGl2ZSBzdGF0ZVxuLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSB7XG4gICYsXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIG91dGxpbmU6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGRyb3Bkb3duLWxpbmstYWN0aXZlLWJnO1xuICB9XG59XG5cbi8vIERpc2FibGVkIHN0YXRlXG4vL1xuLy8gR3JheSBvdXQgdGV4dCBhbmQgZW5zdXJlIHRoZSBob3Zlci9mb2N1cyBzdGF0ZSByZW1haW5zIGdyYXlcblxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhIHtcbiAgJixcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6ICRkcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yO1xuICB9XG5cbiAgLy8gTnVrZSBob3Zlci9mb2N1cyBlZmZlY3RzXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZW1vdmUgQ1NTIGdyYWRpZW50XG4gICAgQGluY2x1ZGUgcmVzZXQtZmlsdGVyO1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuXG4vLyBPcGVuIHN0YXRlIGZvciB0aGUgZHJvcGRvd25cbi5vcGVuIHtcbiAgLy8gU2hvdyB0aGUgbWVudVxuICA+IC5kcm9wZG93bi1tZW51IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgb3V0bGluZSB3aGVuIDpmb2N1cyBpcyB0cmlnZ2VyZWRcbiAgPiBhIHtcbiAgICBvdXRsaW5lOiAwO1xuICB9XG59XG5cbi8vIE1lbnUgcG9zaXRpb25pbmdcbi8vXG4vLyBBZGQgZXh0cmEgY2xhc3MgdG8gYC5kcm9wZG93bi1tZW51YCB0byBmbGlwIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGRyb3Bkb3duXG4vLyBtZW51IHdpdGggdGhlIHBhcmVudC5cbi5kcm9wZG93bi1tZW51LXJpZ2h0IHtcbiAgbGVmdDogYXV0bzsgLy8gUmVzZXQgdGhlIGRlZmF1bHQgZnJvbSBgLmRyb3Bkb3duLW1lbnVgXG4gIHJpZ2h0OiAwO1xufVxuLy8gV2l0aCB2Mywgd2UgZW5hYmxlZCBhdXRvLWZsaXBwaW5nIGlmIHlvdSBoYXZlIGEgZHJvcGRvd24gd2l0aGluIGEgcmlnaHRcbi8vIGFsaWduZWQgbmF2IGNvbXBvbmVudC4gVG8gZW5hYmxlIHRoZSB1bmRvaW5nIG9mIHRoYXQsIHdlIHByb3ZpZGUgYW4gb3ZlcnJpZGVcbi8vIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgZHJvcGRvd24gbWVudSBhbGlnbm1lbnQuXG4vL1xuLy8gVGhpcyBpcyBvbmx5IGZvciBsZWZ0LWFsaWduaW5nIGEgZHJvcGRvd24gbWVudSB3aXRoaW4gYSBgLm5hdmJhci1yaWdodGAgb3Jcbi8vIGAucHVsbC1yaWdodGAgbmF2IGNvbXBvbmVudC5cbi5kcm9wZG93bi1tZW51LWxlZnQge1xuICBsZWZ0OiAwO1xuICByaWdodDogYXV0bztcbn1cblxuLy8gRHJvcGRvd24gc2VjdGlvbiBoZWFkZXJzXG4uZHJvcGRvd24taGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDNweCAyMHB4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICRkcm9wZG93bi1oZWFkZXItY29sb3I7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7IC8vIGFzIHdpdGggPiBsaSA+IGFcbn1cblxuLy8gQmFja2Ryb3AgdG8gY2F0Y2ggYm9keSBjbGlja3Mgb24gbW9iaWxlLCBldGMuXG4uZHJvcGRvd24tYmFja2Ryb3Age1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIHRvcDogMDtcbiAgei1pbmRleDogKCR6aW5kZXgtZHJvcGRvd24gLSAxMCk7XG59XG5cbi8vIFJpZ2h0IGFsaWduZWQgZHJvcGRvd25zXG4ucHVsbC1yaWdodCA+IC5kcm9wZG93bi1tZW51IHtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IGF1dG87XG59XG5cbi8vIEFsbG93IGZvciBkcm9wZG93bnMgdG8gZ28gYm90dG9tIHVwIChha2EsIGRyb3B1cC1tZW51KVxuLy9cbi8vIEp1c3QgYWRkIC5kcm9wdXAgYWZ0ZXIgdGhlIHN0YW5kYXJkIC5kcm9wZG93biBjbGFzcyBhbmQgeW91J3JlIHNldCwgYnJvLlxuLy8gVE9ETzogYWJzdHJhY3QgdGhpcyBzbyB0aGF0IHRoZSBuYXZiYXIgZml4ZWQgc3R5bGVzIGFyZSBub3QgcGxhY2VkIGhlcmU/XG5cbi5kcm9wdXAsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24ge1xuICAvLyBSZXZlcnNlIHRoZSBjYXJldFxuICAuY2FyZXQge1xuICAgIGJvcmRlci10b3A6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogJGNhcmV0LXdpZHRoLWJhc2UgZGFzaGVkO1xuICAgIGJvcmRlci1ib3R0b206ICRjYXJldC13aWR0aC1iYXNlIHNvbGlkIFxcOTsgLy8gSUU4XG4gICAgY29udGVudDogXCJcIjtcbiAgfVxuICAvLyBEaWZmZXJlbnQgcG9zaXRpb25pbmcgZm9yIGJvdHRvbSB1cCBtZW51XG4gIC5kcm9wZG93bi1tZW51IHtcbiAgICB0b3A6IGF1dG87XG4gICAgYm90dG9tOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgfVxufVxuXG5cbi8vIENvbXBvbmVudCBhbGlnbm1lbnRcbi8vXG4vLyBSZWl0ZXJhdGUgcGVyIG5hdmJhci5sZXNzIGFuZCB0aGUgbW9kaWZpZWQgY29tcG9uZW50IGFsaWdubWVudCB0aGVyZS5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgLm5hdmJhci1yaWdodCB7XG4gICAgLmRyb3Bkb3duLW1lbnUge1xuICAgICAgcmlnaHQ6IDA7IGxlZnQ6IGF1dG87XG4gICAgfVxuICAgIC8vIE5lY2Vzc2FyeSBmb3Igb3ZlcnJpZGVzIG9mIHRoZSBkZWZhdWx0IHJpZ2h0IGFsaWduZWQgbWVudS5cbiAgICAvLyBXaWxsIHJlbW92ZSBjb21lIHY0IGluIGFsbCBsaWtlbGlob29kLlxuICAgIC5kcm9wZG93bi1tZW51LWxlZnQge1xuICAgICAgbGVmdDogMDsgcmlnaHQ6IGF1dG87XG4gICAgfVxuICB9XG59XG4iLCIvLyBIb3Jpem9udGFsIGRpdmlkZXJzXG4vL1xuLy8gRGl2aWRlcnMgKGJhc2ljYWxseSBhbiBocikgd2l0aGluIGRyb3Bkb3ducyBhbmQgbmF2IGxpc3RzXG5cbkBtaXhpbiBuYXYtZGl2aWRlcigkY29sb3I6ICNlNWU1ZTUpIHtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogKCgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKSAtIDEpIDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbn1cbiIsIi8vIFJlc2V0IGZpbHRlcnMgZm9yIElFXG4vL1xuLy8gV2hlbiB5b3UgbmVlZCB0byByZW1vdmUgYSBncmFkaWVudCBiYWNrZ3JvdW5kLCBkbyBub3QgZm9yZ2V0IHRvIHVzZSB0aGlzIHRvIHJlc2V0XG4vLyB0aGUgSUUgZmlsdGVyIGZvciBJRTkgYW5kIGJlbG93LlxuXG5AbWl4aW4gcmVzZXQtZmlsdGVyKCkge1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChlbmFibGVkID0gZmFsc2UpO1xufVxuIiwiLy9cbi8vIEJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE1ha2UgdGhlIGRpdiBiZWhhdmUgbGlrZSBhIGJ1dHRvblxuLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLy8gbWF0Y2ggLmJ0biBhbGlnbm1lbnQgZ2l2ZW4gZm9udC1zaXplIGhhY2sgYWJvdmVcbiAgPiAuYnRuIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gQnJpbmcgdGhlIFwiYWN0aXZlXCIgYnV0dG9uIHRvIHRoZSBmcm9udFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmOmFjdGl2ZSxcbiAgICAmLmFjdGl2ZSB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgIH1cbiAgfVxufVxuXG4vLyBQcmV2ZW50IGRvdWJsZSBib3JkZXJzIHdoZW4gYnV0dG9ucyBhcmUgbmV4dCB0byBlYWNoIG90aGVyXG4uYnRuLWdyb3VwIHtcbiAgLmJ0biArIC5idG4sXG4gIC5idG4gKyAuYnRuLWdyb3VwLFxuICAuYnRuLWdyb3VwICsgLmJ0bixcbiAgLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsOiBHcm91cCBtdWx0aXBsZSBidXR0b24gZ3JvdXBzIHRvZ2V0aGVyIGZvciBhIHRvb2xiYXJcbi5idG4tdG9vbGJhciB7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4OyAvLyBPZmZzZXQgdGhlIGZpcnN0IGNoaWxkJ3MgbWFyZ2luXG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gIC5idG4sXG4gIC5idG4tZ3JvdXAsXG4gIC5pbnB1dC1ncm91cCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAsXG4gID4gLmlucHV0LWdyb3VwIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLy8gU2V0IGNvcm5lcnMgaW5kaXZpZHVhbCBiZWNhdXNlIHNvbWV0aW1lcyBhIHNpbmdsZSBidXR0b24gY2FuIGJlIGluIGEgLmJ0bi1ncm91cCBhbmQgd2UgbmVlZCA6Zmlyc3QtY2hpbGQgYW5kIDpsYXN0LWNoaWxkIHRvIGJvdGggbWF0Y2hcbi5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gICY6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSkge1xuICAgIEBpbmNsdWRlIGJvcmRlci1yaWdodC1yYWRpdXMoMCk7XG4gIH1cbn1cbi8vIE5lZWQgLmRyb3Bkb3duLXRvZ2dsZSBzaW5jZSA6bGFzdC1jaGlsZCBkb2Vzbid0IGFwcGx5IGdpdmVuIGEgLmRyb3Bkb3duLW1lbnUgaW1tZWRpYXRlbHkgYWZ0ZXIgaXRcbi5idG4tZ3JvdXAgPiAuYnRuOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4uYnRuLWdyb3VwID4gLmRyb3Bkb3duLXRvZ2dsZTpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIEBpbmNsdWRlIGJvcmRlci1sZWZ0LXJhZGl1cygwKTtcbn1cblxuLy8gQ3VzdG9tIGVkaXRzIGZvciBpbmNsdWRpbmcgYnRuLWdyb3VwcyB3aXRoaW4gYnRuLWdyb3VwcyAodXNlZnVsIGZvciBpbmNsdWRpbmcgZHJvcGRvd24gYnV0dG9ucyB3aXRoaW4gYSBidG4tZ3JvdXApXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gID4gLmJ0bjpsYXN0LWNoaWxkLFxuICA+IC5kcm9wZG93bi10b2dnbGUge1xuICAgIEBpbmNsdWRlIGJvcmRlci1yaWdodC1yYWRpdXMoMCk7XG4gIH1cbn1cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgQGluY2x1ZGUgYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuXG4vLyBPbiBhY3RpdmUgYW5kIG9wZW4sIGRvbid0IHNob3cgb3V0bGluZVxuLmJ0bi1ncm91cCAuZHJvcGRvd24tdG9nZ2xlOmFjdGl2ZSxcbi5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgb3V0bGluZTogMDtcbn1cblxuXG4vLyBTaXppbmdcbi8vXG4vLyBSZW1peCB0aGUgZGVmYXVsdCBidXR0b24gc2l6aW5nIGNsYXNzZXMgaW50byBuZXcgb25lcyBmb3IgZWFzaWVyIG1hbmlwdWxhdGlvbi5cblxuLmJ0bi1ncm91cC14cyA+IC5idG4geyBAZXh0ZW5kIC5idG4teHM7IH1cbi5idG4tZ3JvdXAtc20gPiAuYnRuIHsgQGV4dGVuZCAuYnRuLXNtOyB9XG4uYnRuLWdyb3VwLWxnID4gLmJ0biB7IEBleHRlbmQgLmJ0bi1sZzsgfVxuXG5cbi8vIFNwbGl0IGJ1dHRvbiBkcm9wZG93bnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gR2l2ZSB0aGUgbGluZSBiZXR3ZWVuIGJ1dHRvbnMgc29tZSBkZXB0aFxuLmJ0bi1ncm91cCA+IC5idG4gKyAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcbn1cbi5idG4tZ3JvdXAgPiAuYnRuLWxnICsgLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIHBhZGRpbmctbGVmdDogMTJweDtcbiAgcGFkZGluZy1yaWdodDogMTJweDtcbn1cblxuLy8gVGhlIGNsaWNrYWJsZSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBtZW51XG4vLyBSZW1vdmUgdGhlIGdyYWRpZW50IGFuZCBzZXQgdGhlIHNhbWUgaW5zZXQgc2hhZG93IGFzIHRoZSA6YWN0aXZlIHN0YXRlXG4uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSkpO1xuXG4gIC8vIFNob3cgbm8gc2hhZG93IGZvciBgLmJ0bi1saW5rYCBzaW5jZSBpdCBoYXMgbm8gb3RoZXIgYnV0dG9uIHN0eWxlcy5cbiAgJi5idG4tbGluayB7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgfVxufVxuXG5cbi8vIFJlcG9zaXRpb24gdGhlIGNhcmV0XG4uYnRuIC5jYXJldCB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuLy8gQ2FyZXRzIGluIG90aGVyIGJ1dHRvbiBzaXplc1xuLmJ0bi1sZyAuY2FyZXQge1xuICBib3JkZXItd2lkdGg6ICRjYXJldC13aWR0aC1sYXJnZSAkY2FyZXQtd2lkdGgtbGFyZ2UgMDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbn1cbi8vIFVwc2lkZSBkb3duIGNhcmV0cyBmb3IgLmRyb3B1cFxuLmRyb3B1cCAuYnRuLWxnIC5jYXJldCB7XG4gIGJvcmRlci13aWR0aDogMCAkY2FyZXQtd2lkdGgtbGFyZ2UgJGNhcmV0LXdpZHRoLWxhcmdlO1xufVxuXG5cbi8vIFZlcnRpY2FsIGJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCB7XG4gID4gLmJ0bixcbiAgPiAuYnRuLWdyb3VwLFxuICA+IC5idG4tZ3JvdXAgPiAuYnRuIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBmbG9hdDogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICAvLyBDbGVhciBmbG9hdHMgc28gZHJvcGRvd24gbWVudXMgY2FuIGJlIHByb3Blcmx5IHBsYWNlZFxuICA+IC5idG4tZ3JvdXAge1xuICAgIEBpbmNsdWRlIGNsZWFyZml4O1xuICAgID4gLmJ0biB7XG4gICAgICBmbG9hdDogbm9uZTtcbiAgICB9XG4gIH1cblxuICA+IC5idG4gKyAuYnRuLFxuICA+IC5idG4gKyAuYnRuLWdyb3VwLFxuICA+IC5idG4tZ3JvdXAgKyAuYnRuLFxuICA+IC5idG4tZ3JvdXAgKyAuYnRuLWdyb3VwIHtcbiAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuIHtcbiAgJjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICB9XG4gICY6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRidG4tYm9yZGVyLXJhZGl1cy1iYXNlO1xuICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xuICB9XG4gICY6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJGJ0bi1ib3JkZXItcmFkaXVzLWJhc2U7XG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG4gIH1cbn1cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgPiAuYnRuIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkge1xuICA+IC5idG46bGFzdC1jaGlsZCxcbiAgPiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cygwKTtcbiAgfVxufVxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cblxuXG4vLyBKdXN0aWZpZWQgYnV0dG9uIGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCB7XG4gIGRpc3BsYXk6IHRhYmxlO1xuICB3aWR0aDogMTAwJTtcbiAgdGFibGUtbGF5b3V0OiBmaXhlZDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAge1xuICAgIGZsb2F0OiBub25lO1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgd2lkdGg6IDElO1xuICB9XG4gID4gLmJ0bi1ncm91cCAuYnRuIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gID4gLmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxufVxuXG5cbi8vIENoZWNrYm94IGFuZCByYWRpbyBvcHRpb25zXG4vL1xuLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgYnJvd3NlcidzIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjaywgcG93ZXJlZCBieSB0aGVcbi8vIGByZXF1aXJlZGAgYXR0cmlidXRlLCB3ZSBoYXZlIHRvIFwiaGlkZVwiIHRoZSBpbnB1dHMgdmlhIGBjbGlwYC4gV2UgY2Fubm90IHVzZVxuLy8gYGRpc3BsYXk6IG5vbmU7YCBvciBgdmlzaWJpbGl0eTogaGlkZGVuO2AgYXMgdGhhdCBhbHNvIGhpZGVzIHRoZSBwb3BvdmVyLlxuLy8gU2ltcGx5IHZpc3VhbGx5IGhpZGluZyB0aGUgaW5wdXRzIHZpYSBgb3BhY2l0eWAgd291bGQgbGVhdmUgdGhlbSBjbGlja2FibGUgaW5cbi8vIGNlcnRhaW4gY2FzZXMgd2hpY2ggaXMgcHJldmVudGVkIGJ5IHVzaW5nIGBjbGlwYCBhbmQgYHBvaW50ZXItZXZlbnRzYC5cbi8vIFRoaXMgd2F5LCB3ZSBlbnN1cmUgYSBET00gZWxlbWVudCBpcyB2aXNpYmxlIHRvIHBvc2l0aW9uIHRoZSBwb3BvdmVyIGZyb20uXG4vL1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEyNzk0IGFuZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTQ1NTkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0ge1xuICA+IC5idG4sXG4gID4gLmJ0bi1ncm91cCA+IC5idG4ge1xuICAgIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY2xpcDogcmVjdCgwLDAsMCwwKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gU2luZ2xlIHNpZGUgYm9yZGVyLXJhZGl1c1xuXG5AbWl4aW4gYm9yZGVyLXRvcC1yYWRpdXMoJHJhZGl1cykge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHJhZGl1cztcbiAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICRyYWRpdXM7XG59XG5AbWl4aW4gYm9yZGVyLXJpZ2h0LXJhZGl1cygkcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkcmFkaXVzO1xuICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHJhZGl1cztcbn1cbkBtaXhpbiBib3JkZXItYm90dG9tLXJhZGl1cygkcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkcmFkaXVzO1xuICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJHJhZGl1cztcbn1cbkBtaXhpbiBib3JkZXItbGVmdC1yYWRpdXMoJHJhZGl1cykge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAkcmFkaXVzO1xuICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkcmFkaXVzO1xufVxuIiwiLy9cbi8vIElucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQmFzZSBzdHlsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5pbnB1dC1ncm91cCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLy8gRm9yIGRyb3Bkb3duc1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLy8gcHJldmVudCBpbnB1dCBncm91cHMgZnJvbSBpbmhlcml0aW5nIGJvcmRlciBzdHlsZXMgZnJvbSB0YWJsZSBjZWxscyB3aGVuIHBsYWNlZCB3aXRoaW4gYSB0YWJsZVxuXG4gIC8vIFVuZG8gcGFkZGluZyBhbmQgZmxvYXQgb2YgZ3JpZCBjbGFzc2VzXG4gICZbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cblxuICAuZm9ybS1jb250cm9sIHtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGFib3ZlIHRoZSAqYXBwZW5kZWQqIGFkZG9uIGJ1dHRvbiBmb3JcbiAgICAvLyBwcm9wZXIgYm9yZGVyIGNvbG9ycy5cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMjtcblxuICAgIC8vIElFOSBmdWJhcnMgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZSBpbiB0ZXh0IGlucHV0cyBhbmQgdGhlIGFycm93cyBvblxuICAgIC8vIHNlbGVjdCBlbGVtZW50cyBpbiBpbnB1dCBncm91cHMuIFRvIGZpeCBpdCwgd2UgZmxvYXQgdGhlIGlucHV0LiBEZXRhaWxzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE1NjEjaXNzdWVjb21tZW50LTI4OTM2ODU1XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIFNpemluZyBvcHRpb25zXG4vL1xuLy8gUmVtaXggdGhlIGRlZmF1bHQgZm9ybSBjb250cm9sIHNpemluZyBjbGFzc2VzIGludG8gbmV3IG9uZXMgZm9yIGVhc2llclxuLy8gbWFuaXB1bGF0aW9uLlxuXG4uaW5wdXQtZ3JvdXAtbGcgPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICBAZXh0ZW5kIC5pbnB1dC1sZztcbn1cbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIEBleHRlbmQgLmlucHV0LXNtO1xufVxuXG5cbi8vIERpc3BsYXkgYXMgdGFibGUtY2VsbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWJ0bixcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcblxuICAmOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cbi8vIEFkZG9uIGFuZCBhZGRvbiB3cmFwcGVyIGZvciBidXR0b25zXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgd2lkdGg6IDElO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvLyBNYXRjaCB0aGUgaW5wdXRzXG59XG5cbi8vIFRleHQgaW5wdXQgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBwYWRkaW5nOiAkcGFkZGluZy1iYXNlLXZlcnRpY2FsICRwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGlucHV0LWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1ncm91cC1hZGRvbi1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJGlucHV0LWdyb3VwLWFkZG9uLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtYmFzZTtcblxuICAvLyBTaXppbmdcbiAgJi5pbnB1dC1zbSB7XG4gICAgcGFkZGluZzogJHBhZGRpbmctc21hbGwtdmVydGljYWwgJHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgJi5pbnB1dC1sZyB7XG4gICAgcGFkZGluZzogJHBhZGRpbmctbGFyZ2UtdmVydGljYWwgJHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cblxuICAvLyBOdWtlIGRlZmF1bHQgbWFyZ2lucyBmcm9tIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyB0byB2ZXJ0aWNhbGx5IGNlbnRlciB3aXRoaW4uXG4gIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi8vIFJlc2V0IHJvdW5kZWQgY29ybmVyc1xuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBAaW5jbHVkZSBib3JkZXItcmlnaHQtcmFkaXVzKDApO1xufVxuLmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xufVxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6bGFzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1hZGRvbjpsYXN0LWNoaWxkLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXAgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmRyb3Bkb3duLXRvZ2dsZSxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuIHtcbiAgQGluY2x1ZGUgYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQge1xuICBib3JkZXItbGVmdDogMDtcbn1cblxuLy8gQnV0dG9uIGlucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWJ0biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gSmFua2lseSBwcmV2ZW50IGlucHV0IGJ1dHRvbiBncm91cHMgZnJvbSB3cmFwcGluZyB3aXRoIGB3aGl0ZS1zcGFjZWAgYW5kXG4gIC8vIGBmb250LXNpemVgIGluIGNvbWJpbmF0aW9uIHdpdGggYGlubGluZS1ibG9ja2Agb24gYnV0dG9ucy5cbiAgZm9udC1zaXplOiAwO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gIC8vIE5lZ2F0aXZlIG1hcmdpbiBmb3Igc3BhY2luZywgcG9zaXRpb24gZm9yIGJyaW5naW5nIGhvdmVyZWQvZm9jdXNlZC9hY3RpdmVkXG4gIC8vIGVsZW1lbnQgYWJvdmUgdGhlIHNpYmxpbmdzLlxuICA+IC5idG4ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICArIC5idG4ge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfVxuICAgIC8vIEJyaW5nIHRoZSBcImFjdGl2ZVwiIGJ1dHRvbiB0byB0aGUgZnJvbnRcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMsXG4gICAgJjphY3RpdmUge1xuICAgICAgei1pbmRleDogMjtcbiAgICB9XG4gIH1cblxuICAvLyBOZWdhdGl2ZSBtYXJnaW4gdG8gb25seSBoYXZlIGEgMXB4IGJvcmRlciBiZXR3ZWVuIHRoZSB0d29cbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgPiAuYnRuLFxuICAgID4gLmJ0bi1ncm91cCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG4gICAgfVxuICB9XG4gICY6bGFzdC1jaGlsZCB7XG4gICAgPiAuYnRuLFxuICAgID4gLmJ0bi1ncm91cCB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gTmF2c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubmF2IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgcGFkZGluZy1sZWZ0OiAwOyAvLyBPdmVycmlkZSBkZWZhdWx0IHVsL29sXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gID4gbGkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcblxuICAgID4gYSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBhZGRpbmc6ICRuYXYtbGluay1wYWRkaW5nO1xuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtbGluay1ob3Zlci1iZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlZCBzdGF0ZSBzZXRzIHRleHQgdG8gZ3JheSBhbmQgbnVrZXMgaG92ZXIvdGFiIGVmZmVjdHNcbiAgICAmLmRpc2FibGVkID4gYSB7XG4gICAgICBjb2xvcjogJG5hdi1kaXNhYmxlZC1saW5rLWNvbG9yO1xuXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2LWRpc2FibGVkLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBPcGVuIGRyb3Bkb3duc1xuICAub3BlbiA+IGEge1xuICAgICYsXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtbGluay1ob3Zlci1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJGxpbmstY29sb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gTmF2IGRpdmlkZXJzIChkZXByZWNhdGVkIHdpdGggdjMuMC4xKVxuICAvL1xuICAvLyBUaGlzIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBpbiB2MyB3aXRoIHRoZSBkcm9wcGluZyBvZiBgLm5hdi1saXN0YCwgYnV0XG4gIC8vIHdlIG1pc3NlZCBpdC4gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBhbnl3aGVyZSwgYnV0IGluIHRoZSBpbnRlcmVzdFxuICAvLyBvZiBtYWludGFpbmluZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGluIGNhc2UgeW91IHVzZSBpdCwgaXQncyBkZXByZWNhdGVkLlxuICAubmF2LWRpdmlkZXIge1xuICAgIEBpbmNsdWRlIG5hdi1kaXZpZGVyO1xuICB9XG5cbiAgLy8gUHJldmVudCBJRTggZnJvbSBtaXNwbGFjaW5nIGltZ3NcbiAgLy9cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2lzc3Vlcy85ODQjaXNzdWVjb21tZW50LTM5ODU5ODlcbiAgPiBsaSA+IGEgPiBpbWcge1xuICAgIG1heC13aWR0aDogbm9uZTtcbiAgfVxufVxuXG5cbi8vIFRhYnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gR2l2ZSB0aGUgdGFicyBzb21ldGhpbmcgdG8gc2l0IG9uXG4ubmF2LXRhYnMge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJG5hdi10YWJzLWJvcmRlci1jb2xvcjtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gTWFrZSB0aGUgbGlzdC1pdGVtcyBvdmVybGF5IHRoZSBib3R0b20gYm9yZGVyXG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDtcblxuICAgIC8vIEFjdHVhbCB0YWJzIChhcyBsaW5rcylcbiAgICA+IGEge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2UgJGJvcmRlci1yYWRpdXMtYmFzZSAwIDA7XG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3IgJG5hdi10YWJzLWxpbmstaG92ZXItYm9yZGVyLWNvbG9yICRuYXYtdGFicy1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIHN0YXRlLCBhbmQgaXRzIDpob3ZlciB0byBvdmVycmlkZSBub3JtYWwgOmhvdmVyXG4gICAgJi5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZztcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gcHVsbGluZyB0aGlzIGluIG1haW5seSBmb3IgbGVzcyBzaG9ydGhhbmRcbiAgJi5uYXYtanVzdGlmaWVkIHtcbiAgICBAZXh0ZW5kIC5uYXYtanVzdGlmaWVkO1xuICAgIEBleHRlbmQgLm5hdi10YWJzLWp1c3RpZmllZDtcbiAgfVxufVxuXG5cbi8vIFBpbGxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4ubmF2LXBpbGxzIHtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICAvLyBMaW5rcyByZW5kZXJlZCBhcyBwaWxsc1xuICAgID4gYSB7XG4gICAgICBib3JkZXItcmFkaXVzOiAkbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM7XG4gICAgfVxuICAgICsgbGkge1xuICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmUgc3RhdGVcbiAgICAmLmFjdGl2ZSA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXYtcGlsbHMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtcGlsbHMtYWN0aXZlLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gU3RhY2tlZCBwaWxsc1xuLm5hdi1zdGFja2VkIHtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgKyBsaSB7XG4gICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICBtYXJnaW4tbGVmdDogMDsgLy8gbm8gbmVlZCBmb3IgdGhpcyBnYXAgYmV0d2VlbiBuYXYgaXRlbXNcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBOYXYgdmFyaWF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSnVzdGlmaWVkIG5hdiBsaW5rc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubmF2LWp1c3RpZmllZCB7XG4gIHdpZHRoOiAxMDAlO1xuXG4gID4gbGkge1xuICAgIGZsb2F0OiBub25lO1xuICAgID4gYSB7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gICAgfVxuICB9XG5cbiAgPiAuZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUge1xuICAgIHRvcDogYXV0bztcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgPiBsaSB7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgICAgd2lkdGg6IDElO1xuICAgICAgPiBhIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gTW92ZSBib3JkZXJzIHRvIGFuY2hvcnMgaW5zdGVhZCBvZiBib3R0b20gb2YgbGlzdFxuLy9cbi8vIE1peGluIGZvciBhZGRpbmcgb24gdG9wIHRoZSBzaGFyZWQgYC5uYXYtanVzdGlmaWVkYCBzdHlsZXMgZm9yIG91ciB0YWJzXG4ubmF2LXRhYnMtanVzdGlmaWVkIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcblxuICA+IGxpID4gYSB7XG4gICAgLy8gT3ZlcnJpZGUgbWFyZ2luIGZyb20gLm5hdi10YWJzXG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG4gIH1cblxuICA+IC5hY3RpdmUgPiBhLFxuICA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuICA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgPiBsaSA+IGEge1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRuYXYtdGFicy1qdXN0aWZpZWQtbGluay1ib3JkZXItY29sb3I7XG4gICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlICRib3JkZXItcmFkaXVzLWJhc2UgMCAwO1xuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhLFxuICAgID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4gICAgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBUYWJiYWJsZSB0YWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhpZGUgdGFiYmFibGUgcGFuZXMgdG8gc3RhcnQsIHNob3cgdGhlbSB3aGVuIGAuYWN0aXZlYFxuLnRhYi1jb250ZW50IHtcbiAgPiAudGFiLXBhbmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgPiAuYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxufVxuXG5cbi8vIERyb3Bkb3duc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBTcGVjaWZpYyBkcm9wZG93bnNcbi5uYXYtdGFicyAuZHJvcGRvd24tbWVudSB7XG4gIC8vIG1ha2UgZHJvcGRvd24gYm9yZGVyIG92ZXJsYXAgdGFiIGJvcmRlclxuICBtYXJnaW4tdG9wOiAtMXB4O1xuICAvLyBSZW1vdmUgdGhlIHRvcCByb3VuZGVkIGNvcm5lcnMgaGVyZSBzaW5jZSB0aGVyZSBpcyBhIGhhcmQgZWRnZSBhYm92ZSB0aGUgbWVudVxuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cbiIsIi8vIGJvd2VyOnNjc3NcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2NvbXBhc3MtbWl4aW5zL2xpYi9jb21wYXNzL2NzczMvX3VzZXItaW50ZXJmYWNlLnNjc3NcIjtcbi8vIGVuZGJvd2VyXG5cblxuLy9cbi8vIE5hdmJhcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gV3JhcHBlciBhbmQgYmFzZSBjbGFzc1xuLy9cbi8vIFByb3ZpZGUgYSBzdGF0aWMgbmF2YmFyIGZyb20gd2hpY2ggd2UgZXhwYW5kIHRvIGNyZWF0ZSBmdWxsLXdpZHRoLCBmaXhlZCwgYW5kXG4vLyBvdGhlciBuYXZiYXIgdmFyaWF0aW9ucy5cblxuLm5hdmJhciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogJG5hdmJhci1oZWlnaHQ7IC8vIEVuc3VyZSBhIG5hdmJhciBhbHdheXMgc2hvd3MgKGUuZy4sIHdpdGhvdXQgYSAubmF2YmFyLWJyYW5kIGluIGNvbGxhcHNlZCBtb2RlKVxuICBtYXJnaW4tYm90dG9tOiAkbmF2YmFyLW1hcmdpbi1ib3R0b207XG4gIGJvcmRlcjogMDtcblxuICAvLyBQcmV2ZW50IGZsb2F0cyBmcm9tIGJyZWFraW5nIHRoZSBuYXZiYXJcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAkbmF2YmFyLWJvcmRlci1yYWRpdXM7XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgaGVhZGluZ1xuLy9cbi8vIEdyb3VwcyBgLm5hdmJhci1icmFuZGAgYW5kIGAubmF2YmFyLXRvZ2dsZWAgaW50byBhIHNpbmdsZSBjb21wb25lbnQgZm9yIGVhc3lcbi8vIHN0eWxpbmcgb2YgcmVzcG9uc2l2ZSBhc3BlY3RzLlxuXG4ubmF2YmFyLWhlYWRlciB7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgY29sbGFwc2UgKGJvZHkpXG4vL1xuLy8gR3JvdXAgeW91ciBuYXZiYXIgY29udGVudCBpbnRvIHRoaXMgZm9yIGVhc3kgY29sbGFwc2luZyBhbmQgZXhwYW5kaW5nIGFjcm9zc1xuLy8gdmFyaW91cyBkZXZpY2Ugc2l6ZXMuIEJ5IGRlZmF1bHQsIHRoaXMgY29udGVudCBpcyBjb2xsYXBzZWQgd2hlbiA8NzY4cHgsIGJ1dFxuLy8gd2lsbCBleHBhbmQgcGFzdCB0aGF0IGZvciBhIGhvcml6b250YWwgZGlzcGxheS5cbi8vXG4vLyBUbyBzdGFydCAob24gbW9iaWxlIGRldmljZXMpIHRoZSBuYXZiYXIgbGlua3MsIGZvcm1zLCBhbmQgYnV0dG9ucyBhcmUgc3RhY2tlZFxuLy8gdmVydGljYWxseSBhbmQgaW5jbHVkZSBhIGBtYXgtaGVpZ2h0YCB0byBvdmVyZmxvdyBpbiBjYXNlIHlvdSBoYXZlIHRvbyBtdWNoXG4vLyBjb250ZW50IGZvciB0aGUgdXNlcidzIHZpZXdwb3J0LlxuXG4ubmF2YmFyLWNvbGxhcHNlIHtcbiAgb3ZlcmZsb3cteDogdmlzaWJsZTtcbiAgcGFkZGluZy1yaWdodDogJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIHBhZGRpbmctbGVmdDogICRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG5cbiAgJi5pbiB7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuXG4gICAgJi5jb2xsYXBzZSB7XG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMDsgLy8gT3ZlcnJpZGUgZGVmYXVsdCBzZXR0aW5nXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgICYuaW4ge1xuICAgICAgb3ZlcmZsb3cteTogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvLyBVbmRvIHRoZSBjb2xsYXBzZSBzaWRlIHBhZGRpbmcgZm9yIG5hdmJhcnMgd2l0aCBjb250YWluZXJzIHRvIGVuc3VyZVxuICAgIC8vIGFsaWdubWVudCBvZiByaWdodC1hbGlnbmVkIGNvbnRlbnRzLlxuICAgIC5uYXZiYXItZml4ZWQtdG9wICYsXG4gICAgLm5hdmJhci1zdGF0aWMtdG9wICYsXG4gICAgLm5hdmJhci1maXhlZC1ib3R0b20gJiB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxufVxuXG4ubmF2YmFyLWZpeGVkLXRvcCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIHtcbiAgLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWF4LWhlaWdodDogJG5hdmJhci1jb2xsYXBzZS1tYXgtaGVpZ2h0O1xuXG4gICAgQG1lZGlhIChtYXgtZGV2aWNlLXdpZHRoOiAkc2NyZWVuLXhzLW1pbikgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSB7XG4gICAgICBtYXgtaGVpZ2h0OiAyMDBweDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBCb3RoIG5hdmJhciBoZWFkZXIgYW5kIGNvbGxhcHNlXG4vL1xuLy8gV2hlbiBhIGNvbnRhaW5lciBpcyBwcmVzZW50LCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBoZWFkZXIgYW5kIGNvbGxhcHNlLlxuXG4uY29udGFpbmVyLFxuLmNvbnRhaW5lci1mbHVpZCB7XG4gID4gLm5hdmJhci1oZWFkZXIsXG4gID4gLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gICAgbWFyZ2luLWxlZnQ6ICAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG5cbiAgICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgICAgbWFyZ2luLWxlZnQ6ICAwO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vXG4vLyBOYXZiYXIgYWxpZ25tZW50IG9wdGlvbnNcbi8vXG4vLyBEaXNwbGF5IHRoZSBuYXZiYXIgYWNyb3NzIHRoZSBlbnRpcmV0eSBvZiB0aGUgcGFnZSBvciBmaXhlZCBpdCB0byB0aGUgdG9wIG9yXG4vLyBib3R0b20gb2YgdGhlIHBhZ2UuXG5cbi8vIFN0YXRpYyB0b3AgKHVuZml4ZWQsIGJ1dCAxMDAlIHdpZGUpIG5hdmJhclxuLm5hdmJhci1zdGF0aWMtdG9wIHtcbiAgei1pbmRleDogJHppbmRleC1uYXZiYXI7XG4gIGJvcmRlci13aWR0aDogMCAwIDFweDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLy8gRml4IHRoZSB0b3AvYm90dG9tIG5hdmJhcnMgd2hlbiBzY3JlZW4gcmVhbCBlc3RhdGUgc3VwcG9ydHMgaXRcbi5uYXZiYXItZml4ZWQtdG9wLFxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LW5hdmJhci1maXhlZDtcblxuICAvLyBVbmRvIHRoZSByb3VuZGVkIGNvcm5lcnNcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICB9XG59XG4ubmF2YmFyLWZpeGVkLXRvcCB7XG4gIHRvcDogMDtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4O1xufVxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICBib3R0b206IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7IC8vIG92ZXJyaWRlIC5uYXZiYXIgZGVmYXVsdHNcbiAgYm9yZGVyLXdpZHRoOiAxcHggMCAwO1xufVxuXG5cbi8vIEJyYW5kL3Byb2plY3QgbmFtZVxuXG4ubmF2YmFyLWJyYW5kIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMCAwIDAgLTgwcHg7XG4gIHBhZGRpbmc6IDAgMCAwIDgwcHg7XG4gIGhlaWdodDogNTVweDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCRraW1jaGktbG9nbykgbm8tcmVwZWF0IDI0cHggM3B4O1xuICBjb2xvcjogJGhpZ2hsaWdodHMtY29sb3I7XG4gIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktYm9sZDsgXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogMS41NzFlbTtcbiAgbGluZS1oZWlnaHQ6IDU1cHg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG5cbiAgPiBpbWcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICAubmF2YmFyID4gLmNvbnRhaW5lciAmLFxuICAgIC5uYXZiYXIgPiAuY29udGFpbmVyLWZsdWlkICYge1xuICAgICAgbWFyZ2luLWxlZnQ6IC04MHB4O1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIE5hdmJhciB0b2dnbGVcbi8vXG4vLyBDdXN0b20gYnV0dG9uIGZvciB0b2dnbGluZyB0aGUgYC5uYXZiYXItY29sbGFwc2VgLCBwb3dlcmVkIGJ5IHRoZSBjb2xsYXBzZVxuLy8gSmF2YVNjcmlwdCBwbHVnaW4uXG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbG9hdDogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIHBhZGRpbmc6IDlweCAxMHB4O1xuICBAaW5jbHVkZSBuYXZiYXItdmVydGljYWwtYWxpZ24oMzRweCk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlO1xuXG4gIC8vIFdlIHJlbW92ZSB0aGUgYG91dGxpbmVgIGhlcmUsIGJ1dCBsYXRlciBjb21wZW5zYXRlIGJ5IGF0dGFjaGluZyBgOmhvdmVyYFxuICAvLyBzdHlsZXMgdG8gYDpmb2N1c2AuXG4gICY6Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cblxuICAvLyBCYXJzXG4gIC5pY29uLWJhciB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICB9XG4gIC5pY29uLWJhciArIC5pY29uLWJhciB7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cblxuLy8gTmF2YmFyIG5hdiBsaW5rc1xuLy9cbi8vIEJ1aWxkcyBvbiB0b3Agb2YgdGhlIGAubmF2YCBjb21wb25lbnRzIHdpdGggaXRzIG93biBtb2RpZmllciBjbGFzcyB0byBtYWtlXG4vLyB0aGUgbmF2IHRoZSBmdWxsIGhlaWdodCBvZiB0aGUgaG9yaXpvbnRhbCBuYXYgKGFib3ZlIDc2OHB4KS5cblxuLm5hdmJhci1uYXYge1xuICBtYXJnaW46ICgkbmF2YmFyLXBhZGRpbmctdmVydGljYWwgLyAyKSAoLSRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsKTtcblxuICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgIHBhZGRpbmctbGVmdDogNDBweDtcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0MHB4O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gICAgICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1hbHRlcm5hdGU7XG4gICAgICAgICAgZm9udC1zaXplOiAxM3B0O1xuXG4gICAgICAgICAgPiAuZmEge1xuICAgICAgICAgICAgZm9udC1zaXplOiAyNnB4O1xuICAgICAgICAgIH0gIFxuXG4gICAgICB9XG5cbiAgICAgID4gbGkgPiBhLmRyb3Bkb3duLXRvZ2dsZSB7XG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMjJweDtcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDIycHg7XG4gICAgICB9XG5cbiAgQG1lZGlhIChtYXgtd2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQtbWF4KSB7XG4gICAgLy8gRHJvcGRvd25zIGdldCBjdXN0b20gZGlzcGxheSB3aGVuIGNvbGxhcHNlZFxuICAgIC5vcGVuIC5kcm9wZG93bi1tZW51IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICBmbG9hdDogbm9uZTtcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgID4gbGkgPiBhLFxuICAgICAgLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgICAgIHBhZGRpbmc6IDVweCAxNXB4IDVweCAyNXB4O1xuICAgICAgfVxuICAgICAgPiBsaSA+IGEge1xuICAgICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICAgICAgICAmOmhvdmVyLFxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVW5jb2xsYXBzZSB0aGUgbmF2XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luOiAwO1xuXG4gICAgPiBsaSB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICAgID4gYSB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAgICAkbmF2YmFyLXBhZGRpbmctdmVydGljYWw7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAkbmF2YmFyLXBhZGRpbmctdmVydGljYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gTmF2YmFyIGZvcm1cbi8vXG4vLyBFeHRlbnNpb24gb2YgdGhlIGAuZm9ybS1pbmxpbmVgIHdpdGggc29tZSBleHRyYSBmbGF2b3IgZm9yIG9wdGltdW0gZGlzcGxheSBpblxuLy8gb3VyIG5hdmJhcnMuXG5cbi5uYXZiYXItZm9ybSB7XG4gIG1hcmdpbi1sZWZ0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIG1hcmdpbi1yaWdodDogLSRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBwYWRkaW5nOiAxMHB4ICRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgJHNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKSwgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtcbiAgQGluY2x1ZGUgYm94LXNoYWRvdygkc2hhZG93KTtcblxuICAvLyBNaXhpbiBiZWhhdmlvciBmb3Igb3B0aW11bSBkaXNwbGF5XG4gIEBpbmNsdWRlIGZvcm0taW5saW5lO1xuXG4gIC5mb3JtLWdyb3VwIHtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWZXJ0aWNhbGx5IGNlbnRlciBpbiBleHBhbmRlZCwgaG9yaXpvbnRhbCBuYXZiYXJcbiAgQGluY2x1ZGUgbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRpbnB1dC1oZWlnaHQtYmFzZSk7XG5cbiAgLy8gVW5kbyAxMDAlIHdpZHRoIGZvciBwdWxsIGNsYXNzZXNcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSk7XG4gIH1cbn1cblxuXG4vLyBEcm9wZG93biBtZW51c1xuXG4vLyBNZW51IHBvc2l0aW9uIGFuZCBtZW51IGNhcmV0c1xuXG4ubmF2YmFyLW5hdiA+IGxpID4gYS5kcm9wZG93bi10b2dnbGUgPiAuY2FyZXQge1xuICBib3JkZXItdG9wOiAwO1xuICBib3JkZXItbGVmdDogMDtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xuICBib3JkZXItYm90dG9tOiAwO1xuICBtYXJnaW4tbGVmdDogMTBweDtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogMzlweDtcblxuICAgICAgJjpiZWZvcmUge1xuICAgICAgICAgIGNvbnRlbnQ6ICdcXGYwNzgnO1xuICAgICAgICAgIGZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMSBGb250QXdlc29tZTtcbiAgICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgICAgdGV4dC1yZW5kZXJpbmc6IGF1dG87XG4gICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gICAgICAgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAgICAgICAgICAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWNvbG9yO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB0b3A6IDI0cHg7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDE0cHg7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG5cbn1cblxuLm5hdmJhci1uYXYgPiBsaS5kcm9wZG93bi5vcGVuID4gYSA+IC5jYXJldCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWJnO1xuXG4gICAgICAmOmJlZm9yZSB7XG4gICAgICAgICAgY29udGVudDogJ1xcZjA3Nyc7XG4gICAgICB9XG59XG5cbi5uYXZiYXItcmlnaHQgPiBsaSA+IGEge1xuICAgICAgaGVpZ2h0OiA0OXB4O1xuXG4gICAgICAuZmEge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgICB9XG5cbiAgICAgIC50b3BiYXItdGV4dCwgLmNhcmV0LCAuZmEge1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgfVxufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW4tdG9wOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWJnO1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSAhaW1wb3J0YW50KTtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuXG4gID4gbGkge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgPiBsaSA+IGEsXG4gID4gbGkgPiBzcGFuIHtcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIGNvbG9yOiAkbWVudS1mbGF0LXRleHQ7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1zYW5zLXNlcmlmO1xuICAgIGZvbnQtc2l6ZTogMTNwdDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGxpbmUtaGVpZ2h0OiAyNHB4OyAgICBcbiAgICBwYWRkaW5nOiA3cHggMzBweDtcbiAgICBoZWlnaHQ6IDQwcHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRtZW51LWZsYXQtZHJvcGRvd24tYm9yZGVyO1xuICAgIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMHB4IDFweCAwcHggMHB4ICRtZW51LWZsYXQtZHJvcGRvd24tZGl2aWRlci1iZyk7XG4gICAgY2xlYXI6IGJvdGg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLy8gcHJldmVudCBsaW5rcyBmcm9tIHJhbmRvbWx5IGJyZWFraW5nIG9udG8gbmV3IGxpbmVzXG5cbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG5cbiAgfVxuXG4gID4gbGkgPiBhID4gLmZhIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIGZvbnQtc2l6ZTogMjZweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICB9XG5cbiAgPiBsaS5jcml0aWNhbCA+IGEge1xuICAgICAgYmFja2dyb3VuZDogJG1lbnUtZmxhdC1kcm9wZG93bi1jcml0aWNhbC1iZztcbiAgfVxuXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICB3aWR0aDogMTJweDtcbiAgfVxuICAgXG4gIC8qIFRyYWNrICovXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcbiAgICAgIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAwIDZweCByZ2JhKDAsMCwwLDAuMykpO1xuICB9XG4gICBcbiAgLyogSGFuZGxlICovXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICM3OTc5Nzk7XG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNCM0IzQjM7XG4gICAgICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDZweCAxcHggNnB4ICM5ZTllOWUpOyBcbiAgfVxuXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOndpbmRvdy1pbmFjdGl2ZSB7XG4gIH1cblxufVxuLy8gTWVudSBwb3NpdGlvbiBhbmQgbWVudSBjYXJldCBzdXBwb3J0IGZvciBkcm9wdXBzIHZpYSBleHRyYSBkcm9wdXAgY2xhc3Ncbi5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKCRuYXZiYXItYm9yZGVyLXJhZGl1cyk7XG4gIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xufVxuXG5cbi8vIEJ1dHRvbnMgaW4gbmF2YmFyc1xuLy9cbi8vIFZlcnRpY2FsbHkgY2VudGVyIGEgYnV0dG9uIHdpdGhpbiBhIG5hdmJhciAod2hlbiAqbm90KiBpbiBhIGZvcm0pLlxuXG4ubmF2YmFyLWJ0biB7XG4gIEBpbmNsdWRlIG5hdmJhci12ZXJ0aWNhbC1hbGlnbigkaW5wdXQtaGVpZ2h0LWJhc2UpO1xuXG4gICYuYnRuLXNtIHtcbiAgICBAaW5jbHVkZSBuYXZiYXItdmVydGljYWwtYWxpZ24oJGlucHV0LWhlaWdodC1zbWFsbCk7XG4gIH1cbiAgJi5idG4teHMge1xuICAgIEBpbmNsdWRlIG5hdmJhci12ZXJ0aWNhbC1hbGlnbigyMik7XG4gIH1cbn1cblxuXG4vLyBUZXh0IGluIG5hdmJhcnNcbi8vXG4vLyBBZGQgYSBjbGFzcyB0byBtYWtlIGFueSBlbGVtZW50IHByb3Blcmx5IGFsaWduIGl0c2VsZiB2ZXJ0aWNhbGx5IHdpdGhpbiB0aGUgbmF2YmFycy5cblxuLm5hdmJhci10ZXh0IHtcbiAgQGluY2x1ZGUgbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRsaW5lLWhlaWdodC1jb21wdXRlZCk7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tbGVmdDogJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gICAgbWFyZ2luLXJpZ2h0OiAkbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgfVxufVxuXG5cbi8vIENvbXBvbmVudCBhbGlnbm1lbnRcbi8vXG4vLyBSZXB1cnBvc2UgdGhlIHB1bGwgdXRpbGl0aWVzIGFzIHRoZWlyIG93biBuYXZiYXIgdXRpbGl0aWVzIHRvIGF2b2lkIHNwZWNpZmljaXR5XG4vLyBpc3N1ZXMgd2l0aCBwYXJlbnRzIGFuZCBjaGFpbmluZy4gT25seSBkbyB0aGlzIHdoZW4gdGhlIG5hdmJhciBpcyB1bmNvbGxhcHNlZFxuLy8gdGhvdWdoIHNvIHRoYXQgbmF2YmFyIGNvbnRlbnRzIHByb3Blcmx5IHN0YWNrIGFuZCBhbGlnbiBpbiBtb2JpbGUuXG4vL1xuLy8gRGVjbGFyZWQgYWZ0ZXIgdGhlIG5hdmJhciBjb21wb25lbnRzIHRvIGVuc3VyZSBtb3JlIHNwZWNpZmljaXR5IG9uIHRoZSBtYXJnaW5zLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAubmF2YmFyLWxlZnQge1xuICAgIGZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm5hdmJhci1yaWdodCB7XG4gICAgZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnQ7XG4gIG1hcmdpbi1yaWdodDogLSRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuXG4gICAgfiAubmF2YmFyLXJpZ2h0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBBbHRlcm5hdGUgbmF2YmFyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRGVmYXVsdCBuYXZiYXJcbi5uYXZiYXItZGVmYXVsdCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1iZztcbiAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYm9yZGVyO1xuXG4gIC5uYXZiYXItYnJhbmQge1xuICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci10ZXh0IHtcbiAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWNvbG9yO1xuICB9XG5cbiAgLm5hdmJhci1uYXYge1xuICAgID4gbGkgPiBhIHtcbiAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1zaXplOiAxM3B0O1xuICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1ib2xkO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBtaW4td2lkdGg6IDE5MHB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgaGVpZ2h0OiAkbmF2YmFyLWhlaWdodDtcblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWJnO1xuICAgICAgfVxuXG4gICAgICAuZGlnaXQtY29udGFpbmVyIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogLTJweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gICAgICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgICAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICM1NTU7XG4gICAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNTU1O1xuICAgICAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICAgICAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWJhc2U7XG4gICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgICAgICBwYWRkaW5nOiAwIDhweDtcbiAgICAgIH1cblxuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZztcbiAgICAgIH1cblxuICAgICAgLmRpZ2l0LWNvbnRhaW5lciB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogI2ZmZjtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICB9XG4gICAgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZztcbiAgICAgIH1cblxuICAgICAgLmRpZ2l0LWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBAZWFjaCAkcGFnZSwgJGJnY29sb3IgaW4gJGNvbG9ycyB7XG5cbiAgICA+IC5hY3RpdmUgPiBhLiN7JHBhZ2V9IHtcbiAgICAgICAgJixcbiAgICAgICAgJjpob3ZlcixcbiAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGJnY29sb3IgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgID4gLmhvc3RuYW1lIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIHBhZGRpbmc6IDhweCAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgIHdpZHRoOiAxODBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDI0cHg7XG4gICAgICBAaW5jbHVkZSBib3gtc2l6aW5nKGJvcmRlci1ib3gpO1xuXG4gICAgICAuaG9zdC1sb2NhdGlvbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWFsdGVybmF0ZTtcbiAgICAgICAgY29sb3I6ICRoaWdobGlnaHRzLWNvbG9yO1xuICAgICAgICBmb250LXNpemU6IDEzcHQ7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIH1cblxuICAgIH1cblxuICB9XG5cbiAgLm5hdmJhci10b2dnbGUge1xuICAgIGJvcmRlci1jb2xvcjogJG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1ib3JkZXItY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC10b2dnbGUtaG92ZXItYmc7XG4gICAgfVxuICAgIC5pY29uLWJhciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWljb24tYmFyLWJnO1xuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItY29sbGFwc2UsXG4gIC5uYXZiYXItZm9ybSB7XG4gICAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYm9yZGVyO1xuICB9XG5cbiAgLy8gRHJvcGRvd24gbWVudSBpdGVtc1xuICAubmF2YmFyLW5hdiB7XG4gICAgLy8gUmVtb3ZlIGJhY2tncm91bmQgY29sb3IgZnJvbSBvcGVuIGRyb3Bkb3duXG4gICAgPiAub3BlbiA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWJnO1xuICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heCkge1xuICAgICAgLy8gRHJvcGRvd25zIGdldCBjdXN0b20gZGlzcGxheSB3aGVuIGNvbGxhcHNlZFxuICAgICAgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgICA+IGxpID4gYSB7XG4gICAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuYWN0aXZlID4gYSB7XG4gICAgICAgICAgJixcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICAgICAmLFxuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8vIExpbmtzIGluIG5hdmJhcnNcbiAgLy9cbiAgLy8gQWRkIGEgY2xhc3MgdG8gZW5zdXJlIGxpbmtzIG91dHNpZGUgdGhlIG5hdmJhciBuYXYgYXJlIGNvbG9yZWQgY29ycmVjdGx5LlxuXG4gIC5uYXZiYXItbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC5idG4tbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgfVxuICAgICZbZGlzYWJsZWRdLFxuICAgIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBJbnZlcnNlIG5hdmJhclxuXG4ubmF2YmFyLWludmVyc2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYmc7XG4gIGJvcmRlci1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWJvcmRlcjtcblxuICAubmF2YmFyLWJyYW5kIHtcbiAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWJyYW5kLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWJyYW5kLWhvdmVyLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWJyYW5kLWhvdmVyLWJnO1xuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItdGV4dCB7XG4gICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1jb2xvcjtcbiAgfVxuXG4gIC5uYXZiYXItbmF2IHtcbiAgICA+IGxpID4gYSB7XG4gICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG5cbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1iZztcbiAgICAgIH1cbiAgICB9XG4gICAgPiAuYWN0aXZlID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtYmc7XG4gICAgICB9XG4gICAgfVxuICAgID4gLmRpc2FibGVkID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWJnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIERhcmtlbiB0aGUgcmVzcG9uc2l2ZSBuYXYgdG9nZ2xlXG4gIC5uYXZiYXItdG9nZ2xlIHtcbiAgICBib3JkZXItY29sb3I6ICRuYXZiYXItaW52ZXJzZS10b2dnbGUtYm9yZGVyLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtdG9nZ2xlLWhvdmVyLWJnO1xuICAgIH1cbiAgICAuaWNvbi1iYXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLXRvZ2dsZS1pY29uLWJhci1iZztcbiAgICB9XG4gIH1cblxuICAubmF2YmFyLWNvbGxhcHNlLFxuICAubmF2YmFyLWZvcm0ge1xuICAgIGJvcmRlci1jb2xvcjogZGFya2VuKCRuYXZiYXItaW52ZXJzZS1iZywgNyUpO1xuICB9XG5cbiAgLy8gRHJvcGRvd25zXG4gIC5uYXZiYXItbmF2IHtcbiAgICA+IC5vcGVuID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtYmc7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQtbWF4KSB7XG4gICAgICAvLyBEcm9wZG93bnMgZ2V0IGN1c3RvbSBkaXNwbGF5XG4gICAgICAub3BlbiAuZHJvcGRvd24tbWVudSB7XG4gICAgICAgID4gLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIC5kaXZpZGVyIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgID4gbGkgPiBhIHtcbiAgICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICAgICAmLFxuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA+IC5kaXNhYmxlZCA+IGEge1xuICAgICAgICAgICYsXG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC5idG4tbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG4gICAgfVxuICAgICZbZGlzYWJsZWRdLFxuICAgIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiQGltcG9ydCBcIi4uL3N1cHBvcnRcIjtcblxuLy8gVGhpcyBtaXhpbiBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgYW5kXG4vLyB0aGVpciBjb3JyZXNwb25kaW5nIGV4cGVyaW1lbnRhbCBDU1MyIHByb3BlcnRpZXMgd2hlblxuLy8gdGhlIGltcGxlbWVudGF0aW9ucyBhcmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIHByb3BlcnR5XG4vLyBwcmVmaXguXG5AbWl4aW4gZXhwZXJpbWVudGFsKCRwcm9wZXJ0eSwgJHZhbHVlLFxuICAkbW96ICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEsXG4gICR3ZWJraXQgICA6ICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itd2Via2l0LFxuICAkbyAgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW9wZXJhLFxuICAkbXMgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1pY3Jvc29mdCxcbiAgJGtodG1sICAgIDogJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1raHRtbCxcbiAgJG9mZmljaWFsIDogdHJ1ZVxuKSB7XG4gIEBpZiAkd2Via2l0ICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci13ZWJraXQgICAgeyAtd2Via2l0LSN7JHByb3BlcnR5fSA6ICR2YWx1ZTsgfVxuICBAaWYgJGtodG1sICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Ita2h0bWwgICAgIHsgIC1raHRtbC0jeyRwcm9wZXJ0eX0gOiAkdmFsdWU7IH1cbiAgQGlmICRtb3ogICAgIGFuZCAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEgICB7ICAgIC1tb3otI3skcHJvcGVydHl9IDogJHZhbHVlOyB9XG4gIEBpZiAkbXMgICAgICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1taWNyb3NvZnQgeyAgICAgLW1zLSN7JHByb3BlcnR5fSA6ICR2YWx1ZTsgfVxuICBAaWYgJG8gICAgICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itb3BlcmEgICAgIHsgICAgICAtby0jeyRwcm9wZXJ0eX0gOiAkdmFsdWU7IH1cbiAgQGlmICRvZmZpY2lhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgI3skcHJvcGVydHl9IDogJHZhbHVlOyB9XG59XG5cbi8vIFNhbWUgYXMgZXhwZXJpbWVudGFsKCksIGJ1dCBmb3IgY2FzZXMgd2hlbiB0aGUgcHJvcGVydHkgaXMgdGhlIHNhbWUgYW5kIHRoZSB2YWx1ZSBpcyB2ZW5kb3JpemVkXG5AbWl4aW4gZXhwZXJpbWVudGFsLXZhbHVlKCRwcm9wZXJ0eSwgJHZhbHVlLFxuICAkbW96ICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEsXG4gICR3ZWJraXQgICA6ICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itd2Via2l0LFxuICAkbyAgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW9wZXJhLFxuICAkbXMgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1pY3Jvc29mdCxcbiAgJGtodG1sICAgIDogJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1raHRtbCxcbiAgJG9mZmljaWFsIDogdHJ1ZVxuKSB7XG4gIEBpZiAkd2Via2l0ICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci13ZWJraXQgICAgeyAjeyRwcm9wZXJ0eX0gOiAtd2Via2l0LSN7JHZhbHVlfTsgfVxuICBAaWYgJGtodG1sICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Ita2h0bWwgICAgIHsgI3skcHJvcGVydHl9IDogIC1raHRtbC0jeyR2YWx1ZX07IH1cbiAgQGlmICRtb3ogICAgIGFuZCAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEgICB7ICN7JHByb3BlcnR5fSA6ICAgIC1tb3otI3skdmFsdWV9OyB9XG4gIEBpZiAkbXMgICAgICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1taWNyb3NvZnQgeyAjeyRwcm9wZXJ0eX0gOiAgICAgLW1zLSN7JHZhbHVlfTsgfVxuICBAaWYgJG8gICAgICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itb3BlcmEgICAgIHsgI3skcHJvcGVydHl9IDogICAgICAtby0jeyR2YWx1ZX07IH1cbiAgQGlmICRvZmZpY2lhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICN7JHByb3BlcnR5fSA6ICAgICAgICAgI3skdmFsdWV9OyB9XG59XG4iLCIvLyBVc2VyIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoaXMgZmlsZSBjYW4gYmUgZXhwYW5kZWQgdG8gaGFuZGxlIGFsbCB0aGUgdXNlciBpbnRlcmZhY2UgcHJvcGVydGllcyBhc1xuLy8gdGhleSBiZWNvbWUgYXZhaWxhYmxlIGluIGJyb3dzZXJzOlxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9XRC1jc3MzLXVzZXJpbnQtMjAwMDAyMTZcbkBpbXBvcnQgXCJzaGFyZWRcIjtcblxuXG4vLyBUaGlzIHByb3BlcnR5IGNvbnRyb2xzIHRoZSBzZWxlY3Rpb24gbW9kZWwgYW5kIGdyYW51bGFyaXR5IG9mIGFuIGVsZW1lbnQuXG4vL1xuLy8gQHBhcmFtICRzZWxlY3Rcbi8vICAgWyBub25lIHwgdGV4dCB8IHRvZ2dsZSB8IGVsZW1lbnQgfCBlbGVtZW50cyB8IGFsbCB8IGluaGVyaXQgXVxuQG1peGluIHVzZXItc2VsZWN0KCRzZWxlY3QpIHtcbiAgJHNlbGVjdDogdW5xdW90ZSgkc2VsZWN0KTtcbiAgQGluY2x1ZGUgZXhwZXJpbWVudGFsKHVzZXItc2VsZWN0LCAkc2VsZWN0LFxuICAgIC1tb3osIC13ZWJraXQsIG5vdCgtbyksIG5vdCgtbXMpLCAta2h0bWwsIG9mZmljaWFsXG4gICk7XG59XG4iLCIvLyBOYXZiYXIgdmVydGljYWwgYWxpZ25cbi8vXG4vLyBWZXJ0aWNhbGx5IGNlbnRlciBlbGVtZW50cyBpbiB0aGUgbmF2YmFyLlxuLy8gRXhhbXBsZTogYW4gZWxlbWVudCBoYXMgYSBoZWlnaHQgb2YgMzBweCwgc28gd3JpdGUgb3V0IGAubmF2YmFyLXZlcnRpY2FsLWFsaWduKDMwcHgpO2AgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB0b3AgbWFyZ2luLlxuXG5AbWl4aW4gbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRlbGVtZW50LWhlaWdodCkge1xuICBtYXJnaW4tdG9wOiAoKCRuYXZiYXItaGVpZ2h0IC0gJGVsZW1lbnQtaGVpZ2h0KSAvIDIpO1xuICBtYXJnaW4tYm90dG9tOiAoKCRuYXZiYXItaGVpZ2h0IC0gJGVsZW1lbnQtaGVpZ2h0KSAvIDIpO1xufVxuIiwiLy9cbi8vIEJyZWFkY3J1bWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5icmVhZGNydW1iIHtcbiAgcGFkZGluZzogJGJyZWFkY3J1bWItcGFkZGluZy12ZXJ0aWNhbCAkYnJlYWRjcnVtYi1wYWRkaW5nLWhvcml6b250YWw7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJyZWFkY3J1bWItYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gICAgKyBsaTpiZWZvcmUge1xuICAgICAgY29udGVudDogXCIjeyRicmVhZGNydW1iLXNlcGFyYXRvcn1cXDAwYTBcIjsgLy8gVW5pY29kZSBzcGFjZSBhZGRlZCBzaW5jZSBpbmxpbmUtYmxvY2sgbWVhbnMgbm9uLWNvbGxhcHNpbmcgd2hpdGUtc3BhY2VcbiAgICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgICAgY29sb3I6ICRicmVhZGNydW1iLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSB7XG4gICAgY29sb3I6ICRicmVhZGNydW1iLWFjdGl2ZS1jb2xvcjtcbiAgfVxufVxuIiwiLy9cbi8vIFBhZ2luYXRpb24gKG11bHRpcGxlIHBhZ2VzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lOyAvLyBSZW1vdmUgbGlzdC1zdHlsZSBhbmQgYmxvY2stbGV2ZWwgZGVmYXVsdHNcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsb2F0OiBsZWZ0OyAvLyBDb2xsYXBzZSB3aGl0ZS1zcGFjZVxuICAgICAgcGFkZGluZzogJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCAkcGFkZGluZy1iYXNlLWhvcml6b250YWw7XG4gICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYWdpbmF0aW9uLWJvcmRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgIH1cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gYSxcbiAgICAgID4gc3BhbiB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItbGVmdC1yYWRpdXMoJGJvcmRlci1yYWRpdXMtYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICA+IGEsXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItcmlnaHQtcmFkaXVzKCRib3JkZXItcmFkaXVzLWJhc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gID4gbGkgPiBhLFxuICA+IGxpID4gc3BhbiB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDM7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24taG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1ob3Zlci1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJHBhZ2luYXRpb24taG92ZXItYm9yZGVyO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSA+IGEsXG4gID4gLmFjdGl2ZSA+IHNwYW4ge1xuICAgICYsXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDI7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tYWN0aXZlLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHBhZ2luYXRpb24tYWN0aXZlLWJnO1xuICAgICAgYm9yZGVyLWNvbG9yOiAkcGFnaW5hdGlvbi1hY3RpdmUtYm9yZGVyO1xuICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIH1cbiAgfVxuXG4gID4gLmRpc2FibGVkIHtcbiAgICA+IHNwYW4sXG4gICAgPiBzcGFuOmhvdmVyLFxuICAgID4gc3Bhbjpmb2N1cyxcbiAgICA+IGEsXG4gICAgPiBhOmhvdmVyLFxuICAgID4gYTpmb2N1cyB7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1kaXNhYmxlZC1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJHBhZ2luYXRpb24tZGlzYWJsZWQtYm9yZGVyO1xuICAgICAgY3Vyc29yOiAkY3Vyc29yLWRpc2FibGVkO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTaXppbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIExhcmdlXG4ucGFnaW5hdGlvbi1sZyB7XG4gIEBpbmNsdWRlIHBhZ2luYXRpb24tc2l6ZSgkcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCwgJHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbCwgJGZvbnQtc2l6ZS1sYXJnZSwgJGxpbmUtaGVpZ2h0LWxhcmdlLCAkYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG5cbi8vIFNtYWxsXG4ucGFnaW5hdGlvbi1zbSB7XG4gIEBpbmNsdWRlIHBhZ2luYXRpb24tc2l6ZSgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCwgJHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbCwgJGZvbnQtc2l6ZS1zbWFsbCwgJGxpbmUtaGVpZ2h0LXNtYWxsLCAkYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG4iLCIvLyBQYWdpbmF0aW9uXG5cbkBtaXhpbiBwYWdpbmF0aW9uLXNpemUoJHBhZGRpbmctdmVydGljYWwsICRwYWRkaW5nLWhvcml6b250YWwsICRmb250LXNpemUsICRsaW5lLWhlaWdodCwgJGJvcmRlci1yYWRpdXMpIHtcbiAgPiBsaSB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBwYWRkaW5nOiAkcGFkZGluZy12ZXJ0aWNhbCAkcGFkZGluZy1ob3Jpem9udGFsO1xuICAgICAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICA+IGEsXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItbGVmdC1yYWRpdXMoJGJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgPiBhLFxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXJpZ2h0LXJhZGl1cygkYm9yZGVyLXJhZGl1cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gUGFnZXIgcGFnaW5hdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4ucGFnZXIge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG4gIGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBwYWRkaW5nOiA1cHggMTRweDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYWdlci1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYWdlci1ib3JkZXI7XG4gICAgICBib3JkZXItcmFkaXVzOiAkcGFnZXItYm9yZGVyLXJhZGl1cztcbiAgICB9XG5cbiAgICA+IGE6aG92ZXIsXG4gICAgPiBhOmZvY3VzIHtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYWdlci1ob3Zlci1iZztcbiAgICB9XG4gIH1cblxuICAubmV4dCB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBmbG9hdDogcmlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLnByZXZpb3VzIHtcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgIH1cbiAgfVxuXG4gIC5kaXNhYmxlZCB7XG4gICAgPiBhLFxuICAgID4gYTpob3ZlcixcbiAgICA+IGE6Zm9jdXMsXG4gICAgPiBzcGFuIHtcbiAgICAgIGNvbG9yOiAkcGFnZXItZGlzYWJsZWQtY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnZXItYmc7XG4gICAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gTGFiZWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmU7XG4gIHBhZGRpbmc6IC4yZW0gLjZlbSAuM2VtO1xuICBmb250LXNpemU6IDc1JTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGxhYmVsLWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgYm9yZGVyLXJhZGl1czogLjI1ZW07XG5cbiAgLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGEmIHRvIGEubGFiZWxcblxuICAvLyBFbXB0eSBsYWJlbHMgY29sbGFwc2UgYXV0b21hdGljYWxseSAobm90IGF2YWlsYWJsZSBpbiBJRTgpXG4gICY6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvLyBRdWljayBmaXggZm9yIGxhYmVscyBpbiBidXR0b25zXG4gIC5idG4gJiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTFweDtcbiAgfVxufVxuXG4vLyBBZGQgaG92ZXIgZWZmZWN0cywgYnV0IG9ubHkgZm9yIGxpbmtzXG5hLmxhYmVsIHtcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6ICRsYWJlbC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbn1cblxuLy8gQ29sb3JzXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnMgKGxpbmtlZCBsYWJlbHMgZ2V0IGRhcmtlciBvbiA6aG92ZXIpXG5cbi5sYWJlbC1kZWZhdWx0IHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtZGVmYXVsdC1iZyk7XG59XG5cbi5sYWJlbC1wcmltYXJ5IHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtcHJpbWFyeS1iZyk7XG59XG5cbi5sYWJlbC1zdWNjZXNzIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtc3VjY2Vzcy1iZyk7XG59XG5cbi5sYWJlbC1pbmZvIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtaW5mby1iZyk7XG59XG5cbi5sYWJlbC13YXJuaW5nIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtd2FybmluZy1iZyk7XG59XG5cbi5sYWJlbC1kYW5nZXIge1xuICBAaW5jbHVkZSBsYWJlbC12YXJpYW50KCRsYWJlbC1kYW5nZXItYmcpO1xufVxuIiwiLy8gTGFiZWxzXG5cbkBtaXhpbiBsYWJlbC12YXJpYW50KCRjb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3I7XG5cbiAgJltocmVmXSB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkY29sb3IsIDEwJSk7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gQmFkZ2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAxMHB4O1xuICBwYWRkaW5nOiAzcHggN3B4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gIGZvbnQtd2VpZ2h0OiAkYmFkZ2UtZm9udC13ZWlnaHQ7XG4gIGNvbG9yOiAkYmFkZ2UtY29sb3I7XG4gIGxpbmUtaGVpZ2h0OiAkYmFkZ2UtbGluZS1oZWlnaHQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJhZGdlLWJnO1xuICBib3JkZXItcmFkaXVzOiAkYmFkZ2UtYm9yZGVyLXJhZGl1cztcblxuICAvLyBFbXB0eSBiYWRnZXMgY29sbGFwc2UgYXV0b21hdGljYWxseSAobm90IGF2YWlsYWJsZSBpbiBJRTgpXG4gICY6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvLyBRdWljayBmaXggZm9yIGJhZGdlcyBpbiBidXR0b25zXG4gIC5idG4gJiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTFweDtcbiAgfVxuXG4gIC5idG4teHMgJixcbiAgLmJ0bi1ncm91cC14cyA+IC5idG4gJiB7XG4gICAgdG9wOiAwO1xuICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSYgdG8gYS5iYWRnZVxuXG4gIC8vIEFjY291bnQgZm9yIGJhZGdlcyBpbiBuYXZzXG4gIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlID4gJixcbiAgLm5hdi1waWxscyA+IC5hY3RpdmUgPiBhID4gJiB7XG4gICAgY29sb3I6ICRiYWRnZS1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJhZGdlLWFjdGl2ZS1iZztcbiAgfVxuXG4gIC5saXN0LWdyb3VwLWl0ZW0gPiAmIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gIH1cblxuICAubGlzdC1ncm91cC1pdGVtID4gJiArICYge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG5cbiAgLm5hdi1waWxscyA+IGxpID4gYSA+ICYge1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIH1cbn1cblxuLy8gSG92ZXIgc3RhdGUsIGJ1dCBvbmx5IGZvciBsaW5rc1xuYS5iYWRnZSB7XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkYmFkZ2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4iLCIvL1xuLy8gSnVtYm90cm9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5qdW1ib3Ryb24ge1xuICBwYWRkaW5nLXRvcDogICAgJGp1bWJvdHJvbi1wYWRkaW5nO1xuICBwYWRkaW5nLWJvdHRvbTogJGp1bWJvdHJvbi1wYWRkaW5nO1xuICBtYXJnaW4tYm90dG9tOiAkanVtYm90cm9uLXBhZGRpbmc7XG4gIGNvbG9yOiAkanVtYm90cm9uLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkanVtYm90cm9uLWJnO1xuXG4gIGgxLFxuICAuaDEge1xuICAgIGNvbG9yOiAkanVtYm90cm9uLWhlYWRpbmctY29sb3I7XG4gIH1cblxuICBwIHtcbiAgICBtYXJnaW4tYm90dG9tOiAoJGp1bWJvdHJvbi1wYWRkaW5nIC8gMik7XG4gICAgZm9udC1zaXplOiAkanVtYm90cm9uLWZvbnQtc2l6ZTtcbiAgICBmb250LXdlaWdodDogMjAwO1xuICB9XG5cbiAgPiBociB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogZGFya2VuKCRqdW1ib3Ryb24tYmcsIDEwJSk7XG4gIH1cblxuICAuY29udGFpbmVyICYsXG4gIC5jb250YWluZXItZmx1aWQgJiB7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7IC8vIE9ubHkgcm91bmQgY29ybmVycyBhdCBoaWdoZXIgcmVzb2x1dGlvbnMgaWYgY29udGFpbmVkIGluIGEgY29udGFpbmVyXG4gIH1cblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikge1xuICAgIHBhZGRpbmctdG9wOiAgICAoJGp1bWJvdHJvbi1wYWRkaW5nICogMS42KTtcbiAgICBwYWRkaW5nLWJvdHRvbTogKCRqdW1ib3Ryb24tcGFkZGluZyAqIDEuNik7XG5cbiAgICAuY29udGFpbmVyICYsXG4gICAgLmNvbnRhaW5lci1mbHVpZCAmIHtcbiAgICAgIHBhZGRpbmctbGVmdDogICgkanVtYm90cm9uLXBhZGRpbmcgKiAyKTtcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICgkanVtYm90cm9uLXBhZGRpbmcgKiAyKTtcbiAgICB9XG5cbiAgICBoMSxcbiAgICAuaDEge1xuICAgICAgZm9udC1zaXplOiAkanVtYm90cm9uLWhlYWRpbmctZm9udC1zaXplO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFRodW1ibmFpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gTWl4aW4gYW5kIGFkanVzdCB0aGUgcmVndWxhciBpbWFnZSBjbGFzc1xuLnRodW1ibmFpbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAkdGh1bWJuYWlsLXBhZGRpbmc7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdGh1bWJuYWlsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCAkdGh1bWJuYWlsLWJvcmRlcjtcbiAgYm9yZGVyLXJhZGl1czogJHRodW1ibmFpbC1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSB0cmFuc2l0aW9uKGJvcmRlciAuMnMgZWFzZS1pbi1vdXQpO1xuXG4gID4gaW1nLFxuICBhID4gaW1nIHtcbiAgICBAaW5jbHVkZSBpbWctcmVzcG9uc2l2ZTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSY6aG92ZXIsIGEmOmZvY3VzLCBhJi5hY3RpdmUgdG8gYS50aHVtYm5haWw6aG92ZXIsIGEudGh1bWJuYWlsOmZvY3VzLCBhLnRodW1ibmFpbC5hY3RpdmVcblxuICAvLyBJbWFnZSBjYXB0aW9uc1xuICAuY2FwdGlvbiB7XG4gICAgcGFkZGluZzogJHRodW1ibmFpbC1jYXB0aW9uLXBhZGRpbmc7XG4gICAgY29sb3I6ICR0aHVtYm5haWwtY2FwdGlvbi1jb2xvcjtcbiAgfVxufVxuXG4vLyBBZGQgYSBob3ZlciBzdGF0ZSBmb3IgbGlua2VkIHZlcnNpb25zIG9ubHlcbmEudGh1bWJuYWlsOmhvdmVyLFxuYS50aHVtYm5haWw6Zm9jdXMsXG5hLnRodW1ibmFpbC5hY3RpdmUge1xuICBib3JkZXItY29sb3I6ICRsaW5rLWNvbG9yO1xufVxuIiwiLy9cbi8vIEFsZXJ0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYWxlcnQge1xuICBwYWRkaW5nOiAkYWxlcnQtcGFkZGluZztcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogJGFsZXJ0LWJvcmRlci1yYWRpdXM7XG5cbiAgLy8gSGVhZGluZ3MgZm9yIGxhcmdlciBhbGVydHNcbiAgaDQge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgLy8gU3BlY2lmaWVkIGZvciB0aGUgaDQgdG8gcHJldmVudCBjb25mbGljdHMgb2YgY2hhbmdpbmcgJGhlYWRpbmdzLWNvbG9yXG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cblxuICAvLyBQcm92aWRlIGNsYXNzIGZvciBsaW5rcyB0aGF0IG1hdGNoIGFsZXJ0c1xuICAuYWxlcnQtbGluayB7XG4gICAgZm9udC13ZWlnaHQ6ICRhbGVydC1saW5rLWZvbnQtd2VpZ2h0O1xuICB9XG5cbiAgLy8gSW1wcm92ZSBhbGlnbm1lbnQgYW5kIHNwYWNpbmcgb2YgaW5uZXIgY29udGVudFxuICA+IHAsXG4gID4gdWwge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICA+IHAgKyBwIHtcbiAgICBtYXJnaW4tdG9wOiA1cHg7XG4gIH1cbn1cblxuLy8gRGlzbWlzc2libGUgYWxlcnRzXG4vL1xuLy8gRXhwYW5kIHRoZSByaWdodCBwYWRkaW5nIGFuZCBhY2NvdW50IGZvciB0aGUgY2xvc2UgYnV0dG9uJ3MgcG9zaXRpb25pbmcuXG5cbi5hbGVydC1kaXNtaXNzYWJsZSwgLy8gVGhlIG1pc3NwZWxsZWQgLmFsZXJ0LWRpc21pc3NhYmxlIHdhcyBkZXByZWNhdGVkIGluIDMuMi4wLlxuLmFsZXJ0LWRpc21pc3NpYmxlIHtcbiAgcGFkZGluZy1yaWdodDogKCRhbGVydC1wYWRkaW5nICsgMjApO1xuXG4gIC8vIEFkanVzdCBjbG9zZSBsaW5rIHBvc2l0aW9uXG4gIC5jbG9zZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTJweDtcbiAgICByaWdodDogLTIxcHg7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbn1cblxuLy8gQWx0ZXJuYXRlIHN0eWxlc1xuLy9cbi8vIEdlbmVyYXRlIGNvbnRleHR1YWwgbW9kaWZpZXIgY2xhc3NlcyBmb3IgY29sb3JpemluZyB0aGUgYWxlcnQuXG5cbi5hbGVydC1zdWNjZXNzIHtcbiAgQGluY2x1ZGUgYWxlcnQtdmFyaWFudCgkYWxlcnQtc3VjY2Vzcy1iZywgJGFsZXJ0LXN1Y2Nlc3MtYm9yZGVyLCAkYWxlcnQtc3VjY2Vzcy10ZXh0KTtcbn1cblxuLmFsZXJ0LWluZm8ge1xuICBAaW5jbHVkZSBhbGVydC12YXJpYW50KCRhbGVydC1pbmZvLWJnLCAkYWxlcnQtaW5mby1ib3JkZXIsICRhbGVydC1pbmZvLXRleHQpO1xufVxuXG4uYWxlcnQtd2FybmluZyB7XG4gIEBpbmNsdWRlIGFsZXJ0LXZhcmlhbnQoJGFsZXJ0LXdhcm5pbmctYmcsICRhbGVydC13YXJuaW5nLWJvcmRlciwgJGFsZXJ0LXdhcm5pbmctdGV4dCk7XG59XG5cbi5hbGVydC1kYW5nZXIge1xuICBAaW5jbHVkZSBhbGVydC12YXJpYW50KCRhbGVydC1kYW5nZXItYmcsICRhbGVydC1kYW5nZXItYm9yZGVyLCAkYWxlcnQtZGFuZ2VyLXRleHQpO1xufVxuIiwiLy8gQWxlcnRzXG5cbkBtaXhpbiBhbGVydC12YXJpYW50KCRiYWNrZ3JvdW5kLCAkYm9yZGVyLCAkdGV4dC1jb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyO1xuICBjb2xvcjogJHRleHQtY29sb3I7XG5cbiAgaHIge1xuICAgIGJvcmRlci10b3AtY29sb3I6IGRhcmtlbigkYm9yZGVyLCA1JSk7XG4gIH1cbiAgLmFsZXJ0LWxpbmsge1xuICAgIGNvbG9yOiBkYXJrZW4oJHRleHQtY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vXG4vLyBQcm9ncmVzcyBiYXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhciBhbmltYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFdlYktpdFxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVzIHtcbiAgZnJvbSAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7IH1cbiAgdG8gICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH1cbn1cblxuLy8gU3BlYyBhbmQgSUUxMCtcbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXMge1xuICBmcm9tICB7IGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDsgfVxuICB0byAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfVxufVxuXG5cbi8vIEJhciBpdHNlbGZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gT3V0ZXIgY29udGFpbmVyXG4ucHJvZ3Jlc3Mge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRwcm9ncmVzcy1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDJweCByZ2JhKDAsMCwwLC4xKSk7XG59XG5cbi8vIEJhciBvZiBwcm9ncmVzc1xuLnByb2dyZXNzLWJhciB7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBjb2xvcjogJHByb2dyZXNzLWJhci1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYmFyLWJnO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjE1KSk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24od2lkdGggLjZzIGVhc2UpO1xufVxuXG4vLyBTdHJpcGVkIGJhcnNcbi8vXG4vLyBgLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhcmAgaXMgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgaW4gZmF2b3Igb2YgdGhlXG4vLyBgLnByb2dyZXNzLWJhci1zdHJpcGVkYCBjbGFzcywgd2hpY2ggeW91IGp1c3QgYWRkIHRvIGFuIGV4aXN0aW5nXG4vLyBgLnByb2dyZXNzLWJhcmAuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLFxuLnByb2dyZXNzLWJhci1zdHJpcGVkIHtcbiAgQGluY2x1ZGUgZ3JhZGllbnQtc3RyaXBlZDtcbiAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHg7XG59XG5cbi8vIENhbGwgYW5pbWF0aW9uIGZvciB0aGUgYWN0aXZlIG9uZVxuLy9cbi8vIGAucHJvZ3Jlc3MuYWN0aXZlIC5wcm9ncmVzcy1iYXJgIGlzIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMi4wIGluIGZhdm9yIG9mIHRoZVxuLy8gYC5wcm9ncmVzcy1iYXIuYWN0aXZlYCBhcHByb2FjaC5cbi5wcm9ncmVzcy5hY3RpdmUgLnByb2dyZXNzLWJhcixcbi5wcm9ncmVzcy1iYXIuYWN0aXZlIHtcbiAgQGluY2x1ZGUgYW5pbWF0aW9uKHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZSk7XG59XG5cblxuLy8gVmFyaWF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucHJvZ3Jlc3MtYmFyLXN1Y2Nlc3Mge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3MtYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWluZm8ge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLWluZm8tYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLXdhcm5pbmcge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLXdhcm5pbmctYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWRhbmdlciB7XG4gIEBpbmNsdWRlIHByb2dyZXNzLWJhci12YXJpYW50KCRwcm9ncmVzcy1iYXItZGFuZ2VyLWJnKTtcbn1cbiIsIi8vIEdyYWRpZW50c1xuXG5cblxuLy8gSG9yaXpvbnRhbCBncmFkaWVudCwgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4vL1xuLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbi8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG5AbWl4aW4gZ3JhZGllbnQtaG9yaXpvbnRhbCgkc3RhcnQtY29sb3I6ICM1NTUsICRlbmQtY29sb3I6ICMzMzMsICRzdGFydC1wZXJjZW50OiAwJSwgJGVuZC1wZXJjZW50OiAxMDAlKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBTYWZhcmkgNS4xLTYsIENocm9tZSAxMCtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBPcGVyYSAxMlxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBTdGFuZGFyZCwgSUUxMCwgRmlyZWZveCAxNissIE9wZXJhIDEyLjEwKywgU2FmYXJpIDcrLCBDaHJvbWUgMjYrXG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRzdGFydC1jb2xvcil9JywgZW5kQ29sb3JzdHI9JyN7aWUtaGV4LXN0cigkZW5kLWNvbG9yKX0nLCBHcmFkaWVudFR5cGU9MSk7IC8vIElFOSBhbmQgZG93blxufVxuXG4vLyBWZXJ0aWNhbCBncmFkaWVudCwgZnJvbSB0b3AgdG8gYm90dG9tXG4vL1xuLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbi8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG5AbWl4aW4gZ3JhZGllbnQtdmVydGljYWwoJHN0YXJ0LWNvbG9yOiAjNTU1LCAkZW5kLWNvbG9yOiAjMzMzLCAkc3RhcnQtcGVyY2VudDogMCUsICRlbmQtcGVyY2VudDogMTAwJSkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAgLy8gT3BlcmEgMTJcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgJHN0YXJ0LWNvbG9yICRzdGFydC1wZXJjZW50LCAkZW5kLWNvbG9yICRlbmQtcGVyY2VudCk7IC8vIFN0YW5kYXJkLCBJRTEwLCBGaXJlZm94IDE2KywgT3BlcmEgMTIuMTArLCBTYWZhcmkgNyssIENocm9tZSAyNitcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScje2llLWhleC1zdHIoJHN0YXJ0LWNvbG9yKX0nLCBlbmRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRlbmQtY29sb3IpfScsIEdyYWRpZW50VHlwZT0wKTsgLy8gSUU5IGFuZCBkb3duXG59XG5cbkBtaXhpbiBncmFkaWVudC1kaXJlY3Rpb25hbCgkc3RhcnQtY29sb3I6ICM1NTUsICRlbmQtY29sb3I6ICMzMzMsICRkZWc6IDQ1ZGVnKSB7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoJGRlZywgJHN0YXJ0LWNvbG9yLCAkZW5kLWNvbG9yKTsgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgkZGVnLCAkc3RhcnQtY29sb3IsICRlbmQtY29sb3IpOyAvLyBPcGVyYSAxMlxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJGRlZywgJHN0YXJ0LWNvbG9yLCAkZW5kLWNvbG9yKTsgLy8gU3RhbmRhcmQsIElFMTAsIEZpcmVmb3ggMTYrLCBPcGVyYSAxMi4xMCssIFNhZmFyaSA3KywgQ2hyb21lIDI2K1xufVxuQG1peGluIGdyYWRpZW50LWhvcml6b250YWwtdGhyZWUtY29sb3JzKCRzdGFydC1jb2xvcjogIzAwYjNlZSwgJG1pZC1jb2xvcjogIzdhNDNiNiwgJGNvbG9yLXN0b3A6IDUwJSwgJGVuZC1jb2xvcjogI2MzMzI1Zikge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCAkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgJHN0YXJ0LWNvbG9yLCAkbWlkLWNvbG9yICRjb2xvci1zdG9wLCAkZW5kLWNvbG9yKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScje2llLWhleC1zdHIoJHN0YXJ0LWNvbG9yKX0nLCBlbmRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRlbmQtY29sb3IpfScsIEdyYWRpZW50VHlwZT0xKTsgLy8gSUU5IGFuZCBkb3duLCBnZXRzIG5vIGNvbG9yLXN0b3AgYXQgYWxsIGZvciBwcm9wZXIgZmFsbGJhY2tcbn1cbkBtaXhpbiBncmFkaWVudC12ZXJ0aWNhbC10aHJlZS1jb2xvcnMoJHN0YXJ0LWNvbG9yOiAjMDBiM2VlLCAkbWlkLWNvbG9yOiAjN2E0M2I2LCAkY29sb3Itc3RvcDogNTAlLCAkZW5kLWNvbG9yOiAjYzMzMjVmKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCRzdGFydC1jb2xvciwgJG1pZC1jb2xvciAkY29sb3Itc3RvcCwgJGVuZC1jb2xvcik7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJHN0YXJ0LWNvbG9yLCAkbWlkLWNvbG9yICRjb2xvci1zdG9wLCAkZW5kLWNvbG9yKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRzdGFydC1jb2xvcil9JywgZW5kQ29sb3JzdHI9JyN7aWUtaGV4LXN0cigkZW5kLWNvbG9yKX0nLCBHcmFkaWVudFR5cGU9MCk7IC8vIElFOSBhbmQgZG93biwgZ2V0cyBubyBjb2xvci1zdG9wIGF0IGFsbCBmb3IgcHJvcGVyIGZhbGxiYWNrXG59XG5AbWl4aW4gZ3JhZGllbnQtcmFkaWFsKCRpbm5lci1jb2xvcjogIzU1NSwgJG91dGVyLWNvbG9yOiAjMzMzKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtcmFkaWFsLWdyYWRpZW50KGNpcmNsZSwgJGlubmVyLWNvbG9yLCAkb3V0ZXItY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlLCAkaW5uZXItY29sb3IsICRvdXRlci1jb2xvcik7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG5AbWl4aW4gZ3JhZGllbnQtc3RyaXBlZCgkY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjE1KSwgJGFuZ2xlOiA0NWRlZykge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgkYW5nbGUsICRjb2xvciAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCAkY29sb3IgNTAlLCAkY29sb3IgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KCRhbmdsZSwgJGNvbG9yIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsICRjb2xvciA1MCUsICRjb2xvciA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJGFuZ2xlLCAkY29sb3IgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgJGNvbG9yIDUwJSwgJGNvbG9yIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG59XG4iLCIvLyBQcm9ncmVzcyBiYXJzXG5cbkBtaXhpbiBwcm9ncmVzcy1iYXItdmFyaWFudCgkY29sb3IpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yO1xuXG4gIC8vIERlcHJlY2F0ZWQgcGFyZW50IGNsYXNzIHJlcXVpcmVtZW50IGFzIG9mIHYzLjIuMFxuICAucHJvZ3Jlc3Mtc3RyaXBlZCAmIHtcbiAgICBAaW5jbHVkZSBncmFkaWVudC1zdHJpcGVkO1xuICB9XG59XG4iLCIubWVkaWEge1xuICAvLyBQcm9wZXIgc3BhY2luZyBiZXR3ZWVuIGluc3RhbmNlcyBvZiAubWVkaWFcbiAgbWFyZ2luLXRvcDogMTVweDtcblxuICAmOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi5tZWRpYSxcbi5tZWRpYS1ib2R5IHtcbiAgem9vbTogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLm1lZGlhLWJvZHkge1xuICB3aWR0aDogMTAwMDBweDtcbn1cblxuLm1lZGlhLW9iamVjdCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuXG4gIC8vIEZpeCBjb2xsYXBzZSBpbiB3ZWJraXQgZnJvbSBtYXgtd2lkdGg6IDEwMCUgYW5kIGRpc3BsYXk6IHRhYmxlLWNlbGwuXG4gICYuaW1nLXRodW1ibmFpbCB7XG4gICAgbWF4LXdpZHRoOiBub25lO1xuICB9XG59XG5cbi5tZWRpYS1yaWdodCxcbi5tZWRpYSA+IC5wdWxsLXJpZ2h0IHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYSA+IC5wdWxsLWxlZnQge1xuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYS1yaWdodCxcbi5tZWRpYS1ib2R5IHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxuLm1lZGlhLW1pZGRsZSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5tZWRpYS1ib3R0b20ge1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4vLyBSZXNldCBtYXJnaW5zIG9uIGhlYWRpbmdzIGZvciB0aWdodGVyIGRlZmF1bHQgc3BhY2luZ1xuLm1lZGlhLWhlYWRpbmcge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi8vIE1lZGlhIGxpc3QgdmFyaWF0aW9uXG4vL1xuLy8gVW5kbyBkZWZhdWx0IHVsL29sIHN0eWxlc1xuLm1lZGlhLWxpc3Qge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG4iLCIvL1xuLy8gTGlzdCBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQmFzZSBjbGFzc1xuLy9cbi8vIEVhc2lseSB1c2FibGUgb24gPHVsPiwgPG9sPiwgb3IgPGRpdj4uXG5cbi5saXN0LWdyb3VwIHtcbiAgLy8gTm8gbmVlZCB0byBzZXQgbGlzdC1zdHlsZTogbm9uZTsgc2luY2UgLmxpc3QtZ3JvdXAtaXRlbSBpcyBibG9jayBsZXZlbFxuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7IC8vIHJlc2V0IHBhZGRpbmcgYmVjYXVzZSB1bCBhbmQgb2xcbn1cblxuXG4vLyBJbmRpdmlkdWFsIGxpc3QgaXRlbXNcbi8vXG4vLyBVc2Ugb24gYGxpYHMgb3IgYGRpdmBzIHdpdGhpbiB0aGUgYC5saXN0LWdyb3VwYCBwYXJlbnQuXG5cbi5saXN0LWdyb3VwLWl0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gIC8vIFBsYWNlIHRoZSBib3JkZXIgb24gdGhlIGxpc3QgaXRlbXMgYW5kIG5lZ2F0aXZlIG1hcmdpbiB1cCBmb3IgYmV0dGVyIHN0eWxpbmdcbiAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGxpc3QtZ3JvdXAtYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRsaXN0LWdyb3VwLWJvcmRlcjtcblxuICAvLyBSb3VuZCB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXNcbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoJGxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyk7XG4gIH1cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKCRsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO1xuICB9XG59XG5cblxuLy8gSW50ZXJhY3RpdmUgbGlzdCBpdGVtc1xuLy9cbi8vIFVzZSBhbmNob3Igb3IgYnV0dG9uIGVsZW1lbnRzIGluc3RlYWQgb2YgYGxpYHMgb3IgYGRpdmBzIHRvIGNyZWF0ZSBpbnRlcmFjdGl2ZSBpdGVtcy5cbi8vIEluY2x1ZGVzIGFuIGV4dHJhIGAuYWN0aXZlYCBtb2RpZmllciBjbGFzcyBmb3Igc2hvd2luZyBzZWxlY3RlZCBpdGVtcy5cblxuYS5saXN0LWdyb3VwLWl0ZW0sXG5idXR0b24ubGlzdC1ncm91cC1pdGVtIHtcbiAgY29sb3I6ICRsaXN0LWdyb3VwLWxpbmstY29sb3I7XG5cbiAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgICBjb2xvcjogJGxpc3QtZ3JvdXAtbGluay1oZWFkaW5nLWNvbG9yO1xuICB9XG5cbiAgLy8gSG92ZXIgc3RhdGVcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRsaXN0LWdyb3VwLWhvdmVyLWJnO1xuICB9XG59XG5cbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0ge1xuICB3aWR0aDogMTAwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIC8vIERpc2FibGVkIHN0YXRlXG4gICYuZGlzYWJsZWQsXG4gICYuZGlzYWJsZWQ6aG92ZXIsXG4gICYuZGlzYWJsZWQ6Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRsaXN0LWdyb3VwLWRpc2FibGVkLWJnO1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcjtcbiAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG5cbiAgICAvLyBGb3JjZSBjb2xvciB0byBpbmhlcml0IGZvciBjdXN0b20gY29udGVudFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiAkbGlzdC1ncm91cC1kaXNhYmxlZC10ZXh0LWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFjdGl2ZSBjbGFzcyBvbiBpdGVtIGl0c2VsZiwgbm90IHBhcmVudFxuICAmLmFjdGl2ZSxcbiAgJi5hY3RpdmU6aG92ZXIsXG4gICYuYWN0aXZlOmZvY3VzIHtcbiAgICB6LWluZGV4OiAyOyAvLyBQbGFjZSBhY3RpdmUgaXRlbXMgYWJvdmUgdGhlaXIgc2libGluZ3MgZm9yIHByb3BlciBib3JkZXIgc3R5bGluZ1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGxpc3QtZ3JvdXAtYWN0aXZlLWJnO1xuICAgIGJvcmRlci1jb2xvcjogJGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjtcblxuICAgIC8vIEZvcmNlIGNvbG9yIHRvIGluaGVyaXQgZm9yIGN1c3RvbSBjb250ZW50XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiAkbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhbnRzXG4vL1xuLy8gQWRkIG1vZGlmaWVyIGNsYXNzZXMgdG8gY2hhbmdlIHRleHQgYW5kIGJhY2tncm91bmQgY29sb3Igb24gaW5kaXZpZHVhbCBpdGVtcy5cbi8vIE9yZ2FuaXphdGlvbmFsbHksIHRoaXMgbXVzdCBjb21lIGFmdGVyIHRoZSBgOmhvdmVyYCBzdGF0ZXMuXG5cbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHN1Y2Nlc3MsICRzdGF0ZS1zdWNjZXNzLWJnLCAkc3RhdGUtc3VjY2Vzcy10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KGluZm8sICRzdGF0ZS1pbmZvLWJnLCAkc3RhdGUtaW5mby10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHdhcm5pbmcsICRzdGF0ZS13YXJuaW5nLWJnLCAkc3RhdGUtd2FybmluZy10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KGRhbmdlciwgJHN0YXRlLWRhbmdlci1iZywgJHN0YXRlLWRhbmdlci10ZXh0KTtcblxuXG4vLyBDdXN0b20gY29udGVudCBvcHRpb25zXG4vL1xuLy8gRXh0cmEgY2xhc3NlcyBmb3IgY3JlYXRpbmcgd2VsbC1mb3JtYXR0ZWQgY29udGVudCB3aXRoaW4gYC5saXN0LWdyb3VwLWl0ZW1gcy5cblxuLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbn1cbiIsIi8vIExpc3QgR3JvdXBzXG5cbkBtaXhpbiBsaXN0LWdyb3VwLWl0ZW0tdmFyaWFudCgkc3RhdGUsICRiYWNrZ3JvdW5kLCAkY29sb3IpIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbS0jeyRzdGF0ZX0ge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQ7XG5cbiAgICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSYsIGJ1dHRvbiYgdG8gYS5saXN0LWdyb3VwLWl0ZW0tI3skc3RhdGV9LCBidXR0b24ubGlzdC1ncm91cC1pdGVtLSN7JHN0YXRlfVxuICB9XG5cbiAgYS5saXN0LWdyb3VwLWl0ZW0tI3skc3RhdGV9LFxuICBidXR0b24ubGlzdC1ncm91cC1pdGVtLSN7JHN0YXRlfSB7XG4gICAgY29sb3I6ICRjb2xvcjtcblxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG5cbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgNSUpO1xuICAgIH1cbiAgICAmLmFjdGl2ZSxcbiAgICAmLmFjdGl2ZTpob3ZlcixcbiAgICAmLmFjdGl2ZTpmb2N1cyB7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbiAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFBhbmVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ucGFuZWwge1xuICBtYXJnaW4tYm90dG9tOiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6ICRwYW5lbC1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSkpO1xufVxuXG4vLyBQYW5lbCBjb250ZW50c1xuLnBhbmVsLWJvZHkge1xuICBwYWRkaW5nOiAkcGFuZWwtYm9keS1wYWRkaW5nO1xuICBAaW5jbHVkZSBjbGVhcmZpeDtcbn1cblxuLy8gT3B0aW9uYWwgaGVhZGluZ1xuLnBhbmVsLWhlYWRpbmcge1xuICBwYWRkaW5nOiAkcGFuZWwtaGVhZGluZy1wYWRkaW5nO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKCgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpKTtcblxuICA+IC5kcm9wZG93biAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBXaXRoaW4gaGVhZGluZywgc3RyaXAgYW55IGBoKmAgdGFnIG9mIGl0cyBkZWZhdWx0IG1hcmdpbnMgZm9yIHNwYWNpbmcuXG4ucGFuZWwtdGl0bGUge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LXNpemU6IGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDEuMTI1KSk7XG4gIGNvbG9yOiBpbmhlcml0O1xuXG4gID4gYSxcbiAgPiBzbWFsbCxcbiAgPiAuc21hbGwsXG4gID4gc21hbGwgPiBhLFxuICA+IC5zbWFsbCA+IGEge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsIGZvb3RlciAoc3RheXMgZ3JheSBpbiBldmVyeSBtb2RpZmllciBjbGFzcylcbi5wYW5lbC1mb290ZXIge1xuICBwYWRkaW5nOiAkcGFuZWwtZm9vdGVyLXBhZGRpbmc7XG4gIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1mb290ZXItYmc7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAkcGFuZWwtaW5uZXItYm9yZGVyO1xuICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cygoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG59XG5cblxuLy8gTGlzdCBncm91cHMgaW4gcGFuZWxzXG4vL1xuLy8gQnkgZGVmYXVsdCwgc3BhY2Ugb3V0IGxpc3QgZ3JvdXAgY29udGVudCBmcm9tIHBhbmVsIGhlYWRpbmdzIHRvIGFjY291bnQgZm9yXG4vLyBhbnkga2luZCBvZiBjdXN0b20gY29udGVudCBiZXR3ZWVuIHRoZSB0d28uXG5cbi5wYW5lbCB7XG4gID4gLmxpc3QtZ3JvdXAsXG4gID4gLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICAubGlzdC1ncm91cC1pdGVtIHtcbiAgICAgIGJvcmRlci13aWR0aDogMXB4IDA7XG4gICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIH1cblxuICAgIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMDtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBib3JkZXIgYm90dG9tIHJhZGl1cyBmb3IgbGFzdCBvbmVcbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG4gICAgfVxuICB9XG59XG4vLyBDb2xsYXBzZSBzcGFjZSBiZXR3ZWVuIHdoZW4gdGhlcmUncyBubyBhZGRpdGlvbmFsIGNvbnRlbnQuXG4ucGFuZWwtaGVhZGluZyArIC5saXN0LWdyb3VwIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgfVxufVxuLmxpc3QtZ3JvdXAgKyAucGFuZWwtZm9vdGVyIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbn1cblxuLy8gVGFibGVzIGluIHBhbmVsc1xuLy9cbi8vIFBsYWNlIGEgbm9uLWJvcmRlcmVkIGAudGFibGVgIHdpdGhpbiBhIHBhbmVsIChub3Qgd2l0aGluIGEgYC5wYW5lbC1ib2R5YCkgYW5kXG4vLyB3YXRjaCBpdCBnbyBmdWxsIHdpZHRoLlxuXG4ucGFuZWwge1xuICA+IC50YWJsZSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSxcbiAgPiAucGFuZWwtY29sbGFwc2UgPiAudGFibGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICBjYXB0aW9uIHtcbiAgICAgIHBhZGRpbmctbGVmdDogJHBhbmVsLWJvZHktcGFkZGluZztcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICRwYW5lbC1ib2R5LXBhZGRpbmc7XG4gICAgfVxuICB9XG4gIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gID4gLnRhYmxlOmZpcnN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkIHtcbiAgICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG5cbiAgICA+IHRoZWFkOmZpcnN0LWNoaWxkLFxuICAgID4gdGJvZHk6Zmlyc3QtY2hpbGQge1xuICAgICAgPiB0cjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG5cbiAgICAgICAgdGQ6Zmlyc3QtY2hpbGQsXG4gICAgICAgIHRoOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZDpsYXN0LWNoaWxkLFxuICAgICAgICB0aDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gQWRkIGJvcmRlciBib3R0b20gcmFkaXVzIGZvciBsYXN0IG9uZVxuICA+IC50YWJsZTpsYXN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCB7XG4gICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuXG4gICAgPiB0Ym9keTpsYXN0LWNoaWxkLFxuICAgID4gdGZvb3Q6bGFzdC1jaGlsZCB7XG4gICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuXG4gICAgICAgIHRkOmZpcnN0LWNoaWxkLFxuICAgICAgICB0aDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGQ6bGFzdC1jaGlsZCxcbiAgICAgICAgdGg6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gLnBhbmVsLWJvZHkgKyAudGFibGUsXG4gID4gLnBhbmVsLWJvZHkgKyAudGFibGUtcmVzcG9uc2l2ZSxcbiAgPiAudGFibGUgKyAucGFuZWwtYm9keSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSArIC5wYW5lbC1ib2R5IHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgfVxuICA+IC50YWJsZSA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGgsXG4gID4gLnRhYmxlID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZCB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgfVxuICA+IC50YWJsZS1ib3JkZXJlZCxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCB7XG4gICAgYm9yZGVyOiAwO1xuICAgID4gdGhlYWQsXG4gICAgPiB0Ym9keSxcbiAgICA+IHRmb290IHtcbiAgICAgID4gdHIge1xuICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICA+IHRkOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItbGVmdDogMDtcbiAgICAgICAgfVxuICAgICAgICA+IHRoOmxhc3QtY2hpbGQsXG4gICAgICAgID4gdGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgID4gdGhlYWQsXG4gICAgPiB0Ym9keSB7XG4gICAgICA+IHRyOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgPiB0ZCxcbiAgICAgICAgPiB0aCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICA+IHRib2R5LFxuICAgID4gdGZvb3Qge1xuICAgICAgPiB0cjpsYXN0LWNoaWxkIHtcbiAgICAgICAgPiB0ZCxcbiAgICAgICAgPiB0aCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IC50YWJsZS1yZXNwb25zaXZlIHtcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG5cbi8vIENvbGxhcHNhYmxlIHBhbmVscyAoYWthLCBhY2NvcmRpb24pXG4vL1xuLy8gV3JhcCBhIHNlcmllcyBvZiBwYW5lbHMgaW4gYC5wYW5lbC1ncm91cGAgdG8gdHVybiB0aGVtIGludG8gYW4gYWNjb3JkaW9uIHdpdGhcbi8vIHRoZSBoZWxwIG9mIG91ciBjb2xsYXBzZSBKYXZhU2NyaXB0IHBsdWdpbi5cblxuLnBhbmVsLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuXG4gIC8vIFRpZ2h0ZW4gdXAgbWFyZ2luIHNvIGl0J3Mgb25seSBiZXR3ZWVuIHBhbmVsc1xuICAucGFuZWwge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgYm9yZGVyLXJhZGl1czogJHBhbmVsLWJvcmRlci1yYWRpdXM7XG5cbiAgICArIC5wYW5lbCB7XG4gICAgICBtYXJnaW4tdG9wOiA1cHg7XG4gICAgfVxuICB9XG5cbiAgLnBhbmVsLWhlYWRpbmcge1xuICAgIGJvcmRlci1ib3R0b206IDA7XG5cbiAgICArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5LFxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRwYW5lbC1pbm5lci1ib3JkZXI7XG4gICAgfVxuICB9XG5cbiAgLnBhbmVsLWZvb3RlciB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICArIC5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keSB7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHBhbmVsLWlubmVyLWJvcmRlcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnNcbi5wYW5lbC1kZWZhdWx0IHtcbiAgQGluY2x1ZGUgcGFuZWwtdmFyaWFudCgkcGFuZWwtZGVmYXVsdC1ib3JkZXIsICRwYW5lbC1kZWZhdWx0LXRleHQsICRwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmcsICRwYW5lbC1kZWZhdWx0LWJvcmRlcik7XG59XG4ucGFuZWwtcHJpbWFyeSB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLXByaW1hcnktYm9yZGVyLCAkcGFuZWwtcHJpbWFyeS10ZXh0LCAkcGFuZWwtcHJpbWFyeS1oZWFkaW5nLWJnLCAkcGFuZWwtcHJpbWFyeS1ib3JkZXIpO1xufVxuLnBhbmVsLXN1Y2Nlc3Mge1xuICBAaW5jbHVkZSBwYW5lbC12YXJpYW50KCRwYW5lbC1zdWNjZXNzLWJvcmRlciwgJHBhbmVsLXN1Y2Nlc3MtdGV4dCwgJHBhbmVsLXN1Y2Nlc3MtaGVhZGluZy1iZywgJHBhbmVsLXN1Y2Nlc3MtYm9yZGVyKTtcbn1cbi5wYW5lbC1pbmZvIHtcbiAgQGluY2x1ZGUgcGFuZWwtdmFyaWFudCgkcGFuZWwtaW5mby1ib3JkZXIsICRwYW5lbC1pbmZvLXRleHQsICRwYW5lbC1pbmZvLWhlYWRpbmctYmcsICRwYW5lbC1pbmZvLWJvcmRlcik7XG59XG4ucGFuZWwtd2FybmluZyB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLXdhcm5pbmctYm9yZGVyLCAkcGFuZWwtd2FybmluZy10ZXh0LCAkcGFuZWwtd2FybmluZy1oZWFkaW5nLWJnLCAkcGFuZWwtd2FybmluZy1ib3JkZXIpO1xufVxuLnBhbmVsLWRhbmdlciB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLWRhbmdlci1ib3JkZXIsICRwYW5lbC1kYW5nZXItdGV4dCwgJHBhbmVsLWRhbmdlci1oZWFkaW5nLWJnLCAkcGFuZWwtZGFuZ2VyLWJvcmRlcik7XG59XG4iLCIvLyBQYW5lbHNcblxuQG1peGluIHBhbmVsLXZhcmlhbnQoJGJvcmRlciwgJGhlYWRpbmctdGV4dC1jb2xvciwgJGhlYWRpbmctYmctY29sb3IsICRoZWFkaW5nLWJvcmRlcikge1xuICBib3JkZXItY29sb3I6ICRib3JkZXI7XG5cbiAgJiA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgICBjb2xvcjogJGhlYWRpbmctdGV4dC1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGluZy1iZy1jb2xvcjtcbiAgICBib3JkZXItY29sb3I6ICRoZWFkaW5nLWJvcmRlcjtcblxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGJvcmRlcjtcbiAgICB9XG4gICAgLmJhZGdlIHtcbiAgICAgIGNvbG9yOiAkaGVhZGluZy1iZy1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRoZWFkaW5nLXRleHQtY29sb3I7XG4gICAgfVxuICB9XG4gICYgPiAucGFuZWwtZm9vdGVyIHtcbiAgICArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRib3JkZXI7XG4gICAgfVxuICB9XG59XG4iLCIvLyBFbWJlZHMgcmVzcG9uc2l2ZVxuLy9cbi8vIENyZWRpdDogTmljb2xhcyBHYWxsYWdoZXIgYW5kIFNVSVQgQ1NTLlxuXG4uZW1iZWQtcmVzcG9uc2l2ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogMDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAuZW1iZWQtcmVzcG9uc2l2ZS1pdGVtLFxuICBpZnJhbWUsXG4gIGVtYmVkLFxuICBvYmplY3QsXG4gIHZpZGVvIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IDA7XG4gIH1cbn1cblxuLy8gTW9kaWZpZXIgY2xhc3MgZm9yIDE2OjkgYXNwZWN0IHJhdGlvXG4uZW1iZWQtcmVzcG9uc2l2ZS0xNmJ5OSB7XG4gIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG59XG5cbi8vIE1vZGlmaWVyIGNsYXNzIGZvciA0OjMgYXNwZWN0IHJhdGlvXG4uZW1iZWQtcmVzcG9uc2l2ZS00YnkzIHtcbiAgcGFkZGluZy1ib3R0b206IDc1JTtcbn1cbiIsIi8vXG4vLyBXZWxsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ud2VsbCB7XG4gIG1pbi1oZWlnaHQ6IDIwcHg7XG4gIHBhZGRpbmc6IDE5cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3ZWxsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCAkd2VsbC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KSk7XG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlci1jb2xvcjogI2RkZDtcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsLjE1KTtcbiAgfVxufVxuXG4vLyBTaXplc1xuLndlbGwtbGcge1xuICBwYWRkaW5nOiAyNHB4O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1sYXJnZTtcbn1cbi53ZWxsLXNtIHtcbiAgcGFkZGluZzogOXB4O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1zbWFsbDtcbn1cbiIsIi8vXG4vLyBDbG9zZSBpY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4uY2xvc2Uge1xuICBmbG9hdDogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogKCRmb250LXNpemUtYmFzZSAqIDEuNSk7XG4gIGZvbnQtd2VpZ2h0OiAkY2xvc2UtZm9udC13ZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGNsb3NlLWNvbG9yO1xuICB0ZXh0LXNoYWRvdzogJGNsb3NlLXRleHQtc2hhZG93O1xuICBAaW5jbHVkZSBvcGFjaXR5KC4yKTtcblxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBjb2xvcjogJGNsb3NlLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgQGluY2x1ZGUgb3BhY2l0eSguNSk7XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYnV0dG9uJiB0byBidXR0b24uY2xvc2Vcbn1cblxuLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBidXR0b24gdmVyc2lvblxuLy8gaU9TIHJlcXVpcmVzIHRoZSBidXR0b24gZWxlbWVudCBpbnN0ZWFkIG9mIGFuIGFuY2hvciB0YWcuXG4vLyBJZiB5b3Ugd2FudCB0aGUgYW5jaG9yIHZlcnNpb24sIGl0IHJlcXVpcmVzIGBocmVmPVwiI1wiYC5cbi8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvY2xpY2sjU2FmYXJpX01vYmlsZVxuYnV0dG9uLmNsb3NlIHtcbiAgcGFkZGluZzogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG4iLCIvKlxuKiBQcm9qZWN0IEtpbWNoaVxuKlxuKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDE1XG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG4vL1xuLy8gTW9kYWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyAubW9kYWwtb3BlbiAgICAgIC0gYm9keSBjbGFzcyBmb3Iga2lsbGluZyB0aGUgc2Nyb2xsXG4vLyAubW9kYWwgICAgICAgICAgIC0gY29udGFpbmVyIHRvIHNjcm9sbCB3aXRoaW5cbi8vIC5tb2RhbC1kaWFsb2cgICAgLSBwb3NpdGlvbmluZyBzaGVsbCBmb3IgdGhlIGFjdHVhbCBtb2RhbFxuLy8gLm1vZGFsLWNvbnRlbnQgICAtIGFjdHVhbCBtb2RhbCB3LyBiZyBhbmQgY29ybmVycyBhbmQgc2hpdFxuXG4vLyBLaWxsIHRoZSBzY3JvbGwgb24gdGhlIGJvZHlcbi5tb2RhbC1vcGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLy8gQ29udGFpbmVyIHRoYXQgdGhlIG1vZGFsIHNjcm9sbHMgd2l0aGluXG4ubW9kYWwge1xuICBkaXNwbGF5OiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHppbmRleC1tb2RhbDtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuXG4gIC8vIFByZXZlbnQgQ2hyb21lIG9uIFdpbmRvd3MgZnJvbSBhZGRpbmcgYSBmb2N1cyBvdXRsaW5lLiBGb3IgZGV0YWlscywgc2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEwOTUxLlxuICBvdXRsaW5lOiAwO1xuXG4gIC8vIFdoZW4gZmFkaW5nIGluIHRoZSBtb2RhbCwgYW5pbWF0ZSBpdCB0byBzbGlkZSBkb3duXG4gICYuZmFkZSAubW9kYWwtZGlhbG9nIHtcbiAgICBAaW5jbHVkZSB0cmFuc2xhdGUoMCwgLTI1JSk7XG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbi10cmFuc2Zvcm0oMC4zcyBlYXNlLW91dCk7XG4gIH1cbiAgJi5pbiAubW9kYWwtZGlhbG9nIHsgQGluY2x1ZGUgdHJhbnNsYXRlKDAsIDApIH1cbn1cbi5tb2RhbC1vcGVuIC5tb2RhbCB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLy8gU2hlbGwgZGl2IHRvIHBvc2l0aW9uIHRoZSBtb2RhbCB3aXRoIGJvdHRvbSBwYWRkaW5nXG4ubW9kYWwtZGlhbG9nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogYXV0bztcbiAgbWFyZ2luOiAxMHB4O1xuICBib3JkZXI6IDZweCBzb2xpZCAkbW9kYWwtY29udGVudC1mYWxsYmFjay1ib3JkZXItY29sb3I7IC8vb2xkIGJyb3dzZXJzIGZhbGxiYWNrIChpZTggZXRjKVxuICBib3JkZXI6IDZweCBzb2xpZCAkbW9kYWwtY29udGVudC1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsgIFxufVxuXG4vLyBBY3R1YWwgbW9kYWxcbi5tb2RhbC1jb250ZW50IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtY29udGVudC1iZztcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgYm9yZGVyOiAzcHggc29saWQgIzk5OTsgICBcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lICFpbXBvcnRhbnQpO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBvdXRsaW5lOiAwO1xufVxuXG5cbi8vIE1vZGFsIGJhY2tncm91bmRcbi5tb2RhbC1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LW1vZGFsLWJhY2tncm91bmQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICRtb2RhbC1iYWNrZHJvcC1iZztcbiAgLy8gRmFkZSBmb3IgYmFja2Ryb3BcbiAgJi5mYWRlIHsgQGluY2x1ZGUgb3BhY2l0eSgwKTsgfVxuICAmLmluIHsgQGluY2x1ZGUgb3BhY2l0eSgkbW9kYWwtYmFja2Ryb3Atb3BhY2l0eSk7IH1cbn1cblxuLy8gTW9kYWwgaGVhZGVyXG4vLyBUb3Agc2VjdGlvbiBvZiB0aGUgbW9kYWwgdy8gdGl0bGUgYW5kIGRpc21pc3Ncbi5tb2RhbC1oZWFkZXIge1xuICBwYWRkaW5nOiAkbW9kYWwtdGl0bGUtcGFkZGluZztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRtb2RhbC1oZWFkZXItYm9yZGVyLWNvbG9yO1xuICBtaW4taGVpZ2h0OiAoJG1vZGFsLXRpdGxlLXBhZGRpbmcgKyAkbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQpO1xufVxuLy8gQ2xvc2UgaWNvblxuLm1vZGFsLWhlYWRlciAuY2xvc2Uge1xuICBtYXJnaW4tdG9wOiAtMnB4O1xufVxuXG4vLyBUaXRsZSB0ZXh0IHdpdGhpbiBoZWFkZXJcbi5tb2RhbC10aXRsZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGxpbmUtaGVpZ2h0OiAkbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQ7XG4gICAgZm9udC1zaXplOiAyN3B4O1xuICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbGlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IDMwMCAhaW1wb3J0YW50O1xufVxuXG4vLyBNb2RhbCBib2R5XG4vLyBXaGVyZSBhbGwgbW9kYWwgY29udGVudCByZXNpZGVzIChzaWJsaW5nIG9mIC5tb2RhbC1oZWFkZXIgYW5kIC5tb2RhbC1mb290ZXIpXG4ubW9kYWwtYm9keSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogJG1vZGFsLWlubmVyLXBhZGRpbmc7XG59XG5cbi8vIEZvb3RlciAoZm9yIGFjdGlvbnMpXG4ubW9kYWwtZm9vdGVyIHtcbiAgcGFkZGluZzogJG1vZGFsLWlubmVyLXBhZGRpbmc7XG4gIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDtcbiAgYm9yZGVyLXRvcDogMDtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7IC8vIGNsZWFyIGl0IGluIGNhc2UgZm9sa3MgdXNlIC5wdWxsLSogY2xhc3NlcyBvbiBidXR0b25zXG5cbiAgLmJ0biB7XG4gICAgcGFkZGluZzogNnB4IDEycHg7XG4gICAgbWluLXdpZHRoOiA3NXB4O1xuICAgIH1cblxuICAvLyBQcm9wZXJseSBzcGFjZSBvdXQgYnV0dG9uc1xuICAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyAvLyBhY2NvdW50IGZvciBpbnB1dFt0eXBlPVwic3VibWl0XCJdIHdoaWNoIGdldHMgdGhlIGJvdHRvbSBtYXJnaW4gbGlrZSBhbGwgb3RoZXIgaW5wdXRzXG4gIH1cbiAgLy8gYnV0IG92ZXJyaWRlIHRoYXQgZm9yIGJ1dHRvbiBncm91cHNcbiAgLmJ0bi1ncm91cCAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIH1cbiAgLy8gYW5kIG92ZXJyaWRlIGl0IGZvciBibG9jayBidXR0b25zIGFzIHdlbGxcbiAgLmJ0bi1ibG9jayArIC5idG4tYmxvY2sge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi8vIE1lYXN1cmUgc2Nyb2xsYmFyIHdpZHRoIGZvciBwYWRkaW5nIGJvZHkgZHVyaW5nIG1vZGFsIHNob3cvaGlkZVxuLm1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC05OTk5cHg7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5cbi8vIFNjYWxlIHVwIHRoZSBtb2RhbFxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gIC8vIEF1dG9tYXRpY2FsbHkgc2V0IG1vZGFsJ3Mgd2lkdGggZm9yIGxhcmdlciB2aWV3cG9ydHNcbiAgLm1vZGFsLWRpYWxvZyB7XG4gICAgd2lkdGg6ICRtb2RhbC1tZDtcbiAgICBtYXJnaW46IDMwcHggYXV0bztcbiAgfVxuICAubW9kYWwtY29udGVudCB7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdygwIDVweCAxNXB4IHJnYmEoMCwwLDAsLjUpKTtcbiAgfVxuXG4gIC8vIE1vZGFsIHNpemVzXG4gIC5tb2RhbC1zbSB7IHdpZHRoOiAkbW9kYWwtc207IH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gIC5tb2RhbC1sZyB7IHdpZHRoOiAkbW9kYWwtbGc7IH1cbn1cblxuLm1vZGFsIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgeyBcbiAgLm1vZGFsOmJlZm9yZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgY29udGVudDogXCIgXCI7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG59XG5cbi5tb2RhbC1kaWFsb2cge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbkBlYWNoICRwYWdlLCAkYmdjb2xvciBpbiAkY29sb3JzIHtcbiAgIyN7JHBhZ2V9LXJvb3QtY29udGFpbmVyLCAuI3skcGFnZX0tbW9kYWwge1xuXG4gICAgICAubW9kYWwtZm9vdGVyIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAkYmdjb2xvciAhaW1wb3J0YW50O1xuICAgICAgfVxuICB9XG59XG5cbi5tb2RhbCBsYWJlbCB7XG4gIGNvbG9yOiAkZ3JheS1kYXJrZXI7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbGlnaHQ7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cbiIsIi8vXG4vLyBUb29sdGlwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4udG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogJHppbmRleC10b29sdGlwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgLy8gT3VyIHBhcmVudCBlbGVtZW50IGNhbiBiZSBhcmJpdHJhcnkgc2luY2UgdG9vbHRpcHMgYXJlIGJ5IGRlZmF1bHQgaW5zZXJ0ZWQgYXMgYSBzaWJsaW5nIG9mIHRoZWlyIHRhcmdldCBlbGVtZW50LlxuICAvLyBTbyByZXNldCBvdXIgZm9udCBhbmQgdGV4dCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGluaGVyaXRpbmcgd2VpcmQgdmFsdWVzLlxuICBAaW5jbHVkZSByZXNldC10ZXh0O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG5cbiAgQGluY2x1ZGUgb3BhY2l0eSgwKTtcblxuICAmLmluICAgICB7IEBpbmNsdWRlIG9wYWNpdHkoJHRvb2x0aXAtb3BhY2l0eSk7IH1cbiAgJi50b3AgICAgeyBtYXJnaW4tdG9wOiAgLTNweDsgcGFkZGluZzogJHRvb2x0aXAtYXJyb3ctd2lkdGggMDsgfVxuICAmLnJpZ2h0ICB7IG1hcmdpbi1sZWZ0OiAgM3B4OyBwYWRkaW5nOiAwICR0b29sdGlwLWFycm93LXdpZHRoOyB9XG4gICYuYm90dG9tIHsgbWFyZ2luLXRvcDogICAzcHg7IHBhZGRpbmc6ICR0b29sdGlwLWFycm93LXdpZHRoIDA7IH1cbiAgJi5sZWZ0ICAgeyBtYXJnaW4tbGVmdDogLTNweDsgcGFkZGluZzogMCAkdG9vbHRpcC1hcnJvdy13aWR0aDsgfVxufVxuXG4vLyBXcmFwcGVyIGZvciB0aGUgdG9vbHRpcCBjb250ZW50XG4udG9vbHRpcC1pbm5lciB7XG4gIG1heC13aWR0aDogJHRvb2x0aXAtbWF4LXdpZHRoO1xuICBwYWRkaW5nOiAzcHggOHB4O1xuICBjb2xvcjogJHRvb2x0aXAtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHRvb2x0aXAtYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG59XG5cbi8vIEFycm93c1xuLnRvb2x0aXAtYXJyb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG59XG4vLyBOb3RlOiBEZXByZWNhdGVkIC50b3AtbGVmdCwgLnRvcC1yaWdodCwgLmJvdHRvbS1sZWZ0LCBhbmQgLmJvdHRvbS1yaWdodCBhcyBvZiB2My4zLjFcbi50b29sdGlwIHtcbiAgJi50b3AgLnRvb2x0aXAtYXJyb3cge1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogJHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbiAgJi50b3AtbGVmdCAudG9vbHRpcC1hcnJvdyB7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAkdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBtYXJnaW4tYm90dG9tOiAtJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAkdG9vbHRpcC1hcnJvdy13aWR0aCAkdG9vbHRpcC1hcnJvdy13aWR0aCAwO1xuICAgIGJvcmRlci10b3AtY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYudG9wLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgbWFyZ2luLWJvdHRvbTogLSR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGggMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLnJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogNTAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoIDAgJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tIC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAwICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogMDtcbiAgICByaWdodDogJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgbWFyZ2luLXRvcDogLSR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogMCAkdG9vbHRpcC1hcnJvdy13aWR0aCAkdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmJvdHRvbS1yaWdodCAudG9vbHRpcC1hcnJvdyB7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6ICR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IDAgJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbn1cbiIsIkBtaXhpbiByZXNldC10ZXh0KCkge1xuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWJhc2U7XG4gIC8vIFdlIGRlbGliZXJhdGVseSBkbyBOT1QgcmVzZXQgZm9udC1zaXplLlxuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gIGxpbmUtYnJlYWs6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRmFsbGJhY2sgZm9yIHdoZXJlIGBzdGFydGAgaXMgbm90IHN1cHBvcnRlZFxuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIHdvcmQtYnJlYWs6IG5vcm1hbDtcbiAgd29yZC1zcGFjaW5nOiBub3JtYWw7XG4gIHdvcmQtd3JhcDogbm9ybWFsO1xufVxuIiwiLy9cbi8vIFBvcG92ZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5wb3BvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6ICR6aW5kZXgtcG9wb3ZlcjtcbiAgZGlzcGxheTogbm9uZTtcbiAgbWF4LXdpZHRoOiAkcG9wb3Zlci1tYXgtd2lkdGg7XG4gIHBhZGRpbmc6IDFweDtcbiAgLy8gT3VyIHBhcmVudCBlbGVtZW50IGNhbiBiZSBhcmJpdHJhcnkgc2luY2UgcG9wb3ZlcnMgYXJlIGJ5IGRlZmF1bHQgaW5zZXJ0ZWQgYXMgYSBzaWJsaW5nIG9mIHRoZWlyIHRhcmdldCBlbGVtZW50LlxuICAvLyBTbyByZXNldCBvdXIgZm9udCBhbmQgdGV4dCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGluaGVyaXRpbmcgd2VpcmQgdmFsdWVzLlxuICBAaW5jbHVkZSByZXNldC10ZXh0O1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcG9wb3Zlci1iZztcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgJHBvcG92ZXItZmFsbGJhY2stYm9yZGVyLWNvbG9yO1xuICBib3JkZXI6IDFweCBzb2xpZCAkcG9wb3Zlci1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWxhcmdlO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMikpO1xuXG4gIC8vIE9mZnNldCB0aGUgcG9wb3ZlciB0byBhY2NvdW50IGZvciB0aGUgcG9wb3ZlciBhcnJvd1xuICAmLnRvcCAgICAgeyBtYXJnaW4tdG9wOiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7IH1cbiAgJi5yaWdodCAgIHsgbWFyZ2luLWxlZnQ6ICRwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYuYm90dG9tICB7IG1hcmdpbi10b3A6ICRwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYubGVmdCAgICB7IG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7IH1cbn1cblxuLnBvcG92ZXItdGl0bGUge1xuICBtYXJnaW46IDA7IC8vIHJlc2V0IGhlYWRpbmcgbWFyZ2luXG4gIHBhZGRpbmc6IDhweCAxNHB4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHBvcG92ZXItdGl0bGUtYmc7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBkYXJrZW4oJHBvcG92ZXItdGl0bGUtYmcsIDUlKTtcbiAgYm9yZGVyLXJhZGl1czogKCRib3JkZXItcmFkaXVzLWxhcmdlIC0gMSkgKCRib3JkZXItcmFkaXVzLWxhcmdlIC0gMSkgMCAwO1xufVxuXG4ucG9wb3Zlci1jb250ZW50IHtcbiAgcGFkZGluZzogOXB4IDE0cHg7XG59XG5cbi8vIEFycm93c1xuLy9cbi8vIC5hcnJvdyBpcyBvdXRlciwgLmFycm93OmFmdGVyIGlzIGlubmVyXG5cbi5wb3BvdmVyID4gLmFycm93IHtcbiAgJixcbiAgJjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIH1cbn1cbi5wb3BvdmVyID4gLmFycm93IHtcbiAgYm9yZGVyLXdpZHRoOiAkcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbn1cbi5wb3BvdmVyID4gLmFycm93OmFmdGVyIHtcbiAgYm9yZGVyLXdpZHRoOiAkcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgY29udGVudDogXCJcIjtcbn1cblxuLnBvcG92ZXIge1xuICAmLnRvcCA+IC5hcnJvdyB7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjsgLy8gSUU4IGZhbGxiYWNrXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItY29sb3I7XG4gICAgYm90dG9tOiAtJHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiBcIiBcIjtcbiAgICAgIGJvdHRvbTogMXB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJi5yaWdodCA+IC5hcnJvdyB7XG4gICAgdG9wOiA1MCU7XG4gICAgbGVmdDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgICBib3JkZXItcmlnaHQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItcmlnaHQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICBsZWZ0OiAxcHg7XG4gICAgICBib3R0b206IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJi5ib3R0b20gPiAuYXJyb3cge1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIGJvcmRlci10b3Atd2lkdGg6IDA7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItZmFsbGJhY2stY29sb3I7IC8vIElFOCBmYWxsYmFja1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgIHRvcDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICB0b3A6IDFweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgfVxuICB9XG5cbiAgJi5sZWZ0ID4gLmFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICByaWdodDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItbGVmdC1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItY29sb3I7XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiBcIiBcIjtcbiAgICAgIHJpZ2h0OiAxcHg7XG4gICAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgICBib3JkZXItbGVmdC1jb2xvcjogJHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgICBib3R0b206IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBDYXJvdXNlbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBXcmFwcGVyIGZvciB0aGUgc2xpZGUgY29udGFpbmVyIGFuZCBpbmRpY2F0b3JzXG4uY2Fyb3VzZWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jYXJvdXNlbC1pbm5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2lkdGg6IDEwMCU7XG5cbiAgPiAuaXRlbSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbiguNnMgZWFzZS1pbi1vdXQgbGVmdCk7XG5cbiAgICAvLyBBY2NvdW50IGZvciBqYW5raXR1ZGUgb24gaW1hZ2VzXG4gICAgPiBpbWcsXG4gICAgPiBhID4gaW1nIHtcbiAgICAgIEBpbmNsdWRlIGltZy1yZXNwb25zaXZlO1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgfVxuXG4gICAgLy8gV2ViS2l0IENTUzMgdHJhbnNmb3JtcyBmb3Igc3VwcG9ydGVkIGRldmljZXNcbiAgICBAbWVkaWEgYWxsIGFuZCAodHJhbnNmb3JtLTNkKSwgKC13ZWJraXQtdHJhbnNmb3JtLTNkKSB7XG4gICAgICBAaW5jbHVkZSB0cmFuc2l0aW9uLXRyYW5zZm9ybSgwLjZzIGVhc2UtaW4tb3V0KTtcbiAgICAgIEBpbmNsdWRlIGJhY2tmYWNlLXZpc2liaWxpdHkoaGlkZGVuKTtcbiAgICAgIEBpbmNsdWRlIHBlcnNwZWN0aXZlKDEwMDBweCk7XG5cbiAgICAgICYubmV4dCxcbiAgICAgICYuYWN0aXZlLnJpZ2h0IHtcbiAgICAgICAgQGluY2x1ZGUgdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG4gICAgICAmLnByZXYsXG4gICAgICAmLmFjdGl2ZS5sZWZ0IHtcbiAgICAgICAgQGluY2x1ZGUgdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgICAgJi5uZXh0LmxlZnQsXG4gICAgICAmLnByZXYucmlnaHQsXG4gICAgICAmLmFjdGl2ZSB7XG4gICAgICAgIEBpbmNsdWRlIHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSxcbiAgPiAubmV4dCxcbiAgPiAucHJldiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICA+IC5hY3RpdmUge1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICA+IC5uZXh0LFxuICA+IC5wcmV2IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgPiAubmV4dCB7XG4gICAgbGVmdDogMTAwJTtcbiAgfVxuICA+IC5wcmV2IHtcbiAgICBsZWZ0OiAtMTAwJTtcbiAgfVxuICA+IC5uZXh0LmxlZnQsXG4gID4gLnByZXYucmlnaHQge1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICA+IC5hY3RpdmUubGVmdCB7XG4gICAgbGVmdDogLTEwMCU7XG4gIH1cbiAgPiAuYWN0aXZlLnJpZ2h0IHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG5cbn1cblxuLy8gTGVmdC9yaWdodCBjb250cm9scyBmb3IgbmF2XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmNhcm91c2VsLWNvbnRyb2wge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgYm90dG9tOiAwO1xuICB3aWR0aDogJGNhcm91c2VsLWNvbnRyb2wtd2lkdGg7XG4gIEBpbmNsdWRlIG9wYWNpdHkoJGNhcm91c2VsLWNvbnRyb2wtb3BhY2l0eSk7XG4gIGZvbnQtc2l6ZTogJGNhcm91c2VsLWNvbnRyb2wtZm9udC1zaXplO1xuICBjb2xvcjogJGNhcm91c2VsLWNvbnRyb2wtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdGV4dC1zaGFkb3c6ICRjYXJvdXNlbC10ZXh0LXNoYWRvdztcbiAgLy8gV2UgY2FuJ3QgaGF2ZSB0aGlzIHRyYW5zaXRpb24gaGVyZSBiZWNhdXNlIFdlYktpdCBjYW5jZWxzIHRoZSBjYXJvdXNlbFxuICAvLyBhbmltYXRpb24gaWYgeW91IHRyaXAgdGhpcyB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIGFub3RoZXIgYW5pbWF0aW9uLlxuXG4gIC8vIFNldCBncmFkaWVudHMgZm9yIGJhY2tncm91bmRzXG4gICYubGVmdCB7XG4gICAgQGluY2x1ZGUgZ3JhZGllbnQtaG9yaXpvbnRhbCgkc3RhcnQtY29sb3I6IHJnYmEoMCwwLDAsLjUpLCAkZW5kLWNvbG9yOiByZ2JhKDAsMCwwLC4wMDAxKSk7XG4gIH1cbiAgJi5yaWdodCB7XG4gICAgbGVmdDogYXV0bztcbiAgICByaWdodDogMDtcbiAgICBAaW5jbHVkZSBncmFkaWVudC1ob3Jpem9udGFsKCRzdGFydC1jb2xvcjogcmdiYSgwLDAsMCwuMDAwMSksICRlbmQtY29sb3I6IHJnYmEoMCwwLDAsLjUpKTtcbiAgfVxuXG4gIC8vIEhvdmVyL2ZvY3VzIHN0YXRlXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG4gICAgY29sb3I6ICRjYXJvdXNlbC1jb250cm9sLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBAaW5jbHVkZSBvcGFjaXR5KC45KTtcbiAgfVxuXG4gIC8vIFRvZ2dsZXNcbiAgLmljb24tcHJldixcbiAgLmljb24tbmV4dCxcbiAgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xuICAgIHotaW5kZXg6IDU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLW5leHQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5pY29uLW5leHQge1xuICAgIHdpZHRoOiAgMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgZm9udC1mYW1pbHk6IHNlcmlmO1xuICB9XG5cblxuICAuaWNvbi1wcmV2IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDM5JzsvLyBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAoVSsyMDM5KVxuICAgIH1cbiAgfVxuICAuaWNvbi1uZXh0IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDNhJzsvLyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKFUrMjAzQSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3B0aW9uYWwgaW5kaWNhdG9yIHBpcHNcbi8vXG4vLyBBZGQgYW4gdW5vcmRlcmVkIGxpc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNsYXNzIGFuZCBhZGQgYSBsaXN0IGl0ZW0gZm9yIGVhY2hcbi8vIHNsaWRlIHlvdXIgY2Fyb3VzZWwgaG9sZHMuXG5cbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIHdpZHRoOiA2MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAgMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgbWFyZ2luOiAxcHg7XG4gICAgdGV4dC1pbmRlbnQ6IC05OTlweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgIC8vIElFOC05IGhhY2sgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgLy9cbiAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA4LTkgZG9lcyBub3Qgc3VwcG9ydCBjbGlja3Mgb24gZWxlbWVudHMgd2l0aG91dCBhIHNldFxuICAgIC8vIGBiYWNrZ3JvdW5kLWNvbG9yYC4gV2UgY2Fubm90IHVzZSBgZmlsdGVyYCBzaW5jZSB0aGF0J3Mgbm90IHZpZXdlZCBhcyBhXG4gICAgLy8gYmFja2dyb3VuZCBjb2xvciBieSB0aGUgYnJvd3Nlci4gVGh1cywgYSBoYWNrIGlzIG5lZWRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2NsaWNrI0ludGVybmV0X0V4cGxvcmVyXG4gICAgLy9cbiAgICAvLyBGb3IgSUU4LCB3ZSBzZXQgc29saWQgYmxhY2sgYXMgaXQgZG9lc24ndCBzdXBwb3J0IGByZ2JhKClgLiBGb3IgSUU5LCB3ZVxuICAgIC8vIHNldCBhbHBoYSB0cmFuc3BhcmVuY3kgZm9yIHRoZSBiZXN0IHJlc3VsdHMgcG9zc2libGUuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMCBcXDk7IC8vIElFOFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMCk7IC8vIElFOVxuICB9XG4gIC5hY3RpdmUge1xuICAgIG1hcmdpbjogMDtcbiAgICB3aWR0aDogIDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjYXJvdXNlbC1pbmRpY2F0b3ItYWN0aXZlLWJnO1xuICB9XG59XG5cbi8vIE9wdGlvbmFsIGNhcHRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGlkZGVuIGJ5IGRlZmF1bHQgZm9yIHNtYWxsZXIgdmlld3BvcnRzXG4uY2Fyb3VzZWwtY2FwdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMTUlO1xuICByaWdodDogMTUlO1xuICBib3R0b206IDIwcHg7XG4gIHotaW5kZXg6IDEwO1xuICBwYWRkaW5nLXRvcDogMjBweDtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG4gIGNvbG9yOiAkY2Fyb3VzZWwtY2FwdGlvbi1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXNoYWRvdzogJGNhcm91c2VsLXRleHQtc2hhZG93O1xuICAmIC5idG4ge1xuICAgIHRleHQtc2hhZG93OiBub25lOyAvLyBObyBzaGFkb3cgZm9yIGJ1dHRvbiBlbGVtZW50cyBpbiBjYXJvdXNlbC1jYXB0aW9uXG4gIH1cbn1cblxuXG4vLyBTY2FsZSB1cCBjb250cm9scyBmb3IgdGFibGV0cyBhbmQgdXBcbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG5cbiAgLy8gU2NhbGUgdXAgdGhlIGNvbnRyb2xzIGEgc21pZGdlXG4gIC5jYXJvdXNlbC1jb250cm9sIHtcbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tbGVmdCxcbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gICAgLmljb24tcHJldixcbiAgICAuaWNvbi1uZXh0IHtcbiAgICAgIHdpZHRoOiAzMHB4O1xuICAgICAgaGVpZ2h0OiAzMHB4O1xuICAgICAgbWFyZ2luLXRvcDogLTE1cHg7XG4gICAgICBmb250LXNpemU6IDMwcHg7XG4gICAgfVxuICAgIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAgIC5pY29uLXByZXYge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICAgIH1cbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gICAgLmljb24tbmV4dCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgYW5kIGxlZnQgYWxpZ24gdGhlIGNhcHRpb25zXG4gIC5jYXJvdXNlbC1jYXB0aW9uIHtcbiAgICBsZWZ0OiAyMCU7XG4gICAgcmlnaHQ6IDIwJTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMzBweDtcbiAgfVxuXG4gIC8vIE1vdmUgdXAgdGhlIGluZGljYXRvcnNcbiAgLmNhcm91c2VsLWluZGljYXRvcnMge1xuICAgIGJvdHRvbTogMjBweDtcbiAgfVxufVxuIiwiLy9cbi8vIFV0aWxpdHkgY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBGbG9hdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmNsZWFyZml4IHtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG59XG4uY2VudGVyLWJsb2NrIHtcbiAgQGluY2x1ZGUgY2VudGVyLWJsb2NrO1xufVxuLnB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQgIWltcG9ydGFudDtcbn1cbi5wdWxsLWxlZnQge1xuICBmbG9hdDogbGVmdCAhaW1wb3J0YW50O1xufVxuXG5cbi8vIFRvZ2dsaW5nIGNvbnRlbnRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gTm90ZTogRGVwcmVjYXRlZCAuaGlkZSBpbiBmYXZvciBvZiAuaGlkZGVuIG9yIC5zci1vbmx5IChhcyBhcHByb3ByaWF0ZSkgaW4gdjMuMC4xXG4uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5zaG93IHtcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbn1cbi5pbnZpc2libGUge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG4udGV4dC1oaWRlIHtcbiAgQGluY2x1ZGUgdGV4dC1oaWRlO1xufVxuXG5cbi8vIEhpZGUgZnJvbSBzY3JlZW5yZWFkZXJzIGFuZCBicm93c2Vyc1xuLy9cbi8vIENyZWRpdDogSFRNTDUgQm9pbGVycGxhdGVcblxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuXG4vLyBGb3IgQWZmaXggcGx1Z2luXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5hZmZpeCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbiIsIi8vIENlbnRlci1hbGlnbiBhIGJsb2NrIGxldmVsIGVsZW1lbnRcblxuQG1peGluIGNlbnRlci1ibG9jaygpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4iLCIvLyBDU1MgaW1hZ2UgcmVwbGFjZW1lbnRcbi8vXG4vLyBIZWFkcyB1cCEgdjMgbGF1bmNoZWQgd2l0aCBvbmx5IGAuaGlkZS10ZXh0KClgLCBidXQgcGVyIG91ciBwYXR0ZXJuIGZvclxuLy8gbWl4aW5zIGJlaW5nIHJldXNlZCBhcyBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhpcyBkb2Vzbid0IGhvbGQgdXAuIEFzXG4vLyBvZiB2My4wLjEgd2UgaGF2ZSBhZGRlZCBgLnRleHQtaGlkZSgpYCBhbmQgZGVwcmVjYXRlZCBgLmhpZGUtdGV4dCgpYC5cbi8vXG4vLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2NvbW1pdC9hYTAzOTZlYWU3NTdcblxuLy8gRGVwcmVjYXRlZCBhcyBvZiB2My4wLjEgKHdpbGwgYmUgcmVtb3ZlZCBpbiB2NClcbkBtaXhpbiBoaWRlLXRleHQoKSB7XG4gIGZvbnQ6IDAvMCBhO1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHRleHQtc2hhZG93OiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xufVxuXG4vLyBOZXcgbWl4aW4gdG8gdXNlIGFzIG9mIHYzLjAuMVxuQG1peGluIHRleHQtaGlkZSgpIHtcbiAgQGluY2x1ZGUgaGlkZS10ZXh0O1xufVxuIiwiLy9cbi8vIFJlc3BvbnNpdmU6IFV0aWxpdHkgY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBJRTEwIGluIFdpbmRvd3MgKFBob25lKSA4XG4vL1xuLy8gU3VwcG9ydCBmb3IgcmVzcG9uc2l2ZSB2aWV3cyB2aWEgbWVkaWEgcXVlcmllcyBpcyBraW5kIG9mIGJvcmtlZCBpbiBJRTEwLCBmb3Jcbi8vIFN1cmZhY2UvZGVza3RvcCBpbiBzcGxpdCB2aWV3IGFuZCBmb3IgV2luZG93cyBQaG9uZSA4LiBUaGlzIHBhcnRpY3VsYXIgZml4XG4vLyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgc25pcHBldCBvZiBKYXZhU2NyaXB0IHRvIHNuaWZmIHRoZSB1c2VyIGFnZW50IGFuZFxuLy8gYXBwbHkgc29tZSBjb25kaXRpb25hbCBDU1MgdG8gKm9ubHkqIHRoZSBTdXJmYWNlL2Rlc2t0b3AgV2luZG93cyA4LiBMb29rIGF0XG4vLyBvdXIgR2V0dGluZyBTdGFydGVkIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBidWcuXG4vL1xuLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZm9sbG93aW5nOlxuLy9cbi8vIElzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEwNDk3XG4vLyBEb2NzOiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9nZXR0aW5nLXN0YXJ0ZWQvI3N1cHBvcnQtaWUxMC13aWR0aFxuLy8gU291cmNlOiBodHRwOi8vdGlta2FkbGVjLmNvbS8yMDEzLzAxL3dpbmRvd3MtcGhvbmUtOC1hbmQtZGV2aWNlLXdpZHRoL1xuLy8gU291cmNlOiBodHRwOi8vdGlta2FkbGVjLmNvbS8yMDEyLzEwL2llMTAtc25hcC1tb2RlLWFuZC1yZXNwb25zaXZlLWRlc2lnbi9cblxuQGF0LXJvb3Qge1xuICBALW1zLXZpZXdwb3J0IHtcbiAgICB3aWR0aDogZGV2aWNlLXdpZHRoO1xuICB9XG59XG5cblxuLy8gVmlzaWJpbGl0eSB1dGlsaXRpZXNcbi8vIE5vdGU6IERlcHJlY2F0ZWQgLnZpc2libGUteHMsIC52aXNpYmxlLXNtLCAudmlzaWJsZS1tZCwgYW5kIC52aXNpYmxlLWxnIGFzIG9mIHYzLjIuMFxuXG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUteHMnKTtcbkBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcudmlzaWJsZS1zbScpO1xuQGluY2x1ZGUgcmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoJy52aXNpYmxlLW1kJyk7XG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUtbGcnKTtcblxuLnZpc2libGUteHMtYmxvY2ssXG4udmlzaWJsZS14cy1pbmxpbmUsXG4udmlzaWJsZS14cy1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1zbS1ibG9jayxcbi52aXNpYmxlLXNtLWlubGluZSxcbi52aXNpYmxlLXNtLWlubGluZS1ibG9jayxcbi52aXNpYmxlLW1kLWJsb2NrLFxuLnZpc2libGUtbWQtaW5saW5lLFxuLnZpc2libGUtbWQtaW5saW5lLWJsb2NrLFxuLnZpc2libGUtbGctYmxvY2ssXG4udmlzaWJsZS1sZy1pbmxpbmUsXG4udmlzaWJsZS1sZy1pbmxpbmUtYmxvY2sge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLXhzJyk7XG59XG4udmlzaWJsZS14cy1ibG9jayB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXhzLWlubGluZSB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS14cy1pbmxpbmUtYmxvY2sge1xuICBAbWVkaWEgKG1heC13aWR0aDogJHNjcmVlbi14cy1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIGFuZCAobWF4LXdpZHRoOiAkc2NyZWVuLXNtLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLXNtJyk7XG59XG4udmlzaWJsZS1zbS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tc20tbWF4KSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtc20taW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1zbS1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtc20taW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1zbS1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiAkc2NyZWVuLW1kLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLW1kJyk7XG59XG4udmlzaWJsZS1tZC1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tbWQtbWF4KSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbWQtaW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1tZC1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbWQtaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1tZC1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCcudmlzaWJsZS1sZycpO1xufVxuLnZpc2libGUtbGctYmxvY2sge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS1sZy1pbmxpbmUge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbGctaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6ICRzY3JlZW4teHMtbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLXhzJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tc20tbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLXNtJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tbWQtbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLW1kJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLmhpZGRlbi1sZycpO1xufVxuXG5cbi8vIFByaW50IHV0aWxpdGllc1xuLy9cbi8vIE1lZGlhIHF1ZXJpZXMgYXJlIHBsYWNlZCBvbiB0aGUgaW5zaWRlIHRvIGJlIG1peGluLWZyaWVuZGx5LlxuXG4vLyBOb3RlOiBEZXByZWNhdGVkIC52aXNpYmxlLXByaW50IGFzIG9mIHYzLjIuMFxuXG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUtcHJpbnQnKTtcblxuQG1lZGlhIHByaW50IHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCcudmlzaWJsZS1wcmludCcpO1xufVxuLnZpc2libGUtcHJpbnQtYmxvY2sge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS1wcmludC1pbmxpbmUge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtcHJpbnQtaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIHByaW50IHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoJy5oaWRkZW4tcHJpbnQnKTtcbn1cbiIsIi8vIFJlc3BvbnNpdmUgdXRpbGl0aWVzXG5cbi8vXG4vLyBNb3JlIGVhc2lseSBpbmNsdWRlIGFsbCB0aGUgc3RhdGVzIGZvciByZXNwb25zaXZlLXV0aWxpdGllcy5sZXNzLlxuLy8gW2NvbnZlcnRlcl0gJHBhcmVudCBoYWNrXG5AbWl4aW4gcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCRwYXJlbnQpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxuICB0YWJsZSN7JHBhcmVudH0gIHsgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsgfVxuICB0ciN7JHBhcmVudH0gICAgIHsgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7IH1cbiAgdGgjeyRwYXJlbnR9LFxuICB0ZCN7JHBhcmVudH0gICAgIHsgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50OyB9XG59XG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCRwYXJlbnQpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG4iLCIvKiBcblRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG5Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBib290c3RyYXAtc2VsZWN0XG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS4gKi9cblxuLy8gTWl4aW5zXG5AbWl4aW4gY3Vyc29yLWRpc2FibGVkKCkge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4vLyBSdWxlc1xuLmJvb3RzdHJhcC1zZWxlY3Qge1xuICAvKndpZHRoOiAyMjBweFxcOTsgSUU4IGFuZCBiZWxvdyovXG4gIC8vbm9pbnNwZWN0aW9uIENzc1Nob3J0aGFuZFByb3BlcnR5VmFsdWVcbiAgd2lkdGg6IDIyMHB4IFxcMDsgLypJRTkgYW5kIGJlbG93Ki9cblxuICAvLyBUaGUgc2VsZWN0cGlja2VyIGJ1dHRvblxuICA+IC5idG4ge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDBweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAyNXB4O1xuICB9XG5cbiAgLy8gRXJyb3IgZGlzcGxheVxuICAuZXJyb3IgJiAuYnRuIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkY29sb3ItcmVkLWVycm9yO1xuICB9XG5cbiAgLy8gRXJyb3IgZGlzcGxheVxuICAuY29udHJvbC1ncm91cC5lcnJvciAmIC5kcm9wZG93bi10b2dnbGUge1xuICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLXJlZC1lcnJvcjtcbiAgfVxuXG4gICYuZml0LXdpZHRoIHtcbiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50O1xuICB9XG5cbiAgJjpub3QoW2NsYXNzKj1cImNvbC1cIl0pOm5vdChbY2xhc3MqPVwiZm9ybS1jb250cm9sXCJdKTpub3QoLmlucHV0LWdyb3VwLWJ0bikge1xuICAgIHdpZHRoOiAkd2lkdGgtZGVmYXVsdDtcbiAgfVxuXG4gIC5idG46Zm9jdXMge1xuICAgIG91dGxpbmU6IHRoaW4gZG90dGVkICMzMzMzMzMgIWltcG9ydGFudDtcbiAgICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3IgIWltcG9ydGFudDtcbiAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgfVxufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5mb3JtLWNvbnRyb2wge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG5cbiAgJjpub3QoW2NsYXNzKj1cImNvbC1cIl0pIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4vLyBUaGUgc2VsZWN0cGlja2VyIGNvbXBvbmVudHNcbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCB7XG4gICY6bm90KC5pbnB1dC1ncm91cC1idG4pLFxuICAmW2NsYXNzKj1cImNvbC1cIl0ge1xuICAgIGZsb2F0OiBub25lO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxuXG4gIC8vIEZvcmNlcyB0aGUgcHVsbCB0byB0aGUgcmlnaHQsIGlmIG5lY2Vzc2FyeVxuICAmLFxuICAmW2NsYXNzKj1cImNvbC1cIl0sXG4gIC5yb3ctZmx1aWQgJltjbGFzcyo9XCJjb2wtXCJdIHtcbiAgICAmLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICAgICAgZmxvYXQ6IHJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC5mb3JtLXNlYXJjaCAmLFxuICAuZm9ybS1pbmxpbmUgJixcbiAgLmZvcm0taG9yaXpvbnRhbCAmLFxuICAuZm9ybS1ncm91cCAmIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG5cbiAgLmZvcm0tZ3JvdXAtbGcgICYuZm9ybS1jb250cm9sLFxuICAuZm9ybS1ncm91cC1zbSAgJi5mb3JtLWNvbnRyb2wge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAvLyBTZXQgdGhlIHdpZHRoIG9mIHRoZSBsaXZlIHNlYXJjaCAoYW5kIGFueSBvdGhlciBmb3JtIGNvbnRyb2wgd2l0aGluIGFuIGlubGluZSBmb3JtKVxuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbHZpb21vcmV0by9ib290c3RyYXAtc2VsZWN0L2lzc3Vlcy82ODVcbiAgLmZvcm0taW5saW5lICYgLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAuaW5wdXQtYXBwZW5kICYge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICB9XG5cbiAgLmlucHV0LXByZXBlbmQgJiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMXB4O1xuICB9XG5cbiAgPiAuZGlzYWJsZWQge1xuICAgIEBpbmNsdWRlIGN1cnNvci1kaXNhYmxlZDtcblxuICAgICY6Zm9jdXMge1xuICAgICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBzZWxlY3RwaWNrZXIgYnV0dG9uXG4gIC5idG4ge1xuICAgIC5maWx0ZXItb3B0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgfVxuXG4gICAgLmNhcmV0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiA0MHB4O1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICRidG4tZGVmYXVsdC1ib3JkZXI7XG4gICAgICBoZWlnaHQ6IDM4cHg7XG4gICAgfVxuXG4gICAgLmNhcmV0OmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFxmMDc4JztcbiAgICAgIGZvbnQtZmFtaWx5OiBcIkZvbnRBd2Vzb21lXCI7XG4gICAgICBmb250LXNpemU6IDE1cHg7XG4gICAgICBjb2xvcjogIzY2NjY2NjtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGxlZnQ6IDEycHg7XG4gICAgICB0b3A6IDlweDtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmNhcmV0IHtcbiAgICAgIGJvcmRlci1jb2xvcjogZGFya2VuKCRidG4tZGVmYXVsdC1ib3JkZXIsIDEyJSk7XG4gICAgfVxuXG4gICAgJjpmb2N1cyAuY2FyZXQge1xuICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJ0bi1kZWZhdWx0LWJvcmRlciwgMjUlKTtcbiAgICB9XG5cbiAgfVxuXG4gICZbY2xhc3MqPVwiY29sLVwiXSAuYnRuIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC8vIFRoZSBzZWxlY3RwaWNrZXIgZHJvcGRvd25cbiAgLmRyb3Bkb3duLW1lbnUge1xuICAgIG1pbi13aWR0aDogMTAwJTtcbiAgICB6LWluZGV4OiAkemluZGV4LXNlbGVjdC1kcm9wZG93bjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG4gICAgJi5pbm5lciB7XG4gICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cblxuICAgIGxpIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICAgJjpub3QoLmRpc2FibGVkKSBhOmhvdmVyIHNtYWxsLFxuICAgICAgJjpub3QoLmRpc2FibGVkKSBhOmZvY3VzIHNtYWxsLFxuICAgICAgJi5hY3RpdmU6bm90KC5kaXNhYmxlZCkgYSBzbWFsbCB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItYmx1ZS1ob3ZlcjtcbiAgICAgICAgY29sb3I6IGZhZGUoJGNvbG9yLWJsdWUtaG92ZXIsIDQwJSk7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQgYSB7XG4gICAgICAgIEBpbmNsdWRlIGN1cnNvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgYSB7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgICAgICAmLm9wdCB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHBhZGRpbmctbGVmdDogMi4yNWVtO1xuICAgICAgICB9XG5cbiAgICAgICAgc3Bhbi5jaGVjay1tYXJrIHtcbiAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4udGV4dCB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNtYWxsIHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAwLjVlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubm90aWZ5IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJvdHRvbTogNXB4O1xuICAgICAgd2lkdGg6IDk2JTtcbiAgICAgIG1hcmdpbjogMCAyJTtcbiAgICAgIG1pbi1oZWlnaHQ6IDI2cHg7XG4gICAgICBwYWRkaW5nOiAzcHggNXB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiKDI0NSwgMjQ1LCAyNDUpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIyNywgMjI3LCAyMjcpO1xuICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IGZhZGUocmdiKDAsIDAsIDApLCA1JSk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIG9wYWNpdHk6IDAuOTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICB9XG5cbiAgLm5vLXJlc3VsdHMge1xuICAgIHBhZGRpbmc6IDNweDtcbiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xuICAgIG1hcmdpbjogMCA1cHg7XG4gIH1cblxuICAmLmZpdC13aWR0aCAuYnRuIHtcbiAgICAuZmlsdGVyLW9wdGlvbiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgIH1cblxuICAgIC5jYXJldCB7XG4gICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgICAgdG9wOiBhdXRvO1xuICAgICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICB9XG4gIH1cblxuICAmLnNob3ctdGljayAuZHJvcGRvd24tbWVudSBsaSB7XG4gICAgJi5zZWxlY3RlZCBhIHNwYW4uY2hlY2stbWFyayB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICByaWdodDogMTVweDtcbiAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG5cbiAgICBhIHNwYW4udGV4dCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDM0cHg7XG4gICAgfVxuICB9XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LnNob3ctbWVudS1hcnJvdyB7XG4gICYub3BlbiA+IC5idG4ge1xuICAgIHotaW5kZXg6ICR6aW5kZXgtc2VsZWN0LWRyb3Bkb3duICsgMTtcbiAgfVxuXG4gIC5kcm9wZG93bi10b2dnbGUge1xuICAgICY6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgYm9yZGVyLWxlZnQ6IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlci1yaWdodDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyLWJvdHRvbS13aWR0aDogN3B4O1xuICAgICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7XG4gICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkY29sb3ItZ3JleS1hcnJvdztcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGZhZGUoJGNvbG9yLWdyZXktYXJyb3csIDIwJSk7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IC00cHg7XG4gICAgICBsZWZ0OiA5cHg7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBib3JkZXItbGVmdDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgd2hpdGU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IC00cHg7XG4gICAgICBsZWZ0OiAxMHB4O1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cblxuICAmLmRyb3B1cCAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBib3R0b206IGF1dG87XG4gICAgICB0b3A6IC0zcHg7XG4gICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgYm9yZGVyLXRvcC13aWR0aDogN3B4O1xuICAgICAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAkY29sb3ItZ3JleS1hcnJvdztcbiAgICAgIGJvcmRlci10b3AtY29sb3I6IGZhZGUoJGNvbG9yLWdyZXktYXJyb3csIDIwJSk7XG4gICAgfVxuXG4gICAgJjphZnRlciB7XG4gICAgICBib3R0b206IGF1dG87XG4gICAgICB0b3A6IC0zcHg7XG4gICAgICBib3JkZXItdG9wOiA2cHggc29saWQgd2hpdGU7XG4gICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gICYucHVsbC1yaWdodCAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICByaWdodDogMTJweDtcbiAgICAgIGxlZnQ6IGF1dG87XG4gICAgfVxuXG4gICAgJjphZnRlciB7XG4gICAgICByaWdodDogMTNweDtcbiAgICAgIGxlZnQ6IGF1dG87XG4gICAgfVxuICB9XG5cbiAgJi5vcGVuID4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gICAgJjpiZWZvcmUsXG4gICAgJjphZnRlciB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIH1cbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLm9wZW4ge1xuXG4gICAgLmJ0biAuY2FyZXQge1xuICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IGRhcmtlbigkYnRuLWRlZmF1bHQtYm9yZGVyLCAxMiUpO1xuICAgIH1cblxuICAgIC5idG46aG92ZXIgLmNhcmV0IHtcbiAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBkYXJrZW4oJGJ0bi1kZWZhdWx0LWJvcmRlciwgMjUlKTtcbiAgICB9XG5cbn1cblxuLmJzLXNlYXJjaGJveCxcbi5icy1hY3Rpb25zYm94IHtcbiAgcGFkZGluZzogNHB4IDhweDtcbn1cblxuLmJzLWFjdGlvbnNib3gge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgJiAuYnRuLWdyb3VwIGJ1dHRvbiB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxufVxuXG4uYnMtc2VhcmNoYm94IHtcbiAgJiArIC5icy1hY3Rpb25zYm94IHtcbiAgICBwYWRkaW5nOiAwIDhweCA0cHg7XG4gIH1cblxuICAmIGlucHV0LmZvcm0tY29udHJvbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4ubW9iaWxlLWRldmljZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG4gIG9wYWNpdHk6IDA7XG59XG4iLCIubG9naW4tYXJlYSB7XG4gICAgbWFyZ2luOiA5MHB4IGF1dG8gMDtcbiAgICB3aWR0aDogMzAwcHg7XG5cbiAgICAuYnRuLWxvZ2luIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICAgIGZsb2F0OiBub25lO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA1MHB4OyBcbiAgICB9XG5cbiAgICAuY29sLW1kLTEyLCAuY29sLWxnLTEyIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmJvb3RzdHJhcC1zZWxlY3QsXG4gICAgLnNlbGVjdHBpY2tlciB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbGlnaHQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNwdDtcbiAgICB9XG5cbiAgICAuZHJvcGRvd24tdG9nZ2xlLnNlbGVjdHBpY2tlciB7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXA6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgfVxuXG59XG4iLCIudG9vbGJhciB7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogJG5hdmJhci1kZWZhdWx0LWJnO1xuXG4gICAgLnRvb2xzIHtcbiAgICAgICAgaGVpZ2h0OiA0MHB4O1xuICAgIH1cblxuICAgIGEge1xuICAgICAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWFsdGVybmF0ZTtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBjb2xvcjogJGhpZ2hsaWdodHMtY29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgZm9udC1zaXplOiAxM3B0O1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgICBwYWRkaW5nOiA2cHggMDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDUwcHg7XG4gICAgfVxuXG4gICAgc3BhbiwgLmZhIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXG4gICAgfVxuXG4gICAgLmZhIHtcbiAgICAgICAgZm9udC1zaXplOiAyNHB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgfVxuXG59XG5cbkBlYWNoICRwYWdlLCAkYmdjb2xvciBpbiAkY29sb3JzIHtcblxuIyN7JHBhZ2V9LXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiZ2NvbG9yICFpbXBvcnRhbnQ7XG4gICAgfVxufSIsIi5idG4ge1xuICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktYmFzZTtcbiAgICBmb250LXNpemU6IDEzcHQ7XG59XG5cbi5idG4tbG9naW4ge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWxvZ2luLWNvbG9yLCAkYnRuLWxvZ2luLWJnLCAkYnRuLWxvZ2luLWJvcmRlcik7XG59IiwiLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuLmRpYWxvZy1ib3JkZXItZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jbGlwOiBib3JkZXItYm94O1xuICAgIGJvcmRlcjogNnB4IHNvbGlkIHJnYmEoMTcwLDE3MCwxNzAsMC4zKTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG59XG5cbi5kaWFsb2ctY29udGFpbmVyIHtcbiAgICBib3JkZXI6IDNweCBzb2xpZCAjOTk5OTk5O1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLXRpdGxlIHtcbiAgICBoZWlnaHQ6IDYwcHg7XG4gICAgcGFkZGluZzogMjBweCAwIDIwcHggMjBweDtcbiAgICBtYXJnaW46IDA7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgZm9udC1zaXplOiAyN3B4O1xuICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbGlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IDMwMCAhaW1wb3J0YW50O1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWJvZHkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1mb290ZXIge1xuICAgIGhlaWdodDogNTBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA4QUJGO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWZvb3RlciAuZGlhbG9nLWJ1dHRvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHdpZHRoOiA3NXB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBsaW5lLWhlaWdodDogMzBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1mb290ZXIgLmRpYWxvZy1idXR0b246aG92ZXJ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUVFRTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59IiwiLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuXG4vL1xuLy8gTWVudS1GbGF0IERyb3AtRG93blxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRHJvcGRvd24gYXJyb3cvY2FyZXRcblxuLm1lbnUtZmxhdCB7XG5cbiAgICAuYnRuIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGtpbWNoaS1kcm9wZG93biAhaW1wb3J0YW50O1xuICAgICAgICBtaW4td2lkdGg6IDE2MHB4O1xuICAgICAgICBib3JkZXI6IDAgIWltcG9ydGFudDtcbiAgICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1ib2xkO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtYnRuO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICAgICAgcGFkZGluZzogNHB4IDQ1cHggNXB4IDM4cHg7XG5cbiAgICAgICAgJiA+IGkge1xuICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gICAgICAgIHdpZHRoOiAyNnB4O1xuICAgICAgICBoZWlnaHQ6IDQwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbGVmdDogNnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgJiA+IGk6YmVmb3JlIHtcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAuY2FyZXQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDQwcHg7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3JkZXItdG9wOiAwIFxcOTtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgYm9yZGVyLWxlZnQ6IDA7XG5cbiAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBcImZvbnRlbGxvXCI7XG4gICAgICAgICAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICAgICAgc3BlYWs6IG5vbmU7XG4gICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XG4gICAgICAgICAgICB3aWR0aDogMS4yZW07XG4gICAgICAgICAgICBoZWlnaHQ6IDEuMmVtO1xuICAgICAgICAgICAgbWFyZ2luOiAuNWVtO1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgZm9udC12YXJpYW50OiBub3JtYWw7XG4gICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyZW07XG4gICAgICAgICAgICBjb250ZW50OiAnXFxlODYxJztcbiAgICAgIH1cblxuICAgIH1cblxuXG5cbiAgICAvLyBUaGUgZHJvcGRvd24gd3JhcHBlciAoZGl2KVxuICAgICYuZHJvcHVwLFxuICAgICYuZHJvcGRvd24ge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgdGhlIGZvY3VzIG9uIHRoZSBkcm9wZG93biB0b2dnbGUgd2hlbiBjbG9zaW5nIGRyb3Bkb3duc1xuICAgIC5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICAgICAgb3V0bGluZTogMDtcbiAgICB9XG5cbiAgICAvLyBUaGUgZHJvcGRvd24gbWVudSAodWwpXG4gICAgLmRyb3Bkb3duLW1lbnUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAxMDAlO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHotaW5kZXg6ICR6aW5kZXgtZHJvcGRvd247XG4gICAgICBkaXNwbGF5OiBub25lOyAvLyBub25lIGJ5IGRlZmF1bHQsIGJ1dCBibG9jayBvbiBcIm9wZW5cIiBvZiB0aGUgbWVudVxuICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICBtaW4td2lkdGg6IDE2MHB4O1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDsgLy8gb3ZlcnJpZGUgZGVmYXVsdCB1bFxuICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1idG47XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0OyAvLyBFbnN1cmVzIHByb3BlciBhbGlnbm1lbnQgaWYgcGFyZW50IGhhcyBpdCBjaGFuZ2VkIChlLmcuLCBtb2RhbCBmb290ZXIpXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWJnO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSAhaW1wb3J0YW50KTtcbiAgICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG5cbiAgICAgICAgICAvLyBBbGlnbnMgdGhlIGRyb3Bkb3duIG1lbnUgdG8gcmlnaHRcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIERlcHJlY2F0ZWQgYXMgb2YgMy4xLjAgaW4gZmF2b3Igb2YgYC5kcm9wZG93bi1tZW51LVtkaXJdYFxuICAgICAgICAgICYucHVsbC1yaWdodCB7XG4gICAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGl2aWRlcnMgKGJhc2ljYWxseSBhbiBocikgd2l0aGluIHRoZSBkcm9wZG93blxuICAgICAgICAgIC5kaXZpZGVyIHtcbiAgICAgICAgICAgIEBpbmNsdWRlIG5hdi1kaXZpZGVyKCRtZW51LWZsYXQtZHJvcGRvd24tZGl2aWRlci1iZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgICAgICAvL2JvcmRlci10b3A6IDFweCBzb2xpZCAkbWVudS1mbGF0LWRyb3Bkb3duLWRpdmlkZXItYmc7XG4gICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJG1lbnUtZmxhdC1kcm9wZG93bi1ib3JkZXI7XG4gICAgICAgICAgICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDBweCAxcHggMHB4IDBweCAkbWVudS1mbGF0LWRyb3Bkb3duLWRpdmlkZXItYmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgID4gbGk6Zmlyc3QtY2hpbGQgPiBhIHtcbiAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkbWVudS1mbGF0LWRyb3Bkb3duLWJnO1xuICAgICAgICAgICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICA+IGxpLmNyaXRpY2FsOmxhc3QtY2hpbGQgPiBhIHtcbiAgICAgICAgICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTGlua3Mgd2l0aGluIHRoZSBkcm9wZG93biBtZW51XG4gICAgICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICBwYWRkaW5nOiA0cHggNnB4O1xuICAgICAgICAgICAgY2xlYXI6IGJvdGg7XG4gICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1tZW51LWZsYXQ7XG4gICAgICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC10ZXh0O1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLy8gcHJldmVudCBsaW5rcyBmcm9tIHJhbmRvbWx5IGJyZWFraW5nIG9udG8gbmV3IGxpbmVzXG5cbiAgICAgICAgICAgICAgICA+IGkge1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI2cHg7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjZweDtcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIb3Zlci9Gb2N1cyBzdGF0ZVxuICAgIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIHN0YXRlXG4gICAgLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstYWN0aXZlLWJnO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgLmRyb3Bkb3duLW1lbnUgPiBsaS5jcml0aWNhbCA+IGEge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkbWVudS1mbGF0LWRyb3Bkb3duLWNyaXRpY2FsLWJnO1xuICAgIH1cblxuICAgIC8vIERpc2FibGVkIHN0YXRlXG4gICAgLy9cbiAgICAvLyBHcmF5IG91dCB0ZXh0IGFuZCBlbnN1cmUgdGhlIGhvdmVyL2ZvY3VzIHN0YXRlIHJlbWFpbnMgZ3JheVxuXG4gICAgLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLy8gTnVrZSBob3Zlci9mb2N1cyBlZmZlY3RzXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlbW92ZSBDU1MgZ3JhZGllbnRcbiAgICAgICAgQGluY2x1ZGUgcmVzZXQtZmlsdGVyO1xuICAgICAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3BlbiBzdGF0ZSBmb3IgdGhlIGRyb3Bkb3duXG4gICAgJi5vcGVuIHtcblxuICAgICAgICAuYnRuIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNob3cgdGhlIG1lbnVcbiAgICAgID4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cblxuICAgICAgLmNhcmV0IHtcbiAgICAgICAgYmFja2dyb3VuZDogIzNhMzkzYjtcbiAgICAgIH1cblxuICAgICAgLmNhcmV0OmJlZm9yZSB7XG4gICAgICAgIGNvbnRlbnQ6ICdcXGU4NjQnO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgdGhlIG91dGxpbmUgd2hlbiA6Zm9jdXMgaXMgdHJpZ2dlcmVkXG4gICAgICA+IGEge1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgfVxuICAgIH1cblxufVxuXG4vLyBNZW51IHBvc2l0aW9uaW5nXG4vL1xuLy8gQWRkIGV4dHJhIGNsYXNzIHRvIGAuZHJvcGRvd24tbWVudWAgdG8gZmxpcCB0aGUgYWxpZ25tZW50IG9mIHRoZSBkcm9wZG93blxuLy8gbWVudSB3aXRoIHRoZSBwYXJlbnQuXG4uZHJvcGRvd24tbWVudS1yaWdodCB7XG4gIGxlZnQ6IGF1dG87IC8vIFJlc2V0IHRoZSBkZWZhdWx0IGZyb20gYC5kcm9wZG93bi1tZW51YFxuICByaWdodDogMDtcbn1cbi8vIFdpdGggdjMsIHdlIGVuYWJsZWQgYXV0by1mbGlwcGluZyBpZiB5b3UgaGF2ZSBhIGRyb3Bkb3duIHdpdGhpbiBhIHJpZ2h0XG4vLyBhbGlnbmVkIG5hdiBjb21wb25lbnQuIFRvIGVuYWJsZSB0aGUgdW5kb2luZyBvZiB0aGF0LCB3ZSBwcm92aWRlIGFuIG92ZXJyaWRlXG4vLyB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRyb3Bkb3duIG1lbnUgYWxpZ25tZW50LlxuLy9cbi8vIFRoaXMgaXMgb25seSBmb3IgbGVmdC1hbGlnbmluZyBhIGRyb3Bkb3duIG1lbnUgd2l0aGluIGEgYC5uYXZiYXItcmlnaHRgIG9yXG4vLyBgLnB1bGwtcmlnaHRgIG5hdiBjb21wb25lbnQuXG4uZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IGF1dG87XG59XG5cbi8vIERyb3Bkb3duIHNlY3Rpb24gaGVhZGVyc1xuLmRyb3Bkb3duLWhlYWRlciB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAzcHggMjBweDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiAkZHJvcGRvd24taGVhZGVyLWNvbG9yO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwOyAvLyBhcyB3aXRoID4gbGkgPiBhXG59XG5cbi8vIEJhY2tkcm9wIHRvIGNhdGNoIGJvZHkgY2xpY2tzIG9uIG1vYmlsZSwgZXRjLlxuLmRyb3Bkb3duLWJhY2tkcm9wIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICB0b3A6IDA7XG4gIHotaW5kZXg6ICgkemluZGV4LWRyb3Bkb3duIC0gMTApO1xufVxuXG4vLyBSaWdodCBhbGlnbmVkIGRyb3Bkb3duc1xuLnB1bGwtcmlnaHQgPiAuZHJvcGRvd24tbWVudSB7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiBhdXRvO1xufVxuXG4vLyBBbGxvdyBmb3IgZHJvcGRvd25zIHRvIGdvIGJvdHRvbSB1cCAoYWthLCBkcm9wdXAtbWVudSlcbi8vXG4vLyBKdXN0IGFkZCAuZHJvcHVwIGFmdGVyIHRoZSBzdGFuZGFyZCAuZHJvcGRvd24gY2xhc3MgYW5kIHlvdSdyZSBzZXQsIGJyby5cbi8vIFRPRE86IGFic3RyYWN0IHRoaXMgc28gdGhhdCB0aGUgbmF2YmFyIGZpeGVkIHN0eWxlcyBhcmUgbm90IHBsYWNlZCBoZXJlP1xuXG4uZHJvcHVwLFxuLm5hdmJhci1maXhlZC1ib3R0b20gLmRyb3Bkb3duIHtcbiAgLy8gUmV2ZXJzZSB0aGUgY2FyZXRcbiAgLmNhcmV0IHtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJvcmRlci1ib3R0b206ICRjYXJldC13aWR0aC1iYXNlIGRhc2hlZDtcbiAgICBib3JkZXItYm90dG9tOiAkY2FyZXQtd2lkdGgtYmFzZSBzb2xpZCBcXDk7IC8vIElFOFxuICAgIGNvbnRlbnQ6IFwiXCI7XG4gIH1cbiAgLy8gRGlmZmVyZW50IHBvc2l0aW9uaW5nIGZvciBib3R0b20gdXAgbWVudVxuICAuZHJvcGRvd24tbWVudSB7XG4gICAgdG9wOiBhdXRvO1xuICAgIGJvdHRvbTogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gIH1cbn1cblxuXG4vLyBDb21wb25lbnQgYWxpZ25tZW50XG4vL1xuLy8gUmVpdGVyYXRlIHBlciBuYXZiYXIubGVzcyBhbmQgdGhlIG1vZGlmaWVkIGNvbXBvbmVudCBhbGlnbm1lbnQgdGhlcmUuXG5cbkBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gIC5uYXZiYXItcmlnaHQge1xuICAgIC5kcm9wZG93bi1tZW51IHtcbiAgICAgIHJpZ2h0OiAwOyBsZWZ0OiBhdXRvO1xuICAgIH1cbiAgICAvLyBOZWNlc3NhcnkgZm9yIG92ZXJyaWRlcyBvZiB0aGUgZGVmYXVsdCByaWdodCBhbGlnbmVkIG1lbnUuXG4gICAgLy8gV2lsbCByZW1vdmUgY29tZSB2NCBpbiBhbGwgbGlrZWxpaG9vZC5cbiAgICAuZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgICAgIGxlZnQ6IDA7IHJpZ2h0OiBhdXRvO1xuICAgIH1cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9
*/
\ No newline at end of file
diff --git a/ui/libs/themes/base/jquery-ui.custom.css
b/ui/libs/themes/base/jquery-ui.custom.css
new file mode 100644
index 0000000..56f7e06
--- /dev/null
+++ b/ui/libs/themes/base/jquery-ui.custom.css
@@ -0,0 +1,203 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ui-button-primary {
+ border-radius: 8px 8px 8px 8px;
+}
+
+.ui-button-primary.ui-state-default {
+ background: none repeat scroll 0 0 #0066FF;
+ border: 0 none;
+}
+
+.ui-button-primary.ui-state-disabled {
+ background-color: silver;
+ opacity: 1;
+}
+
+.ui-button-primary.ui-state-hover {
+ background: #0044DD;
+}
+
+.ui-button-primary .ui-button-text {
+ padding: 10px 23px;
+ font-size: 13px;
+ color: #EEEEEE;
+}
+
+.ui-button-secondary {
+ border: 1px solid #AAAAAA;
+ border-radius: 5px 5px 5px 5px;
+ cursor: pointer;
+}
+
+.ui-button-secondary.ui-state-default {
+ background: linear-gradient(to bottom, #FFFFFF 0%, #E5E5E5 100%) repeat
+ scroll 0 0 transparent;
+ box-shadow: -2px -2px 2px #EAEAEA, 2px 2px 2px #FFFFFF, 3px 3px 3px white
+ inset, -3px -3px 3px rgba(0, 0, 0, 0.25) inset;
+}
+
+.ui-button-secondary.ui-state-hover {
+ background: linear-gradient(to bottom, #d5d5d5 0%, #eeeeee 100%);
+ box-shadow: -2px -2px 2px #dadada, 2px 2px 2px #fff, 3px 3px 3px white
+ inset, -3px -3px 3px rgba(0, 0, 0, .25) inset;
+}
+
+.ui-button-secondary .ui-button-text {
+ font-size: 13px;
+ color: #333333;
+ text-overflow: ellipsis;
+ text-shadow: -1px -1px 1px #AAAAAA, 1px 1px 1px #FFFFFF;
+ white-space: nowrap;
+}
+
+.ui-button-secondary.ui-button-text-only .ui-button-text {
+ padding: 12px 23px 13px 20px;
+}
+
+.ui-button-secondary.ui-button-text-icon-secondary .ui-button-text {
+ padding: 12px 35px 13px 13px;
+}
+
+.ui-button-secondary .ui-button-icon-secondary {
+ padding-right: 5px;
+ width: 15px;
+ height: 15px;
+}
+
+.ui-menu {
+ background: linear-gradient(to bottom, #EEEEEE 0%, #CCCCCC 10px, #CCCCCC
+ 96%, #A5A5A5 100%) repeat scroll 0 0 transparent;
+ padding: 10px 10px 0;
+ width: 250px;
+}
+
+.ui-menu .ui-menu-item a {
+ background: linear-gradient(to bottom, #FFFFFF 0%, #E5E5E5 100%) repeat
+ scroll 0 0 transparent;
+ border: 1px solid #CCCCCC;
+ border-radius: 5px 5px 5px 5px;
+ box-shadow: -1px -1px 1px #CCCCCC, 1px 1px 1px #EEEEEE;
+ display: block;
+ font-size: 13px;
+ line-height: 38px;
+ margin-bottom: 10px;
+ text-align: center;
+ text-shadow: -1px -1px 1px #CCCCCC, 1px 1px 1px #FFFFFF;
+ width: 96%;
+}
+
+.ui-menu .ui-menu-item a.ui-state-focus {
+ background: linear-gradient(to bottom, #EEEEEE 0%, #D5D5D5 100%) repeat
+ scroll 0 0 transparent;
+ box-shadow: -1px -1px 1px #BBBBBB, 1px 1px 1px #DDDDDD;
+ margin: 0px 0px 10px 0px;
+}
+
+.ui-menu .ui-menu-item a.red:not([disabled]) {
+ background: linear-gradient(to bottom, #FF3019 0%, #CF0404 100%) repeat
+ scroll 0 0 transparent;
+ border: 1px solid #B10F14;
+ color: #FFFFFF;
+ text-shadow: -1px -1px 1px #9E0505, 1px 1px 1px #FC5D4C;
+}
+
+.ui-menu .ui-menu-item a.red:hover:not([disabled]) {
+ background: linear-gradient(to bottom, #EF2009 0%, #BF0404 100%) repeat
+ scroll 0 0 transparent;
+}
+
+.ui-menu .ui-state-disabled {
+ opacity: 1;
+}
+
+.ui-menu .ui-state-disabled a {
+ color: gray;
+}
+
+.ui-widget-overlay {
+ background: url("../images/theme-default/bg-mask.png") repeat scroll
+ 0 0 transparent;
+ opacity: 1;
+}
+
+.ui-dialog {
+ background: none;
+ background-color: #EEEEEE;
+ border: 2px solid #0F71B4;
+ border-radius: 8px;
+ padding: 0px;
+}
+
+.ui-dialog .ui-dialog-titlebar {
+ border: none;
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+ background: none;
+ padding: 13px 0px 13px 10px;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.15), 0 -1px 0 rgba(0,0,0,0.05) inset;
+}
+
+.ui-dialog .ui-dialog-title {
+ font-size: 18px;
+ color: #0066CC;
+}
+
+.ui-dialog .ui-dialog-titlebar-close {
+ margin: 4px 0 0;
+ background: none repeat scroll 0 0 #EEEEEE;
+ border: 2px solid #CCCCCC;
+ border-radius: 35px 35px 35px 35px;
+ color: #CCCCCC;
+ cursor: pointer;
+ height: 35px;
+ width: 35px;
+ position: absolute;
+ right: 7px;
+ text-align: center;
+ top: 5px;
+}
+
+.ui-dialog .ui-dialog-titlebar .ui-state-hover {
+ border: 2px solid #444444;
+ color: #444444;
+}
+
+.ui-dialog .ui-dialog-titlebar .ui-button-text {
+ font-size: 24px;
+ font-weight: bold;
+ padding: 0px;
+ text-indent: 0px;
+}
+
+.ui-dialog .ui-dialog-titlebar .ui-button-icon-primary {
+ display: none;
+}
+
+.ui-dialog .ui-dialog-buttonpane {
+ padding: 0px;
+ background-color: transparent;
+ border-width: 0;
+ box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.15);
+}
+
+.ui-dialog .ui-dialog-buttonpane button {
+ cursor: pointer;
+ margin: 0.5em 13px 0.5em 0;
+}
diff --git a/ui/libs/vendor.js b/ui/libs/vendor.js
new file mode 100644
index 0000000..ef0e2ec
--- /dev/null
+++ b/ui/libs/vendor.js
@@ -0,0 +1,5523 @@
+/*!
+ *
https://github.com/es-shims/es5-shim
+ * @license es5-shim Copyright 2009-2015 by contributors, MIT License
+ * see
https://github.com/es-shims/es5-shim/blob/master/LICENSE
+ */
+
+// vim: ts=4 sts=4 sw=4 expandtab
+
+// Add semicolon to prevent IIFE from being passed as argument to concatenated code.
+;
+
+// UMD (Universal Module Definition)
+// see
https://github.com/umdjs/umd/blob/master/returnExports.js
+(function (root, factory) {
+ 'use strict';
+
+ /* global define, exports, module */
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory);
+ } else if (typeof exports === 'object') {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like enviroments that support module.exports,
+ // like Node.
+ module.exports = factory();
+ } else {
+ // Browser globals (root is window)
+ root.returnExports = factory();
+ }
+}(this, function () {
+
+/**
+ * Brings an environment as close to ECMAScript 5 compliance
+ * as is possible with the facilities of erstwhile engines.
+ *
+ * Annotated ES5:
http://es5.github.com/ (specific links below)
+ * ES5 Spec:
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
+ * Required reading:
http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-nat...
+ */
+
+// Shortcut to an often accessed properties, in order to avoid multiple
+// dereference that costs universally. This also holds a reference to known-good
+// functions.
+var $Array = Array;
+var ArrayPrototype = $Array.prototype;
+var $Object = Object;
+var ObjectPrototype = $Object.prototype;
+var FunctionPrototype = Function.prototype;
+var $String = String;
+var StringPrototype = $String.prototype;
+var $Number = Number;
+var NumberPrototype = $Number.prototype;
+var array_slice = ArrayPrototype.slice;
+var array_splice = ArrayPrototype.splice;
+var array_push = ArrayPrototype.push;
+var array_unshift = ArrayPrototype.unshift;
+var array_concat = ArrayPrototype.concat;
+var call = FunctionPrototype.call;
+var max = Math.max;
+var min = Math.min;
+
+// Having a toString local variable name breaks in Opera so use to_string.
+var to_string = ObjectPrototype.toString;
+
+var hasToStringTag = typeof Symbol === 'function' && typeof
Symbol.toStringTag === 'symbol';
+var isCallable; /* inlined from
https://npmjs.com/is-callable */ var fnToStr =
Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try {
fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object
Function]', genClass = '[object GeneratorFunction]'; isCallable = function
isCallable(value) { if (typeof value !== 'function') { return false; } if
(hasToStringTag) { return tryFunctionObject(value); } var strClass =
to_string.call(value); return strClass === fnClass || strClass === genClass; };
+var isRegex; /* inlined from
https://npmjs.com/is-regex */ var regexExec =
RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try {
regexExec.call(value); return true; } catch (e) { return false; } }, regexClass =
'[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !==
'object') { return false; } return hasToStringTag ? tryRegexExec(value) :
to_string.call(value) === regexClass; };
+var isString; /* inlined from
https://npmjs.com/is-string */ var strValue =
String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try {
strValue.call(value); return true; } catch (e) { return false; } }, stringClass =
'[object String]'; isString = function isString(value) { if (typeof value ===
'string') { return true; } if (typeof value !== 'object') { return false;
} return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass;
};
+
+/* inlined from
http://npmjs.com/define-properties */
+var defineProperties = (function (has) {
+ var supportsDescriptors = $Object.defineProperty && (function () {
+ try {
+ var obj = {};
+ $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
+ for (var _ in obj) { return false; }
+ return obj.x === obj;
+ } catch (e) { /* this is ES3 */
+ return false;
+ }
+ }());
+
+ // Define configurable, writable and non-enumerable props
+ // if they don't exist.
+ var defineProperty;
+ if (supportsDescriptors) {
+ defineProperty = function (object, name, method, forceAssign) {
+ if (!forceAssign && (name in object)) { return; }
+ $Object.defineProperty(object, name, {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: method
+ });
+ };
+ } else {
+ defineProperty = function (object, name, method, forceAssign) {
+ if (!forceAssign && (name in object)) { return; }
+ object[name] = method;
+ };
+ }
+ return function defineProperties(object, map, forceAssign) {
+ for (var name in map) {
+ if (has.call(map, name)) {
+ defineProperty(object, name, map[name], forceAssign);
+ }
+ }
+ };
+}(ObjectPrototype.hasOwnProperty));
+
+//
+// Util
+// ======
+//
+
+/* replaceable with
https://npmjs.com/package/es-abstract /helpers/isPrimitive */
+var isPrimitive = function isPrimitive(input) {
+ var type = typeof input;
+ return input === null || (type !== 'object' && type !==
'function');
+};
+
+var ES = {
+ // ES5 9.4
+ //
http://es5.github.com/#x9.4
+ //
http://jsperf.com/to-integer
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToInteger */
+ ToInteger: function ToInteger(num) {
+ var n = +num;
+ if (n !== n) { // isNaN
+ n = 0;
+ } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
+ n = (n > 0 || -1) * Math.floor(Math.abs(n));
+ }
+ return n;
+ },
+
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToPrimitive */
+ ToPrimitive: function ToPrimitive(input) {
+ var val, valueOf, toStr;
+ if (isPrimitive(input)) {
+ return input;
+ }
+ valueOf = input.valueOf;
+ if (isCallable(valueOf)) {
+ val = valueOf.call(input);
+ if (isPrimitive(val)) {
+ return val;
+ }
+ }
+ toStr = input.toString;
+ if (isCallable(toStr)) {
+ val = toStr.call(input);
+ if (isPrimitive(val)) {
+ return val;
+ }
+ }
+ throw new TypeError();
+ },
+
+ // ES5 9.9
+ //
http://es5.github.com/#x9.9
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToObject */
+ ToObject: function (o) {
+ /* jshint eqnull: true */
+ if (o == null) { // this matches both null and undefined
+ throw new TypeError("can't convert " + o + ' to
object');
+ }
+ return $Object(o);
+ },
+
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToUint32 */
+ ToUint32: function ToUint32(x) {
+ return x >>> 0;
+ }
+};
+
+//
+// Function
+// ========
+//
+
+// ES-5 15.3.4.5
+//
http://es5.github.com/#x15.3.4.5
+
+var Empty = function Empty() {};
+
+defineProperties(FunctionPrototype, {
+ bind: function bind(that) { // .length is 1
+ // 1. Let Target be the this value.
+ var target = this;
+ // 2. If IsCallable(Target) is false, throw a TypeError exception.
+ if (!isCallable(target)) {
+ throw new TypeError('Function.prototype.bind called on incompatible '
+ target);
+ }
+ // 3. Let A be a new (possibly empty) internal list of all of the
+ // argument values provided after thisArg (arg1, arg2 etc), in order.
+ // XXX slicedArgs will stand in for "A" if used
+ var args = array_slice.call(arguments, 1); // for normal call
+ // 4. Let F be a new native ECMAScript object.
+ // 11. Set the [[Prototype]] internal property of F to the standard
+ // built-in Function prototype object as specified in 15.3.3.1.
+ // 12. Set the [[Call]] internal property of F as described in
+ // 15.3.4.5.1.
+ // 13. Set the [[Construct]] internal property of F as described in
+ // 15.3.4.5.2.
+ // 14. Set the [[HasInstance]] internal property of F as described in
+ // 15.3.4.5.3.
+ var bound;
+ var binder = function () {
+
+ if (this instanceof bound) {
+ // 15.3.4.5.2 [[Construct]]
+ // When the [[Construct]] internal method of a function object,
+ // F that was created using the bind function is called with a
+ // list of arguments ExtraArgs, the following steps are taken:
+ // 1. Let target be the value of F's [[TargetFunction]]
+ // internal property.
+ // 2. If target has no [[Construct]] internal method, a
+ // TypeError exception is thrown.
+ // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
+ // property.
+ // 4. Let args be a new list containing the same values as the
+ // list boundArgs in the same order followed by the same
+ // values as the list ExtraArgs in the same order.
+ // 5. Return the result of calling the [[Construct]] internal
+ // method of target providing args as the arguments.
+
+ var result = target.apply(
+ this,
+ array_concat.call(args, array_slice.call(arguments))
+ );
+ if ($Object(result) === result) {
+ return result;
+ }
+ return this;
+
+ } else {
+ // 15.3.4.5.1 [[Call]]
+ // When the [[Call]] internal method of a function object, F,
+ // which was created using the bind function is called with a
+ // this value and a list of arguments ExtraArgs, the following
+ // steps are taken:
+ // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
+ // property.
+ // 2. Let boundThis be the value of F's [[BoundThis]] internal
+ // property.
+ // 3. Let target be the value of F's [[TargetFunction]] internal
+ // property.
+ // 4. Let args be a new list containing the same values as the
+ // list boundArgs in the same order followed by the same
+ // values as the list ExtraArgs in the same order.
+ // 5. Return the result of calling the [[Call]] internal method
+ // of target providing boundThis as the this value and
+ // providing args as the arguments.
+
+ // equiv: target.call(this, ...boundArgs, ...args)
+ return target.apply(
+ that,
+ array_concat.call(args, array_slice.call(arguments))
+ );
+
+ }
+
+ };
+
+ // 15. If the [[Class]] internal property of Target is "Function",
then
+ // a. Let L be the length property of Target minus the length of A.
+ // b. Set the length own property of F to either 0 or L, whichever is
+ // larger.
+ // 16. Else set the length own property of F to 0.
+
+ var boundLength = max(0, target.length - args.length);
+
+ // 17. Set the attributes of the length own property of F to the values
+ // specified in 15.3.5.1.
+ var boundArgs = [];
+ for (var i = 0; i < boundLength; i++) {
+ array_push.call(boundArgs, '$' + i);
+ }
+
+ // XXX Build a dynamic function with desired amount of arguments is the only
+ // way to set the length property of a function.
+ // In environments where Content Security Policies enabled (Chrome extensions,
+ // for ex.) all use of eval or Function costructor throws an exception.
+ // However in all of these environments Function.prototype.bind exists
+ // and so this code will never be executed.
+ bound = Function('binder', 'return function (' +
boundArgs.join(',') + '){ return binder.apply(this, arguments);
}')(binder);
+
+ if (target.prototype) {
+ Empty.prototype = target.prototype;
+ bound.prototype = new Empty();
+ // Clean up dangling references.
+ Empty.prototype = null;
+ }
+
+ // TODO
+ // 18. Set the [[Extensible]] internal property of F to true.
+
+ // TODO
+ // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
+ // 20. Call the [[DefineOwnProperty]] internal method of F with
+ // arguments "caller", PropertyDescriptor {[[Get]]: thrower,
[[Set]]:
+ // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
+ // false.
+ // 21. Call the [[DefineOwnProperty]] internal method of F with
+ // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
+ // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
+ // and false.
+
+ // TODO
+ // NOTE Function objects created using Function.prototype.bind do not
+ // have a prototype property or the [[Code]], [[FormalParameters]], and
+ // [[Scope]] internal properties.
+ // XXX can't delete prototype in pure-js.
+
+ // 22. Return F.
+ return bound;
+ }
+});
+
+// _Please note: Shortcuts are defined after `Function.prototype.bind` as we
+// us it in defining shortcuts.
+var owns = call.bind(ObjectPrototype.hasOwnProperty);
+var toStr = call.bind(ObjectPrototype.toString);
+var strSlice = call.bind(StringPrototype.slice);
+var strSplit = call.bind(StringPrototype.split);
+
+//
+// Array
+// =====
+//
+
+var isArray = $Array.isArray || function isArray(obj) {
+ return toStr(obj) === '[object Array]';
+};
+
+// ES5 15.4.4.12
+//
http://es5.github.com/#x15.4.4.13
+// Return len+argCount.
+// [bugfix, ielt8]
+// IE < 8 bug: [].unshift(0) === undefined but should be "1"
+var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
+defineProperties(ArrayPrototype, {
+ unshift: function () {
+ array_unshift.apply(this, arguments);
+ return this.length;
+ }
+}, hasUnshiftReturnValueBug);
+
+// ES5 15.4.3.2
+//
http://es5.github.com/#x15.4.3.2
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+defineProperties($Array, { isArray: isArray });
+
+// The IsCallable() check in the Array functions
+// has been replaced with a strict check on the
+// internal class of the object to trap cases where
+// the provided function was actually a regular
+// expression literal, which in V8 and
+// JavaScriptCore is a typeof "function". Only in
+// V8 are regular expression literals permitted as
+// reduce parameters, so it is desirable in the
+// general case for the shim to match the more
+// strict and common behavior of rejecting regular
+// expressions.
+
+// ES5 15.4.4.18
+//
http://es5.github.com/#x15.4.4.18
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/arra...
+
+// Check failure of by-index access of string characters (IE < 9)
+// and failure of `0 in boxedString` (Rhino)
+var boxedString = $Object('a');
+var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
+
+var properlyBoxesContext = function properlyBoxed(method) {
+ // Check node 0.6.21 bug where third parameter is not boxed
+ var properlyBoxesNonStrict = true;
+ var properlyBoxesStrict = true;
+ if (method) {
+ method.call('foo', function (_, __, context) {
+ if (typeof context !== 'object') { properlyBoxesNonStrict = false; }
+ });
+
+ method.call([1], function () {
+ 'use strict';
+
+ properlyBoxesStrict = typeof this === 'string';
+ }, 'x');
+ }
+ return !!method && properlyBoxesNonStrict && properlyBoxesStrict;
+};
+
+defineProperties(ArrayPrototype, {
+ forEach: function forEach(callbackfn /*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var i = -1;
+ var length = self.length >>> 0;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.forEach callback must be a
function');
+ }
+
+ while (++i < length) {
+ if (i in self) {
+ // Invoke the callback function with call, passing arguments:
+ // context, property value, property key, thisArg object
+ if (typeof T !== 'undefined') {
+ callbackfn.call(T, self[i], i, object);
+ } else {
+ callbackfn(self[i], i, object);
+ }
+ }
+ }
+ }
+}, !properlyBoxesContext(ArrayPrototype.forEach));
+
+// ES5 15.4.4.19
+//
http://es5.github.com/#x15.4.4.19
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+defineProperties(ArrayPrototype, {
+ map: function map(callbackfn/*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var result = $Array(length);
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.map callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self) {
+ if (typeof T !== 'undefined') {
+ result[i] = callbackfn.call(T, self[i], i, object);
+ } else {
+ result[i] = callbackfn(self[i], i, object);
+ }
+ }
+ }
+ return result;
+ }
+}, !properlyBoxesContext(ArrayPrototype.map));
+
+// ES5 15.4.4.20
+//
http://es5.github.com/#x15.4.4.20
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+defineProperties(ArrayPrototype, {
+ filter: function filter(callbackfn /*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var result = [];
+ var value;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.filter callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self) {
+ value = self[i];
+ if (typeof T === 'undefined' ? callbackfn(value, i, object) :
callbackfn.call(T, value, i, object)) {
+ array_push.call(result, value);
+ }
+ }
+ }
+ return result;
+ }
+}, !properlyBoxesContext(ArrayPrototype.filter));
+
+// ES5 15.4.4.16
+//
http://es5.github.com/#x15.4.4.16
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+defineProperties(ArrayPrototype, {
+ every: function every(callbackfn /*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.every callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self && !(typeof T === 'undefined' ?
callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
+ return false;
+ }
+ }
+ return true;
+ }
+}, !properlyBoxesContext(ArrayPrototype.every));
+
+// ES5 15.4.4.17
+//
http://es5.github.com/#x15.4.4.17
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+defineProperties(ArrayPrototype, {
+ some: function some(callbackfn/*, thisArg */) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.some callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self && (typeof T === 'undefined' ?
callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
+ return true;
+ }
+ }
+ return false;
+ }
+}, !properlyBoxesContext(ArrayPrototype.some));
+
+// ES5 15.4.4.21
+//
http://es5.github.com/#x15.4.4.21
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+var reduceCoercesToObject = false;
+if (ArrayPrototype.reduce) {
+ reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_,
__, ___, list) { return list; }) === 'object';
+}
+defineProperties(ArrayPrototype, {
+ reduce: function reduce(callbackfn /*, initialValue*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.reduce callback must be a
function');
+ }
+
+ // no value to return if no initial value and an empty array
+ if (length === 0 && arguments.length === 1) {
+ throw new TypeError('reduce of empty array with no initial value');
+ }
+
+ var i = 0;
+ var result;
+ if (arguments.length >= 2) {
+ result = arguments[1];
+ } else {
+ do {
+ if (i in self) {
+ result = self[i++];
+ break;
+ }
+
+ // if array contains no values, no initial value to return
+ if (++i >= length) {
+ throw new TypeError('reduce of empty array with no initial
value');
+ }
+ } while (true);
+ }
+
+ for (; i < length; i++) {
+ if (i in self) {
+ result = callbackfn(result, self[i], i, object);
+ }
+ }
+
+ return result;
+ }
+}, !reduceCoercesToObject);
+
+// ES5 15.4.4.22
+//
http://es5.github.com/#x15.4.4.22
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+var reduceRightCoercesToObject = false;
+if (ArrayPrototype.reduceRight) {
+ reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5',
function (_, __, ___, list) { return list; }) === 'object';
+}
+defineProperties(ArrayPrototype, {
+ reduceRight: function reduceRight(callbackfn/*, initial*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.reduceRight callback must be a
function');
+ }
+
+ // no value to return if no initial value, empty array
+ if (length === 0 && arguments.length === 1) {
+ throw new TypeError('reduceRight of empty array with no initial
value');
+ }
+
+ var result;
+ var i = length - 1;
+ if (arguments.length >= 2) {
+ result = arguments[1];
+ } else {
+ do {
+ if (i in self) {
+ result = self[i--];
+ break;
+ }
+
+ // if array contains no values, no initial value to return
+ if (--i < 0) {
+ throw new TypeError('reduceRight of empty array with no initial
value');
+ }
+ } while (true);
+ }
+
+ if (i < 0) {
+ return result;
+ }
+
+ do {
+ if (i in self) {
+ result = callbackfn(result, self[i], i, object);
+ }
+ } while (i--);
+
+ return result;
+ }
+}, !reduceRightCoercesToObject);
+
+// ES5 15.4.4.14
+//
http://es5.github.com/#x15.4.4.14
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !==
-1;
+defineProperties(ArrayPrototype, {
+ indexOf: function indexOf(searchElement /*, fromIndex */) {
+ var self = splitString && isString(this) ? strSplit(this, '') :
ES.ToObject(this);
+ var length = self.length >>> 0;
+
+ if (length === 0) {
+ return -1;
+ }
+
+ var i = 0;
+ if (arguments.length > 1) {
+ i = ES.ToInteger(arguments[1]);
+ }
+
+ // handle negative indices
+ i = i >= 0 ? i : max(0, length + i);
+ for (; i < length; i++) {
+ if (i in self && self[i] === searchElement) {
+ return i;
+ }
+ }
+ return -1;
+ }
+}, hasFirefox2IndexOfBug);
+
+// ES5 15.4.4.15
+//
http://es5.github.com/#x15.4.4.15
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0,
1].lastIndexOf(0, -3) !== -1;
+defineProperties(ArrayPrototype, {
+ lastIndexOf: function lastIndexOf(searchElement /*, fromIndex */) {
+ var self = splitString && isString(this) ? strSplit(this, '') :
ES.ToObject(this);
+ var length = self.length >>> 0;
+
+ if (length === 0) {
+ return -1;
+ }
+ var i = length - 1;
+ if (arguments.length > 1) {
+ i = min(i, ES.ToInteger(arguments[1]));
+ }
+ // handle negative indices
+ i = i >= 0 ? i : length - Math.abs(i);
+ for (; i >= 0; i--) {
+ if (i in self && searchElement === self[i]) {
+ return i;
+ }
+ }
+ return -1;
+ }
+}, hasFirefox2LastIndexOfBug);
+
+// ES5 15.4.4.12
+//
http://es5.github.com/#x15.4.4.12
+var spliceNoopReturnsEmptyArray = (function () {
+ var a = [1, 2];
+ var result = a.splice();
+ return a.length === 2 && isArray(result) && result.length === 0;
+}());
+defineProperties(ArrayPrototype, {
+ // Safari 5.0 bug where .splice() returns undefined
+ splice: function splice(start, deleteCount) {
+ if (arguments.length === 0) {
+ return [];
+ } else {
+ return array_splice.apply(this, arguments);
+ }
+ }
+}, !spliceNoopReturnsEmptyArray);
+
+var spliceWorksWithEmptyObject = (function () {
+ var obj = {};
+ ArrayPrototype.splice.call(obj, 0, 0, 1);
+ return obj.length === 1;
+}());
+defineProperties(ArrayPrototype, {
+ splice: function splice(start, deleteCount) {
+ if (arguments.length === 0) { return []; }
+ var args = arguments;
+ this.length = max(ES.ToInteger(this.length), 0);
+ if (arguments.length > 0 && typeof deleteCount !== 'number')
{
+ args = array_slice.call(arguments);
+ if (args.length < 2) {
+ array_push.call(args, this.length - start);
+ } else {
+ args[1] = ES.ToInteger(deleteCount);
+ }
+ }
+ return array_splice.apply(this, args);
+ }
+}, !spliceWorksWithEmptyObject);
+var spliceWorksWithLargeSparseArrays = (function () {
+ // Per
https://github.com/es-shims/es5-shim/issues/295
+ // Safari 7/8 breaks with sparse arrays of size 1e5 or greater
+ var arr = new $Array(1e5);
+ // note: the index MUST be 8 or larger or the test will false pass
+ arr[8] = 'x';
+ arr.splice(1, 1);
+ // note: this test must be defined *after* the indexOf shim
+ // per
https://github.com/es-shims/es5-shim/issues/313
+ return arr.indexOf('x') === 7;
+}());
+var spliceWorksWithSmallSparseArrays = (function () {
+ // Per
https://github.com/es-shims/es5-shim/issues/295
+ // Opera 12.15 breaks on this, no idea why.
+ var n = 256;
+ var arr = [];
+ arr[n] = 'a';
+ arr.splice(n + 1, 0, 'b');
+ return arr[n] === 'a';
+}());
+defineProperties(ArrayPrototype, {
+ splice: function splice(start, deleteCount) {
+ var O = ES.ToObject(this);
+ var A = [];
+ var len = ES.ToUint32(O.length);
+ var relativeStart = ES.ToInteger(start);
+ var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) :
min(relativeStart, len);
+ var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len -
actualStart);
+
+ var k = 0;
+ var from;
+ while (k < actualDeleteCount) {
+ from = $String(actualStart + k);
+ if (owns(O, from)) {
+ A[k] = O[from];
+ }
+ k += 1;
+ }
+
+ var items = array_slice.call(arguments, 2);
+ var itemCount = items.length;
+ var to;
+ if (itemCount < actualDeleteCount) {
+ k = actualStart;
+ while (k < (len - actualDeleteCount)) {
+ from = $String(k + actualDeleteCount);
+ to = $String(k + itemCount);
+ if (owns(O, from)) {
+ O[to] = O[from];
+ } else {
+ delete O[to];
+ }
+ k += 1;
+ }
+ k = len;
+ while (k > (len - actualDeleteCount + itemCount)) {
+ delete O[k - 1];
+ k -= 1;
+ }
+ } else if (itemCount > actualDeleteCount) {
+ k = len - actualDeleteCount;
+ while (k > actualStart) {
+ from = $String(k + actualDeleteCount - 1);
+ to = $String(k + itemCount - 1);
+ if (owns(O, from)) {
+ O[to] = O[from];
+ } else {
+ delete O[to];
+ }
+ k -= 1;
+ }
+ }
+ k = actualStart;
+ for (var i = 0; i < items.length; ++i) {
+ O[k] = items[i];
+ k += 1;
+ }
+ O.length = len - actualDeleteCount + itemCount;
+
+ return A;
+ }
+}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);
+
+//
+// Object
+// ======
+//
+
+// ES5 15.2.3.14
+//
http://es5.github.com/#x15.2.3.14
+
+//
http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-impl...
+var hasDontEnumBug = !({ 'toString': null
}).propertyIsEnumerable('toString');
+var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
+var hasStringEnumBug = !owns('x', '0');
+var equalsConstructorPrototype = function (o) {
+ var ctor = o.constructor;
+ return ctor && ctor.prototype === o;
+};
+var blacklistedKeys = {
+ $window: true,
+ $console: true,
+ $parent: true,
+ $self: true,
+ $frames: true,
+ $frameElement: true,
+ $webkitIndexedDB: true,
+ $webkitStorageInfo: true
+};
+var hasAutomationEqualityBug = (function () {
+ /* globals window */
+ if (typeof window === 'undefined') { return false; }
+ for (var k in window) {
+ if (!blacklistedKeys['$' + k] && owns(window, k) &&
window[k] !== null && typeof window[k] === 'object') {
+ try {
+ equalsConstructorPrototype(window[k]);
+ } catch (e) {
+ return true;
+ }
+ }
+ }
+ return false;
+}());
+var equalsConstructorPrototypeIfNotBuggy = function (object) {
+ if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return
equalsConstructorPrototype(object); }
+ try {
+ return equalsConstructorPrototype(object);
+ } catch (e) {
+ return false;
+ }
+};
+var dontEnums = [
+ 'toString',
+ 'toLocaleString',
+ 'valueOf',
+ 'hasOwnProperty',
+ 'isPrototypeOf',
+ 'propertyIsEnumerable',
+ 'constructor'
+];
+var dontEnumsLength = dontEnums.length;
+
+var isArguments = function isArguments(value) {
+ var str = toStr(value);
+ var isArgs = str === '[object Arguments]';
+ if (!isArgs) {
+ isArgs = !isArray(value) &&
+ value !== null &&
+ typeof value === 'object' &&
+ typeof value.length === 'number' &&
+ value.length >= 0 &&
+ isCallable(value.callee);
+ }
+ return isArgs;
+};
+
+defineProperties($Object, {
+ keys: function keys(object) {
+ var isFn = isCallable(object);
+ var isArgs = isArguments(object);
+ var isObject = object !== null && typeof object === 'object';
+ var isStr = isObject && isString(object);
+
+ if (!isObject && !isFn && !isArgs) {
+ throw new TypeError('Object.keys called on a non-object');
+ }
+
+ var theKeys = [];
+ var skipProto = hasProtoEnumBug && isFn;
+ if ((isStr && hasStringEnumBug) || isArgs) {
+ for (var i = 0; i < object.length; ++i) {
+ array_push.call(theKeys, $String(i));
+ }
+ }
+
+ if (!isArgs) {
+ for (var name in object) {
+ if (!(skipProto && name === 'prototype') &&
owns(object, name)) {
+ array_push.call(theKeys, $String(name));
+ }
+ }
+ }
+
+ if (hasDontEnumBug) {
+ var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
+ for (var j = 0; j < dontEnumsLength; j++) {
+ var dontEnum = dontEnums[j];
+ if (!(skipConstructor && dontEnum === 'constructor')
&& owns(object, dontEnum)) {
+ array_push.call(theKeys, dontEnum);
+ }
+ }
+ }
+ return theKeys;
+ }
+});
+
+var keysWorksWithArguments = $Object.keys && (function () {
+ // Safari 5.0 bug
+ return $Object.keys(arguments).length === 2;
+}(1, 2));
+var originalKeys = $Object.keys;
+defineProperties($Object, {
+ keys: function keys(object) {
+ if (isArguments(object)) {
+ return originalKeys(array_slice.call(object));
+ } else {
+ return originalKeys(object);
+ }
+ }
+}, !keysWorksWithArguments);
+
+//
+// Date
+// ====
+//
+
+// ES5 15.9.5.43
+//
http://es5.github.com/#x15.9.5.43
+// This function returns a String value represent the instance in time
+// represented by this Date object. The format of the String is the Date Time
+// string format defined in 15.9.1.15. All fields are present in the String.
+// The time zone is always UTC, denoted by the suffix Z. If the time value of
+// this object is not a finite Number a RangeError exception is thrown.
+var negativeDate = -62198755200000;
+var negativeYearString = '-000001';
+var hasNegativeDateBug = Date.prototype.toISOString && new
Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
+var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString()
!== '1969-12-31T23:59:59.999Z';
+
+defineProperties(Date.prototype, {
+ toISOString: function toISOString() {
+ var result, length, value, year, month;
+ if (!isFinite(this)) {
+ throw new RangeError('Date.prototype.toISOString called on non-finite
value.');
+ }
+
+ year = this.getUTCFullYear();
+
+ month = this.getUTCMonth();
+ // see
https://github.com/es-shims/es5-shim/issues/111
+ year += Math.floor(month / 12);
+ month = (month % 12 + 12) % 12;
+
+ // the date time string format is specified in 15.9.1.15.
+ result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(),
this.getUTCSeconds()];
+ year = (
+ (year < 0 ? '-' : (year > 9999 ? '+' : '')) +
+ strSlice('00000' + Math.abs(year), (0 <= year && year
<= 9999) ? -4 : -6)
+ );
+
+ length = result.length;
+ while (length--) {
+ value = result[length];
+ // pad months, days, hours, minutes, and seconds to have two
+ // digits.
+ if (value < 10) {
+ result[length] = '0' + value;
+ }
+ }
+ // pad milliseconds to have three digits.
+ return (
+ year + '-' + array_slice.call(result, 0, 2).join('-') +
+ 'T' + array_slice.call(result, 2).join(':') + '.' +
+ strSlice('000' + this.getUTCMilliseconds(), -3) + 'Z'
+ );
+ }
+}, hasNegativeDateBug || hasSafari51DateBug);
+
+// ES5 15.9.5.44
+//
http://es5.github.com/#x15.9.5.44
+// This function provides a String representation of a Date object for use by
+// JSON.stringify (15.12.3).
+var dateToJSONIsSupported = (function () {
+ try {
+ return Date.prototype.toJSON &&
+ new Date(NaN).toJSON() === null &&
+ new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1
&&
+ Date.prototype.toJSON.call({ // generic
+ toISOString: function () { return true; }
+ });
+ } catch (e) {
+ return false;
+ }
+}());
+if (!dateToJSONIsSupported) {
+ Date.prototype.toJSON = function toJSON(key) {
+ // When the toJSON method is called with argument key, the following
+ // steps are taken:
+
+ // 1. Let O be the result of calling ToObject, giving it the this
+ // value as its argument.
+ // 2. Let tv be ES.ToPrimitive(O, hint Number).
+ var O = $Object(this);
+ var tv = ES.ToPrimitive(O);
+ // 3. If tv is a Number and is not finite, return null.
+ if (typeof tv === 'number' && !isFinite(tv)) {
+ return null;
+ }
+ // 4. Let toISO be the result of calling the [[Get]] internal method of
+ // O with argument "toISOString".
+ var toISO = O.toISOString;
+ // 5. If IsCallable(toISO) is false, throw a TypeError exception.
+ if (!isCallable(toISO)) {
+ throw new TypeError('toISOString property is not callable');
+ }
+ // 6. Return the result of calling the [[Call]] internal method of
+ // toISO with O as the this value and an empty argument list.
+ return toISO.call(O);
+
+ // NOTE 1 The argument is ignored.
+
+ // NOTE 2 The toJSON function is intentionally generic; it does not
+ // require that its this value be a Date object. Therefore, it can be
+ // transferred to other kinds of objects for use as a method. However,
+ // it does require that any such object have a toISOString method. An
+ // object is free to use the argument key to filter its
+ // stringification.
+ };
+}
+
+// ES5 15.9.4.2
+//
http://es5.github.com/#x15.9.4.2
+// based on work shared by Daniel Friesen (dantman)
+//
http://gist.github.com/303249
+var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
+var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) ||
!isNaN(Date.parse('2012-11-31T23:59:59.000Z')) ||
!isNaN(Date.parse('2012-12-31T23:59:60.000Z'));
+var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));
+if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates ||
!supportsExtendedYears) {
+ // XXX global assignment won't work in embeddings that use
+ // an alternate object for the context.
+ /* global Date: true */
+ /* eslint-disable no-undef */
+ Date = (function (NativeDate) {
+ /* eslint-enable no-undef */
+ // Date.length === 7
+ var DateShim = function Date(Y, M, D, h, m, s, ms) {
+ var length = arguments.length;
+ var date;
+ if (this instanceof NativeDate) {
+ date = length === 1 && $String(Y) === Y ? // isString(Y)
+ // We explicitly pass it through parse:
+ new NativeDate(DateShim.parse(Y)) :
+ // We have to manually make calls depending on argument
+ // length here
+ length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :
+ length >= 6 ? new NativeDate(Y, M, D, h, m, s) :
+ length >= 5 ? new NativeDate(Y, M, D, h, m) :
+ length >= 4 ? new NativeDate(Y, M, D, h) :
+ length >= 3 ? new NativeDate(Y, M, D) :
+ length >= 2 ? new NativeDate(Y, M) :
+ length >= 1 ? new NativeDate(Y) :
+ new NativeDate();
+ } else {
+ date = NativeDate.apply(this, arguments);
+ }
+ // Prevent mixups with unfixed Date object
+ defineProperties(date, { constructor: DateShim }, true);
+ return date;
+ };
+
+ // 15.9.1.15 Date Time String Format.
+ var isoDateExpression = new RegExp('^' +
+ '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign +
+ // 6-digit extended year
+ '(?:-(\\d{2})' + // optional month capture
+ '(?:-(\\d{2})' + // optional day capture
+ '(?:' + // capture hours:minutes:seconds.milliseconds
+ 'T(\\d{2})' + // hours capture
+ ':(\\d{2})' + // minutes capture
+ '(?:' + // optional :seconds.milliseconds
+ ':(\\d{2})' + // seconds capture
+ '(?:(\\.\\d{1,}))?' + // milliseconds capture
+ ')?' +
+ '(' + // capture UTC offset component
+ 'Z|' + // UTC capture
+ '(?:' + // offset specifier +/-hours:minutes
+ '([-+])' + // sign capture
+ '(\\d{2})' + // hours offset capture
+ ':(\\d{2})' + // minutes offset capture
+ ')' +
+ ')?)?)?)?' +
+ '$');
+
+ var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
+
+ var dayFromMonth = function dayFromMonth(year, month) {
+ var t = month > 1 ? 1 : 0;
+ return (
+ months[month] +
+ Math.floor((year - 1969 + t) / 4) -
+ Math.floor((year - 1901 + t) / 100) +
+ Math.floor((year - 1601 + t) / 400) +
+ 365 * (year - 1970)
+ );
+ };
+
+ var toUTC = function toUTC(t) {
+ return $Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));
+ };
+
+ // Copy any custom methods a 3rd party library may have added
+ for (var key in NativeDate) {
+ if (owns(NativeDate, key)) {
+ DateShim[key] = NativeDate[key];
+ }
+ }
+
+ // Copy "native" methods explicitly; they may be non-enumerable
+ defineProperties(DateShim, {
+ now: NativeDate.now,
+ UTC: NativeDate.UTC
+ }, true);
+ DateShim.prototype = NativeDate.prototype;
+ defineProperties(DateShim.prototype, {
+ constructor: DateShim
+ }, true);
+
+ // Upgrade Date.parse to handle simplified ISO 8601 strings
+ var parseShim = function parse(string) {
+ var match = isoDateExpression.exec(string);
+ if (match) {
+ // parse months, days, hours, minutes, seconds, and milliseconds
+ // provide default values if necessary
+ // parse the UTC offset component
+ var year = $Number(match[1]),
+ month = $Number(match[2] || 1) - 1,
+ day = $Number(match[3] || 1) - 1,
+ hour = $Number(match[4] || 0),
+ minute = $Number(match[5] || 0),
+ second = $Number(match[6] || 0),
+ millisecond = Math.floor($Number(match[7] || 0) * 1000),
+ // When time zone is missed, local offset should be used
+ // (ES 5.1 bug)
+ // see
https://bugs.ecmascript.org/show_bug.cgi?id=112
+ isLocalTime = Boolean(match[4] && !match[8]),
+ signOffset = match[9] === '-' ? 1 : -1,
+ hourOffset = $Number(match[10] || 0),
+ minuteOffset = $Number(match[11] || 0),
+ result;
+ if (
+ hour < (
+ minute > 0 || second > 0 || millisecond > 0 ?
+ 24 : 25
+ ) &&
+ minute < 60 && second < 60 && millisecond <
1000 &&
+ month > -1 && month < 12 && hourOffset < 24
&&
+ minuteOffset < 60 && // detect invalid offsets
+ day > -1 &&
+ day < (
+ dayFromMonth(year, month + 1) -
+ dayFromMonth(year, month)
+ )
+ ) {
+ result = (
+ (dayFromMonth(year, month) + day) * 24 +
+ hour +
+ hourOffset * signOffset
+ ) * 60;
+ result = (
+ (result + minute + minuteOffset * signOffset) * 60 +
+ second
+ ) * 1000 + millisecond;
+ if (isLocalTime) {
+ result = toUTC(result);
+ }
+ if (-8.64e15 <= result && result <= 8.64e15) {
+ return result;
+ }
+ }
+ return NaN;
+ }
+ return NativeDate.parse.apply(this, arguments);
+ };
+ defineProperties(DateShim, { parse: parseShim });
+
+ return DateShim;
+ }(Date));
+ /* global Date: false */
+}
+
+// ES5 15.9.4.4
+//
http://es5.github.com/#x15.9.4.4
+if (!Date.now) {
+ Date.now = function now() {
+ return new Date().getTime();
+ };
+}
+
+//
+// Number
+// ======
+//
+
+// ES5.1 15.7.4.5
+//
http://es5.github.com/#x15.7.4.5
+var hasToFixedBugs = NumberPrototype.toFixed && (
+ (0.00008).toFixed(3) !== '0.000' ||
+ (0.9).toFixed(0) !== '1' ||
+ (1.255).toFixed(2) !== '1.25' ||
+ (1000000000000000128).toFixed(0) !== '1000000000000000128'
+);
+
+var toFixedHelpers = {
+ base: 1e7,
+ size: 6,
+ data: [0, 0, 0, 0, 0, 0],
+ multiply: function multiply(n, c) {
+ var i = -1;
+ var c2 = c;
+ while (++i < toFixedHelpers.size) {
+ c2 += n * toFixedHelpers.data[i];
+ toFixedHelpers.data[i] = c2 % toFixedHelpers.base;
+ c2 = Math.floor(c2 / toFixedHelpers.base);
+ }
+ },
+ divide: function divide(n) {
+ var i = toFixedHelpers.size, c = 0;
+ while (--i >= 0) {
+ c += toFixedHelpers.data[i];
+ toFixedHelpers.data[i] = Math.floor(c / n);
+ c = (c % n) * toFixedHelpers.base;
+ }
+ },
+ numToString: function numToString() {
+ var i = toFixedHelpers.size;
+ var s = '';
+ while (--i >= 0) {
+ if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
+ var t = $String(toFixedHelpers.data[i]);
+ if (s === '') {
+ s = t;
+ } else {
+ s += strSlice('0000000', 0, 7 - t.length) + t;
+ }
+ }
+ }
+ return s;
+ },
+ pow: function pow(x, n, acc) {
+ return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2,
acc)));
+ },
+ log: function log(x) {
+ var n = 0;
+ var x2 = x;
+ while (x2 >= 4096) {
+ n += 12;
+ x2 /= 4096;
+ }
+ while (x2 >= 2) {
+ n += 1;
+ x2 /= 2;
+ }
+ return n;
+ }
+};
+
+defineProperties(NumberPrototype, {
+ toFixed: function toFixed(fractionDigits) {
+ var f, x, s, m, e, z, j, k;
+
+ // Test for NaN and round fractionDigits down
+ f = $Number(fractionDigits);
+ f = f !== f ? 0 : Math.floor(f);
+
+ if (f < 0 || f > 20) {
+ throw new RangeError('Number.toFixed called with invalid number of
decimals');
+ }
+
+ x = $Number(this);
+
+ // Test for NaN
+ if (x !== x) {
+ return 'NaN';
+ }
+
+ // If it is too big or small, return the string value of the number
+ if (x <= -1e21 || x >= 1e21) {
+ return $String(x);
+ }
+
+ s = '';
+
+ if (x < 0) {
+ s = '-';
+ x = -x;
+ }
+
+ m = '0';
+
+ if (x > 1e-21) {
+ // 1e-21 < x < 1e21
+ // -70 < log2(x) < 70
+ e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
+ z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2,
e, 1));
+ z *= 0x10000000000000; // Math.pow(2, 52);
+ e = 52 - e;
+
+ // -18 < e < 122
+ // x = z / 2 ^ e
+ if (e > 0) {
+ toFixedHelpers.multiply(0, z);
+ j = f;
+
+ while (j >= 7) {
+ toFixedHelpers.multiply(1e7, 0);
+ j -= 7;
+ }
+
+ toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
+ j = e - 1;
+
+ while (j >= 23) {
+ toFixedHelpers.divide(1 << 23);
+ j -= 23;
+ }
+
+ toFixedHelpers.divide(1 << j);
+ toFixedHelpers.multiply(1, 1);
+ toFixedHelpers.divide(2);
+ m = toFixedHelpers.numToString();
+ } else {
+ toFixedHelpers.multiply(0, z);
+ toFixedHelpers.multiply(1 << (-e), 0);
+ m = toFixedHelpers.numToString() +
strSlice('0.00000000000000000000', 2, 2 + f);
+ }
+ }
+
+ if (f > 0) {
+ k = m.length;
+
+ if (k <= f) {
+ m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;
+ } else {
+ m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);
+ }
+ } else {
+ m = s + m;
+ }
+
+ return m;
+ }
+}, hasToFixedBugs);
+
+//
+// String
+// ======
+//
+
+// ES5 15.5.4.14
+//
http://es5.github.com/#x15.5.4.14
+
+// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
+// Many browsers do not split properly with regular expressions or they
+// do not perform the split correctly under obscure conditions.
+// See
http://blog.stevenlevithan.com/archives/cross-browser-split
+// I've tested in many browsers and this seems to cover the deviant ones:
+// 'ab'.split(/(?:ab)*/) should be ["", ""], not
[""]
+// '.'.split(/(.?)(.?)/) should be ["", ".", "",
""], not ["", ""]
+// 'tesst'.split(/(s)*/) should be ["t", undefined, "e",
"s", "t"], not
+// [undefined, "t", undefined, "e", ...]
+// ''.split(/.?/) should be [], not [""]
+// '.'.split(/()()/) should be ["."], not ["",
"", "."]
+
+if (
+ 'ab'.split(/(?:ab)*/).length !== 2 ||
+ '.'.split(/(.?)(.?)/).length !== 4 ||
+ 'tesst'.split(/(s)*/)[1] === 't' ||
+ 'test'.split(/(?:)/, -1).length !== 4 ||
+ ''.split(/.?/).length ||
+ '.'.split(/()()/).length > 1
+) {
+ (function () {
+ var compliantExecNpcg = typeof (/()??/).exec('')[1] ===
'undefined'; // NPCG: nonparticipating capturing group
+
+ StringPrototype.split = function (separator, limit) {
+ var string = this;
+ if (typeof separator === 'undefined' && limit === 0) {
+ return [];
+ }
+
+ // If `separator` is not a regex, use native split
+ if (!isRegex(separator)) {
+ return strSplit(this, separator, limit);
+ }
+
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') + // in ES6
+ (separator.sticky ? 'y' : ''), // Firefox 3+ and
ES6
+ lastLastIndex = 0,
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ separator2, match, lastIndex, lastLength;
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ string += ''; // Type-convert
+ if (!compliantExecNpcg) {
+ // Doesn't need flags gy, but they don't hurt
+ separator2 = new RegExp('^' + separatorCopy.source +
'$(?!\\s)', flags);
+ }
+ /* Values for `limit`, per the spec:
+ * If undefined: 4294967295 // Math.pow(2, 32) - 1
+ * If 0, Infinity, or NaN: 0
+ * If positive number: limit = Math.floor(limit); if (limit > 4294967295)
limit -= 4294967296;
+ * If negative number: 4294967296 - Math.floor(Math.abs(limit))
+ * If other: Type-convert, then use the above rules
+ */
+ var splitLimit = typeof limit === 'undefined' ?
+ -1 >>> 0 : // Math.pow(2, 32) - 1
+ ES.ToUint32(limit);
+ match = separatorCopy.exec(string);
+ while (match) {
+ // `separatorCopy.lastIndex` is not reliable cross-browser
+ lastIndex = match.index + match[0].length;
+ if (lastIndex > lastLastIndex) {
+ array_push.call(output, strSlice(string, lastLastIndex,
match.index));
+ // Fix browsers whose `exec` methods don't consistently return
`undefined` for
+ // nonparticipating capturing groups
+ if (!compliantExecNpcg && match.length > 1) {
+ /* eslint-disable no-loop-func */
+ match[0].replace(separator2, function () {
+ for (var i = 1; i < arguments.length - 2; i++) {
+ if (typeof arguments[i] === 'undefined') {
+ match[i] = void 0;
+ }
+ }
+ });
+ /* eslint-enable no-loop-func */
+ }
+ if (match.length > 1 && match.index < string.length) {
+ array_push.apply(output, array_slice.call(match, 1));
+ }
+ lastLength = match[0].length;
+ lastLastIndex = lastIndex;
+ if (output.length >= splitLimit) {
+ break;
+ }
+ }
+ if (separatorCopy.lastIndex === match.index) {
+ separatorCopy.lastIndex++; // Avoid an infinite loop
+ }
+ match = separatorCopy.exec(string);
+ }
+ if (lastLastIndex === string.length) {
+ if (lastLength || !separatorCopy.test('')) {
+ array_push.call(output, '');
+ }
+ } else {
+ array_push.call(output, strSlice(string, lastLastIndex));
+ }
+ return output.length > splitLimit ? strSlice(output, 0, splitLimit) :
output;
+ };
+ }());
+
+// [bugfix, chrome]
+// If separator is undefined, then the result array contains just one String,
+// which is the this value (converted to a String). If limit is not undefined,
+// then the output array is truncated so that it contains no more than limit
+// elements.
+// "0".split(undefined, 0) -> []
+} else if ('0'.split(void 0, 0).length) {
+ StringPrototype.split = function split(separator, limit) {
+ if (typeof separator === 'undefined' && limit === 0) { return [];
}
+ return strSplit(this, separator, limit);
+ };
+}
+
+var str_replace = StringPrototype.replace;
+var replaceReportsGroupsCorrectly = (function () {
+ var groups = [];
+ 'x'.replace(/x(.)?/g, function (match, group) {
+ array_push.call(groups, group);
+ });
+ return groups.length === 1 && typeof groups[0] === 'undefined';
+}());
+
+if (!replaceReportsGroupsCorrectly) {
+ StringPrototype.replace = function replace(searchValue, replaceValue) {
+ var isFn = isCallable(replaceValue);
+ var hasCapturingGroups = isRegex(searchValue) &&
(/\)[*?]/).test(searchValue.source);
+ if (!isFn || !hasCapturingGroups) {
+ return str_replace.call(this, searchValue, replaceValue);
+ } else {
+ var wrappedReplaceValue = function (match) {
+ var length = arguments.length;
+ var originalLastIndex = searchValue.lastIndex;
+ searchValue.lastIndex = 0;
+ var args = searchValue.exec(match) || [];
+ searchValue.lastIndex = originalLastIndex;
+ array_push.call(args, arguments[length - 2], arguments[length - 1]);
+ return replaceValue.apply(this, args);
+ };
+ return str_replace.call(this, searchValue, wrappedReplaceValue);
+ }
+ };
+}
+
+// ECMA-262, 3rd B.2.3
+// Not an ECMAScript standard, although ECMAScript 3rd Edition has a
+// non-normative section suggesting uniform semantics and it should be
+// normalized across all browsers
+// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
+var string_substr = StringPrototype.substr;
+var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !==
'b';
+defineProperties(StringPrototype, {
+ substr: function substr(start, length) {
+ var normalizedStart = start;
+ if (start < 0) {
+ normalizedStart = max(this.length + start, 0);
+ }
+ return string_substr.call(this, normalizedStart, length);
+ }
+}, hasNegativeSubstrBug);
+
+// ES5 15.5.4.20
+// whitespace from:
http://es5.github.io/#x15.5.4.20
+var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
+ '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' +
+ '\u2029\uFEFF';
+var zeroWidth = '\u200b';
+var wsRegexChars = '[' + ws + ']';
+var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars +
'*');
+var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');
+var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() ||
!zeroWidth.trim());
+defineProperties(StringPrototype, {
+ //
http://blog.stevenlevithan.com/archives/faster-trim-javascript
+ //
http://perfectionkills.com/whitespace-deviations/
+ trim: function trim() {
+ if (typeof this === 'undefined' || this === null) {
+ throw new TypeError("can't convert " + this + ' to
object');
+ }
+ return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp,
'');
+ }
+}, hasTrimWhitespaceBug);
+
+// ES-5 15.1.2.2
+if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
+ /* global parseInt: true */
+ parseInt = (function (origParseInt) {
+ var hexRegex = /^0[xX]/;
+ return function parseInt(str, radix) {
+ var string = $String(str).trim();
+ var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);
+ return origParseInt(string, defaultedRadix);
+ };
+ }(parseInt));
+}
+
+}));
+
+/*
+ json2.js
+ 2015-05-03
+
+ Public Domain.
+
+ NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+ See
http://www.JSON.org/js.html
+
+
+ This code should be minified before deployment.
+ See
http://javascript.crockford.com/jsmin.html
+
+ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+ NOT CONTROL.
+
+
+ This file creates a global JSON object containing two methods: stringify
+ and parse. This file is provides the ES5 JSON capability to ES3 systems.
+ If a project might run on IE8 or earlier, then this file should be included.
+ This file does nothing on ES5 systems.
+
+ JSON.stringify(value, replacer, space)
+ value any JavaScript value, usually an object or array.
+
+ replacer an optional parameter that determines how object
+ values are stringified for objects. It can be a
+ function or an array of strings.
+
+ space an optional parameter that specifies the indentation
+ of nested structures. If it is omitted, the text will
+ be packed without extra whitespace. If it is a number,
+ it will specify the number of spaces to indent at each
+ level. If it is a string (such as '\t' or
' '),
+ it contains the characters used to indent at each level.
+
+ This method produces a JSON text from a JavaScript value.
+
+ When an object value is found, if the object contains a toJSON
+ method, its toJSON method will be called and the result will be
+ stringified. A toJSON method does not serialize: it returns the
+ value represented by the name/value pair that should be serialized,
+ or undefined if nothing should be serialized. The toJSON method
+ will be passed the key associated with the value, and this will be
+ bound to the value
+
+ For example, this would serialize Dates as ISO strings.
+
+ Date.prototype.toJSON = function (key) {
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10
+ ? '0' + n
+ : n;
+ }
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+ You can provide an optional replacer method. It will be passed the
+ key and value of each member, with this bound to the containing
+ object. The value that is returned from your method will be
+ serialized. If your method returns undefined, then the member will
+ be excluded from the serialization.
+
+ If the replacer parameter is an array of strings, then it will be
+ used to select the members to be serialized. It filters the results
+ such that only members with keys listed in the replacer array are
+ stringified.
+
+ Values that do not have JSON representations, such as undefined or
+ functions, will not be serialized. Such values in objects will be
+ dropped; in arrays they will be replaced with null. You can use
+ a replacer function to replace those with JSON values.
+ JSON.stringify(undefined) returns undefined.
+
+ The optional space parameter produces a stringification of the
+ value that is filled with line breaks and indentation to make it
+ easier to read.
+
+ If the space parameter is a non-empty string, then that string will
+ be used for indentation. If the space parameter is a number, then
+ the indentation will be that many spaces.
+
+ Example:
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}]);
+ // text is '["e",{"pluribus":"unum"}]'
+
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}], null,
'\t');
+ // text is '[\n\t"e",\n\t{\n\t\t"pluribus":
"unum"\n\t}\n]'
+
+ text = JSON.stringify([new Date()], function (key, value) {
+ return this[key] instanceof Date
+ ? 'Date(' + this[key] + ')'
+ : value;
+ });
+ // text is '["Date(---current time---)"]'
+
+
+ JSON.parse(text, reviver)
+ This method parses a JSON text to produce an object or array.
+ It can throw a SyntaxError exception.
+
+ The optional reviver parameter is a function that can filter and
+ transform the results. It receives each of the keys and values,
+ and its return value is used instead of the original value.
+ If it returns what it received, then the structure is not modified.
+ If it returns undefined then the member is deleted.
+
+ Example:
+
+ // Parse the text. Values that look like ISO date strings will
+ // be converted to Date objects.
+
+ myData = JSON.parse(text, function (key, value) {
+ var a;
+ if (typeof value === 'string') {
+ a =
+/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+ if (a) {
+ return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+ +a[5], +a[6]));
+ }
+ }
+ return value;
+ });
+
+ myData = JSON.parse('["Date(09/09/2001)"]', function (key,
value) {
+ var d;
+ if (typeof value === 'string' &&
+ value.slice(0, 5) === 'Date(' &&
+ value.slice(-1) === ')') {
+ d = new Date(value.slice(5, -1));
+ if (d) {
+ return d;
+ }
+ }
+ return value;
+ });
+
+
+ This is a reference implementation. You are free to copy, modify, or
+ redistribute.
+*/
+
+/*jslint
+ eval, for, this
+*/
+
+/*property
+ JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+ getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+ lastIndex, length, parse, prototype, push, replace, slice, stringify,
+ test, toJSON, toString, valueOf
+*/
+
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+if (typeof JSON !== 'object') {
+ JSON = {};
+}
+
+(function () {
+ 'use strict';
+
+ var rx_one = /^[\],:{}\s]*$/,
+ rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+ rx_three =
/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+ rx_four = /(?:^|:|,)(?:\s*\[)+/g,
+ rx_escapable =
/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ rx_dangerous =
/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10
+ ? '0' + n
+ : n;
+ }
+
+ function this_value() {
+ return this.valueOf();
+ }
+
+ if (typeof Date.prototype.toJSON !== 'function') {
+
+ Date.prototype.toJSON = function () {
+
+ return isFinite(this.valueOf())
+ ? this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z'
+ : null;
+ };
+
+ Boolean.prototype.toJSON = this_value;
+ Number.prototype.toJSON = this_value;
+ String.prototype.toJSON = this_value;
+ }
+
+ var gap,
+ indent,
+ meta,
+ rep;
+
+
+ function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+ rx_escapable.lastIndex = 0;
+ return rx_escapable.test(string)
+ ? '"' + string.replace(rx_escapable, function (a) {
+ var c = meta[a];
+ return typeof c === 'string'
+ ? c
+ : '\\u' + ('0000' +
a.charCodeAt(0).toString(16)).slice(-4);
+ }) + '"'
+ : '"' + string + '"';
+ }
+
+
+ function str(key, holder) {
+
+// Produce a string from holder[key].
+
+ var i, // The loop counter.
+ k, // The member key.
+ v, // The member value.
+ length,
+ mind = gap,
+ partial,
+ value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+ if (value && typeof value === 'object' &&
+ typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+ if (typeof rep === 'function') {
+ value = rep.call(holder, key, value);
+ }
+
+// What happens next depends on the value's type.
+
+ switch (typeof value) {
+ case 'string':
+ return quote(value);
+
+ case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value)
+ ? String(value)
+ : 'null';
+
+ case 'boolean':
+ case 'null':
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce 'null'. The case is included here in
+// the remote chance that this gets fixed someday.
+
+ return String(value);
+
+// If the type is 'object', we might be dealing with an object or an array or
+// null.
+
+ case 'object':
+
+// Due to a specification blunder in ECMAScript, typeof null is 'object',
+// so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+ gap += indent;
+ partial = [];
+
+// Is the value an array?
+
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+ length = value.length;
+ for (i = 0; i < length; i += 1) {
+ partial[i] = str(i, value) || 'null';
+ }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+ v = partial.length === 0
+ ? '[]'
+ : gap
+ ? '[\n' + gap + partial.join(',\n' + gap) +
'\n' + mind + ']'
+ : '[' + partial.join(',') + ']';
+ gap = mind;
+ return v;
+ }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+ if (rep && typeof rep === 'object') {
+ length = rep.length;
+ for (i = 0; i < length; i += 1) {
+ if (typeof rep[i] === 'string') {
+ k = rep[i];
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (
+ gap
+ ? ': '
+ : ':'
+ ) + v);
+ }
+ }
+ }
+ } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (
+ gap
+ ? ': '
+ : ':'
+ ) + v);
+ }
+ }
+ }
+ }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+ v = partial.length === 0
+ ? '{}'
+ : gap
+ ? '{\n' + gap + partial.join(',\n' + gap) +
'\n' + mind + '}'
+ : '{' + partial.join(',') + '}';
+ gap = mind;
+ return v;
+ }
+ }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+ if (typeof JSON.stringify !== 'function') {
+ meta = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"': '\\"',
+ '\\': '\\\\'
+ };
+ JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+ var i;
+ gap = '';
+ indent = '';
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+ if (typeof space === 'number') {
+ for (i = 0; i < space; i += 1) {
+ indent += ' ';
+ }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+ } else if (typeof space === 'string') {
+ indent = space;
+ }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+ rep = replacer;
+ if (replacer && typeof replacer !== 'function' &&
+ (typeof replacer !== 'object' ||
+ typeof replacer.length !== 'number')) {
+ throw new Error('JSON.stringify');
+ }
+
+// Make a fake root object containing our value under the key of ''.
+// Return the result of stringifying the value.
+
+ return str('', {'': value});
+ };
+ }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+ if (typeof JSON.parse !== 'function') {
+ JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+ var j;
+
+ function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+ var k, v, value = holder[key];
+ if (value && typeof value === 'object') {
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = walk(value, k);
+ if (v !== undefined) {
+ value[k] = v;
+ } else {
+ delete value[k];
+ }
+ }
+ }
+ }
+ return reviver.call(holder, key, value);
+ }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+ text = String(text);
+ rx_dangerous.lastIndex = 0;
+ if (rx_dangerous.test(text)) {
+ text = text.replace(rx_dangerous, function (a) {
+ return '\\u' +
+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with '()' and
'new'
+// because they can cause invocation, and '=' because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text
is safe for eval.
+
+ if (
+ rx_one.test(
+ text
+ .replace(rx_two, '@')
+ .replace(rx_three, ']')
+ .replace(rx_four, '')
+ )
+ ) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+ j = eval('(' + text + ')');
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+ return typeof reviver === 'function'
+ ? walk({'': j}, '')
+ : j;
+ }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+ throw new SyntaxError('JSON.parse');
+ };
+ }
+}());
+
+;(function () {
+
+ var object = typeof exports != 'undefined' ? exports : this; // #8: web
workers
+ var chars =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+ function InvalidCharacterError(message) {
+ this.message = message;
+ }
+ InvalidCharacterError.prototype = new Error;
+ InvalidCharacterError.prototype.name = 'InvalidCharacterError';
+
+ // encoder
+ // [
https://gist.github.com/999166] by [
https://github.com/nignag]
+ object.btoa || (
+ object.btoa = function (input) {
+ var str = String(input);
+ for (
+ // initialize result and counter
+ var block, charCode, idx = 0, map = chars, output = '';
+ // if the next str index does not exist:
+ // change the mapping table to "="
+ // check if d has no fractional digits
+ str.charAt(idx | 0) || (map = '=', idx % 1);
+ // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
+ output += map.charAt(63 & block >> 8 - idx % 1 * 8)
+ ) {
+ charCode = str.charCodeAt(idx += 3/4);
+ if (charCode > 0xFF) {
+ throw new InvalidCharacterError("'btoa' failed: The string to be
encoded contains characters outside of the Latin1 range.");
+ }
+ block = block << 8 | charCode;
+ }
+ return output;
+ });
+
+ // decoder
+ // [
https://gist.github.com/1020396] by [
https://github.com/atk]
+ object.atob || (
+ object.atob = function (input) {
+ var str = String(input).replace(/=+$/, '');
+ if (str.length % 4 == 1) {
+ throw new InvalidCharacterError("'atob' failed: The string to be
decoded is not correctly encoded.");
+ }
+ for (
+ // initialize result and counters
+ var bc = 0, bs, buffer, idx = 0, output = '';
+ // get next character
+ buffer = str.charAt(idx++);
+ // character found in table? initialize bit storage and add its ascii value;
+ ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
+ // and if not first of each 4 characters,
+ // convert the first 8 bits to one ascii character
+ bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc &
6)) : 0
+ ) {
+ // try to find character in table (0-63, not found => -1)
+ buffer = chars.indexOf(buffer);
+ }
+ return output;
+ });
+
+}());
+
+/*!
+ * typeahead.js 0.11.1
+ *
https://github.com/twitter/typeahead.js
+ * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
+ */
+
+(function(root, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("bloodhound", [ "jquery" ], function(a0) {
+ return root["Bloodhound"] = factory(a0);
+ });
+ } else if (typeof exports === "object") {
+ module.exports = factory(require("jquery"));
+ } else {
+ root["Bloodhound"] = factory(jQuery);
+ }
+})(this, function($) {
+ var _ = function() {
+ "use strict";
+ return {
+ isMsie: function() {
+ return /(msie|trident)/i.test(navigator.userAgent) ?
navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
+ },
+ isBlankString: function(str) {
+ return !str || /^\s*$/.test(str);
+ },
+ escapeRegExChars: function(str) {
+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
"\\$&");
+ },
+ isString: function(obj) {
+ return typeof obj === "string";
+ },
+ isNumber: function(obj) {
+ return typeof obj === "number";
+ },
+ isArray: $.isArray,
+ isFunction: $.isFunction,
+ isObject: $.isPlainObject,
+ isUndefined: function(obj) {
+ return typeof obj === "undefined";
+ },
+ isElement: function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ },
+ isJQuery: function(obj) {
+ return obj instanceof $;
+ },
+ toStr: function toStr(s) {
+ return _.isUndefined(s) || s === null ? "" : s + "";
+ },
+ bind: $.proxy,
+ each: function(collection, cb) {
+ $.each(collection, reverseArgs);
+ function reverseArgs(index, value) {
+ return cb(value, index);
+ }
+ },
+ map: $.map,
+ filter: $.grep,
+ every: function(obj, test) {
+ var result = true;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (!(result = test.call(null, val, key, obj))) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ some: function(obj, test) {
+ var result = false;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (result = test.call(null, val, key, obj)) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ mixin: $.extend,
+ identity: function(x) {
+ return x;
+ },
+ clone: function(obj) {
+ return $.extend(true, {}, obj);
+ },
+ getIdGenerator: function() {
+ var counter = 0;
+ return function() {
+ return counter++;
+ };
+ },
+ templatify: function templatify(obj) {
+ return $.isFunction(obj) ? obj : template;
+ function template() {
+ return String(obj);
+ }
+ },
+ defer: function(fn) {
+ setTimeout(fn, 0);
+ },
+ debounce: function(func, wait, immediate) {
+ var timeout, result;
+ return function() {
+ var context = this, args = arguments, later, callNow;
+ later = function() {
+ timeout = null;
+ if (!immediate) {
+ result = func.apply(context, args);
+ }
+ };
+ callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) {
+ result = func.apply(context, args);
+ }
+ return result;
+ };
+ },
+ throttle: function(func, wait) {
+ var context, args, timeout, result, previous, later;
+ previous = 0;
+ later = function() {
+ previous = new Date();
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date(), remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ },
+ stringify: function(val) {
+ return _.isString(val) ? val : JSON.stringify(val);
+ },
+ noop: function() {}
+ };
+ }();
+ var VERSION = "0.11.1";
+ var tokenizers = function() {
+ "use strict";
+ return {
+ nonword: nonword,
+ whitespace: whitespace,
+ obj: {
+ nonword: getObjTokenizer(nonword),
+ whitespace: getObjTokenizer(whitespace)
+ }
+ };
+ function whitespace(str) {
+ str = _.toStr(str);
+ return str ? str.split(/\s+/) : [];
+ }
+ function nonword(str) {
+ str = _.toStr(str);
+ return str ? str.split(/\W+/) : [];
+ }
+ function getObjTokenizer(tokenizer) {
+ return function setKey(keys) {
+ keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);
+ return function tokenize(o) {
+ var tokens = [];
+ _.each(keys, function(k) {
+ tokens = tokens.concat(tokenizer(_.toStr(o[k])));
+ });
+ return tokens;
+ };
+ };
+ }
+ }();
+ var LruCache = function() {
+ "use strict";
+ function LruCache(maxSize) {
+ this.maxSize = _.isNumber(maxSize) ? maxSize : 100;
+ this.reset();
+ if (this.maxSize <= 0) {
+ this.set = this.get = $.noop;
+ }
+ }
+ _.mixin(LruCache.prototype, {
+ set: function set(key, val) {
+ var tailItem = this.list.tail, node;
+ if (this.size >= this.maxSize) {
+ this.list.remove(tailItem);
+ delete this.hash[tailItem.key];
+ this.size--;
+ }
+ if (node = this.hash[key]) {
+ node.val = val;
+ this.list.moveToFront(node);
+ } else {
+ node = new Node(key, val);
+ this.list.add(node);
+ this.hash[key] = node;
+ this.size++;
+ }
+ },
+ get: function get(key) {
+ var node = this.hash[key];
+ if (node) {
+ this.list.moveToFront(node);
+ return node.val;
+ }
+ },
+ reset: function reset() {
+ this.size = 0;
+ this.hash = {};
+ this.list = new List();
+ }
+ });
+ function List() {
+ this.head = this.tail = null;
+ }
+ _.mixin(List.prototype, {
+ add: function add(node) {
+ if (this.head) {
+ node.next = this.head;
+ this.head.prev = node;
+ }
+ this.head = node;
+ this.tail = this.tail || node;
+ },
+ remove: function remove(node) {
+ node.prev ? node.prev.next = node.next : this.head = node.next;
+ node.next ? node.next.prev = node.prev : this.tail = node.prev;
+ },
+ moveToFront: function(node) {
+ this.remove(node);
+ this.add(node);
+ }
+ });
+ function Node(key, val) {
+ this.key = key;
+ this.val = val;
+ this.prev = this.next = null;
+ }
+ return LruCache;
+ }();
+ var PersistentStorage = function() {
+ "use strict";
+ var LOCAL_STORAGE;
+ try {
+ LOCAL_STORAGE = window.localStorage;
+ LOCAL_STORAGE.setItem("~~~", "!");
+ LOCAL_STORAGE.removeItem("~~~");
+ } catch (err) {
+ LOCAL_STORAGE = null;
+ }
+ function PersistentStorage(namespace, override) {
+ this.prefix = [ "__", namespace, "__"
].join("");
+ this.ttlKey = "__ttl__";
+ this.keyMatcher = new RegExp("^" +
_.escapeRegExChars(this.prefix));
+ this.ls = override || LOCAL_STORAGE;
+ !this.ls && this._noop();
+ }
+ _.mixin(PersistentStorage.prototype, {
+ _prefix: function(key) {
+ return this.prefix + key;
+ },
+ _ttlKey: function(key) {
+ return this._prefix(key) + this.ttlKey;
+ },
+ _noop: function() {
+ this.get = this.set = this.remove = this.clear = this.isExpired =
_.noop;
+ },
+ _safeSet: function(key, val) {
+ try {
+ this.ls.setItem(key, val);
+ } catch (err) {
+ if (err.name === "QuotaExceededError") {
+ this.clear();
+ this._noop();
+ }
+ }
+ },
+ get: function(key) {
+ if (this.isExpired(key)) {
+ this.remove(key);
+ }
+ return decode(this.ls.getItem(this._prefix(key)));
+ },
+ set: function(key, val, ttl) {
+ if (_.isNumber(ttl)) {
+ this._safeSet(this._ttlKey(key), encode(now() + ttl));
+ } else {
+ this.ls.removeItem(this._ttlKey(key));
+ }
+ return this._safeSet(this._prefix(key), encode(val));
+ },
+ remove: function(key) {
+ this.ls.removeItem(this._ttlKey(key));
+ this.ls.removeItem(this._prefix(key));
+ return this;
+ },
+ clear: function() {
+ var i, keys = gatherMatchingKeys(this.keyMatcher);
+ for (i = keys.length; i--; ) {
+ this.remove(keys[i]);
+ }
+ return this;
+ },
+ isExpired: function(key) {
+ var ttl = decode(this.ls.getItem(this._ttlKey(key)));
+ return _.isNumber(ttl) && now() > ttl ? true : false;
+ }
+ });
+ return PersistentStorage;
+ function now() {
+ return new Date().getTime();
+ }
+ function encode(val) {
+ return JSON.stringify(_.isUndefined(val) ? null : val);
+ }
+ function decode(val) {
+ return $.parseJSON(val);
+ }
+ function gatherMatchingKeys(keyMatcher) {
+ var i, key, keys = [], len = LOCAL_STORAGE.length;
+ for (i = 0; i < len; i++) {
+ if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) {
+ keys.push(key.replace(keyMatcher, ""));
+ }
+ }
+ return keys;
+ }
+ }();
+ var Transport = function() {
+ "use strict";
+ var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6,
sharedCache = new LruCache(10);
+ function Transport(o) {
+ o = o || {};
+ this.cancelled = false;
+ this.lastReq = null;
+ this._send = o.transport;
+ this._get = o.limiter ? o.limiter(this._get) : this._get;
+ this._cache = o.cache === false ? new LruCache(0) : sharedCache;
+ }
+ Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {
+ maxPendingRequests = num;
+ };
+ Transport.resetCache = function resetCache() {
+ sharedCache.reset();
+ };
+ _.mixin(Transport.prototype, {
+ _fingerprint: function fingerprint(o) {
+ o = o || {};
+ return o.url + o.type + $.param(o.data || {});
+ },
+ _get: function(o, cb) {
+ var that = this, fingerprint, jqXhr;
+ fingerprint = this._fingerprint(o);
+ if (this.cancelled || fingerprint !== this.lastReq) {
+ return;
+ }
+ if (jqXhr = pendingRequests[fingerprint]) {
+ jqXhr.done(done).fail(fail);
+ } else if (pendingRequestsCount < maxPendingRequests) {
+ pendingRequestsCount++;
+ pendingRequests[fingerprint] =
this._send(o).done(done).fail(fail).always(always);
+ } else {
+ this.onDeckRequestArgs = [].slice.call(arguments, 0);
+ }
+ function done(resp) {
+ cb(null, resp);
+ that._cache.set(fingerprint, resp);
+ }
+ function fail() {
+ cb(true);
+ }
+ function always() {
+ pendingRequestsCount--;
+ delete pendingRequests[fingerprint];
+ if (that.onDeckRequestArgs) {
+ that._get.apply(that, that.onDeckRequestArgs);
+ that.onDeckRequestArgs = null;
+ }
+ }
+ },
+ get: function(o, cb) {
+ var resp, fingerprint;
+ cb = cb || $.noop;
+ o = _.isString(o) ? {
+ url: o
+ } : o || {};
+ fingerprint = this._fingerprint(o);
+ this.cancelled = false;
+ this.lastReq = fingerprint;
+ if (resp = this._cache.get(fingerprint)) {
+ cb(null, resp);
+ } else {
+ this._get(o, cb);
+ }
+ },
+ cancel: function() {
+ this.cancelled = true;
+ }
+ });
+ return Transport;
+ }();
+ var SearchIndex = window.SearchIndex = function() {
+ "use strict";
+ var CHILDREN = "c", IDS = "i";
+ function SearchIndex(o) {
+ o = o || {};
+ if (!o.datumTokenizer || !o.queryTokenizer) {
+ $.error("datumTokenizer and queryTokenizer are both
required");
+ }
+ this.identify = o.identify || _.stringify;
+ this.datumTokenizer = o.datumTokenizer;
+ this.queryTokenizer = o.queryTokenizer;
+ this.reset();
+ }
+ _.mixin(SearchIndex.prototype, {
+ bootstrap: function bootstrap(o) {
+ this.datums = o.datums;
+ this.trie = o.trie;
+ },
+ add: function(data) {
+ var that = this;
+ data = _.isArray(data) ? data : [ data ];
+ _.each(data, function(datum) {
+ var id, tokens;
+ that.datums[id = that.identify(datum)] = datum;
+ tokens = normalizeTokens(that.datumTokenizer(datum));
+ _.each(tokens, function(token) {
+ var node, chars, ch;
+ node = that.trie;
+ chars = token.split("");
+ while (ch = chars.shift()) {
+ node = node[CHILDREN][ch] || (node[CHILDREN][ch] =
newNode());
+ node[IDS].push(id);
+ }
+ });
+ });
+ },
+ get: function get(ids) {
+ var that = this;
+ return _.map(ids, function(id) {
+ return that.datums[id];
+ });
+ },
+ search: function search(query) {
+ var that = this, tokens, matches;
+ tokens = normalizeTokens(this.queryTokenizer(query));
+ _.each(tokens, function(token) {
+ var node, chars, ch, ids;
+ if (matches && matches.length === 0) {
+ return false;
+ }
+ node = that.trie;
+ chars = token.split("");
+ while (node && (ch = chars.shift())) {
+ node = node[CHILDREN][ch];
+ }
+ if (node && chars.length === 0) {
+ ids = node[IDS].slice(0);
+ matches = matches ? getIntersection(matches, ids) : ids;
+ } else {
+ matches = [];
+ return false;
+ }
+ });
+ return matches ? _.map(unique(matches), function(id) {
+ return that.datums[id];
+ }) : [];
+ },
+ all: function all() {
+ var values = [];
+ for (var key in this.datums) {
+ values.push(this.datums[key]);
+ }
+ return values;
+ },
+ reset: function reset() {
+ this.datums = {};
+ this.trie = newNode();
+ },
+ serialize: function serialize() {
+ return {
+ datums: this.datums,
+ trie: this.trie
+ };
+ }
+ });
+ return SearchIndex;
+ function normalizeTokens(tokens) {
+ tokens = _.filter(tokens, function(token) {
+ return !!token;
+ });
+ tokens = _.map(tokens, function(token) {
+ return token.toLowerCase();
+ });
+ return tokens;
+ }
+ function newNode() {
+ var node = {};
+ node[IDS] = [];
+ node[CHILDREN] = {};
+ return node;
+ }
+ function unique(array) {
+ var seen = {}, uniques = [];
+ for (var i = 0, len = array.length; i < len; i++) {
+ if (!seen[array[i]]) {
+ seen[array[i]] = true;
+ uniques.push(array[i]);
+ }
+ }
+ return uniques;
+ }
+ function getIntersection(arrayA, arrayB) {
+ var ai = 0, bi = 0, intersection = [];
+ arrayA = arrayA.sort();
+ arrayB = arrayB.sort();
+ var lenArrayA = arrayA.length, lenArrayB = arrayB.length;
+ while (ai < lenArrayA && bi < lenArrayB) {
+ if (arrayA[ai] < arrayB[bi]) {
+ ai++;
+ } else if (arrayA[ai] > arrayB[bi]) {
+ bi++;
+ } else {
+ intersection.push(arrayA[ai]);
+ ai++;
+ bi++;
+ }
+ }
+ return intersection;
+ }
+ }();
+ var Prefetch = function() {
+ "use strict";
+ var keys;
+ keys = {
+ data: "data",
+ protocol: "protocol",
+ thumbprint: "thumbprint"
+ };
+ function Prefetch(o) {
+ this.url = o.url;
+ this.ttl = o.ttl;
+ this.cache = o.cache;
+ this.prepare = o.prepare;
+ this.transform = o.transform;
+ this.transport = o.transport;
+ this.thumbprint = o.thumbprint;
+ this.storage = new PersistentStorage(o.cacheKey);
+ }
+ _.mixin(Prefetch.prototype, {
+ _settings: function settings() {
+ return {
+ url: this.url,
+ type: "GET",
+ dataType: "json"
+ };
+ },
+ store: function store(data) {
+ if (!this.cache) {
+ return;
+ }
+ this.storage.set(keys.data, data, this.ttl);
+ this.storage.set(keys.protocol, location.protocol, this.ttl);
+ this.storage.set(keys.thumbprint, this.thumbprint, this.ttl);
+ },
+ fromCache: function fromCache() {
+ var stored = {}, isExpired;
+ if (!this.cache) {
+ return null;
+ }
+ stored.data = this.storage.get(keys.data);
+ stored.protocol = this.storage.get(keys.protocol);
+ stored.thumbprint = this.storage.get(keys.thumbprint);
+ isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !==
location.protocol;
+ return stored.data && !isExpired ? stored.data : null;
+ },
+ fromNetwork: function(cb) {
+ var that = this, settings;
+ if (!cb) {
+ return;
+ }
+ settings = this.prepare(this._settings());
+ this.transport(settings).fail(onError).done(onResponse);
+ function onError() {
+ cb(true);
+ }
+ function onResponse(resp) {
+ cb(null, that.transform(resp));
+ }
+ },
+ clear: function clear() {
+ this.storage.clear();
+ return this;
+ }
+ });
+ return Prefetch;
+ }();
+ var Remote = function() {
+ "use strict";
+ function Remote(o) {
+ this.url = o.url;
+ this.prepare = o.prepare;
+ this.transform = o.transform;
+ this.transport = new Transport({
+ cache: o.cache,
+ limiter: o.limiter,
+ transport: o.transport
+ });
+ }
+ _.mixin(Remote.prototype, {
+ _settings: function settings() {
+ return {
+ url: this.url,
+ type: "GET",
+ dataType: "json"
+ };
+ },
+ get: function get(query, cb) {
+ var that = this, settings;
+ if (!cb) {
+ return;
+ }
+ query = query || "";
+ settings = this.prepare(query, this._settings());
+ return this.transport.get(settings, onResponse);
+ function onResponse(err, resp) {
+ err ? cb([]) : cb(that.transform(resp));
+ }
+ },
+ cancelLastRequest: function cancelLastRequest() {
+ this.transport.cancel();
+ }
+ });
+ return Remote;
+ }();
+ var oParser = function() {
+ "use strict";
+ return function parse(o) {
+ var defaults, sorter;
+ defaults = {
+ initialize: true,
+ identify: _.stringify,
+ datumTokenizer: null,
+ queryTokenizer: null,
+ sufficient: 5,
+ sorter: null,
+ local: [],
+ prefetch: null,
+ remote: null
+ };
+ o = _.mixin(defaults, o || {});
+ !o.datumTokenizer && $.error("datumTokenizer is
required");
+ !o.queryTokenizer && $.error("queryTokenizer is
required");
+ sorter = o.sorter;
+ o.sorter = sorter ? function(x) {
+ return x.sort(sorter);
+ } : _.identity;
+ o.local = _.isFunction(o.local) ? o.local() : o.local;
+ o.prefetch = parsePrefetch(o.prefetch);
+ o.remote = parseRemote(o.remote);
+ return o;
+ };
+ function parsePrefetch(o) {
+ var defaults;
+ if (!o) {
+ return null;
+ }
+ defaults = {
+ url: null,
+ ttl: 24 * 60 * 60 * 1e3,
+ cache: true,
+ cacheKey: null,
+ thumbprint: "",
+ prepare: _.identity,
+ transform: _.identity,
+ transport: null
+ };
+ o = _.isString(o) ? {
+ url: o
+ } : o;
+ o = _.mixin(defaults, o);
+ !o.url && $.error("prefetch requires url to be set");
+ o.transform = o.filter || o.transform;
+ o.cacheKey = o.cacheKey || o.url;
+ o.thumbprint = VERSION + o.thumbprint;
+ o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
+ return o;
+ }
+ function parseRemote(o) {
+ var defaults;
+ if (!o) {
+ return;
+ }
+ defaults = {
+ url: null,
+ cache: true,
+ prepare: null,
+ replace: null,
+ wildcard: null,
+ limiter: null,
+ rateLimitBy: "debounce",
+ rateLimitWait: 300,
+ transform: _.identity,
+ transport: null
+ };
+ o = _.isString(o) ? {
+ url: o
+ } : o;
+ o = _.mixin(defaults, o);
+ !o.url && $.error("remote requires url to be set");
+ o.transform = o.filter || o.transform;
+ o.prepare = toRemotePrepare(o);
+ o.limiter = toLimiter(o);
+ o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
+ delete o.replace;
+ delete o.wildcard;
+ delete o.rateLimitBy;
+ delete o.rateLimitWait;
+ return o;
+ }
+ function toRemotePrepare(o) {
+ var prepare, replace, wildcard;
+ prepare = o.prepare;
+ replace = o.replace;
+ wildcard = o.wildcard;
+ if (prepare) {
+ return prepare;
+ }
+ if (replace) {
+ prepare = prepareByReplace;
+ } else if (o.wildcard) {
+ prepare = prepareByWildcard;
+ } else {
+ prepare = idenityPrepare;
+ }
+ return prepare;
+ function prepareByReplace(query, settings) {
+ settings.url = replace(settings.url, query);
+ return settings;
+ }
+ function prepareByWildcard(query, settings) {
+ settings.url = settings.url.replace(wildcard,
encodeURIComponent(query));
+ return settings;
+ }
+ function idenityPrepare(query, settings) {
+ return settings;
+ }
+ }
+ function toLimiter(o) {
+ var limiter, method, wait;
+ limiter = o.limiter;
+ method = o.rateLimitBy;
+ wait = o.rateLimitWait;
+ if (!limiter) {
+ limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait);
+ }
+ return limiter;
+ function debounce(wait) {
+ return function debounce(fn) {
+ return _.debounce(fn, wait);
+ };
+ }
+ function throttle(wait) {
+ return function throttle(fn) {
+ return _.throttle(fn, wait);
+ };
+ }
+ }
+ function callbackToDeferred(fn) {
+ return function wrapper(o) {
+ var deferred = $.Deferred();
+ fn(o, onSuccess, onError);
+ return deferred;
+ function onSuccess(resp) {
+ _.defer(function() {
+ deferred.resolve(resp);
+ });
+ }
+ function onError(err) {
+ _.defer(function() {
+ deferred.reject(err);
+ });
+ }
+ };
+ }
+ }();
+ var Bloodhound = function() {
+ "use strict";
+ var old;
+ old = window && window.Bloodhound;
+ function Bloodhound(o) {
+ o = oParser(o);
+ this.sorter = o.sorter;
+ this.identify = o.identify;
+ this.sufficient = o.sufficient;
+ this.local = o.local;
+ this.remote = o.remote ? new Remote(o.remote) : null;
+ this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;
+ this.index = new SearchIndex({
+ identify: this.identify,
+ datumTokenizer: o.datumTokenizer,
+ queryTokenizer: o.queryTokenizer
+ });
+ o.initialize !== false && this.initialize();
+ }
+ Bloodhound.noConflict = function noConflict() {
+ window && (window.Bloodhound = old);
+ return Bloodhound;
+ };
+ Bloodhound.tokenizers = tokenizers;
+ _.mixin(Bloodhound.prototype, {
+ __ttAdapter: function ttAdapter() {
+ var that = this;
+ return this.remote ? withAsync : withoutAsync;
+ function withAsync(query, sync, async) {
+ return that.search(query, sync, async);
+ }
+ function withoutAsync(query, sync) {
+ return that.search(query, sync);
+ }
+ },
+ _loadPrefetch: function loadPrefetch() {
+ var that = this, deferred, serialized;
+ deferred = $.Deferred();
+ if (!this.prefetch) {
+ deferred.resolve();
+ } else if (serialized = this.prefetch.fromCache()) {
+ this.index.bootstrap(serialized);
+ deferred.resolve();
+ } else {
+ this.prefetch.fromNetwork(done);
+ }
+ return deferred.promise();
+ function done(err, data) {
+ if (err) {
+ return deferred.reject();
+ }
+ that.add(data);
+ that.prefetch.store(that.index.serialize());
+ deferred.resolve();
+ }
+ },
+ _initialize: function initialize() {
+ var that = this, deferred;
+ this.clear();
+ (this.initPromise = this._loadPrefetch()).done(addLocalToIndex);
+ return this.initPromise;
+ function addLocalToIndex() {
+ that.add(that.local);
+ }
+ },
+ initialize: function initialize(force) {
+ return !this.initPromise || force ? this._initialize() :
this.initPromise;
+ },
+ add: function add(data) {
+ this.index.add(data);
+ return this;
+ },
+ get: function get(ids) {
+ ids = _.isArray(ids) ? ids : [].slice.call(arguments);
+ return this.index.get(ids);
+ },
+ search: function search(query, sync, async) {
+ var that = this, local;
+ local = this.sorter(this.index.search(query));
+ sync(this.remote ? local.slice() : local);
+ if (this.remote && local.length < this.sufficient) {
+ this.remote.get(query, processRemote);
+ } else if (this.remote) {
+ this.remote.cancelLastRequest();
+ }
+ return this;
+ function processRemote(remote) {
+ var nonDuplicates = [];
+ _.each(remote, function(r) {
+ !_.some(local, function(l) {
+ return that.identify(r) === that.identify(l);
+ }) && nonDuplicates.push(r);
+ });
+ async && async(nonDuplicates);
+ }
+ },
+ all: function all() {
+ return this.index.all();
+ },
+ clear: function clear() {
+ this.index.reset();
+ return this;
+ },
+ clearPrefetchCache: function clearPrefetchCache() {
+ this.prefetch && this.prefetch.clear();
+ return this;
+ },
+ clearRemoteCache: function clearRemoteCache() {
+ Transport.resetCache();
+ return this;
+ },
+ ttAdapter: function ttAdapter() {
+ return this.__ttAdapter();
+ }
+ });
+ return Bloodhound;
+ }();
+ return Bloodhound;
+});
+
+(function(root, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("typeahead.js", [ "jquery" ], function(a0) {
+ return factory(a0);
+ });
+ } else if (typeof exports === "object") {
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(jQuery);
+ }
+})(this, function($) {
+ var _ = function() {
+ "use strict";
+ return {
+ isMsie: function() {
+ return /(msie|trident)/i.test(navigator.userAgent) ?
navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
+ },
+ isBlankString: function(str) {
+ return !str || /^\s*$/.test(str);
+ },
+ escapeRegExChars: function(str) {
+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
"\\$&");
+ },
+ isString: function(obj) {
+ return typeof obj === "string";
+ },
+ isNumber: function(obj) {
+ return typeof obj === "number";
+ },
+ isArray: $.isArray,
+ isFunction: $.isFunction,
+ isObject: $.isPlainObject,
+ isUndefined: function(obj) {
+ return typeof obj === "undefined";
+ },
+ isElement: function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ },
+ isJQuery: function(obj) {
+ return obj instanceof $;
+ },
+ toStr: function toStr(s) {
+ return _.isUndefined(s) || s === null ? "" : s + "";
+ },
+ bind: $.proxy,
+ each: function(collection, cb) {
+ $.each(collection, reverseArgs);
+ function reverseArgs(index, value) {
+ return cb(value, index);
+ }
+ },
+ map: $.map,
+ filter: $.grep,
+ every: function(obj, test) {
+ var result = true;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (!(result = test.call(null, val, key, obj))) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ some: function(obj, test) {
+ var result = false;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (result = test.call(null, val, key, obj)) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ mixin: $.extend,
+ identity: function(x) {
+ return x;
+ },
+ clone: function(obj) {
+ return $.extend(true, {}, obj);
+ },
+ getIdGenerator: function() {
+ var counter = 0;
+ return function() {
+ return counter++;
+ };
+ },
+ templatify: function templatify(obj) {
+ return $.isFunction(obj) ? obj : template;
+ function template() {
+ return String(obj);
+ }
+ },
+ defer: function(fn) {
+ setTimeout(fn, 0);
+ },
+ debounce: function(func, wait, immediate) {
+ var timeout, result;
+ return function() {
+ var context = this, args = arguments, later, callNow;
+ later = function() {
+ timeout = null;
+ if (!immediate) {
+ result = func.apply(context, args);
+ }
+ };
+ callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) {
+ result = func.apply(context, args);
+ }
+ return result;
+ };
+ },
+ throttle: function(func, wait) {
+ var context, args, timeout, result, previous, later;
+ previous = 0;
+ later = function() {
+ previous = new Date();
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date(), remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ },
+ stringify: function(val) {
+ return _.isString(val) ? val : JSON.stringify(val);
+ },
+ noop: function() {}
+ };
+ }();
+ var WWW = function() {
+ "use strict";
+ var defaultClassNames = {
+ wrapper: "twitter-typeahead",
+ input: "tt-input",
+ hint: "tt-hint",
+ menu: "tt-menu",
+ dataset: "tt-dataset",
+ suggestion: "tt-suggestion",
+ selectable: "tt-selectable",
+ empty: "tt-empty",
+ open: "tt-open",
+ cursor: "tt-cursor",
+ highlight: "tt-highlight"
+ };
+ return build;
+ function build(o) {
+ var www, classes;
+ classes = _.mixin({}, defaultClassNames, o);
+ www = {
+ css: buildCss(),
+ classes: classes,
+ html: buildHtml(classes),
+ selectors: buildSelectors(classes)
+ };
+ return {
+ css:
www.css,
+ html:
www.html,
+ classes:
www.classes,
+ selectors:
www.selectors,
+ mixin: function(o) {
+ _.mixin(o, www);
+ }
+ };
+ }
+ function buildHtml(c) {
+ return {
+ wrapper: '<span class="' + c.wrapper +
'"></span>',
+ menu: '<div class="' + c.menu +
'"></div>'
+ };
+ }
+ function buildSelectors(classes) {
+ var selectors = {};
+ _.each(classes, function(v, k) {
+ selectors[k] = "." + v;
+ });
+ return selectors;
+ }
+ function buildCss() {
+ var css = {
+ wrapper: {
+ position: "relative",
+ display: "inline-block"
+ },
+ hint: {
+ position: "absolute",
+ top: "0",
+ left: "0",
+ borderColor: "transparent",
+ boxShadow: "none",
+ opacity: "1"
+ },
+ input: {
+ position: "relative",
+ verticalAlign: "top",
+ backgroundColor: "transparent"
+ },
+ inputWithNoHint: {
+ position: "relative",
+ verticalAlign: "top"
+ },
+ menu: {
+ position: "absolute",
+ top: "100%",
+ left: "0",
+ zIndex: "100",
+ display: "none"
+ },
+ ltr: {
+ left: "0",
+ right: "auto"
+ },
+ rtl: {
+ left: "auto",
+ right: " 0"
+ }
+ };
+ if (_.isMsie()) {
+ _.mixin(css.input, {
+ backgroundImage:
"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
+ });
+ }
+ return css;
+ }
+ }();
+ var EventBus = function() {
+ "use strict";
+ var namespace, deprecationMap;
+ namespace = "typeahead:";
+ deprecationMap = {
+ render: "rendered",
+ cursorchange: "cursorchanged",
+ select: "selected",
+ autocomplete: "autocompleted"
+ };
+ function EventBus(o) {
+ if (!o || !o.el) {
+ $.error("EventBus initialized without el");
+ }
+ this.$el = $(o.el);
+ }
+ _.mixin(EventBus.prototype, {
+ _trigger: function(type, args) {
+ var $e;
+ $e = $.Event(namespace + type);
+ (args = args || []).unshift($e);
+ this.$el.trigger.apply(this.$el, args);
+ return $e;
+ },
+ before: function(type) {
+ var args, $e;
+ args = [].slice.call(arguments, 1);
+ $e = this._trigger("before" + type, args);
+ return $e.isDefaultPrevented();
+ },
+ trigger: function(type) {
+ var deprecatedType;
+ this._trigger(type, [].slice.call(arguments, 1));
+ if (deprecatedType = deprecationMap[type]) {
+ this._trigger(deprecatedType, [].slice.call(arguments, 1));
+ }
+ }
+ });
+ return EventBus;
+ }();
+ var EventEmitter = function() {
+ "use strict";
+ var splitter = /\s+/, nextTick = getNextTick();
+ return {
+ onSync: onSync,
+ onAsync: onAsync,
+ off: off,
+ trigger: trigger
+ };
+ function on(method, types, cb, context) {
+ var type;
+ if (!cb) {
+ return this;
+ }
+ types = types.split(splitter);
+ cb = context ? bindContext(cb, context) : cb;
+ this._callbacks = this._callbacks || {};
+ while (type = types.shift()) {
+ this._callbacks[type] = this._callbacks[type] || {
+ sync: [],
+ async: []
+ };
+ this._callbacks[type][method].push(cb);
+ }
+ return this;
+ }
+ function onAsync(types, cb, context) {
+ return on.call(this, "async", types, cb, context);
+ }
+ function onSync(types, cb, context) {
+ return on.call(this, "sync", types, cb, context);
+ }
+ function off(types) {
+ var type;
+ if (!this._callbacks) {
+ return this;
+ }
+ types = types.split(splitter);
+ while (type = types.shift()) {
+ delete this._callbacks[type];
+ }
+ return this;
+ }
+ function trigger(types) {
+ var type, callbacks, args, syncFlush, asyncFlush;
+ if (!this._callbacks) {
+ return this;
+ }
+ types = types.split(splitter);
+ args = [].slice.call(arguments, 1);
+ while ((type = types.shift()) && (callbacks = this._callbacks[type]))
{
+ syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));
+ asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));
+ syncFlush() && nextTick(asyncFlush);
+ }
+ return this;
+ }
+ function getFlush(callbacks, context, args) {
+ return flush;
+ function flush() {
+ var cancelled;
+ for (var i = 0, len = callbacks.length; !cancelled && i < len;
i += 1) {
+ cancelled = callbacks[i].apply(context, args) === false;
+ }
+ return !cancelled;
+ }
+ }
+ function getNextTick() {
+ var nextTickFn;
+ if (window.setImmediate) {
+ nextTickFn = function nextTickSetImmediate(fn) {
+ setImmediate(function() {
+ fn();
+ });
+ };
+ } else {
+ nextTickFn = function nextTickSetTimeout(fn) {
+ setTimeout(function() {
+ fn();
+ }, 0);
+ };
+ }
+ return nextTickFn;
+ }
+ function bindContext(fn, context) {
+ return fn.bind ? fn.bind(context) : function() {
+ fn.apply(context, [].slice.call(arguments, 0));
+ };
+ }
+ }();
+ var highlight = function(doc) {
+ "use strict";
+ var defaults = {
+ node: null,
+ pattern: null,
+ tagName: "strong",
+ className: null,
+ wordsOnly: false,
+ caseSensitive: false
+ };
+ return function hightlight(o) {
+ var regex;
+ o = _.mixin({}, defaults, o);
+ if (!o.node || !o.pattern) {
+ return;
+ }
+ o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
+ regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
+ traverse(o.node, hightlightTextNode);
+ function hightlightTextNode(textNode) {
+ var match, patternNode, wrapperNode;
+ if (match = regex.exec(textNode.data)) {
+ wrapperNode = doc.createElement(o.tagName);
+ o.className && (wrapperNode.className = o.className);
+ patternNode = textNode.splitText(match.index);
+ patternNode.splitText(match[0].length);
+ wrapperNode.appendChild(patternNode.cloneNode(true));
+ textNode.parentNode.replaceChild(wrapperNode, patternNode);
+ }
+ return !!match;
+ }
+ function traverse(el, hightlightTextNode) {
+ var childNode, TEXT_NODE_TYPE = 3;
+ for (var i = 0; i < el.childNodes.length; i++) {
+ childNode = el.childNodes[i];
+ if (childNode.nodeType === TEXT_NODE_TYPE) {
+ i += hightlightTextNode(childNode) ? 1 : 0;
+ } else {
+ traverse(childNode, hightlightTextNode);
+ }
+ }
+ }
+ };
+ function getRegex(patterns, caseSensitive, wordsOnly) {
+ var escapedPatterns = [], regexStr;
+ for (var i = 0, len = patterns.length; i < len; i++) {
+ escapedPatterns.push(_.escapeRegExChars(patterns[i]));
+ }
+ regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|")
+ ")\\b" : "(" + escapedPatterns.join("|") + ")";
+ return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr,
"i");
+ }
+ }(window.document);
+ var Input = function() {
+ "use strict";
+ var specialKeyCodeMap;
+ specialKeyCodeMap = {
+ 9: "tab",
+ 27: "esc",
+ 37: "left",
+ 39: "right",
+ 13: "enter",
+ 38: "up",
+ 40: "down"
+ };
+ function Input(o, www) {
+ o = o || {};
+ if (!o.input) {
+ $.error("input is missing");
+ }
+
www.mixin(this);
+ this.$hint = $(o.hint);
+ this.$input = $(o.input);
+ this.query = this.$input.val();
+ this.queryWhenFocused = this.hasFocus() ? this.query : null;
+ this.$overflowHelper = buildOverflowHelper(this.$input);
+ this._checkLanguageDirection();
+ if (this.$hint.length === 0) {
+ this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid =
_.noop;
+ }
+ }
+ Input.normalizeQuery = function(str) {
+ return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, "
");
+ };
+ _.mixin(Input.prototype, EventEmitter, {
+ _onBlur: function onBlur() {
+ this.resetInputValue();
+ this.trigger("blurred");
+ },
+ _onFocus: function onFocus() {
+ this.queryWhenFocused = this.query;
+ this.trigger("focused");
+ },
+ _onKeydown: function onKeydown($e) {
+ var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
+ this._managePreventDefault(keyName, $e);
+ if (keyName && this._shouldTrigger(keyName, $e)) {
+ this.trigger(keyName + "Keyed", $e);
+ }
+ },
+ _onInput: function onInput() {
+ this._setQuery(this.getInputValue());
+ this.clearHintIfInvalid();
+ this._checkLanguageDirection();
+ },
+ _managePreventDefault: function managePreventDefault(keyName, $e) {
+ var preventDefault;
+ switch (keyName) {
+ case "up":
+ case "down":
+ preventDefault = !withModifier($e);
+ break;
+
+ default:
+ preventDefault = false;
+ }
+ preventDefault && $e.preventDefault();
+ },
+ _shouldTrigger: function shouldTrigger(keyName, $e) {
+ var trigger;
+ switch (keyName) {
+ case "tab":
+ trigger = !withModifier($e);
+ break;
+
+ default:
+ trigger = true;
+ }
+ return trigger;
+ },
+ _checkLanguageDirection: function checkLanguageDirection() {
+ var dir = (this.$input.css("direction") ||
"ltr").toLowerCase();
+ if (this.dir !== dir) {
+ this.dir = dir;
+ this.$hint.attr("dir", dir);
+ this.trigger("langDirChanged", dir);
+ }
+ },
+ _setQuery: function setQuery(val, silent) {
+ var areEquivalent, hasDifferentWhitespace;
+ areEquivalent = areQueriesEquivalent(val, this.query);
+ hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length
: false;
+ this.query = val;
+ if (!silent && !areEquivalent) {
+ this.trigger("queryChanged", this.query);
+ } else if (!silent && hasDifferentWhitespace) {
+ this.trigger("whitespaceChanged", this.query);
+ }
+ },
+ bind: function() {
+ var that = this, onBlur, onFocus, onKeydown, onInput;
+ onBlur = _.bind(this._onBlur, this);
+ onFocus = _.bind(this._onFocus, this);
+ onKeydown = _.bind(this._onKeydown, this);
+ onInput = _.bind(this._onInput, this);
+ this.$input.on("blur.tt", onBlur).on("focus.tt",
onFocus).on("keydown.tt", onKeydown);
+ if (!_.isMsie() || _.isMsie() > 9) {
+ this.$input.on("input.tt", onInput);
+ } else {
+ this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",
function($e) {
+ if (specialKeyCodeMap[$e.which || $e.keyCode]) {
+ return;
+ }
+ _.defer(_.bind(that._onInput, that, $e));
+ });
+ }
+ return this;
+ },
+ focus: function focus() {
+ this.$input.focus();
+ },
+ blur: function blur() {
+ this.$input.blur();
+ },
+ getLangDir: function getLangDir() {
+ return this.dir;
+ },
+ getQuery: function getQuery() {
+ return this.query || "";
+ },
+ setQuery: function setQuery(val, silent) {
+ this.setInputValue(val);
+ this._setQuery(val, silent);
+ },
+ hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {
+ return this.query !== this.queryWhenFocused;
+ },
+ getInputValue: function getInputValue() {
+ return this.$input.val();
+ },
+ setInputValue: function setInputValue(value) {
+ this.$input.val(value);
+ this.clearHintIfInvalid();
+ this._checkLanguageDirection();
+ },
+ resetInputValue: function resetInputValue() {
+ this.setInputValue(this.query);
+ },
+ getHint: function getHint() {
+ return this.$hint.val();
+ },
+ setHint: function setHint(value) {
+ this.$hint.val(value);
+ },
+ clearHint: function clearHint() {
+ this.setHint("");
+ },
+ clearHintIfInvalid: function clearHintIfInvalid() {
+ var val, hint, valIsPrefixOfHint, isValid;
+ val = this.getInputValue();
+ hint = this.getHint();
+ valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
+ isValid = val !== "" && valIsPrefixOfHint &&
!this.hasOverflow();
+ !isValid && this.clearHint();
+ },
+ hasFocus: function hasFocus() {
+ return this.$input.is(":focus");
+ },
+ hasOverflow: function hasOverflow() {
+ var constraint = this.$input.width() - 2;
+ this.$overflowHelper.text(this.getInputValue());
+ return this.$overflowHelper.width() >= constraint;
+ },
+ isCursorAtEnd: function() {
+ var valueLength, selectionStart, range;
+ valueLength = this.$input.val().length;
+ selectionStart = this.$input[0].selectionStart;
+ if (_.isNumber(selectionStart)) {
+ return selectionStart === valueLength;
+ } else if (document.selection) {
+ range = document.selection.createRange();
+ range.moveStart("character", -valueLength);
+ return valueLength === range.text.length;
+ }
+ return true;
+ },
+ destroy: function destroy() {
+ this.$hint.off(".tt");
+ this.$input.off(".tt");
+ this.$overflowHelper.remove();
+ this.$hint = this.$input = this.$overflowHelper =
$("<div>");
+ }
+ });
+ return Input;
+ function buildOverflowHelper($input) {
+ return $('<pre
aria-hidden="true"></pre>').css({
+ position: "absolute",
+ visibility: "hidden",
+ whiteSpace: "pre",
+ fontFamily: $input.css("font-family"),
+ fontSize: $input.css("font-size"),
+ fontStyle: $input.css("font-style"),
+ fontVariant: $input.css("font-variant"),
+ fontWeight: $input.css("font-weight"),
+ wordSpacing: $input.css("word-spacing"),
+ letterSpacing: $input.css("letter-spacing"),
+ textIndent: $input.css("text-indent"),
+ textRendering: $input.css("text-rendering"),
+ textTransform: $input.css("text-transform")
+ }).insertAfter($input);
+ }
+ function areQueriesEquivalent(a, b) {
+ return Input.normalizeQuery(a) === Input.normalizeQuery(b);
+ }
+ function withModifier($e) {
+ return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
+ }
+ }();
+ var Dataset = function() {
+ "use strict";
+ var keys, nameGenerator;
+ keys = {
+ val: "tt-selectable-display",
+ obj: "tt-selectable-object"
+ };
+ nameGenerator = _.getIdGenerator();
+ function Dataset(o, www) {
+ o = o || {};
+ o.templates = o.templates || {};
+ o.templates.notFound = o.templates.notFound || o.templates.empty;
+ if (!o.source) {
+ $.error("missing source");
+ }
+ if (!o.node) {
+ $.error("missing node");
+ }
+ if (o.name && !isValidName(o.name)) {
+ $.error("invalid dataset name: " + o.name);
+ }
+
www.mixin(this);
+ this.highlight = !!o.highlight;
+ this.name = o.name || nameGenerator();
+ this.limit = o.limit || 5;
+ this.displayFn = getDisplayFn(o.display || o.displayKey);
+ this.templates = getTemplates(o.templates, this.displayFn);
+ this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;
+ this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;
+ this._resetLastSuggestion();
+ this.$el =
$(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" +
this.name);
+ }
+ Dataset.extractData = function extractData(el) {
+ var $el = $(el);
+ if ($el.data(keys.obj)) {
+ return {
+ val: $el.data(keys.val) || "",
+ obj: $el.data(keys.obj) || null
+ };
+ }
+ return null;
+ };
+ _.mixin(Dataset.prototype, EventEmitter, {
+ _overwrite: function overwrite(query, suggestions) {
+ suggestions = suggestions || [];
+ if (suggestions.length) {
+ this._renderSuggestions(query, suggestions);
+ } else if (this.async && this.templates.pending) {
+ this._renderPending(query);
+ } else if (!this.async && this.templates.notFound) {
+ this._renderNotFound(query);
+ } else {
+ this._empty();
+ }
+ this.trigger("rendered", this.name, suggestions, false);
+ },
+ _append: function append(query, suggestions) {
+ suggestions = suggestions || [];
+ if (suggestions.length && this.$lastSuggestion.length) {
+ this._appendSuggestions(query, suggestions);
+ } else if (suggestions.length) {
+ this._renderSuggestions(query, suggestions);
+ } else if (!this.$lastSuggestion.length &&
this.templates.notFound) {
+ this._renderNotFound(query);
+ }
+ this.trigger("rendered", this.name, suggestions, true);
+ },
+ _renderSuggestions: function renderSuggestions(query, suggestions) {
+ var $fragment;
+ $fragment = this._getSuggestionsFragment(query, suggestions);
+ this.$lastSuggestion = $fragment.children().last();
+ this.$el.html($fragment).prepend(this._getHeader(query,
suggestions)).append(this._getFooter(query, suggestions));
+ },
+ _appendSuggestions: function appendSuggestions(query, suggestions) {
+ var $fragment, $lastSuggestion;
+ $fragment = this._getSuggestionsFragment(query, suggestions);
+ $lastSuggestion = $fragment.children().last();
+ this.$lastSuggestion.after($fragment);
+ this.$lastSuggestion = $lastSuggestion;
+ },
+ _renderPending: function renderPending(query) {
+ var template = this.templates.pending;
+ this._resetLastSuggestion();
+ template && this.$el.html(template({
+ query: query,
+ dataset: this.name
+ }));
+ },
+ _renderNotFound: function renderNotFound(query) {
+ var template = this.templates.notFound;
+ this._resetLastSuggestion();
+ template && this.$el.html(template({
+ query: query,
+ dataset: this.name
+ }));
+ },
+ _empty: function empty() {
+ this.$el.empty();
+ this._resetLastSuggestion();
+ },
+ _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions)
{
+ var that = this, fragment;
+ fragment = document.createDocumentFragment();
+ _.each(suggestions, function getSuggestionNode(suggestion) {
+ var $el, context;
+ context = that._injectQuery(query, suggestion);
+ $el = $(that.templates.suggestion(context)).data(keys.obj,
suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion +
" " + that.classes.selectable);
+ fragment.appendChild($el[0]);
+ });
+ this.highlight && highlight({
+ className: this.classes.highlight,
+ node: fragment,
+ pattern: query
+ });
+ return $(fragment);
+ },
+ _getFooter: function getFooter(query, suggestions) {
+ return this.templates.footer ? this.templates.footer({
+ query: query,
+ suggestions: suggestions,
+ dataset: this.name
+ }) : null;
+ },
+ _getHeader: function getHeader(query, suggestions) {
+ return this.templates.header ? this.templates.header({
+ query: query,
+ suggestions: suggestions,
+ dataset: this.name
+ }) : null;
+ },
+ _resetLastSuggestion: function resetLastSuggestion() {
+ this.$lastSuggestion = $();
+ },
+ _injectQuery: function injectQuery(query, obj) {
+ return _.isObject(obj) ? _.mixin({
+ _query: query
+ }, obj) : obj;
+ },
+ update: function update(query) {
+ var that = this, canceled = false, syncCalled = false, rendered = 0;
+ this.cancel();
+ this.cancel = function cancel() {
+ canceled = true;
+ that.cancel = $.noop;
+ that.async && that.trigger("asyncCanceled",
query);
+ };
+ this.source(query, sync, async);
+ !syncCalled && sync([]);
+ function sync(suggestions) {
+ if (syncCalled) {
+ return;
+ }
+ syncCalled = true;
+ suggestions = (suggestions || []).slice(0, that.limit);
+ rendered = suggestions.length;
+ that._overwrite(query, suggestions);
+ if (rendered < that.limit && that.async) {
+ that.trigger("asyncRequested", query);
+ }
+ }
+ function async(suggestions) {
+ suggestions = suggestions || [];
+ if (!canceled && rendered < that.limit) {
+ that.cancel = $.noop;
+ rendered += suggestions.length;
+ that._append(query, suggestions.slice(0, that.limit -
rendered));
+ that.async && that.trigger("asyncReceived",
query);
+ }
+ }
+ },
+ cancel: $.noop,
+ clear: function clear() {
+ this._empty();
+ this.cancel();
+ this.trigger("cleared");
+ },
+ isEmpty: function isEmpty() {
+ return this.$el.is(":empty");
+ },
+ destroy: function destroy() {
+ this.$el = $("<div>");
+ }
+ });
+ return Dataset;
+ function getDisplayFn(display) {
+ display = display || _.stringify;
+ return _.isFunction(display) ? display : displayFn;
+ function displayFn(obj) {
+ return obj[display];
+ }
+ }
+ function getTemplates(templates, displayFn) {
+ return {
+ notFound: templates.notFound &&
_.templatify(templates.notFound),
+ pending: templates.pending && _.templatify(templates.pending),
+ header: templates.header && _.templatify(templates.header),
+ footer: templates.footer && _.templatify(templates.footer),
+ suggestion: templates.suggestion || suggestionTemplate
+ };
+ function suggestionTemplate(context) {
+ return $("<div>").text(displayFn(context));
+ }
+ }
+ function isValidName(str) {
+ return /^[_a-zA-Z0-9-]+$/.test(str);
+ }
+ }();
+ var Menu = function() {
+ "use strict";
+ function Menu(o, www) {
+ var that = this;
+ o = o || {};
+ if (!o.node) {
+ $.error("node is required");
+ }
+
www.mixin(this);
+ this.$node = $(o.node);
+ this.query = null;
+ this.datasets = _.map(o.datasets, initializeDataset);
+ function initializeDataset(oDataset) {
+ var node = that.$node.find(oDataset.node).first();
+ oDataset.node = node.length ? node :
$("<div>").appendTo(that.$node);
+ return new Dataset(oDataset, www);
+ }
+ }
+ _.mixin(Menu.prototype, EventEmitter, {
+ _onSelectableClick: function onSelectableClick($e) {
+ this.trigger("selectableClicked", $($e.currentTarget));
+ },
+ _onRendered: function onRendered(type, dataset, suggestions, async) {
+ this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+ this.trigger("datasetRendered", dataset, suggestions, async);
+ },
+ _onCleared: function onCleared() {
+ this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+ this.trigger("datasetCleared");
+ },
+ _propagate: function propagate() {
+ this.trigger.apply(this, arguments);
+ },
+ _allDatasetsEmpty: function allDatasetsEmpty() {
+ return _.every(this.datasets, isDatasetEmpty);
+ function isDatasetEmpty(dataset) {
+ return dataset.isEmpty();
+ }
+ },
+ _getSelectables: function getSelectables() {
+ return this.$node.find(this.selectors.selectable);
+ },
+ _removeCursor: function _removeCursor() {
+ var $selectable = this.getActiveSelectable();
+ $selectable && $selectable.removeClass(this.classes.cursor);
+ },
+ _ensureVisible: function ensureVisible($el) {
+ var elTop, elBottom, nodeScrollTop, nodeHeight;
+ elTop = $el.position().top;
+ elBottom = elTop + $el.outerHeight(true);
+ nodeScrollTop = this.$node.scrollTop();
+ nodeHeight = this.$node.height() +
parseInt(this.$node.css("paddingTop"), 10) +
parseInt(this.$node.css("paddingBottom"), 10);
+ if (elTop < 0) {
+ this.$node.scrollTop(nodeScrollTop + elTop);
+ } else if (nodeHeight < elBottom) {
+ this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));
+ }
+ },
+ bind: function() {
+ var that = this, onSelectableClick;
+ onSelectableClick = _.bind(this._onSelectableClick, this);
+ this.$node.on("click.tt", this.selectors.selectable,
onSelectableClick);
+ _.each(this.datasets, function(dataset) {
+ dataset.onSync("asyncRequested", that._propagate,
that).onSync("asyncCanceled", that._propagate,
that).onSync("asyncReceived", that._propagate,
that).onSync("rendered", that._onRendered, that).onSync("cleared",
that._onCleared, that);
+ });
+ return this;
+ },
+ isOpen: function isOpen() {
+ return this.$node.hasClass(this.classes.open);
+ },
+ open: function open() {
+ this.$node.addClass(this.classes.open);
+ },
+ close: function close() {
+ this.$node.removeClass(this.classes.open);
+ this._removeCursor();
+ },
+ setLanguageDirection: function setLanguageDirection(dir) {
+ this.$node.attr("dir", dir);
+ },
+ selectableRelativeToCursor: function selectableRelativeToCursor(delta) {
+ var $selectables, $oldCursor, oldIndex, newIndex;
+ $oldCursor = this.getActiveSelectable();
+ $selectables = this._getSelectables();
+ oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;
+ newIndex = oldIndex + delta;
+ newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;
+ newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;
+ return newIndex === -1 ? null : $selectables.eq(newIndex);
+ },
+ setCursor: function setCursor($selectable) {
+ this._removeCursor();
+ if ($selectable = $selectable && $selectable.first()) {
+ $selectable.addClass(this.classes.cursor);
+ this._ensureVisible($selectable);
+ }
+ },
+ getSelectableData: function getSelectableData($el) {
+ return $el && $el.length ? Dataset.extractData($el) : null;
+ },
+ getActiveSelectable: function getActiveSelectable() {
+ var $selectable =
this._getSelectables().filter(this.selectors.cursor).first();
+ return $selectable.length ? $selectable : null;
+ },
+ getTopSelectable: function getTopSelectable() {
+ var $selectable = this._getSelectables().first();
+ return $selectable.length ? $selectable : null;
+ },
+ update: function update(query) {
+ var isValidUpdate = query !== this.query;
+ if (isValidUpdate) {
+ this.query = query;
+ _.each(this.datasets, updateDataset);
+ }
+ return isValidUpdate;
+ function updateDataset(dataset) {
+ dataset.update(query);
+ }
+ },
+ empty: function empty() {
+ _.each(this.datasets, clearDataset);
+ this.query = null;
+ this.$node.addClass(this.classes.empty);
+ function clearDataset(dataset) {
+ dataset.clear();
+ }
+ },
+ destroy: function destroy() {
+ this.$node.off(".tt");
+ this.$node = $("<div>");
+ _.each(this.datasets, destroyDataset);
+ function destroyDataset(dataset) {
+ dataset.destroy();
+ }
+ }
+ });
+ return Menu;
+ }();
+ var DefaultMenu = function() {
+ "use strict";
+ var s = Menu.prototype;
+ function DefaultMenu() {
+ Menu.apply(this, [].slice.call(arguments, 0));
+ }
+ _.mixin(DefaultMenu.prototype, Menu.prototype, {
+ open: function open() {
+ !this._allDatasetsEmpty() && this._show();
+ return s.open.apply(this, [].slice.call(arguments, 0));
+ },
+ close: function close() {
+ this._hide();
+ return s.close.apply(this, [].slice.call(arguments, 0));
+ },
+ _onRendered: function onRendered() {
+ if (this._allDatasetsEmpty()) {
+ this._hide();
+ } else {
+ this.isOpen() && this._show();
+ }
+ return s._onRendered.apply(this, [].slice.call(arguments, 0));
+ },
+ _onCleared: function onCleared() {
+ if (this._allDatasetsEmpty()) {
+ this._hide();
+ } else {
+ this.isOpen() && this._show();
+ }
+ return s._onCleared.apply(this, [].slice.call(arguments, 0));
+ },
+ setLanguageDirection: function setLanguageDirection(dir) {
+ this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl);
+ return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));
+ },
+ _hide: function hide() {
+ this.$node.hide();
+ },
+ _show: function show() {
+ this.$node.css("display", "block");
+ }
+ });
+ return DefaultMenu;
+ }();
+ var Typeahead = function() {
+ "use strict";
+ function Typeahead(o, www) {
+ var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed,
onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;
+ o = o || {};
+ if (!o.input) {
+ $.error("missing input");
+ }
+ if (!o.menu) {
+ $.error("missing menu");
+ }
+ if (!o.eventBus) {
+ $.error("missing event bus");
+ }
+
www.mixin(this);
+ this.eventBus = o.eventBus;
+ this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
+ this.input = o.input;
+ this.menu = o.menu;
+ this.enabled = true;
+ this.active = false;
+ this.input.hasFocus() && this.activate();
+ this.dir = this.input.getLangDir();
+ this._hacks();
+ this.menu.bind().onSync("selectableClicked",
this._onSelectableClicked, this).onSync("asyncRequested",
this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled,
this).onSync("asyncReceived", this._onAsyncReceived,
this).onSync("datasetRendered", this._onDatasetRendered,
this).onSync("datasetCleared", this._onDatasetCleared, this);
+ onFocused = c(this, "activate", "open",
"_onFocused");
+ onBlurred = c(this, "deactivate", "_onBlurred");
+ onEnterKeyed = c(this, "isActive", "isOpen",
"_onEnterKeyed");
+ onTabKeyed = c(this, "isActive", "isOpen",
"_onTabKeyed");
+ onEscKeyed = c(this, "isActive", "_onEscKeyed");
+ onUpKeyed = c(this, "isActive", "open",
"_onUpKeyed");
+ onDownKeyed = c(this, "isActive", "open",
"_onDownKeyed");
+ onLeftKeyed = c(this, "isActive", "isOpen",
"_onLeftKeyed");
+ onRightKeyed = c(this, "isActive", "isOpen",
"_onRightKeyed");
+ onQueryChanged = c(this, "_openIfActive",
"_onQueryChanged");
+ onWhitespaceChanged = c(this, "_openIfActive",
"_onWhitespaceChanged");
+ this.input.bind().onSync("focused", onFocused,
this).onSync("blurred", onBlurred, this).onSync("enterKeyed",
onEnterKeyed, this).onSync("tabKeyed", onTabKeyed,
this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed",
onUpKeyed, this).onSync("downKeyed", onDownKeyed,
this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed",
onRightKeyed, this).onSync("queryChanged", onQueryChanged,
this).onSync("whitespaceChanged", onWhitespaceChanged,
this).onSync("langDirChanged", this._onLangDirChanged, this);
+ }
+ _.mixin(Typeahead.prototype, {
+ _hacks: function hacks() {
+ var $input, $menu;
+ $input = this.input.$input || $("<div>");
+ $menu = this.menu.$node || $("<div>");
+ $input.on("blur.tt", function($e) {
+ var active, isActive, hasActive;
+ active = document.activeElement;
+ isActive = $menu.is(active);
+ hasActive = $menu.has(active).length > 0;
+ if (_.isMsie() && (isActive || hasActive)) {
+ $e.preventDefault();
+ $e.stopImmediatePropagation();
+ _.defer(function() {
+ $input.focus();
+ });
+ }
+ });
+ $menu.on("mousedown.tt", function($e) {
+ $e.preventDefault();
+ });
+ },
+ _onSelectableClicked: function onSelectableClicked(type, $el) {
+ this.select($el);
+ },
+ _onDatasetCleared: function onDatasetCleared() {
+ this._updateHint();
+ },
+ _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions,
async) {
+ this._updateHint();
+ this.eventBus.trigger("render", suggestions, async, dataset);
+ },
+ _onAsyncRequested: function onAsyncRequested(type, dataset, query) {
+ this.eventBus.trigger("asyncrequest", query, dataset);
+ },
+ _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {
+ this.eventBus.trigger("asynccancel", query, dataset);
+ },
+ _onAsyncReceived: function onAsyncReceived(type, dataset, query) {
+ this.eventBus.trigger("asyncreceive", query, dataset);
+ },
+ _onFocused: function onFocused() {
+ this._minLengthMet() && this.menu.update(this.input.getQuery());
+ },
+ _onBlurred: function onBlurred() {
+ if (this.input.hasQueryChangedSinceLastFocus()) {
+ this.eventBus.trigger("change", this.input.getQuery());
+ }
+ },
+ _onEnterKeyed: function onEnterKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ this.select($selectable) && $e.preventDefault();
+ }
+ },
+ _onTabKeyed: function onTabKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ this.select($selectable) && $e.preventDefault();
+ } else if ($selectable = this.menu.getTopSelectable()) {
+ this.autocomplete($selectable) && $e.preventDefault();
+ }
+ },
+ _onEscKeyed: function onEscKeyed() {
+ this.close();
+ },
+ _onUpKeyed: function onUpKeyed() {
+ this.moveCursor(-1);
+ },
+ _onDownKeyed: function onDownKeyed() {
+ this.moveCursor(+1);
+ },
+ _onLeftKeyed: function onLeftKeyed() {
+ if (this.dir === "rtl" && this.input.isCursorAtEnd())
{
+ this.autocomplete(this.menu.getTopSelectable());
+ }
+ },
+ _onRightKeyed: function onRightKeyed() {
+ if (this.dir === "ltr" && this.input.isCursorAtEnd())
{
+ this.autocomplete(this.menu.getTopSelectable());
+ }
+ },
+ _onQueryChanged: function onQueryChanged(e, query) {
+ this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();
+ },
+ _onWhitespaceChanged: function onWhitespaceChanged() {
+ this._updateHint();
+ },
+ _onLangDirChanged: function onLangDirChanged(e, dir) {
+ if (this.dir !== dir) {
+ this.dir = dir;
+ this.menu.setLanguageDirection(dir);
+ }
+ },
+ _openIfActive: function openIfActive() {
+ this.isActive() && this.open();
+ },
+ _minLengthMet: function minLengthMet(query) {
+ query = _.isString(query) ? query : this.input.getQuery() ||
"";
+ return query.length >= this.minLength;
+ },
+ _updateHint: function updateHint() {
+ var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;
+ $selectable = this.menu.getTopSelectable();
+ data = this.menu.getSelectableData($selectable);
+ val = this.input.getInputValue();
+ if (data && !_.isBlankString(val) &&
!this.input.hasOverflow()) {
+ query = Input.normalizeQuery(val);
+ escapedQuery = _.escapeRegExChars(query);
+ frontMatchRegEx = new RegExp("^(?:" + escapedQuery +
")(.+$)", "i");
+ match = frontMatchRegEx.exec(data.val);
+ match && this.input.setHint(val + match[1]);
+ } else {
+ this.input.clearHint();
+ }
+ },
+ isEnabled: function isEnabled() {
+ return this.enabled;
+ },
+ enable: function enable() {
+ this.enabled = true;
+ },
+ disable: function disable() {
+ this.enabled = false;
+ },
+ isActive: function isActive() {
+ return this.active;
+ },
+ activate: function activate() {
+ if (this.isActive()) {
+ return true;
+ } else if (!this.isEnabled() || this.eventBus.before("active"))
{
+ return false;
+ } else {
+ this.active = true;
+ this.eventBus.trigger("active");
+ return true;
+ }
+ },
+ deactivate: function deactivate() {
+ if (!this.isActive()) {
+ return true;
+ } else if (this.eventBus.before("idle")) {
+ return false;
+ } else {
+ this.active = false;
+ this.close();
+ this.eventBus.trigger("idle");
+ return true;
+ }
+ },
+ isOpen: function isOpen() {
+ return this.menu.isOpen();
+ },
+ open: function open() {
+ if (!this.isOpen() && !this.eventBus.before("open")) {
+ this.menu.open();
+ this._updateHint();
+ this.eventBus.trigger("open");
+ }
+ return this.isOpen();
+ },
+ close: function close() {
+ if (this.isOpen() && !this.eventBus.before("close")) {
+ this.menu.close();
+ this.input.clearHint();
+ this.input.resetInputValue();
+ this.eventBus.trigger("close");
+ }
+ return !this.isOpen();
+ },
+ setVal: function setVal(val) {
+ this.input.setQuery(_.toStr(val));
+ },
+ getVal: function getVal() {
+ return this.input.getQuery();
+ },
+ select: function select($selectable) {
+ var data = this.menu.getSelectableData($selectable);
+ if (data && !this.eventBus.before("select", data.obj))
{
+ this.input.setQuery(data.val, true);
+ this.eventBus.trigger("select", data.obj);
+ this.close();
+ return true;
+ }
+ return false;
+ },
+ autocomplete: function autocomplete($selectable) {
+ var query, data, isValid;
+ query = this.input.getQuery();
+ data = this.menu.getSelectableData($selectable);
+ isValid = data && query !== data.val;
+ if (isValid && !this.eventBus.before("autocomplete",
data.obj)) {
+ this.input.setQuery(data.val);
+ this.eventBus.trigger("autocomplete", data.obj);
+ return true;
+ }
+ return false;
+ },
+ moveCursor: function moveCursor(delta) {
+ var query, $candidate, data, payload, cancelMove;
+ query = this.input.getQuery();
+ $candidate = this.menu.selectableRelativeToCursor(delta);
+ data = this.menu.getSelectableData($candidate);
+ payload = data ? data.obj : null;
+ cancelMove = this._minLengthMet() && this.menu.update(query);
+ if (!cancelMove &&
!this.eventBus.before("cursorchange", payload)) {
+ this.menu.setCursor($candidate);
+ if (data) {
+ this.input.setInputValue(data.val);
+ } else {
+ this.input.resetInputValue();
+ this._updateHint();
+ }
+ this.eventBus.trigger("cursorchange", payload);
+ return true;
+ }
+ return false;
+ },
+ destroy: function destroy() {
+ this.input.destroy();
+ this.menu.destroy();
+ }
+ });
+ return Typeahead;
+ function c(ctx) {
+ var methods = [].slice.call(arguments, 1);
+ return function() {
+ var args = [].slice.call(arguments);
+ _.each(methods, function(method) {
+ return ctx[method].apply(ctx, args);
+ });
+ };
+ }
+ }();
+ (function() {
+ "use strict";
+ var old, keys, methods;
+ old = $.fn.typeahead;
+ keys = {
+ www: "tt-www",
+ attrs: "tt-attrs",
+ typeahead: "tt-typeahead"
+ };
+ methods = {
+ initialize: function initialize(o, datasets) {
+ var www;
+ datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
+ o = o || {};
+ www = WWW(o.classNames);
+ return this.each(attach);
+ function attach() {
+ var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu,
eventBus, input, menu, typeahead, MenuConstructor;
+ _.each(datasets, function(d) {
+ d.highlight = !!o.highlight;
+ });
+ $input = $(this);
+ $wrapper = $(www.html.wrapper);
+ $hint = $elOrNull(o.hint);
+ $menu = $elOrNull(o.menu);
+ defaultHint = o.hint !== false && !$hint;
+ defaultMenu = o.menu !== false && !$menu;
+ defaultHint && ($hint = buildHintFromInput($input, www));
+ defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));
+ $hint && $hint.val("");
+ $input = prepInput($input, www);
+ if (defaultHint || defaultMenu) {
+ $wrapper.css(www.css.wrapper);
+ $input.css(defaultHint ?
www.css.input :
www.css.inputWithNoHint);
+ $input.wrap($wrapper).parent().prepend(defaultHint ? $hint :
null).append(defaultMenu ? $menu : null);
+ }
+ MenuConstructor = defaultMenu ? DefaultMenu : Menu;
+ eventBus = new EventBus({
+ el: $input
+ });
+ input = new Input({
+ hint: $hint,
+ input: $input
+ }, www);
+ menu = new MenuConstructor({
+ node: $menu,
+ datasets: datasets
+ }, www);
+ typeahead = new Typeahead({
+ input: input,
+ menu: menu,
+ eventBus: eventBus,
+ minLength: o.minLength
+ }, www);
+ $input.data(keys.www, www);
+ $input.data(keys.typeahead, typeahead);
+ }
+ },
+ isEnabled: function isEnabled() {
+ var enabled;
+ ttEach(this.first(), function(t) {
+ enabled = t.isEnabled();
+ });
+ return enabled;
+ },
+ enable: function enable() {
+ ttEach(this, function(t) {
+ t.enable();
+ });
+ return this;
+ },
+ disable: function disable() {
+ ttEach(this, function(t) {
+ t.disable();
+ });
+ return this;
+ },
+ isActive: function isActive() {
+ var active;
+ ttEach(this.first(), function(t) {
+ active = t.isActive();
+ });
+ return active;
+ },
+ activate: function activate() {
+ ttEach(this, function(t) {
+ t.activate();
+ });
+ return this;
+ },
+ deactivate: function deactivate() {
+ ttEach(this, function(t) {
+ t.deactivate();
+ });
+ return this;
+ },
+ isOpen: function isOpen() {
+ var open;
+ ttEach(this.first(), function(t) {
+ open = t.isOpen();
+ });
+ return open;
+ },
+ open: function open() {
+ ttEach(this, function(t) {
+ t.open();
+ });
+ return this;
+ },
+ close: function close() {
+ ttEach(this, function(t) {
+ t.close();
+ });
+ return this;
+ },
+ select: function select(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.select($el);
+ });
+ return success;
+ },
+ autocomplete: function autocomplete(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.autocomplete($el);
+ });
+ return success;
+ },
+ moveCursor: function moveCursoe(delta) {
+ var success = false;
+ ttEach(this.first(), function(t) {
+ success = t.moveCursor(delta);
+ });
+ return success;
+ },
+ val: function val(newVal) {
+ var query;
+ if (!arguments.length) {
+ ttEach(this.first(), function(t) {
+ query = t.getVal();
+ });
+ return query;
+ } else {
+ ttEach(this, function(t) {
+ t.setVal(newVal);
+ });
+ return this;
+ }
+ },
+ destroy: function destroy() {
+ ttEach(this, function(typeahead, $input) {
+ revert($input);
+ typeahead.destroy();
+ });
+ return this;
+ }
+ };
+ $.fn.typeahead = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, [].slice.call(arguments, 1));
+ } else {
+ return methods.initialize.apply(this, arguments);
+ }
+ };
+ $.fn.typeahead.noConflict = function noConflict() {
+ $.fn.typeahead = old;
+ return this;
+ };
+ function ttEach($els, fn) {
+ $els.each(function() {
+ var $input = $(this), typeahead;
+ (typeahead = $input.data(keys.typeahead)) && fn(typeahead,
$input);
+ });
+ }
+ function buildHintFromInput($input, www) {
+ return
$input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly",
true).removeAttr("id name placeholder required").attr({
+ autocomplete: "off",
+ spellcheck: "false",
+ tabindex: -1
+ });
+ }
+ function prepInput($input, www) {
+ $input.data(keys.attrs, {
+ dir: $input.attr("dir"),
+ autocomplete: $input.attr("autocomplete"),
+ spellcheck: $input.attr("spellcheck"),
+ style: $input.attr("style")
+ });
+ $input.addClass(www.classes.input).attr({
+ autocomplete: "off",
+ spellcheck: false
+ });
+ try {
+ !$input.attr("dir") && $input.attr("dir",
"auto");
+ } catch (e) {}
+ return $input;
+ }
+ function getBackgroundStyles($el) {
+ return {
+ backgroundAttachment: $el.css("background-attachment"),
+ backgroundClip: $el.css("background-clip"),
+ backgroundColor: $el.css("background-color"),
+ backgroundImage: $el.css("background-image"),
+ backgroundOrigin: $el.css("background-origin"),
+ backgroundPosition: $el.css("background-position"),
+ backgroundRepeat: $el.css("background-repeat"),
+ backgroundSize: $el.css("background-size")
+ };
+ }
+ function revert($input) {
+ var www, $wrapper;
+ www = $input.data(keys.www);
+ $wrapper = $input.parent().filter(www.selectors.wrapper);
+ _.each($input.data(keys.attrs), function(val, key) {
+ _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
+ });
+
$input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);
+ if ($wrapper.length) {
+ $input.detach().insertAfter($wrapper);
+ $wrapper.remove();
+ }
+ }
+ function $elOrNull(obj) {
+ var isValid, $el;
+ isValid = _.isJQuery(obj) || _.isElement(obj);
+ $el = isValid ? $(obj).first() : [];
+ return $el.length ? $el : null;
+ }
+ })();
+});
+/*
+ * bag.js - js/css/other loader + kv storage
+ *
+ * Copyright 2013-2014 Vitaly Puzrin
+ *
https://github.com/nodeca/bag.js
+ *
+ * License MIT
+ */
+
+/*global define*/
+
+(function (root, factory) {
+ 'use strict';
+
+ if (typeof define === 'function' && define.amd) {
+ define(factory);
+ } else if (typeof module === 'object' && typeof module.exports ===
'object') {
+ module.exports = factory();
+ } else {
+ root.Bag = factory();
+ }
+} (this, function () {
+ 'use strict';
+
+ var head = document.head || document.getElementsByTagName('head')[0];
+
+ //////////////////////////////////////////////////////////////////////////////
+ // helpers
+
+ function _nope() { return; }
+
+ function _isString(obj) {
+ return Object.prototype.toString.call(obj) === '[object String]';
+ }
+
+ var _isArray = Array.isArray || function isArray(obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+ };
+
+ function _isFunction(obj) {
+ return Object.prototype.toString.call(obj) === '[object Function]';
+ }
+
+ function _each(obj, iterator) {
+ if (_isArray(obj)) {
+ if (obj.forEach) {
+ return obj.forEach(iterator);
+ }
+ for (var i = 0; i < obj.length; i++) {
+ iterator(obj[i], i, obj);
+ }
+ } else {
+ for (var k in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, k)) {
+ iterator(obj[k], k);
+ }
+ }
+ }
+ }
+
+ function _default(obj, src) {
+ // extend obj with src properties if not exists;
+ _each(src, function (val, key) {
+ if (!obj[key]) { obj[key] = src[key]; }
+ });
+ }
+
+
+ function _asyncEach(arr, iterator, callback) {
+ callback = callback || _nope;
+ if (!arr.length) { return callback(); }
+
+ var completed = 0;
+ _each(arr, function (x) {
+ iterator(x, function (err) {
+ if (err) {
+ callback(err);
+ callback = _nope;
+ } else {
+ completed += 1;
+ if (completed >= arr.length) {
+ callback();
+ }
+ }
+ });
+ });
+ }
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // Adapters for Store class
+
+ function DomStorage(namespace) {
+ var self = this;
+ var _ns = namespace + '__';
+ var _storage = localStorage;
+
+
+ this.init = function (callback) {
+ callback();
+ };
+
+
+ this.remove = function (key, callback) {
+ callback = callback || _nope;
+ _storage.removeItem(_ns + key);
+ callback();
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ var obj = {
+ value: value,
+ expire: expire
+ };
+
+ var err;
+
+ try {
+ _storage.setItem(_ns + key, JSON.stringify(obj));
+ } catch (e) {
+ // On quota error try to reset storage & try again.
+ // Just remove all keys, without conditions, no optimizations needed.
+ if (e.name.toUpperCase().indexOf('QUOTA') >= 0) {
+ try {
+ _each(_storage, function (val, name) {
+ var k = name.split(_ns)[1];
+ if (k) { self.remove(k); }
+ });
+ _storage.setItem(_ns + key, JSON.stringify(obj));
+ } catch (e2) {
+ err = e2;
+ }
+ } else {
+ err = e;
+ }
+ }
+
+ callback(err);
+ };
+
+
+ this.get = function (key, raw, callback) {
+ if (_isFunction(raw)) {
+ callback = raw;
+ raw = false;
+ }
+
+ var err, data;
+
+ try {
+ data = JSON.parse(_storage.getItem(_ns + key));
+ data = raw ? data : data.value;
+ } catch (e) {
+ err = new Error('Can\'t read key: ' + key);
+ }
+
+ callback(err, data);
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+ var now = +new Date();
+
+ _each(_storage, function (val, name) {
+ var key = name.split(_ns)[1];
+
+ if (!key) { return; }
+
+ if (!expiredOnly) {
+ self.remove(key);
+ return;
+ }
+
+ var raw;
+ self.get(key, true, function (__, data) {
+ raw = data; // can use this hack, because get is sync;
+ });
+ if (raw && (raw.expire > 0) && ((raw.expire - now) < 0)) {
+ self.remove(key);
+ }
+ });
+
+ callback();
+ };
+ }
+
+
+ DomStorage.prototype.exists = function () {
+ try {
+ localStorage.setItem('__ls_test__', '__ls_test__');
+ localStorage.removeItem('__ls_test__');
+ return true;
+ } catch (e) {
+ return false;
+ }
+ };
+
+
+
+ function WebSql(namespace) {
+ var db;
+
+
+ this.init = function (callback) {
+ db = window.openDatabase(namespace, '1.0', 'bag.js db', 2e5);
+
+ if (!db) { return callback('Can\'t open webdql database'); }
+
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'CREATE TABLE IF NOT EXISTS kv (key TEXT PRIMARY KEY, value TEXT, expire
INTEGER KEY)',
+ [],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.remove = function (key, callback) {
+ callback = callback || _nope;
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'DELETE FROM kv WHERE key = ?',
+ [ key ],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'INSERT OR REPLACE INTO kv (key, value, expire) VALUES (?, ?, ?)',
+ [ key, JSON.stringify(value), expire ],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.get = function (key, callback) {
+ db.readTransaction(function (tx) {
+ tx.executeSql(
+ 'SELECT value FROM kv WHERE key = ?',
+ [ key ],
+ function (tx, result) {
+ if (result.rows.length === 0) {
+ return callback(new Error('key not found: ' + key));
+ }
+ var value = result.rows.item(0).value;
+ var err, data;
+ try {
+ data = JSON.parse(value);
+ } catch (e) {
+ err = new Error('Can\'t unserialise data: ' + value);
+ }
+ callback(err, data);
+ },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+
+ db.transaction(function (tx) {
+ if (expiredOnly) {
+ tx.executeSql(
+ 'DELETE FROM kv WHERE expire > 0 AND expire < ?',
+ [ +new Date() ],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ } else {
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'DELETE FROM kv',
+ [],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ }
+ });
+ };
+ }
+
+
+ WebSql.prototype.exists = function () {
+ return (!!window.openDatabase);
+ };
+
+
+
+ function Idb(namespace) {
+ var db;
+
+ this.init = function (callback) {
+ var idb = this.idb = window.indexedDB; /* || window.webkitIndexedDB ||
+ window.mozIndexedDB || window.msIndexedDB;*/
+
+ var req = idb.open(namespace, 2 /*version*/);
+
+ req.onsuccess = function (e) {
+ db = e.target.result;
+ callback();
+ };
+ req.onblocked = function (e) {
+ callback(new Error('IndexedDB blocked. ' + e.target.errorCode));
+ };
+ req.onerror = function (e) {
+ callback(new Error('IndexedDB opening error. ' + e.target.errorCode));
+ };
+ req.onupgradeneeded = function (e) {
+ db = e.target.result;
+ if (db.objectStoreNames.contains('kv')) {
+ db.deleteObjectStore('kv');
+ }
+ var store = db.createObjectStore('kv', { keyPath: 'key' });
+ store.createIndex('expire', 'expire', { unique: false });
+ };
+ };
+
+
+ this.remove = function (key, callback) {
+ var tx = db.transaction('kv', 'readwrite');
+
+ tx.oncomplete = function () { callback(); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Key remove error:
', e.target)); };
+
+ // IE 8 not allow to use reserved keywords as functions. More info:
+ //
http://tiffanybbrown.com/2013/09/10/expected-identifier-bug-in-internet-e...
+ tx.objectStore('kv')['delete'](key).onerror = function () {
tx.abort(); };
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ var tx = db.transaction('kv', 'readwrite');
+
+ tx.oncomplete = function () { callback(); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Key set error:
', e.target)); };
+
+ tx.objectStore('kv').put({
+ key: key,
+ value: value,
+ expire: expire
+ }).onerror = function () { tx.abort(); };
+ };
+
+
+ this.get = function (key, callback) {
+ var err, result;
+ var tx = db.transaction('kv');
+
+ tx.oncomplete = function () { callback(err, result); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Key get error:
', e.target)); };
+
+ tx.objectStore('kv').get(key).onsuccess = function (e) {
+ if (e.target.result) {
+ result = e.target.result.value;
+ } else {
+ err = new Error('key not found: ' + key);
+ }
+ };
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+ var keyrange = window.IDBKeyRange; /* ||
+ window.webkitIDBKeyRange || window.msIDBKeyRange;*/
+ var tx, store;
+
+ tx = db.transaction('kv', 'readwrite');
+ store = tx.objectStore('kv');
+
+ tx.oncomplete = function () { callback(); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Clear error:
', e.target)); };
+
+ if (expiredOnly) {
+
+ var cursor = store.index('expire').openCursor(keyrange.bound(1, +new
Date()));
+
+ cursor.onsuccess = function (e) {
+ var _cursor = e.target.result;
+ if (_cursor) {
+ // IE 8 not allow to use reserved keywords as functions (`delete` and
`continue`). More info:
+ //
http://tiffanybbrown.com/2013/09/10/expected-identifier-bug-in-internet-e...
+ store['delete'](_cursor.primaryKey).onerror = function () {
tx.abort(); };
+ _cursor['continue']();
+ }
+ };
+
+ } else {
+ // Just clear everything
+ tx.objectStore('kv').clear().onerror = function () { tx.abort(); };
+ }
+ };
+ }
+
+
+ Idb.prototype.exists = function () {
+ var db = window.indexedDB /*||
+ window.webkitIndexedDB ||
+ window.mozIndexedDB ||
+ window.msIndexedDB*/;
+
+ if (!db) {
+ return false;
+ }
+
+ // Check outdated idb implementations, where `onupgradeneede` event doesn't
work,
+ // see
https://github.com/pouchdb/pouchdb/issues/1207 for more details
+ var dbName = '__idb_test__';
+ var result = db.open(dbName, 1).onupgradeneeded === null;
+
+ if (db.deleteDatabase) {
+ db.deleteDatabase(dbName);
+ }
+
+ return result;
+ };
+
+
+
+ /////////////////////////////////////////////////////////////////////////////
+ // key/value storage with expiration
+
+ var storeAdapters = {
+ indexeddb: Idb,
+ websql: WebSql,
+ localstorage: DomStorage
+ };
+
+
+ // namespace - db name or similar
+ // storesList - array of allowed adapter names to use
+ //
+ function Storage(namespace, storesList) {
+ var self = this;
+
+ var db = null;
+
+ // States of db init singletone process
+ // 'done' / 'progress' / 'failed' / undefined
+ var initState;
+ var initStack = [];
+
+ _each(storesList, function (name) {
+ // do storage names case insensitive
+ name = name.toLowerCase();
+
+ if (!storeAdapters[name]) {
+ throw new Error('Wrong storage adapter name: ' + name, storesList);
+ }
+
+ if (storeAdapters[name].prototype.exists() && !db) {
+ db = new storeAdapters[name](namespace);
+ return false; // terminate search on first success
+ }
+ });
+
+ if (!db) {
+ /* eslint-disable no-console */
+ // If no adaprets - don't make error for correct fallback.
+ // Just log that we continue work without storing results.
+ if (typeof console !== 'undefined' && console.log) {
+ console.log('None of requested storages available: ' + storesList);
+ }
+ /* eslint-enable no-console */
+ }
+
+
+ this.init = function (callback) {
+ if (!db) {
+ callback(new Error('No available db'));
+ return;
+ }
+
+ if (initState === 'done') {
+ callback();
+ return;
+ }
+
+ if (initState === 'progress') {
+ initStack.push(callback);
+ return;
+ }
+
+ initStack.push(callback);
+ initState = 'progress';
+
+ db.init(function (err) {
+ initState = !err ? 'done' : 'failed';
+ _each(initStack, function (cb) {
+ cb(err);
+ });
+ initStack = [];
+
+ // Clear expired. A bit dirty without callback,
+ // but we don't care until clear compleete
+ if (!err) { self.clear(true); }
+ });
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ if (_isFunction(expire)) {
+ callback = expire;
+ expire = null;
+ }
+ callback = callback || _nope;
+ expire = expire ? +(new Date()) + (expire * 1000) : 0;
+
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.set(key, value, expire, callback);
+ });
+ };
+
+
+ this.get = function (key, callback) {
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.get(key, callback);
+ });
+ };
+
+
+ this.remove = function (key, callback) {
+ callback = callback || _nope;
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.remove(key, callback);
+ });
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+ if (_isFunction(expiredOnly)) {
+ callback = expiredOnly;
+ expiredOnly = false;
+ }
+ callback = callback || _nope;
+
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.clear(expiredOnly, callback);
+ });
+ };
+ }
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // Bag class implementation
+
+ function Bag(options) {
+ if (!(this instanceof Bag)) { return new Bag(options); }
+
+ var self = this;
+
+ options = options || {};
+
+ this.prefix = options.prefix || 'bag';
+ this.timeout = options.timeout || 20; // 20 seconds
+ this.expire = options.expire || 30 * 24; // 30 days
+ this.isValidItem = options.isValidItem || null;
+
+ this.stores = _isArray(options.stores) ? options.stores : [ 'indexeddb',
'websql', 'localstorage' ];
+
+ var storage = null;
+
+ this._queue = [];
+ this._chained = false;
+
+ this._createStorage = function () {
+ if (!storage) { storage = new Storage(self.prefix, self.stores); }
+ };
+
+ function getUrl(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url);
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4) {
+ if (xhr.status === 200) {
+ callback(null, {
+ content: xhr.responseText,
+ type: xhr.getResponseHeader('content-type')
+ });
+ callback = _nope;
+ } else {
+ callback(new Error('Can\'t open url ' + url +
+ (xhr.status ? xhr.statusText + ' (' + xhr.status + ')' :
'')));
+ callback = _nope;
+ }
+ }
+ };
+
+ setTimeout(function () {
+ if (xhr.readyState < 4) {
+ xhr.abort();
+ callback(new Error('Timeout'));
+ callback = _nope;
+ }
+ }, self.timeout * 1000);
+
+ xhr.send();
+ }
+
+ function createCacheObj(obj, response) {
+ var cacheObj = {};
+
+ _each([ 'url', 'key', 'unique' ], function (key) {
+ if (obj[key]) { cacheObj[key] = obj[key]; }
+ });
+
+ var now = +new Date();
+ cacheObj.data = response.content;
+ cacheObj.originalType = response.type;
+ cacheObj.type = obj.type || response.type;
+ cacheObj.stamp = now;
+
+ return cacheObj;
+ }
+
+ function saveUrl(obj, callback) {
+ getUrl(obj.url_real, function (err, result) {
+ if (err) { return callback(err); }
+
+ var delay = (obj.expire || self.expire) * 60 * 60; // in seconds
+
+ var cached = createCacheObj(obj, result);
+
+ self.set(obj.key, cached, delay, function () {
+ // Don't check error - have to return data anyway
+ _default(obj, cached);
+ callback(null, obj);
+ });
+ });
+ }
+
+
+ function isCacheValid(cached, obj) {
+ return !cached ||
+ cached.expire - +new Date() < 0 ||
+ obj.unique !== cached.unique ||
+ obj.url !== cached.url ||
+ (self.isValidItem && !self.isValidItem(cached, obj));
+ }
+
+
+ function fetch(obj, callback) {
+
+ if (!obj.url) { return callback(); }
+ obj.key = (obj.key || obj.url);
+
+ self.get(obj.key, function (err_cache, cached) {
+
+ // Check error only on forced fetch from cache
+ if (err_cache && obj.cached) {
+ callback(err_cache);
+ return;
+ }
+
+ // if can't get object from store, then just load it from web.
+ obj.execute = (obj.execute !== false);
+ var shouldFetch = !!err_cache || isCacheValid(cached, obj);
+
+ // If don't have to load new date - return one from cache
+ if (!obj.live && !shouldFetch) {
+ obj.type = obj.type || cached.originalType;
+ _default(obj, cached);
+ callback(null, obj);
+ return;
+ }
+
+ // calculate loading url
+ obj.url_real = obj.url;
+ if (obj.unique) {
+ // set parameter to prevent browser cache
+ obj.url_real = obj.url + ((obj.url.indexOf('?') > 0) ?
'&' : '?') + 'bag-unique=' + obj.unique;
+ }
+
+ saveUrl(obj, function (err_load) {
+ if (err_cache && err_load) {
+ callback(err_load);
+ return;
+ }
+
+ if (err_load) {
+ obj.type = obj.type || cached.originalType;
+ _default(obj, cached);
+ callback(null, obj);
+ return;
+ }
+
+ callback(null, obj);
+ });
+ });
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // helpers to set absolute sourcemap url
+
+ /* eslint-disable max-len */
+ var sourceMappingRe = /(?:^([ \t]*\/\/[@|#][ \t]+sourceMappingURL=)(.+?)([
\t]*)$)|(?:^([ \t]*\/\*[@#][ \t]+sourceMappingURL=)(.+?)([ \t]*\*\/[ \t])*$)/mg;
+ /* eslint-enable max-len */
+
+ function parse_url(url) {
+ var pattern = new
RegExp('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?');
+ var matches = url.match(pattern);
+ return {
+ scheme: matches[2],
+ authority: matches[4],
+ path: matches[5],
+ query: matches[7],
+ fragment: matches[9]
+ };
+ }
+
+ function patchMappingUrl(obj) {
+ var refUrl = parse_url(obj.url);
+ var done = false;
+ var res = obj.data.replace(sourceMappingRe, function (match, p1, p2, p3, p4, p5,
p6) {
+ if (!match) { return null; }
+ done = true;
+ // select matched group of params
+ if (!p1) { p1 = p4; p2 = p5; p3 = p6; }
+ var mapUrl = parse_url(p2);
+
+ var scheme = (mapUrl.scheme ? mapUrl.scheme : refUrl.scheme) ||
window.location.protocol.slice(0, -1);
+ var authority = (mapUrl.authority ? mapUrl.authority : refUrl.authority) ||
window.location.host;
+ /* eslint-disable max-len */
+ var path = mapUrl.path[0] === '/' ? mapUrl.path :
refUrl.path.split('/').slice(0, -1).join('/') + '/' +
mapUrl.path;
+ /* eslint-enable max-len */
+ return p1 + (scheme + '://' + authority + path) + p3;
+ });
+ return done ? res : '';
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ var handlers = {
+ 'application/javascript': function injectScript(obj) {
+ var script = document.createElement('script'), txt;
+
+ // try to change sourcemap address to absolute
+ txt = patchMappingUrl(obj);
+ if (!txt) {
+ // or add script name for dev tools
+ txt = obj.data + '\n//# sourceURL=' + obj.url;
+ }
+
+ // Have to use .text, since we support IE8,
+ // which won't allow appending to a script
+ script.text = txt;
+ head.appendChild(script);
+ return;
+ },
+
+ 'text/css': function injectStyle(obj) {
+ var style = document.createElement('style'), txt;
+
+ // try to change sourcemap address to absolute
+ txt = patchMappingUrl(obj);
+ if (!txt) {
+ // or add stylesheet script name for dev tools
+ txt = obj.data + '\n/*# sourceURL=' + obj.url + ' */';
+ }
+
+ // Needed to enable `style.styleSheet` in IE
+ style.setAttribute('type', 'text/css');
+
+ if (style.styleSheet) {
+ // We should append style element to DOM before assign css text to
+ // workaround IE bugs with `@import` and `@font-face`.
+ //
https://github.com/andrewwakeling/ie-css-bugs
+ head.appendChild(style);
+
+ style.styleSheet.cssText = txt; // IE method
+ } else {
+ style.appendChild(document.createTextNode(txt)); // others
+ head.appendChild(style);
+ }
+
+ return;
+ }
+ };
+
+
+ function execute(obj) {
+ if (!obj.type) { return; }
+
+ // Cut off encoding if exists:
+ // application/javascript; charset=UTF-8
+ var handlerName = obj.type.split(';')[0];
+
+ // Fix outdated mime types if needed, to use single handler
+ if (handlerName === 'application/x-javascript' || handlerName ===
'text/javascript') {
+ handlerName = 'application/javascript';
+ }
+
+ if (handlers[handlerName]) {
+ handlers[handlerName](obj);
+ }
+ return;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ //
+ // Public methods
+ //
+
+ this.require = function (resources, callback) {
+ var queue = self._queue;
+
+ if (_isFunction(resources)) {
+ callback = resources;
+ resources = null;
+ }
+
+ if (resources) {
+ var res = _isArray(resources) ? resources : [ resources ];
+
+ // convert string urls to structures
+ // and push to queue
+ _each(res, function (r, i) {
+ if (_isString(r)) { res[i] = { url: r }; }
+ queue.push(res[i]);
+ });
+ }
+
+ self._createStorage();
+
+ if (!callback) {
+ self._chained = true;
+ return self;
+ }
+
+ _asyncEach(queue, fetch, function (err) {
+ if (err) {
+ // cleanup
+ self._chained = false;
+ self._queue = [];
+
+ callback(err);
+ return;
+ }
+
+ _each(queue, function (obj) {
+ if (obj.execute) {
+ execute(obj);
+ }
+ });
+
+ // return content only, if one need fuul info -
+ // check input object, that will be extended.
+ var replies = [];
+ _each(queue, function (r) { replies.push(r.data); });
+
+ var result = (_isArray(resources) || self._chained) ? replies : replies[0];
+
+ // cleanup
+ self._chained = false;
+ self._queue = [];
+
+ callback(null, result);
+ });
+ };
+
+
+ // Create proxy methods (init store then subcall)
+ _each([ 'remove', 'get', 'set', 'clear' ], function
(method) {
+ self[method] = function () {
+ self._createStorage();
+ storage[method].apply(storage, arguments);
+ };
+ });
+
+
+ this.addHandler = function (types, handler) {
+ types = _isArray(types) ? types : [ types ];
+ _each(types, function (type) { handlers[type] = handler; });
+ };
+
+
+ this.removeHandler = function (types) {
+ self.addHandler(types/*, undefined*/);
+ };
+ }
+
+ return Bag;
+
+}));
diff --git a/ui/pages/browserconfig.xml b/ui/pages/browserconfig.xml
new file mode 100644
index 0000000..f4dc24a
--- /dev/null
+++ b/ui/pages/browserconfig.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+ <msapplication>
+ <tile>
+ <square70x70logo src="images/mstile-70x70.png"/>
+ <square150x150logo src="images/mstile-150x150.png"/>
+ <square310x310logo src="images/mstile-310x310.png"/>
+ <wide310x150logo src="images/mstile-310x150.png"/>
+ <TileColor>#4d4d4d</TileColor>
+ </tile>
+ </msapplication>
+</browserconfig>
diff --git a/ui/pages/login.html.tmpl b/ui/pages/login.html.tmpl
index 12ca69f..40139fc 100644
--- a/ui/pages/login.html.tmpl
+++ b/ui/pages/login.html.tmpl
@@ -24,77 +24,110 @@
#silent next = "?next=%s" % $getVar('data.next', '') if
$getVar('data.next', '') else ""
#from wok.config import get_version
<!DOCTYPE html>
-<html lang="$lang.lang[0]">
+<html class="no-js" lang="$lang.lang[0]">
<head>
<meta charset="UTF-8">
<title>Kimchi</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
-<link rel="shortcut icon" href="images/logo.ico">
-<link rel="stylesheet"
href="$href('css/theme-default.min.css')">
-<script src="$href('libs/jquery-1.10.0.min.js')"></script>
-<script src="$href('libs/jquery-ui.min.js')"></script>
+<link rel="apple-touch-icon" sizes="57x57"
href="images/apple-touch-icon-57x57.png">
+<link rel="apple-touch-icon" sizes="60x60"
href="images/apple-touch-icon-60x60.png">
+<link rel="apple-touch-icon" sizes="72x72"
href="images/apple-touch-icon-72x72.png">
+<link rel="apple-touch-icon" sizes="76x76"
href="images/apple-touch-icon-76x76.png">
+<link rel="apple-touch-icon" sizes="114x114"
href="images/apple-touch-icon-114x114.png">
+<link rel="apple-touch-icon" sizes="120x120"
href="images/apple-touch-icon-120x120.png">
+<link rel="apple-touch-icon" sizes="144x144"
href="images/apple-touch-icon-144x144.png">
+<link rel="apple-touch-icon" sizes="152x152"
href="images/apple-touch-icon-152x152.png">
+<link rel="apple-touch-icon" sizes="180x180"
href="images/apple-touch-icon-180x180.png">
+<link rel="icon" type="image/png"
href="images/favicon-32x32.png" sizes="32x32">
+<link rel="icon" type="image/png"
href="images/favicon-194x194.png" sizes="194x194">
+<link rel="icon" type="image/png"
href="images/favicon-96x96.png" sizes="96x96">
+<link rel="icon" type="image/png"
href="images/android-chrome-192x192.png" sizes="192x192">
+<link rel="icon" type="image/png"
href="images/favicon-16x16.png" sizes="16x16">
+<link rel="manifest" href="images/manifest.json">
+<meta name="apple-mobile-web-app-title" content="Kimchi">
+<meta name="application-name" content="Kimchi">
+<meta name="msapplication-TileColor" content="#4d4d4d">
+<meta name="msapplication-TileImage"
content="images/mstile-144x144.png">
+<meta name="theme-color" content="#ffffff">
+<link rel="stylesheet"
href="$href('libs/themes/base/jquery-ui.min.css')">
+<link rel="stylesheet"
href="$href('libs/themes/base/jquery-ui.custom.css')">
+<link rel="stylesheet"
href="$href('libs/themes/base/bootstrap-official.css')">
+<!-- <link rel="stylesheet"
href="$href('css/theme-default.min.css')"> -->
+<link rel="stylesheet"
href="$href('fontawesome/css/fontawesome.css')">
+<link rel="stylesheet"
href="$href('libs/themes/base/bootstrap.custom.css')">
+<script src="$href('libs/modernizr.js')"></script>
+<script src="$href('libs/jquery.min.js')"></script>
+<script src="$href('libs/jquery-ui.js')"></script>
<script
src="$href('libs/jquery-ui-i18n.min.js')"></script>
+<script src="$href('libs/vendor.js')"></script>
+<script src="$href('libs/bootstrap.js')"></script>
+<script
src="$href('libs/bootstrap-select.min.js')"></script>
<script src="$href('js/wok.min.js')"></script>
-<style type="text/css">
-.topbar select {
- float: right;
- margin-top: 12px;
- margin-right: 10px;
-}
-.login-area {
- margin: 120px auto 0;
-}
-#login-window {
- width: 315px;
-}
-.err-area {
- height: auto;
- margin-bottom: 10px;
-}
-.err-mess {
- color: #C85305;
-}
-</style>
</head>
<body onload="wok.login_main()">
-<div class="container topbar">
- <span id="logo"><img alt="Project Kimchi"
src="images/theme-default/logo-white.png"></span>
- <select id="userLang">
- <option value="en_US">English (US)</option>
- <option value="zh_CN">中文(简体)</option>
- <option value="pt_BR">Português (Brasil)</option>
- <option value="de_DE">Deutsch (Deutschland)</option>
- <option value="es_ES">Español (España)</option>
- <option value="fr_FR">Français (France)</option>
- <option value="it_IT">Italiano (Italia)</option>
- <option value="ja_JP">日本語 (日本)</option>
- <option value="ko_KR">한국어 (대한민국)</option>
- <option value="ru_RU">Русский (Россия)</option>
- <option value="zh_TW">中文(繁體)</option>
- </select>
-</div>
-<div id="login-window" class="login-area">
- <div class="err-area">
- <div id="messUserPass" class="err-mess"
style="display: none;">$_("The username or password you entered is
incorrect. Please try again.")</div>
- <div id="messSession" class="err-mess"
style="display: none;">$_("Session timeout, please
re-login.")</div>
+ <div class="topbar">
+ <nav class="navbar navbar-inverse">
+ <div class="container">
+ <div class="navbar-header">
+ <a class="navbar-brand"
href="#">Kimchi</a>
+ </div>
+ </div>
+ </nav>
+ <nav class="navbar navbar-default">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle
collapsed" data-toggle="collapse" data-target="#nav-menu"
aria-expanded="false">
+ <span class="sr-only">Toggle
navigation</span>
+ <span class="icon-bar"><!-- Hamburguer button
here --></span>
+ </button>
+ </div>
+ <div class="collapse navbar-collapse"
id="nav-menu">
+ <ul class="nav navbar-nav">
+ <li class="hostname"><span
class="host-location"></span></li>
+ </ul>
+ </div>
+ </div>
+ </nav>
</div>
- <form id="form-login" class="login-panel">
- <div class="row">
- <input type="text" id="username"
name="username" required="required" placeholder="$_("User
Name")" autofocus/>
- <div id="username-msg"
class="msg-required"></div>
+ <div class="content">
+ <div id="login-window" class="login-area">
+ <div class="err-area">
+ <div id="messUserPass" class="alert alert-danger"
style="display: none;">$_("The username or password you entered is
incorrect. Please try again.")</div>
+ <div id="messSession" class="alert alert-danger"
style="display: none;">$_("Session timeout, please
re-login.")</div>
+ </div>
+ <form id="form-login" class="form-horizontal">
+ <div class="form-group">
+ <label for="username"
class="sr-only">$_("User Name")</label>
+ <input type="text" class="form-control"
id="username" name="username" required="required"
placeholder="$_("User Name")" autofocus/>
+ <div id="username-msg"
class="msg-required"></div>
+ </div>
+ <div class="form-group">
+ <label for="password"
class="sr-only">$_("Password")</label>
+ <input type="password" class="form-control"
id="password" name="password" required="required"
placeholder="$_("Password")" />
+ <div id="password-msg"
class="msg-required"></div>
+ </div>
+ <div class="form-group">
+ <button id="btn-login" class="btn btn-login col-md-12
col-lg-12">
+ <span id="login">$_("Log in")</span>
+ <span id="logging" style="display:
none;">$_("Logging in...")</span>
+ </button>
+ </div>
+ <select id="userLang" class="selectpicker col-md-12
col-lg-12">
+ <option value="en_US">English (US)</option>
+ <option value="zh_CN">中文(简体)</option>
+ <option value="pt_BR">Português
(Brasil)</option>
+ <option value="de_DE">Deutsch
(Deutschland)</option>
+ <option value="es_ES">Español
(España)</option>
+ <option value="fr_FR">Français
(France)</option>
+ <option value="it_IT">Italiano
(Italia)</option>
+ <option value="ja_JP">日本語 (日本)</option>
+ <option value="ko_KR">한국어 (대한민국)</option>
+ <option value="ru_RU">Русский
(Россия)</option>
+ <option value="zh_TW">中文(繁體)</option>
+ </select>
+ </form>
</div>
- <div class="row">
- <input type="password" id="password"
name="password" required="required"
placeholder="$_("Password")" />
- <div id="password-msg"
class="msg-required"></div>
- </div>
- <div class="row">
- <button id="btn-login" class="btn-normal-1">
- <label id="login">$_("Log in")</label>
- <label id="logging" style="display:
none;">$_("Logging in...")</label>
- </button>
- </div>
- </form>
-</div>
+ </div>
</body>
</html>
diff --git a/ui/pages/manifest.json b/ui/pages/manifest.json
new file mode 100644
index 0000000..2067f76
--- /dev/null
+++ b/ui/pages/manifest.json
@@ -0,0 +1,41 @@
+{
+ "name": "Kimchi",
+ "icons": [
+ {
+ "src": "\/images/android-chrome-36x36.png",
+ "sizes": "36x36",
+ "type": "image\/png",
+ "density": "0.75"
+ },
+ {
+ "src": "\/images/android-chrome-48x48.png",
+ "sizes": "48x48",
+ "type": "image\/png",
+ "density": "1.0"
+ },
+ {
+ "src": "\/images/android-chrome-72x72.png",
+ "sizes": "72x72",
+ "type": "image\/png",
+ "density": "1.5"
+ },
+ {
+ "src": "\/images/android-chrome-96x96.png",
+ "sizes": "96x96",
+ "type": "image\/png",
+ "density": "2.0"
+ },
+ {
+ "src": "\/images/android-chrome-144x144.png",
+ "sizes": "144x144",
+ "type": "image\/png",
+ "density": "3.0"
+ },
+ {
+ "src": "\/images/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image\/png",
+ "density": "4.0"
+ }
+ ]
+}
diff --git a/ui/pages/wok-ui.html.tmpl b/ui/pages/wok-ui.html.tmpl
index a2fd4e1..3757bfc 100644
--- a/ui/pages/wok-ui.html.tmpl
+++ b/ui/pages/wok-ui.html.tmpl
@@ -23,23 +23,45 @@
#silent _t = t.gettext
#from wok.config import get_version
<!DOCTYPE html>
-<html lang="$lang.lang[0]">
+<html class="no-js" lang="$lang.lang[0]">
<head>
<meta charset="UTF-8">
<title>Kimchi</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
-<link rel="shortcut icon" href="images/logo.ico">
+<link rel="apple-touch-icon" sizes="57x57"
href="images/apple-touch-icon-57x57.png">
+<link rel="apple-touch-icon" sizes="60x60"
href="images/apple-touch-icon-60x60.png">
+<link rel="apple-touch-icon" sizes="72x72"
href="images/apple-touch-icon-72x72.png">
+<link rel="apple-touch-icon" sizes="76x76"
href="images/apple-touch-icon-76x76.png">
+<link rel="apple-touch-icon" sizes="114x114"
href="images/apple-touch-icon-114x114.png">
+<link rel="apple-touch-icon" sizes="120x120"
href="images/apple-touch-icon-120x120.png">
+<link rel="apple-touch-icon" sizes="144x144"
href="images/apple-touch-icon-144x144.png">
+<link rel="apple-touch-icon" sizes="152x152"
href="images/apple-touch-icon-152x152.png">
+<link rel="apple-touch-icon" sizes="180x180"
href="images/apple-touch-icon-180x180.png">
+<link rel="icon" type="image/png"
href="images/favicon-32x32.png" sizes="32x32">
+<link rel="icon" type="image/png"
href="images/favicon-194x194.png" sizes="194x194">
+<link rel="icon" type="image/png"
href="images/favicon-96x96.png" sizes="96x96">
+<link rel="icon" type="image/png"
href="images/android-chrome-192x192.png" sizes="192x192">
+<link rel="icon" type="image/png"
href="images/favicon-16x16.png" sizes="16x16">
+<link rel="manifest" href="images/manifest.json">
+<meta name="apple-mobile-web-app-title" content="Kimchi">
+<meta name="application-name" content="Kimchi">
+<meta name="msapplication-TileColor" content="#4d4d4d">
+<meta name="msapplication-TileImage"
content="images/mstile-144x144.png">
+<meta name="theme-color" content="#ffffff">
<link rel="stylesheet"
href="$href('libs/themes/base/jquery-ui.min.css')">
-<link rel="stylesheet"
href="$href('fontello/css/fontello.css')">
-<link rel="stylesheet"
href="$href('fontello/css/animation.css')">
-<link rel="stylesheet"
href="$href('css/theme-default.min.css')">
-
-<script src="$href('libs/jquery-1.10.0.min.js')"></script>
-<script src="$href('libs/jquery-ui.min.js')"></script>
+<link rel="stylesheet"
href="$href('libs/themes/base/jquery-ui.custom.css')">
+<link rel="stylesheet"
href="$href('libs/themes/base/bootstrap-official.css')">
+<!-- <link rel="stylesheet"
href="$href('css/theme-default.min.css')"> -->
+<link rel="stylesheet"
href="$href('fontawesome/css/fontawesome.css')">
+<link rel="stylesheet"
href="$href('libs/themes/base/bootstrap.custom.css')">
+<script src="$href('libs/modernizr.js')"></script>
+<script src="$href('libs/jquery.min.js')"></script>
+<script src="$href('libs/jquery-ui.js')"></script>
<script
src="$href('libs/jquery-ui-i18n.min.js')"></script>
+<script src="$href('libs/bootstrap.js')"></script>
+<script
src="$href('libs/bootstrap-select.min.js')"></script>
<script src="$href('js/wok.min.js')"></script>
-
<!-- This is used for detecting if the UI needs to be built -->
<style type="text/css">
#buildme {
@@ -67,55 +89,66 @@
</style>
</head>
<body onload="wok.main()">
-<div class="container">
-<header class="topbar">
- <h1 id="logo"><img alt="Project Kimchi"
src="images/theme-default/logo-white.png"></h1>
- <ul class="nav-top">
- <li>
- <div id="peers" class="peers hide-content
popable">
- <span>$_("Peers")</span>
- <span class="arrow"></span>
- <div class="dropdown popover right-side">
- <p
id="search-peers">$_("Searching")...</p>
- <p id="no-peers"
class="hide-content">$_("No peers found.")</p>
- </div>
+ <div class="topbar">
+ <nav class="navbar navbar-inverse">
+ <div class="container">
+ <div class="navbar-header">
+ <a id="logo" class="navbar-brand" href="#"
title="Project Kimchi">Kimchi</a>
</div>
- </li>
- <li>
- <div id="user" class="popable">
- <span id="user-icon"></span>
- <span id="user-name"
class="empty-when-logged-off"></span>
- <span class="arrow"></span>
- <div class="action-panel popover right-side">
- <a id="btn-help" class="user-menu-item"
href="javascript:void(0);">$_("Help")</a>
- <br/>
- <br/>
- <a id="btn-about" class="user-menu-item"
href="javascript:void(0);">$_("About")</a>
- <br/>
- <hr/>
- <a id="btn-logout" class="user-menu-item"
href="javascript: void(0);">$_("Log out")</a>
- </div>
+ <ul class="nav navbar-nav navbar-right">
+ <li class="dropdown hide-content peers"
id="peers">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><span
class="topbar-text">$_("Peers")</span><span
class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li
id="search-peers"><span>$_("Searching")...</span></li>
+ <li id="no-peers"
class="hide-content">$_("No peers found.")</li>
+ </ul>
+ </li>
+ <li class="dropdown" id="user">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">
+ <i class="fa fa-user"
id="user-icon"></i><span class="topbar-text
empty-when-logged-off" id="user-name"></span><span
class="caret"></span>
+ </a>
+ <ul class="dropdown-menu">
+ <li class="critical"><a
id="btn-logout" href="javascript: void(0);"><i class="fa
fa-ban"></i><span>$_("Log
out")</span></a></li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><i class="fa
fa-question-circle"></i><span
class="topbar-text">$_("Help")</span><span
class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li><a id="btn-help" href="javascript:
void(0);">$_("Help")</a></li>
+ <li><a id="btn-about"
href="javascript:void(0);">$_("About")</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </nav>
+ <nav class="navbar navbar-default">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle
collapsed" data-toggle="collapse" data-target="#nav-menu"
aria-expanded="false">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"><!-- Hamburguer button here
--></span>
+ </button>
</div>
- </li>
- </ul>
-</header>
-<div class="content">
- <nav class="navbar">
- <ul id="nav-menu" class="nav-menu">
- <li class="menu-arrow"></li>
- </ul>
- </nav>
- <div id="main">
+ <div class="collapse navbar-collapse"
id="nav-menu">
+ <ul class="nav navbar-nav">
+ <li class="hostname"><span
class="host-location"></span></li>
+ </ul>
+ </div>
+ </div>
+ </nav>
+ </div>
+ <div class="content">
+ <div id="main">
+ </div>
+ </div>
</div>
-</div>
-</div>
-<div id="buildme">
- <div><p>Oops! It looks like I am running from a source tree and you
forgot to build!
+ <div id="buildme" style="display:none">
+ <div><p>Oops! It looks like I am running from a source tree and you
forgot to build!
Please run the following command from the wok and kimchi directories and reload this
page:</p>
- <p><code>make</code></p>
+ <p><code>make</code></p>
+ </div>
</div>
-</div>
<script id="about-tmpl" type="wok/template">
<div class="window about-window">
diff --git a/ui/src/README.md b/ui/src/README.md
new file mode 100644
index 0000000..846c751
--- /dev/null
+++ b/ui/src/README.md
@@ -0,0 +1,87 @@
+# WOK new-ui prototypes
+
+The new-ui widgets and mockups are located inside `dist` folder.
+You may need to set `--allow-file-access-from-files` flag option in Chrome or [set your
browser settings to allow local AJAX calls in Firefox].
+
+### Building from source
+If you want to build the dist folder with the source files, please install the following
dependencies:
+ - [node.js]
+ - [Gulp]
+ - [Bower]
+
+### Gulp
+>Gulp is a toolkit that helps automate painful or time-consuming tasks in the ui
development workflow. It helps by doing CSS preprocessing, JS transpiling, minification,
live reloading, and other tasks.
+
+### Bower
+>Bower offers a generic, unopinionated solution to the problem of front-end package
management, while exposing the package dependency model via an API that can be consumed by
a more opinionated build stack. There are no system wide dependencies, no dependencies are
shared between different apps, and the dependency tree is flat.
+
+>Bower runs over Git, and is package-agnostic. A packaged component can be made up of
any type of asset, and use any type of transport (e.g., AMD, CommonJS, etc.).
+
+
+### Getting started
+Once [node.js] is installed, issue the following commands:
+
+ - `npm install --g gulp bower` to install Bower and Gulp globally
+ - Navigate to `new-ui-samples` folder and run `npm install && bower install`
+ - `gulp serve` to preview and watch the changes that are made inside the folder
+ - `gulp styles` to recompile SCSS to CSS files inside `.tmp` folder
+ - `gulp lint` to run ESlint an scan for JavaScript errors
+ - `gulp clean` to clean `dist` folder
+ - `gulp build` to copy and compile all files to `dist` folder for
production/distribution
+
+Please note that some of the dependencies may fail to install/compile if you're
logged as root. If that happens, try reinstalling with `--allow-root` parameter.
+
+### Editing the source files
+#### Automated tasks
+By running `gulp serve` command, gulp automatically watches for any changes in the files
and run the appropriate tasks such as running ESlint to scan JavaScript errors and
lib-sass to compile SCSS files into CSS.
+#### Package control
+All libraries such as jQuery, jQuery-UI, Twitter Bootstrap and fontawesome are managed by
Bower (using `bower install` command). The developer dependencies are located in
`bower.json` file:
+```
+{
+ "name": "ui-bootstrap",
+ "private": true,
+ "dependencies": {
+ "modernizr": "~2.8.1",
+ "bootstrap-sass-official": "~3.3.5",
+ "bootstrap-select-sass": "~1.6.3",
+ "compass-mixins": "~1.0.2",
+ "es5-shim": "~4.1.10",
+ "json2": "*",
+ "base64": "~0.3.0",
+ "typeahead.js": "~0.11.1",
+ "bag.js": "~0.1.4",
+ "fontawesome": "~4.3.0",
+ "jquery": "~2.1.4",
+ "jquery-ui": "~1.11.4"
+ },
+ "overrides": {
+ "bootstrap-sass-official": {
+ "main": [
+ "assets/stylesheets/_bootstrap.scss",
+ "assets/fonts/bootstrap/*",
+ "assets/javascripts/bootstrap.js"
+ ]
+ }
+ },
+ "devDependencies": {
+ "chai": "~3.2.0",
+ "mocha": "~2.2.5"
+ },
+ "resolutions": {
+ "es5-shim": "~4.1.10",
+ "base64": "~0.3.0",
+ "typeahead.js": "~0.11.1",
+ "jquery": "~2.1.4",
+ "jquery-ui": "~1.11.4"
+ }
+}
+```
+If you want to use a different version of one of the listed libraries, edit this file and
run `bower install` command again.
+#### CSS and UI widgets
+CSS files inherited from libaries are located inside bower_components folder and will be
imported to dist folder once you run `gulp build` task.
+The new-ui CSS are compiled by lib-sass by running `gulp styles` task. You don't have
to edit bootstrap-sass-official files to make changes in the UI. Each widget and area from
the new-ui is separated in different files inside `modules` folder and are imported into
`main.scss`. `compass-mixins`, `bootstrap-sass-official` and `bootstrap-select` are
managed by bower and imported at the top of the file. The new-ui custom variabels for
Bootstrap are located inside `_kimchi-variables.scss`
+
+[node.js]:http://nodejs.org
+[Bower]:http://bower.io
+[Gulp]:http://gulpjs.com
+[set your browser settings to allow local AJAX calls in
Firefox]:https://wiki.fluidproject.org/display/fluid/Browser+settings+to+...
\ No newline at end of file
diff --git a/ui/src/app/android-chrome-144x144.png
b/ui/src/app/android-chrome-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6e28d098a966800c1d07015467b517d825a5fdf
GIT binary patch
literal 9965
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/android-chrome-192x192.png
b/ui/src/app/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..040a33d566357cc4dea75cebc527968271516faa
GIT binary patch
literal 15190
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/android-chrome-36x36.png b/ui/src/app/android-chrome-36x36.png
new file mode 100644
index 0000000000000000000000000000000000000000..c949db775e1c3019a74d4e9af6e3c675a2c7ef65
GIT binary patch
literal 1663
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
JPDHLkV1kV~37!A|
literal 0
HcmV?d00001
diff --git a/ui/src/app/android-chrome-48x48.png b/ui/src/app/android-chrome-48x48.png
new file mode 100644
index 0000000000000000000000000000000000000000..10727b708d4f42e506c5612a572c1a48d92f3220
GIT binary patch
literal 2322
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/android-chrome-72x72.png b/ui/src/app/android-chrome-72x72.png
new file mode 100644
index 0000000000000000000000000000000000000000..881f75cc8454921d096e322b19fdadd11c67abdf
GIT binary patch
literal 3915
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
ZD=;!TFfa&WKOX=9002ovPDHLkV1ndqRn!0g
literal 0
HcmV?d00001
diff --git a/ui/src/app/android-chrome-96x96.png b/ui/src/app/android-chrome-96x96.png
new file mode 100644
index 0000000000000000000000000000000000000000..97a151cedaf0e81f72938f640c5abfbe28ae06d0
GIT binary patch
literal 5684
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ΠtuuRo})vmv(eVF6p95R<6Bc2_agoDBjd=3b*{i;%Rn<3C8
zRE~sDJQ2bAaYYsokA=f)E97nr)p+^*kWVyB0<3aSb-%0Asw-7ytcRqcEP}GZKwU)}
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
KSe3ll$NvX^`M%=-
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-114x114.png
b/ui/src/app/apple-touch-icon-114x114.png
new file mode 100644
index 0000000000000000000000000000000000000000..33b5bb3ffe03a0670a5cc03a6668c92d04fe2ce4
GIT binary patch
literal 9159
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
K)K3YM;Qs@*ScfA3
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-120x120.png
b/ui/src/app/apple-touch-icon-120x120.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d0ce2746897c9f75b493595f5356cfaab91f025
GIT binary patch
literal 9860
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
ZH1qub4Y{B6?EefPQeyI=)xw6r{{eZSqyzu}
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-144x144.png
b/ui/src/app/apple-touch-icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..71f3e19ec3dc29ba452fe395b11f2dcebefe9bfb
GIT binary patch
literal 12771
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
aSzCDj{{%VjOq^c?U@{Vl;?<%?LH`A(w0495
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-152x152.png
b/ui/src/app/apple-touch-icon-152x152.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc4ffe25d1e6bb1da5c91cad03ff70c6e608d1bc
GIT binary patch
literal 13861
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-180x180.png
b/ui/src/app/apple-touch-icon-180x180.png
new file mode 100644
index 0000000000000000000000000000000000000000..68f6b0810347c268ad67d9a28d028c4c5078d358
GIT binary patch
literal 15806
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
IM6N<$f@3((RsaA1
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-57x57.png
b/ui/src/app/apple-touch-icon-57x57.png
new file mode 100644
index 0000000000000000000000000000000000000000..da48961409abf3541aac7f903b82d34ca53e1c41
GIT binary patch
literal 3613
zcmZ{nWmFRm7sdw+M%RcDf}|oKHEITI3>YyPC5@wGluAkGsKF>f{-A_^KuV>gN4JO|
zNOwxNAV~P~etbW?_nhbc&VBBA&bePN0rN<cftH&V001y(p^ygGRQ|81sjfQ_f{(lg
z&=HP?0{|6?bQd<1*Yiy~lmQw5@D~LDLL&fxKi5|1Iso7;4FGIn0RUJ!0KoYovqAs<
z^@7S)M-zF?>pD{-g<ON?1<K450H6c^S7d-UnUHG}<fVmH2hD?M!7_5M`_=NUuc6mM
z!i{iqvv1vqSzX>eA&x)&>YoSrG|kDMQu5%fh;70n=|H2ra0JE)pCals%wZ(&EOck2
zsCZa!2UJqPUs7azhLMjS7VfjKpg|yTcpdP;7)DJDNUX4GT^P5TCT)=d=CjZH`!}Kk
znraSg_pDrXkDgd<IR75lzQ~sId^(Wf8JTT#d^&A|rQ4TTaK>^a9nKk3@d9fon8;NC
zqGZUG&O#%0V|L@&k0lny)y02RMz`ZbJQLU0RE>_oB@KIs#6w=ECy5~ARizztt4}C9
zU6$M?dq}=o5oNvvQioMohSP(44;0Mfi!kzroZfvgjR^S41TFrHBmW(kpzs>gPbjT2
z+B4OzEb$P4*OIr0l>8yJ&XaXDlQ2ckc^sEMlnH<ghYi@ZB(jN(a`E*u<tvF}DH4)7
zO;T$^8gyBuY9zcrlM~TMeAa|l5?Dz&1196QV!kPTGy;iksiIKkFf8Jb7DW)%Ka%O2
zlM-Z)P6aqZ{J%}#7Z%y(?@_rFTs*T{zjCjdBj?BHBLonf#?l|sSglCezRSkxLyN&t
zroe~XWIP<dVqWsvEj5o55*U+G#Z6NLxot+mLp#Ie+$v`opiHR1%|9bTh7so>;Scwf
zws|^$kxB?!F*epJ<~(Jbf|`<fkJ~&x<U)CAS`j?I9~`qC7~LR{OJX_^c`}%B+GCO&
zlvV|ekg-ytA-8S|&1F_i`Z3+|tL0QGC~m#*UIpI>M4H@`dN{}_BApFwaJv8}(5+Yf
z;%_6n5#f2mv*r#fj*8Iu=BrM~j+;E~0g6-Lwy(O?O<>}l{Yo>O^q_0MVYJY6NTns^
zBxf$#&rfOs$g=Uw2F~m#1Eik{fX4nhfmLvb6(rRjBwi{GosSEQ`YBge?Tv0bdKB>U
zbvzX-z{0}-zSIJ@m>8zc*vu5P+<!2ST0GKCEf2}OkZPfto^K_*s)uQ->LY<$c7i#q
z_oCeyQ|{$2xB6k2TQ#Dj%`^)O*66h6lXh;%&xmvBTLOTi0P8PmQJ!d7A7cN=?O<%u
z`w(Br1Jrn-({69epPLOk4k+7pTt>MUH5VW96?K-=Qnx4#D1r5jTxWCWP8;o%6+T%2
zNnRY<+t@RsXumZnmhY6*E9muUEii5diW=iAwk8q1W~DHbbwG;;6|9Gj!5W@hcKNlI
zI)@+LiZ$-huH-J3=E+cbXr^bkUAl5+?LE}pD&{OVi|$>c<`aHb8vjqIWo4SZ@BW2q
zR9fEW4+%v(pWcW5b~|i`;(b10*T<zqxM4vAm$V`OZKqcx6|IBimT)8OLZ9r;2@e*M
z7tMjUiQJLNlY-+WO_?19(W;we;HUHwT(%1}JZrnlnW|$q7K?h)cg^Xi+Pd60f?mqU
z1uqZpUMWRa4GA`F_|q!7X8yCKC=>@d{Txtk@=0L&kMOg<kQnT^wf5OSV)E5+cW_jE
zQFctlK*5D-N=ME#4T!QUrQWH}Lc{DZ^4RLuua~eZsXwNgJ=0E2gq(DsasRrlt^;3T
zVQrC=j<$Wdd${w>BL**m-MXRpAblNkUCPuK)ePLbkn)sKlXUDImZ2peb71f7`TN>7
z=;Ip<3$vJzBoUp)8fpz0im1(>4s^A{f%$yiXlM?VB15yfkKL}`rJI0Y{y4+;K;Lj&
zm8$>b*=O7I8T3`R5Y7#>uCF_Z?V~_BP#V-z6<bE<i>nUo_Wqf>mBQd)|EUcUSKPVA
zU_kYl`N<Vad*_{*IS@5?I_YIXl^yPiIm?WY_Dnsh#>-}KWZZJDdhTR|J4~203M4U>
z2@`Q)+IfF+YW+Cy0H3}TzSP*9KgqTm{~UZ0e8Uijr2^}UQPCDzG6?0g8I^%D0*<p}
z+a;JTrvK_5Ec}oo@)N|~r!jp@tlRntPm_9RQ{5-^1bO*Qt<FyJ)l#cpbgCE2!4&BW
znzH5mIeaR{ShzZ-IhOBCwuDR83*66g+;1)mTy;_5S}qHb)+jW7FRTWkAAn9=JY0?Q
zx$BVczm#DQDyUdZ$Kl`yC+#b8FsUmBn{6IsUM$ybyJ4FVBYnkKi7N?NUw>)^m-#G^
zMd0d?`x{9$XI4Q1N*B?_c3Ng4%jf@cGc{`CaFawwjWt{n4`DLARIlRto}h`>M6$?f
zLC!g*CXP;$2AjsPu6=g#>H#Y6klk36uWbO{{6`B3<B6ipn=o$C>Wz)iP`$@kMWNBg
zf0L*(G41>_bbICBT1xN5Q~(eeF<~m|9A@Y3^Dh?(Z{0}q$`~j9E<-H{^a5oo5D<x(
zmr-0P5uwqd5BpAM-|<nN>{TzbCMPrzCax8oJp8_h3AfM8E67Mt&1HmU<CAh2{kkdz
zIhlAGVdTLaP+Y6ayCj6zgT%tO&GxOx&~X1&xYW;1@~rWpz$LF<hYm5t(hm#rw-zuL
z+fzoyo058YH||1j05-XCN0>b%SHnAhR-6)57QRr;T*!42+MatyX{R3%%Pk?ZY}l6&
z^o{P@_-hw<;aJ>)KaD6aipj`gVXa)awcsnLez~E`_i$279Emg+cDWT8GR<~;68XCv
zsU8D@SHJzsGXME0<G&OFTZlo*3}lqb>Apzdek`lsx)+=s3AT;BU!ONXG2P9<3~H3C
zwqz)~#Y+&zTQO~sIMESvsmIE7^v4{zV6*lgGpl{c<RMoZ#+KFQy@5Psd<@~E<aM%t
z_xJ4XpB#2xX!s;})z!Zpch<}P#nWc(0m^sz{`3(Jgt&JLDu>8p=-NsiZkW`Y4%ln@
zJy-h@W*%Sv)H`g}&YO|<7=k7Ui&n7INAH|(5+4gaPAGtQUOgyf^<A7$kuj(v=I+cz
zq8cEE^}KF;@FQ3qb^Gng^_TsX_mbC<k4}in*-e^q&4+p1D#2q(wK}PE2=m^90=Q-7
z&zgA38cUVFlH?_)<i2{NALzs0MHL&f)jOqS!Hk{;mjC)Om<N1M68NHya;NMqP98D?
zo9#SW*vR7g`^Rgbv`L#papwm2A_Sd<{Zj6@yvnZd@uSDqsE(O|WTt0t)V;nu!zZC$
zQQuZuuoYJGCg-22@R6M_j^x#!)yX={+YDyQ^!%&U;pM`T&ieY5EX>}lDZdjdro0vk
z*m*%OB^l$W1PS)v6>zk%>zG=Ns{WeT^LkAs;eP3tfh{E`4AE9}@=<}jK}HDGWs^JP
z0lx9+_Vec*rXn>oH!^a$7=MrU1n_y>pB_N^5};b;2C6hGBj=lWd%$?|p2OCBLj!Rl
z5@AD@T@6m1==W9+K$sO(e7L-s&#+V%E}|j7c`iN7X@Bqbyvoea08QEMFxxf{v$n(J
zwsZ?B+n+r7yqm!6jDh+fcf^H)pG6_py*Ix-Q`fY9P`gNKNWj4#H}>Xy=aOgx9UH#|
zMVnXI;>FBS^Z}ucg|J4J)cNA>)B&t<Vfkn9Y4@VS+pj~Jq1K+8S2sx(Dl6!g*GiE}
z3DVu6v@#B~mFpL(&66h=Uy;!-W!lq(Pz=IUc9AvhicOVeyLFNZ9|;k$)EcdntLY{u
zN~>ID_cO%58g`)Zg+E>KuoL+l8@=<Mk^Z}~0qOZz!ZO5;KAagU-D(g!Y(m+4A@Ib_
zzdO^`AP%xIyGiE^tUxecXqH~A5$%+Y=#@l<ciD0t7j+>>y!vQ*A9gUuB=|AC@5>Rs
zrN}A8Aw+zYJ<33h?S|fas&M~saFki%>m#UD5N1TI4siBmG&+hoEDi{!lY=;uw>kMF
zyxsLC#9-A=eT8TC(>(sc@2vS2AG=j4p<kKj*3lKRVtB0u_HJvf*=od^{HC1XT-nTZ
zFnz5inaBc9C=6i>r>*Diq~+#{(N*kmY4ACRvrnJ6vMdhdioiCw{C4*JPpHk)bD5`i
zN27i<jHxC)Gu9eAv2<0yRD3;;f_iPK50-q@X0gyP$n6JnGrGa5R=?K>RXuokRF}|0
z3LT#`%}Th#UKS`SbK%})5EN(UF_l{ksz}Cu{N-#!$uJvHJ4j)cmQu&^nDb#oMi1qn
zMXI_NovlgE=n8pDh!!C{?7T;g@tcyRYs2d#0^AlZMCO8-_J&aiTE6Apl`wloWH{hW
z7-zOY(C|0tH_L=;``j7<%!y5jy+EIVB@)In-O@cbu)szrKPof~RTtopVWDY|{bqYV
zaJE8`Nq3EmKVpIoPh%+&<xTmuAlE^y4fC+0hV`wiP9B=5Xbm)W9h}6im#Q769<S<E
z7W}fo!WU<B_KLJ+>H4Y+H{tHI1eQJyDq>RRD%7*mJUG_TC1mj7ZwTuegrZGtTf^+h
z1)GUcaD0(oqJN{yLbj*Dp8ws{NT)ehm4UEru1bufe&wstjc5qE6u}YPnf=Kp(i2l3
zSh}K?V4`VnKy1uAwW;wq^Oe#A<m_E8hWEWm@8lSyTv!XRwAvUvtEE}7|DGMZ+st_w
zvTEsM4>PepxPFyHywpv->}|XpV0Io3*8s>$%g9SgD@w{p8_6icpvo|L8F6V@n6&in
hyR_K<3AjDCcY5mg{{uOfcNMM!04?=L$WjD0{67>nq4NL$
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-60x60.png
b/ui/src/app/apple-touch-icon-60x60.png
new file mode 100644
index 0000000000000000000000000000000000000000..511e9caba56c8e2d7b134daed93455df156accb0
GIT binary patch
literal 3839
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
B4j=#k
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-72x72.png
b/ui/src/app/apple-touch-icon-72x72.png
new file mode 100644
index 0000000000000000000000000000000000000000..59a498c7b14870da4bf3642604e53411de735141
GIT binary patch
literal 4862
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-76x76.png
b/ui/src/app/apple-touch-icon-76x76.png
new file mode 100644
index 0000000000000000000000000000000000000000..c145ad38c0e5c77b76e9277498eaebdcb3200d44
GIT binary patch
literal 5193
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
Bn#=$I
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon-precomposed.png
b/ui/src/app/apple-touch-icon-precomposed.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c7bdee612920f195195e8cf566a6467bb8e38ef
GIT binary patch
literal 16413
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/apple-touch-icon.png b/ui/src/app/apple-touch-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..68f6b0810347c268ad67d9a28d028c4c5078d358
GIT binary patch
literal 15806
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
IM6N<$f@3((RsaA1
literal 0
HcmV?d00001
diff --git a/ui/src/app/browserconfig.xml b/ui/src/app/browserconfig.xml
new file mode 100644
index 0000000..2b6279c
--- /dev/null
+++ b/ui/src/app/browserconfig.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+ <msapplication>
+ <tile>
+ <square70x70logo src="mstile-70x70.png"/>
+ <square150x150logo src="mstile-150x150.png"/>
+ <square310x310logo src="mstile-310x310.png"/>
+ <wide310x150logo src="mstile-310x150.png"/>
+ <TileColor>#4d4d4d</TileColor>
+ </tile>
+ </msapplication>
+</browserconfig>
diff --git a/ui/src/app/css/bootstrap.custom.scss b/ui/src/app/css/bootstrap.custom.scss
new file mode 100755
index 0000000..d0f2f04
--- /dev/null
+++ b/ui/src/app/css/bootstrap.custom.scss
@@ -0,0 +1,86 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Override Bootstrap SASS variables
+@import "theme-default/modules/wok-variables";
+
+// bower:scss
+@import "bower_components/compass-mixins/lib/compass";
+// endbower
+
+// Bootstrap custom imports
+@import "theme-default/modules/bootstrap-wok";
+
+// Bootstrap select plugin
+@import "theme-default/modules/bootstrap-select";
+
+// Override Bootstrap mixin
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 80px !important;
+ padding-right: 60px !important;
+}
+
+// Override alert
+
+.alert {
+ border-width: $alert-border-width;
+}
+
+.hide-content {
+ display: none !important;
+}
+
+
+// Login
+@import "theme-default/modules/login";
+
+// Topbar and navigation
+@import "theme-default/modules/toolbar";
+
+// Buttons
+@import "theme-default/modules/buttons";
+
+// Dialog Flat
+@import "theme-default/modules/dialog-flat";
+
+// Dropdown Button - Flat
+@import "theme-default/modules/menu-flat";
+
+pre {
+ margin-top: 20px;
+}
+
+// Media queries
+
+@media screen and (min-width: 768px) {
+
+ .container {
+ width: 1540px;
+ }
+
+}
+
+@media screen and (min-width: 1680px) {
+
+ .container {
+ width: 1540px;
+ }
+
+}
\ No newline at end of file
diff --git a/ui/src/app/css/fontawesome.scss b/ui/src/app/css/fontawesome.scss
new file mode 100644
index 0000000..346018b
--- /dev/null
+++ b/ui/src/app/css/fontawesome.scss
@@ -0,0 +1,17 @@
+/*!
+ * Font Awesome 4.3.0 by @davegandy -
http://fontawesome.io - @fontawesome
+ * License -
http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+
+@import "theme-default/modules/variables";
+@import "bower_components/fontawesome/scss/mixins";
+@import "theme-default/modules/path";
+@import "bower_components/fontawesome/scss/core";
+@import "bower_components/fontawesome/scss/larger";
+@import "bower_components/fontawesome/scss/fixed-width";
+@import "bower_components/fontawesome/scss/list";
+@import "bower_components/fontawesome/scss/bordered-pulled";
+@import "bower_components/fontawesome/scss/animated";
+@import "bower_components/fontawesome/scss/rotated-flipped";
+@import "bower_components/fontawesome/scss/stacked";
+@import "bower_components/fontawesome/scss/icons";
diff --git a/ui/src/app/css/theme-default/button-flat.css
b/ui/src/app/css/theme-default/button-flat.css
new file mode 100755
index 0000000..0897b10
--- /dev/null
+++ b/ui/src/app/css/theme-default/button-flat.css
@@ -0,0 +1,135 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ui-button {
+ display: inline-block;
+ position: relative;
+ color: #FFFFFF;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ border-radius: 3px;
+ border: 1px none;
+ background: #4e4d4f;
+ font-weight: normal;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button:hover{
+ background: #000000;
+ font-weight: normal;
+}
+.ui-button:active {
+ background: #4e4d4f;
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see
h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
diff --git a/ui/src/app/css/theme-default/checkbox-flat.css
b/ui/src/app/css/theme-default/checkbox-flat.css
new file mode 100644
index 0000000..b8712b3
--- /dev/null
+++ b/ui/src/app/css/theme-default/checkbox-flat.css
@@ -0,0 +1,25 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ .checkbox-item {
+ cursor: pointer;
+ }
+
+ .checkbox-inline {
+ display: inline-block;
+ }
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/gauge-flat.css
b/ui/src/app/css/theme-default/gauge-flat.css
new file mode 100755
index 0000000..2aa09da
--- /dev/null
+++ b/ui/src/app/css/theme-default/gauge-flat.css
@@ -0,0 +1,52 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.ui-gauge-flat {
+ height: 15px;
+ width: 100px;
+ text-align: left;
+ overflow: hidden;
+ background: #E6E7E8;
+ border: 0 none;
+ border-radius: 0;
+}
+
+.ui-gauge-flat .ui-gauge-flat-value {
+ margin: -1px;
+ height: 100%;
+ border-radius: 0;
+}
+
+.ui-gauge-flat .red {
+ background: #D9182D;
+ border:1px solid #D9182D;
+}
+
+.ui-gauge-flat .blue {
+ background: #008ABF;
+ border:1px solid #008ABF;
+}
+
+.ui-gauge-flat .yellow {
+ background: #FDB813;
+ border:1px solid #FDB813;
+}
+
+.ui-gauge-flat .purple {
+ background: #7F1C7D;
+ border:1px solid #7F1C7D;
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/list-flat.css
b/ui/src/app/css/theme-default/list-flat.css
new file mode 100644
index 0000000..ba0439d
--- /dev/null
+++ b/ui/src/app/css/theme-default/list-flat.css
@@ -0,0 +1,83 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.list-titlef {
+ height: 30px;
+ line-height: 30px;
+ width: 25%;
+ border-bottom: 1px solid #DEDEDE;
+ color: #626262;
+ font-size: 17px;
+ padding: 10px 0;
+ background: white;
+}
+
+.list-content {
+ height: 300px;
+ width: 25%;
+}
+
+.list-item {
+ border-bottom: 1px solid #F5F5F5;
+ height: 40px;
+}
+
+.list-item-odd {
+ background: #FFFFFF;
+}
+
+.list-item-even {
+ background: #FCFCFC;
+}
+
+.list-item:hover {
+ background: #DDDDDD;
+}
+
+.list-inline {
+ display: inline-block;
+}
+
+.list-item-icon {
+ line-height: 20px;
+ vertical-align: 35%;
+}
+
+.list-item-info {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+.list-item-name {
+ font-size: 14px;
+ line-height: 14px;
+ padding: 9px 0 0;
+}
+
+.list-item-button {
+ position: relative;
+ width: 150px;
+ padding: 5px;
+ float: right;
+}
+
+.list-item-detail {
+ font-size: 11px;
+ color: #CDCDCD;
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/menu-flat.css
b/ui/src/app/css/theme-default/menu-flat.css
new file mode 100644
index 0000000..385a312
--- /dev/null
+++ b/ui/src/app/css/theme-default/menu-flat.css
@@ -0,0 +1,89 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.menu-content {
+ position: relative;
+ height: 35px;
+ width: 170px;
+}
+
+.menu-box {
+ width: 100%;
+ height: 30px;
+ border-radius: 3px 3px 0 3px;
+ cursor: pointer;
+ vertical-align: middle;
+ background: #4E4D4F;
+ color: #EDEDED;
+ float: right;
+ position: relative;
+ padding-bottom: 5px;
+}
+
+.menu-label {
+ position: relative;
+}
+
+.menu-icon-front,
+.list-icon-front {
+ position: relative;
+ font-size: 17px;
+ line-height: 32px;
+ padding-right: 10px;
+ padding-left: 5px;
+ color: #EDEDED;
+}
+
+.menu-icon {
+ position: relative;
+ float: right;
+ line-height: 35px;
+ padding-right: 10px;
+ padding-left: 10px;
+ color: #CFCFCF;
+ font-size: 10px;
+ border-top-right-radius: 3px;
+}
+
+.menu-container {
+ border: 1px solid #999999;
+ width: 100px;
+}
+
+.menu-list {
+ position: absolute;
+ z-index: 3;
+ float: right;
+ width: 100%;
+ top: 35px;
+ padding-left: 0;
+ cursor: pointer;
+ background: #3A393B;
+ margin: 0;
+}
+
+.menu-list li {
+ list-style: none;
+ position: relative;
+ color: #EDEDED;
+ border-top: 1px groove black;
+}
+
+.menu-list li:first-child {
+ border: none;
+}
diff --git a/ui/src/app/css/theme-default/message-flat.css
b/ui/src/app/css/theme-default/message-flat.css
new file mode 100644
index 0000000..8281bff
--- /dev/null
+++ b/ui/src/app/css/theme-default/message-flat.css
@@ -0,0 +1,87 @@
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+.border-grey {
+ background-clip: border-box;
+ border: 6px solid rgba(170,170,170,0.3);
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ width: 502px;
+ height: 202px;
+ border-radius: 5px;
+}
+
+.message-dialog {
+ border: 3px solid #999999;
+ height: 198px;
+ width: 498px;
+ background: white;
+}
+
+.message-dialog .message-inline {
+ display: inline-block;
+}
+
+.message-dialog .message-type-icon {
+ position: absolute;
+ margin: 20px 20px;
+ color: #008ABF;
+ font-size: 50px;
+}
+
+.message-dialog .message-main {
+ position: relative;
+ margin: 30px 0 0 110px;
+ width: 350px;
+}
+
+.message-dialog .message-confirm-info {
+ margin: 20px 0 0 110px;
+ width: 350px;
+}
+
+.message-dialog .message-footer {
+ position: absolute;
+ left: 3px;
+ right: 1px;
+ bottom: 1px;
+ height: 50px;
+ background-color: #008ABF;
+}
+
+.message-dialog .message-footer .message-button {
+ display: inline-block;
+ background-color: white;
+ width: 75px;
+ height: 30px;
+ line-height: 30px;
+ position: relative;
+ margin-left: 10px;
+ margin-top: 10px;
+ text-align: center;
+ vertical-align: middle;
+}
+
+.message-dialog .message-footer .message-button:hover{
+ background-color: #EEEEEE;
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/messagebar-flat.css
b/ui/src/app/css/theme-default/messagebar-flat.css
new file mode 100644
index 0000000..d5efc8e
--- /dev/null
+++ b/ui/src/app/css/theme-default/messagebar-flat.css
@@ -0,0 +1,64 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.messagebar {
+ height: 30px;
+}
+
+.messagebar .messagebar-text {
+ text-align: left;
+ vertical-align: 50%;
+}
+
+.messagebar .messageHead {
+ display: inline-block;
+ width: 5px;
+ height: 30px;
+}
+
+.messagebar-close {
+ line-height: 30px;
+ vertical-align: middle;
+ margin-right: 10px;
+ cursor: pointer;
+ float: right;
+}
+
+.green {
+ background-color: #DAE6CB;
+}
+
+.dark-green {
+ background-color: #89C53A;
+}
+
+.yellow {
+ background-color: #F1E3C2;
+}
+
+.dark-yellow {
+ background-color: #FDB60D;
+}
+
+.red {
+ background-color: #EAC3C7;
+}
+
+.dark-red {
+ background-color: #D81227;
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/modules/_animation.scss
b/ui/src/app/css/theme-default/modules/_animation.scss
new file mode 100644
index 0000000..bd87463
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_animation.scss
@@ -0,0 +1,15 @@
+/*
+ Animation example, for spinners
+*/
+.animate-spin {
+ @include animation(spin 2s infinite linear);
+ display: inline-block;
+}
+@keyframes spin {
+ 0% {
+ @include transform(rotate(0deg));
+ }
+ 100% {
+ @include transform(rotate(359deg));
+ }
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/modules/_base.scss
b/ui/src/app/css/theme-default/modules/_base.scss
new file mode 100644
index 0000000..8634998
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_base.scss
@@ -0,0 +1,15 @@
+/* Body specs */
+
+body {
+ color: $text-color;
+ background: $body-bg;
+}
+
+
+/* Message warning users that some features might not be supported in old browsers */
+.browserupgrade {
+ margin: 0.2em 0;
+ background: #ccc;
+ color: #000;
+ padding: 0.2em 0;
+}
diff --git a/ui/src/app/css/theme-default/modules/_bootstrap-official.scss
b/ui/src/app/css/theme-default/modules/_bootstrap-official.scss
new file mode 100644
index 0000000..9613c84
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_bootstrap-official.scss
@@ -0,0 +1,56 @@
+/*!
+ * Bootstrap v3.3.5 (
http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+// Core variables and mixins
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/variables";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/mixins";
+
+// Reset and dependencies
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/normalize";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/print";
+//@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/glyphicons";
+
+// Core CSS
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/scaffolding";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/type";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/code";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/grid";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/tables";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/forms";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/buttons";
+
+// Components
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/component-animations";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/dropdowns";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/button-groups";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/input-groups";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/navs";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/navbar";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/breadcrumbs";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/pagination";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/pager";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/labels";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/badges";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/jumbotron";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/thumbnails";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/alerts";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/progress-bars";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/media";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/list-group";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/panels";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/responsive-embed";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/wells";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/close";
+
+// Components w/ JavaScript
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/modals";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/tooltip";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/popovers";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/carousel";
+
+// Utility classes
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/utilities";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/responsive-utilities";
diff --git a/ui/src/app/css/theme-default/modules/_bootstrap-select.scss
b/ui/src/app/css/theme-default/modules/_bootstrap-select.scss
new file mode 100644
index 0000000..13f8ff2
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_bootstrap-select.scss
@@ -0,0 +1,390 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2013-2015 bootstrap-select
+
+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. */
+
+// Mixins
+@mixin cursor-disabled() {
+ cursor: not-allowed;
+}
+
+// Rules
+.bootstrap-select {
+ /*width: 220px\9; IE8 and below*/
+ //noinspection CssShorthandPropertyValue
+ width: 220px \0; /*IE9 and below*/
+
+ // The selectpicker button
+ > .btn {
+ width: 100%;
+ height: 40px;
+ padding-right: 25px;
+ }
+
+ // Error display
+ .error & .btn {
+ border: 1px solid $color-red-error;
+ }
+
+ // Error display
+ .control-group.error & .dropdown-toggle {
+ border-color: $color-red-error;
+ }
+
+ &.fit-width {
+ width: auto !important;
+ }
+
+
&:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn)
{
+ width: $width-default;
+ }
+
+ .btn:focus {
+ outline: thin dotted #333333 !important;
+ outline: 5px auto -webkit-focus-ring-color !important;
+ outline-offset: -2px;
+ }
+}
+
+.bootstrap-select.form-control {
+ margin-bottom: 0;
+ padding: 0;
+ border: none;
+
+ &:not([class*="col-"]) {
+ width: 100%;
+ }
+}
+
+// The selectpicker components
+.bootstrap-select.btn-group {
+ &:not(.input-group-btn),
+ &[class*="col-"] {
+ float: none;
+ display: inline-block;
+ margin-left: 0;
+ }
+
+ // Forces the pull to the right, if necessary
+ &,
+ &[class*="col-"],
+ .row-fluid &[class*="col-"] {
+ &.dropdown-menu-right {
+ float: right;
+ }
+ }
+
+ .form-search &,
+ .form-inline &,
+ .form-horizontal &,
+ .form-group & {
+ margin-bottom: 0;
+ }
+
+ .form-group-lg &.form-control,
+ .form-group-sm &.form-control {
+ padding: 0;
+ }
+
+ // Set the width of the live search (and any other form control within an inline form)
+ // see
https://github.com/silviomoreto/bootstrap-select/issues/685
+ .form-inline & .form-control {
+ width: 100%;
+ }
+
+ .input-append & {
+ margin-left: -1px;
+ }
+
+ .input-prepend & {
+ margin-right: -1px;
+ }
+
+ > .disabled {
+ @include cursor-disabled;
+
+ &:focus {
+ outline: none !important;
+ }
+ }
+
+ // The selectpicker button
+ .btn {
+ .filter-option {
+ display: inline-block;
+ overflow: hidden;
+ width: 100%;
+ text-align: left;
+ }
+
+ .caret {
+ position: absolute;
+ top: 0;
+ right: 40px;
+ margin-top: 0;
+ vertical-align: top;
+ border: 0;
+ border-left: 1px solid $btn-default-border;
+ height: 38px;
+ }
+
+ .caret:before {
+ content: '\f078';
+ font-family: "FontAwesome";
+ font-size: 15px;
+ color: #666666;
+ position: absolute;
+ left: 12px;
+ top: 9px;
+ display: block;
+ }
+
+ &:hover .caret {
+ border-color: darken($btn-default-border, 12%);
+ }
+
+ &:focus .caret {
+ border-color: darken($btn-default-border, 25%);
+ }
+
+ }
+
+ &[class*="col-"] .btn {
+ width: 100%;
+ }
+
+ // The selectpicker dropdown
+ .dropdown-menu {
+ min-width: 100%;
+ z-index: $zindex-select-dropdown;
+ box-sizing: border-box;
+
+ &.inner {
+ position: static;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ border-radius: 0;
+ box-shadow: none;
+ }
+
+ li {
+ position: relative;
+
+ &:not(.disabled) a:hover small,
+ &:not(.disabled) a:focus small,
+ &.active:not(.disabled) a small {
+ color: $color-blue-hover;
+ color: fade($color-blue-hover, 40%);
+ }
+
+ &.disabled a {
+ @include cursor-disabled;
+ }
+
+ a {
+ outline: none;
+ cursor: pointer;
+
+ &.opt {
+ position: relative;
+ padding-left: 2.25em;
+ }
+
+ span.check-mark {
+ display: none;
+ }
+ span.text {
+ display: inline-block;
+ }
+ }
+
+ small {
+ padding-left: 0.5em;
+ }
+ }
+
+ .notify {
+ position: absolute;
+ bottom: 5px;
+ width: 96%;
+ margin: 0 2%;
+ min-height: 26px;
+ padding: 3px 5px;
+ background: rgb(245, 245, 245);
+ border: 1px solid rgb(227, 227, 227);
+ box-shadow: inset 0 1px 1px fade(rgb(0, 0, 0), 5%);
+ pointer-events: none;
+ opacity: 0.9;
+ box-sizing: border-box;
+ }
+ }
+
+ .no-results {
+ padding: 3px;
+ background: #f5f5f5;
+ margin: 0 5px;
+ }
+
+ &.fit-width .btn {
+ .filter-option {
+ position: static;
+ }
+
+ .caret {
+ position: static;
+ top: auto;
+ margin-top: -1px;
+ }
+ }
+
+ &.show-tick .dropdown-menu li {
+ &.selected a span.check-mark {
+ position: absolute;
+ display: inline-block;
+ right: 15px;
+ margin-top: 5px;
+ }
+
+ a span.text {
+ margin-right: 34px;
+ }
+ }
+}
+
+.bootstrap-select.show-menu-arrow {
+ &.open > .btn {
+ z-index: $zindex-select-dropdown + 1;
+ }
+
+ .dropdown-toggle {
+ &:before {
+ content: '';
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom-width: 7px;
+ border-bottom-style: solid;
+ border-bottom-color: $color-grey-arrow;
+ border-bottom-color: fade($color-grey-arrow, 20%);
+ position: absolute;
+ bottom: -4px;
+ left: 9px;
+ display: none;
+ }
+
+ &:after {
+ content: '';
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid white;
+ position: absolute;
+ bottom: -4px;
+ left: 10px;
+ display: none;
+ }
+ }
+
+ &.dropup .dropdown-toggle {
+ &:before {
+ bottom: auto;
+ top: -3px;
+ border-bottom: 0;
+ border-top-width: 7px;
+ border-top-style: solid;
+ border-top-color: $color-grey-arrow;
+ border-top-color: fade($color-grey-arrow, 20%);
+ }
+
+ &:after {
+ bottom: auto;
+ top: -3px;
+ border-top: 6px solid white;
+ border-bottom: 0;
+ }
+ }
+
+ &.pull-right .dropdown-toggle {
+ &:before {
+ right: 12px;
+ left: auto;
+ }
+
+ &:after {
+ right: 13px;
+ left: auto;
+ }
+ }
+
+ &.open > .dropdown-toggle {
+ &:before,
+ &:after {
+ display: block;
+ }
+ }
+}
+
+.bootstrap-select.btn-group.open {
+
+ .btn .caret {
+ border-left-color: darken($btn-default-border, 12%);
+ }
+
+ .btn:hover .caret {
+ border-left-color: darken($btn-default-border, 25%);
+ }
+
+}
+
+.bs-searchbox,
+.bs-actionsbox {
+ padding: 4px 8px;
+}
+
+.bs-actionsbox {
+ float: left;
+ width: 100%;
+ box-sizing: border-box;
+
+ & .btn-group button {
+ width: 50%;
+ }
+}
+
+.bs-searchbox {
+ & + .bs-actionsbox {
+ padding: 0 8px 4px;
+ }
+
+ & input.form-control {
+ margin-bottom: 0;
+ width: 100%;
+ }
+}
+
+.mobile-device {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block !important;
+ width: 100%;
+ height: 100% !important;
+ opacity: 0;
+}
diff --git a/ui/src/app/css/theme-default/modules/_bootstrap-wok.scss
b/ui/src/app/css/theme-default/modules/_bootstrap-wok.scss
new file mode 100644
index 0000000..ad294d0
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_bootstrap-wok.scss
@@ -0,0 +1,55 @@
+/*!
+ * Bootstrap v3.3.5 (
http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+// Core variables and mixins
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/mixins";
+
+// Reset and dependencies
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/normalize";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/print";
+//@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/glyphicons";
// Removing Glyphicons due to Fedora font files legal issue
+
+// Core CSS
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/scaffolding";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/type";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/code";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/grid";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/tables";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/forms";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/buttons";
+
+// Components
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/component-animations";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/dropdowns";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/button-groups";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/input-groups";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/navs";
+@import "theme-default/modules/navbar-flat";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/breadcrumbs";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/pagination";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/pager";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/labels";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/badges";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/jumbotron";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/thumbnails";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/alerts";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/progress-bars";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/media";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/list-group";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/panels";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/responsive-embed";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/wells";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/close";
+
+// Components w/ JavaScript
+@import "theme-default/modules/modal-flat";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/tooltip";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/popovers";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/carousel";
+
+// Utility classes
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/utilities";
+@import
"bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap/responsive-utilities";
diff --git a/ui/src/app/css/theme-default/modules/_buttons.scss
b/ui/src/app/css/theme-default/modules/_buttons.scss
new file mode 100644
index 0000000..e01a337
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_buttons.scss
@@ -0,0 +1,8 @@
+.btn {
+ font-family: $font-family-base;
+ font-size: 13pt;
+}
+
+.btn-login {
+ @include button-variant($btn-login-color, $btn-login-bg, $btn-login-border);
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/modules/_dialog-flat.scss
b/ui/src/app/css/theme-default/modules/_dialog-flat.scss
new file mode 100644
index 0000000..25a095d
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_dialog-flat.scss
@@ -0,0 +1,71 @@
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+.dialog-border-grey {
+ background-clip: border-box;
+ border: 6px solid rgba(170,170,170,0.3);
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ border-radius: 5px;
+}
+
+.dialog-container {
+ border: 3px solid #999999;
+ background: white;
+}
+
+.dialog-container .dialog-title {
+ height: 60px;
+ padding: 20px 0 20px 20px;
+ margin: 0;
+ float: left;
+ font-size: 27px;
+ font-family: $font-family-light;
+ font-weight: 300 !important;
+}
+
+.dialog-container .dialog-body {
+ position: relative;
+}
+
+.dialog-container .dialog-footer {
+ height: 50px;
+ background-color: #008ABF;
+}
+
+.dialog-container .dialog-footer .dialog-button {
+ display: inline-block;
+ background-color: white;
+ width: 75px;
+ height: 30px;
+ line-height: 30px;
+ position: relative;
+ margin-left: 10px;
+ margin-top: 10px;
+ text-align: center;
+ vertical-align: middle;
+}
+
+.dialog-container .dialog-footer .dialog-button:hover{
+ background-color: #EEEEEE;
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/modules/_login.scss
b/ui/src/app/css/theme-default/modules/_login.scss
new file mode 100644
index 0000000..f0443a9
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_login.scss
@@ -0,0 +1,34 @@
+.login-area {
+ margin: 90px auto 0;
+ width: 300px;
+
+ .btn-login {
+ display: block;
+ position: static;
+ float: none;
+ margin-bottom: 50px;
+ }
+
+ .col-md-12, .col-lg-12 {
+ width: 100%;
+ }
+
+ .bootstrap-select,
+ .selectpicker {
+ font-family: $font-family-light;
+ font-size: 13pt;
+ }
+
+ .dropdown-toggle.selectpicker {
+ height: 40px;
+ }
+
+ .form-group {
+ margin-bottom: 20px;
+ }
+
+ .form-group:last-child {
+ margin-bottom: 0;
+ }
+
+}
diff --git a/ui/src/app/css/theme-default/modules/_menu-flat.scss
b/ui/src/app/css/theme-default/modules/_menu-flat.scss
new file mode 100644
index 0000000..50b18d8
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_menu-flat.scss
@@ -0,0 +1,337 @@
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+
+//
+// Menu-Flat Drop-Down
+// --------------------------------------------------
+
+// Dropdown arrow/caret
+
+.menu-flat {
+
+ .btn {
+ background: $kimchi-dropdown !important;
+ min-width: 160px;
+ border: 0 !important;
+ font-family: $font-family-bold;
+ font-weight: 700;
+ font-size: $font-size-btn;
+ position: relative;
+ height: 40px;
+ padding: 4px 45px 5px 38px;
+
+ & > i {
+ font-size: 22px;
+ vertical-align: bottom;
+ width: 26px;
+ height: 40px;
+ text-align: left;
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 6px;
+ }
+
+ & > i:before {
+ line-height: 40px;
+ }
+
+ }
+
+ .caret {
+ position: absolute;
+ top: 0;
+ right: 0;
+ display: block;
+ width: 40px;
+ height: 40px;
+ margin-left: 0;
+ vertical-align: middle;
+ border-top: 0;
+ border-top: 0 \9;
+ border-right: 0;
+ border-left: 0;
+
+ &:before {
+ font-family: "fontello";
+ font-style: normal;
+ font-weight: normal;
+ font-size: 13px;
+ speak: none;
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1.2em;
+ height: 1.2em;
+ margin: .5em;
+ text-align: center;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 2em;
+ content: '\e861';
+ }
+
+ }
+
+
+
+ // The dropdown wrapper (div)
+ &.dropup,
+ &.dropdown {
+ position: relative;
+ }
+
+ // Prevent the focus on the dropdown toggle when closing dropdowns
+ .dropdown-toggle:focus {
+ outline: 0;
+ }
+
+ // The dropdown menu (ul)
+ .dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: $zindex-dropdown;
+ display: none; // none by default, but block on "open" of the menu
+ float: left;
+ min-width: 160px;
+ padding: 0;
+ margin: 0; // override default ul
+ list-style: none;
+ font-size: $font-size-btn;
+ text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal
footer)
+ background-color: $menu-flat-dropdown-bg;
+ border: 0;
+ border-radius: 0;
+ @include box-shadow(none !important);
+ background-clip: padding-box;
+
+ // Aligns the dropdown menu to right
+ //
+ // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
+ &.pull-right {
+ right: 0;
+ left: auto;
+ }
+
+ // Dividers (basically an hr) within the dropdown
+ .divider {
+ @include nav-divider($menu-flat-dropdown-divider-bg);
+ }
+
+ > li > a {
+ //border-top: 1px solid $menu-flat-dropdown-divider-bg;
+ border-top: 1px solid $menu-flat-dropdown-border;
+ @include box-shadow(inset 0px 1px 0px 0px $menu-flat-dropdown-divider-bg);
+ }
+
+ > li:first-child > a {
+ border-top: 1px solid $menu-flat-dropdown-bg;
+ @include box-shadow(none);
+ }
+
+ > li.critical:last-child > a {
+ @include box-shadow(none);
+ }
+
+ // Links within the dropdown menu
+ > li > a {
+ display: block;
+ padding: 4px 6px;
+ clear: both;
+ font-weight: normal;
+ line-height: $line-height-menu-flat;
+ color: $menu-flat-text;
+ white-space: nowrap; // prevent links from randomly breaking onto new lines
+
+ > i {
+ font-size: 22px;
+ margin-right: 10px;
+ vertical-align: top;
+ width: 26px;
+ height: 26px;
+ text-align: left;
+ display: inline-block;
+ }
+
+ }
+ }
+
+ // Hover/Focus state
+ .dropdown-menu > li > a {
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: $menu-flat-dropdown-link-hover-color;
+ background-color: $menu-flat-dropdown-link-hover-bg;
+ }
+ }
+
+ // Active state
+ .dropdown-menu > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $menu-flat-dropdown-link-active-color;
+ text-decoration: none;
+ outline: 0;
+ background-color: $menu-flat-dropdown-link-active-bg;
+ }
+ }
+
+
+ .dropdown-menu > li.critical > a {
+ background: $menu-flat-dropdown-critical-bg;
+ }
+
+ // Disabled state
+ //
+ // Gray out text and ensure the hover/focus state remains gray
+
+ .dropdown-menu > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $dropdown-link-disabled-color;
+ }
+
+ // Nuke hover/focus effects
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none; // Remove CSS gradient
+ @include reset-filter;
+ cursor: $cursor-disabled;
+ }
+ }
+
+ // Open state for the dropdown
+ &.open {
+
+ .btn {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+ }
+
+ // Show the menu
+ > .dropdown-menu {
+ display: block;
+ }
+
+ .caret {
+ background: #3a393b;
+ }
+
+ .caret:before {
+ content: '\e864';
+ }
+
+ // Remove the outline when :focus is triggered
+ > a {
+ outline: 0;
+ }
+ }
+
+}
+
+// Menu positioning
+//
+// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
+// menu with the parent.
+.dropdown-menu-right {
+ left: auto; // Reset the default from `.dropdown-menu`
+ right: 0;
+}
+// With v3, we enabled auto-flipping if you have a dropdown within a right
+// aligned nav component. To enable the undoing of that, we provide an override
+// to restore the default dropdown menu alignment.
+//
+// This is only for left-aligning a dropdown menu within a `.navbar-right` or
+// `.pull-right` nav component.
+.dropdown-menu-left {
+ left: 0;
+ right: auto;
+}
+
+// Dropdown section headers
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: $font-size-small;
+ line-height: $line-height-base;
+ color: $dropdown-header-color;
+ white-space: nowrap; // as with > li > a
+}
+
+// Backdrop to catch body clicks on mobile, etc.
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: ($zindex-dropdown - 10);
+}
+
+// Right aligned dropdowns
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+//
+// Just add .dropup after the standard .dropdown class and you're set, bro.
+// TODO: abstract this so that the navbar fixed styles are not placed here?
+
+.dropup,
+.navbar-fixed-bottom .dropdown {
+ // Reverse the caret
+ .caret {
+ border-top: 0;
+ border-bottom: $caret-width-base dashed;
+ border-bottom: $caret-width-base solid \9; // IE8
+ content: "";
+ }
+ // Different positioning for bottom up menu
+ .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+ }
+}
+
+
+// Component alignment
+//
+// Reiterate per navbar.less and the modified component alignment there.
+
+@media (min-width: $grid-float-breakpoint) {
+ .navbar-right {
+ .dropdown-menu {
+ right: 0; left: auto;
+ }
+ // Necessary for overrides of the default right aligned menu.
+ // Will remove come v4 in all likelihood.
+ .dropdown-menu-left {
+ left: 0; right: auto;
+ }
+ }
+}
diff --git a/ui/src/app/css/theme-default/modules/_mixins.scss
b/ui/src/app/css/theme-default/modules/_mixins.scss
new file mode 100644
index 0000000..effa63b
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_mixins.scss
@@ -0,0 +1,13 @@
+// Mixins
+
+@mixin font-face($font-family, $file-path, $font-weight, $font-style) {
+ @font-face {
+ font-family: $font-family;
+ src: url('#{$file-path}.eot');
+ src: url('#{$file-path}.eot?#iefix') format('embedded-opentype'),
+ url('#{$file-path}.woff') format('woff'),
+ url('#{$file-path}.ttf') format('truetype'),
+ url('#{$file-path}.svg##{$font-family}') format('svg');
+ font-weight: $font-weight;
+ font-style: $font-style;
+ }
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/modules/_modal-flat.scss
b/ui/src/app/css/theme-default/modules/_modal-flat.scss
new file mode 100644
index 0000000..8d1d33c
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_modal-flat.scss
@@ -0,0 +1,209 @@
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+//
+// Modals
+// --------------------------------------------------
+
+// .modal-open - body class for killing the scroll
+// .modal - container to scroll within
+// .modal-dialog - positioning shell for the actual modal
+// .modal-content - actual modal w/ bg and corners and shit
+
+// Kill the scroll on the body
+.modal-open {
+ overflow: hidden;
+}
+
+// Container that the modal scrolls within
+.modal {
+ display: none;
+ overflow: hidden;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: $zindex-modal;
+ -webkit-overflow-scrolling: touch;
+
+ // Prevent Chrome on Windows from adding a focus outline. For details, see
+ //
https://github.com/twbs/bootstrap/pull/10951.
+ outline: 0;
+
+ // When fading in the modal, animate it to slide down
+ &.fade .modal-dialog {
+ @include translate(0, -25%);
+ @include transition-transform(0.3s ease-out);
+ }
+ &.in .modal-dialog { @include translate(0, 0) }
+}
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+// Shell div to position the modal with bottom padding
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+ border: 6px solid $modal-content-fallback-border-color; //old browsers fallback (ie8
etc)
+ border: 6px solid $modal-content-border-color;
+ border-radius: 5px;
+ background-clip: padding-box;
+}
+
+// Actual modal
+.modal-content {
+ position: relative;
+ background-color: $modal-content-bg;
+ border-radius: 0;
+ border: 3px solid #999;
+ background-clip: padding-box;
+ @include box-shadow(none !important);
+ border-radius: 0;
+ outline: 0;
+}
+
+
+// Modal background
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: $zindex-modal-background;
+ background-color: $modal-backdrop-bg;
+ // Fade for backdrop
+ &.fade { @include opacity(0); }
+ &.in { @include opacity($modal-backdrop-opacity); }
+}
+
+// Modal header
+// Top section of the modal w/ title and dismiss
+.modal-header {
+ padding: $modal-title-padding;
+ border-bottom: 1px solid $modal-header-border-color;
+ min-height: ($modal-title-padding + $modal-title-line-height);
+}
+// Close icon
+.modal-header .close {
+ margin-top: -2px;
+}
+
+// Title text within header
+.modal-title {
+ margin: 0;
+ line-height: $modal-title-line-height;
+ font-size: 27px;
+ font-family: $font-family-light;
+ font-weight: 300 !important;
+}
+
+// Modal body
+// Where all modal content resides (sibling of .modal-header and .modal-footer)
+.modal-body {
+ position: relative;
+ padding: $modal-inner-padding;
+}
+
+// Footer (for actions)
+.modal-footer {
+ padding: $modal-inner-padding;
+ text-align: left !important;
+ border-top: 0;
+ margin-top: 20px;
+ @include clearfix; // clear it in case folks use .pull-* classes on buttons
+
+ .btn {
+ padding: 6px 12px;
+ min-width: 75px;
+ }
+
+ // Properly space out buttons
+ .btn + .btn {
+ margin-left: 5px;
+ margin-bottom: 0; // account for input[type="submit"] which gets the bottom
margin like all other inputs
+ }
+ // but override that for button groups
+ .btn-group .btn + .btn {
+ margin-left: -1px;
+ }
+ // and override it for block buttons as well
+ .btn-block + .btn-block {
+ margin-left: 0;
+ }
+}
+
+// Measure scrollbar width for padding body during modal show/hide
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+// Scale up the modal
+@media (min-width: $screen-sm-min) {
+ // Automatically set modal's width for larger viewports
+ .modal-dialog {
+ width: $modal-md;
+ margin: 30px auto;
+ }
+ .modal-content {
+ @include box-shadow(0 5px 15px rgba(0,0,0,.5));
+ }
+
+ // Modal sizes
+ .modal-sm { width: $modal-sm; }
+}
+
+@media (min-width: $screen-md-min) {
+ .modal-lg { width: $modal-lg; }
+}
+
+.modal {
+ text-align: center;
+}
+
+@media screen and (min-width: 768px) {
+ .modal:before {
+ display: inline-block;
+ vertical-align: middle;
+ content: " ";
+ height: 100%;
+ }
+}
+
+.modal-dialog {
+ display: inline-block;
+ text-align: left;
+ vertical-align: middle;
+}
+
+@each $page, $bgcolor in $colors {
+ ##{$page}-root-container {
+
+ .modal-footer {
+ background: $bgcolor !important;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/modules/_navbar-flat.scss
b/ui/src/app/css/theme-default/modules/_navbar-flat.scss
new file mode 100644
index 0000000..2627477
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_navbar-flat.scss
@@ -0,0 +1,876 @@
+// bower:scss
+@import
"bower_components/compass-mixins/lib/compass/css3/_user-interface.scss";
+// endbower
+
+
+//
+// Navbars
+// --------------------------------------------------
+
+
+// Wrapper and base class
+//
+// Provide a static navbar from which we expand to create full-width, fixed, and
+// other navbar variations.
+
+.navbar {
+ position: relative;
+ min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a
.navbar-brand in collapsed mode)
+ margin-bottom: $navbar-margin-bottom;
+ border: 0;
+
+ // Prevent floats from breaking the navbar
+ @include clearfix;
+
+ @media (min-width: $grid-float-breakpoint) {
+ border-radius: $navbar-border-radius;
+ }
+}
+
+
+// Navbar heading
+//
+// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
+// styling of responsive aspects.
+
+.navbar-header {
+ @include clearfix;
+
+ @media (min-width: $grid-float-breakpoint) {
+ float: left;
+ }
+}
+
+
+// Navbar collapse (body)
+//
+// Group your navbar content into this for easy collapsing and expanding across
+// various device sizes. By default, this content is collapsed when <768px, but
+// will expand past that for a horizontal display.
+//
+// To start (on mobile devices) the navbar links, forms, and buttons are stacked
+// vertically and include a `max-height` to overflow in case you have too much
+// content for the user's viewport.
+
+.navbar-collapse {
+ overflow-x: visible;
+ padding-right: $navbar-padding-horizontal;
+ padding-left: $navbar-padding-horizontal;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
+ @include clearfix;
+ -webkit-overflow-scrolling: touch;
+
+ &.in {
+ overflow-y: auto;
+ }
+
+ @media (min-width: $grid-float-breakpoint) {
+ width: auto;
+ border-top: 0;
+ box-shadow: none;
+
+ &.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0; // Override default setting
+ overflow: visible !important;
+ }
+
+ &.in {
+ overflow-y: visible;
+ }
+
+ // Undo the collapse side padding for navbars with containers to ensure
+ // alignment of right-aligned contents.
+ .navbar-fixed-top &,
+ .navbar-static-top &,
+ .navbar-fixed-bottom & {
+ padding-left: 0;
+ padding-right: 0;
+ }
+ }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ .navbar-collapse {
+ max-height: $navbar-collapse-max-height;
+
+ @media (max-device-width: $screen-xs-min) and (orientation: landscape) {
+ max-height: 200px;
+ }
+ }
+}
+
+
+// Both navbar header and collapse
+//
+// When a container is present, change the behavior of the header and collapse.
+
+.container,
+.container-fluid {
+ > .navbar-header,
+ > .navbar-collapse {
+ margin-right: -$navbar-padding-horizontal;
+ margin-left: -$navbar-padding-horizontal;
+
+ @media (min-width: $grid-float-breakpoint) {
+ margin-right: 0;
+ margin-left: 0;
+ }
+ }
+}
+
+
+//
+// Navbar alignment options
+//
+// Display the navbar across the entirety of the page or fixed it to the top or
+// bottom of the page.
+
+// Static top (unfixed, but 100% wide) navbar
+.navbar-static-top {
+ z-index: $zindex-navbar;
+ border-width: 0 0 1px;
+
+ @media (min-width: $grid-float-breakpoint) {
+ border-radius: 0;
+ }
+}
+
+// Fix the top/bottom navbars when screen real estate supports it
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: $zindex-navbar-fixed;
+
+ // Undo the rounded corners
+ @media (min-width: $grid-float-breakpoint) {
+ border-radius: 0;
+ }
+}
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0; // override .navbar defaults
+ border-width: 1px 0 0;
+}
+
+
+// Brand/project name
+
+.navbar-brand {
+ display: block;
+ margin: 0 0 0 -80px;
+ padding: 0 0 0 80px;
+ height: 55px;
+ background: transparent url($kimchi-logo) no-repeat 24px 3px;
+ color: $highlights-color;
+ font-family: $font-family-bold;
+ font-weight: 600;
+ font-size: 1.571em;
+ line-height: 55px;
+ cursor: default;
+ @include user-select(none);
+
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ }
+
+ > img {
+ display: block;
+ }
+
+ @media (min-width: $grid-float-breakpoint) {
+ .navbar > .container &,
+ .navbar > .container-fluid & {
+ margin-left: -80px;
+ }
+ }
+}
+
+
+// Navbar toggle
+//
+// Custom button for toggling the `.navbar-collapse`, powered by the collapse
+// JavaScript plugin.
+
+.navbar-toggle {
+ position: relative;
+ float: right;
+ margin-right: $navbar-padding-horizontal;
+ padding: 9px 10px;
+ @include navbar-vertical-align(34px);
+ background-color: transparent;
+ background-image: none; // Reset unusual Firefox-on-Android default style; see
https://github.com/necolas/normalize.css/issues/214
+ border: 1px solid transparent;
+ border-radius: $border-radius-base;
+
+ // We remove the `outline` here, but later compensate by attaching `:hover`
+ // styles to `:focus`.
+ &:focus {
+ outline: 0;
+ }
+
+ // Bars
+ .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+ }
+ .icon-bar + .icon-bar {
+ margin-top: 4px;
+ }
+
+ @media (min-width: $grid-float-breakpoint) {
+ display: none;
+ }
+}
+
+
+// Navbar nav links
+//
+// Builds on top of the `.nav` components with its own modifier class to make
+// the nav the full height of the horizontal nav (above 768px).
+
+.navbar-nav {
+ margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
+
+ > li > a {
+ padding-left: 40px;
+ padding-right: 40px;
+ line-height: $line-height-computed;
+ font-family: $font-family-alternate;
+ font-size: 13pt;
+
+ > .fa {
+ font-size: 26px;
+ }
+
+ }
+
+ > li > a.dropdown-toggle {
+ padding-right: 22px;
+ padding-left: 22px;
+ }
+
+ @media (max-width: $grid-float-breakpoint-max) {
+ // Dropdowns get custom display when collapsed
+ .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ > li > a,
+ .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ > li > a {
+ line-height: $line-height-computed;
+ &:hover,
+ &:focus {
+ background-image: none;
+ }
+ }
+ }
+ }
+
+ // Uncollapse the nav
+ @media (min-width: $grid-float-breakpoint) {
+ float: left;
+ margin: 0;
+
+ > li {
+ float: left;
+ > a {
+ padding-top: $navbar-padding-vertical;
+ padding-bottom: $navbar-padding-vertical;
+ }
+ }
+ }
+}
+
+
+// Navbar form
+//
+// Extension of the `.form-inline` with some extra flavor for optimum display in
+// our navbars.
+
+.navbar-form {
+ margin-left: -$navbar-padding-horizontal;
+ margin-right: -$navbar-padding-horizontal;
+ padding: 10px $navbar-padding-horizontal;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+ @include box-shadow($shadow);
+
+ // Mixin behavior for optimum display
+ @include form-inline;
+
+ .form-group {
+ @media (max-width: $grid-float-breakpoint-max) {
+ margin-bottom: 5px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ // Vertically center in expanded, horizontal navbar
+ @include navbar-vertical-align($input-height-base);
+
+ // Undo 100% width for pull classes
+ @media (min-width: $grid-float-breakpoint) {
+ width: auto;
+ border: 0;
+ margin-left: 0;
+ margin-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ @include box-shadow(none);
+ }
+}
+
+
+// Dropdown menus
+
+// Menu position and menu carets
+
+.navbar-nav > li > a.dropdown-toggle > .caret {
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+ margin-left: 10px;
+ width: 40px;
+ height: 39px;
+
+ &:before {
+ content: '\f078';
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: 13px;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+ color: $navbar-default-color;
+ position: absolute;
+ top: 24px;
+ margin-left: 14px;
+ display: block;
+ }
+
+}
+
+.navbar-nav > li.dropdown.open > a > .caret {
+ background-color: $navbar-default-bg;
+
+ &:before {
+ content: '\f077';
+ }
+}
+
+.navbar-right > li > a {
+ height: 49px;
+
+ .fa {
+ margin-right: 15px;
+ }
+
+ .topbar-text, .caret, .fa {
+ vertical-align: middle;
+ }
+}
+
+.navbar-nav > li > .dropdown-menu {
+ padding: 0;
+ margin-top: 0;
+ background-color: $menu-flat-dropdown-bg;
+ border: 0;
+ border-radius: 0;
+ @include box-shadow(none !important);
+ background-clip: padding-box;
+ height: auto;
+ max-height: 400px;
+ overflow-x: hidden;
+
+ > li {
+ display: block;
+ }
+
+ > li > a,
+ > li > span {
+ margin: 0 !important;
+ display: block;
+ vertical-align: middle;
+ color: $menu-flat-text;
+ font-family: $font-family-sans-serif;
+ font-size: 13pt;
+ font-weight: normal;
+ line-height: 24px;
+ padding: 7px 30px;
+ height: 40px;
+ border-top: 1px solid $menu-flat-dropdown-border;
+ @include box-shadow(inset 0px 1px 0px 0px $menu-flat-dropdown-divider-bg);
+ clear: both;
+ white-space: nowrap; // prevent links from randomly breaking onto new lines
+
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: $menu-flat-dropdown-link-hover-color;
+ background-color: $menu-flat-dropdown-link-hover-bg;
+ }
+
+ }
+
+ > li > a > .fa {
+ vertical-align: middle;
+ font-size: 26px;
+ margin-right: 15px;
+ margin-left: -15px;
+ }
+
+ > li.critical > a {
+ background: $menu-flat-dropdown-critical-bg;
+ }
+
+ &::-webkit-scrollbar {
+ width: 12px;
+ }
+
+ /* Track */
+ &::-webkit-scrollbar-track {
+ @include box-shadow(inset 0 0 6px rgba(0,0,0,0.3));
+ }
+
+ /* Handle */
+ &::-webkit-scrollbar-thumb {
+ border-radius: 4px;
+ background: #797979;
+ border-left: 1px solid #B3B3B3;
+ @include box-shadow(inset 6px 1px 6px #9e9e9e);
+ }
+
+ &::-webkit-scrollbar-thumb:window-inactive {
+ }
+
+}
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ margin-bottom: 0;
+ @include border-top-radius($navbar-border-radius);
+ @include border-bottom-radius(0);
+}
+
+
+// Buttons in navbars
+//
+// Vertically center a button within a navbar (when *not* in a form).
+
+.navbar-btn {
+ @include navbar-vertical-align($input-height-base);
+
+ &.btn-sm {
+ @include navbar-vertical-align($input-height-small);
+ }
+ &.btn-xs {
+ @include navbar-vertical-align(22);
+ }
+}
+
+
+// Text in navbars
+//
+// Add a class to make any element properly align itself vertically within the navbars.
+
+.navbar-text {
+ @include navbar-vertical-align($line-height-computed);
+
+ @media (min-width: $grid-float-breakpoint) {
+ float: left;
+ margin-left: $navbar-padding-horizontal;
+ margin-right: $navbar-padding-horizontal;
+ }
+}
+
+
+// Component alignment
+//
+// Repurpose the pull utilities as their own navbar utilities to avoid specificity
+// issues with parents and chaining. Only do this when the navbar is uncollapsed
+// though so that navbar contents properly stack and align in mobile.
+//
+// Declared after the navbar components to ensure more specificity on the margins.
+
+@media (min-width: $grid-float-breakpoint) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ margin-right: -$navbar-padding-horizontal;
+
+ ~ .navbar-right {
+ margin-right: 0;
+ }
+ }
+}
+
+
+// Alternate navbars
+// --------------------------------------------------
+
+// Default navbar
+.navbar-default {
+ background-color: $navbar-default-bg;
+ border-color: $navbar-default-border;
+
+ .navbar-brand {
+ color: $navbar-default-brand-color;
+ &:hover,
+ &:focus {
+ color: $navbar-default-brand-hover-color;
+ background-color: $navbar-default-brand-hover-bg;
+ }
+ }
+
+ .navbar-text {
+ color: $navbar-default-color;
+ }
+
+ .navbar-nav {
+ > li > a {
+ margin: 0 !important;
+ font-size: 13pt;
+ font-family: $font-family-bold;
+ font-weight: 600;
+ color: $navbar-default-link-color;
+ text-decoration: none;
+ outline: none;
+ min-width: 190px;
+ text-align: center;
+ height: $navbar-height;
+
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-hover-color;
+ background-color: $navbar-default-link-hover-bg;
+ }
+
+ .digit-container {
+ display: inline-block;
+ margin-left: 10px;
+ margin-top: -2px;
+ border-radius: 16px;
+ height: 20px;
+ line-height: 16px;
+ background: #555;
+ border: 2px solid #555;
+ color: #fff;
+ font-family: $font-family-base;
+ font-size: 14px;
+ padding: 0 8px;
+ }
+
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-active-color;
+ background-color: $navbar-default-link-active-bg;
+ }
+
+ .digit-container {
+ border-color: #fff;
+ background: transparent;
+ }
+
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ cursor: default;
+ color: $navbar-default-link-disabled-color;
+ background-color: $navbar-default-link-disabled-bg;
+ }
+
+ .digit-container {
+ display: none;
+ }
+
+ }
+
+ @each $page, $bgcolor in $colors {
+
+ > .active > a.#{$page} {
+ &,
+ &:hover,
+ &:focus {
+ background-color: $bgcolor !important;
+ }
+ }
+ }
+
+ > .hostname {
+ margin: 0;
+ padding: 8px 0;
+ vertical-align: top;
+ width: 180px;
+ padding-right: 24px;
+ @include box-sizing(border-box);
+
+ .host-location {
+ display: block;
+ font-family: $font-family-alternate;
+ color: $highlights-color;
+ font-size: 13pt;
+ font-weight: 400;
+ width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ }
+
+ }
+
+ .navbar-toggle {
+ border-color: $navbar-default-toggle-border-color;
+ &:hover,
+ &:focus {
+ background-color: $navbar-default-toggle-hover-bg;
+ }
+ .icon-bar {
+ background-color: $navbar-default-toggle-icon-bar-bg;
+ }
+ }
+
+ .navbar-collapse,
+ .navbar-form {
+ border-color: $navbar-default-border;
+ }
+
+ // Dropdown menu items
+ .navbar-nav {
+ // Remove background color from open dropdown
+ > .open > a {
+ &,
+ &:hover,
+ &:focus {
+ background-color: $navbar-default-link-active-bg;
+ color: $navbar-default-link-active-color;
+ }
+ }
+
+ @media (max-width: $grid-float-breakpoint-max) {
+ // Dropdowns get custom display when collapsed
+ .open .dropdown-menu {
+ > li > a {
+ color: $navbar-default-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-hover-color;
+ background-color: $navbar-default-link-hover-bg;
+ }
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-active-color;
+ background-color: $navbar-default-link-active-bg;
+ }
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-disabled-color;
+ background-color: $navbar-default-link-disabled-bg;
+ }
+ }
+ }
+ }
+ }
+
+
+ // Links in navbars
+ //
+ // Add a class to ensure links outside the navbar nav are colored correctly.
+
+ .navbar-link {
+ color: $navbar-default-link-color;
+ &:hover {
+ color: $navbar-default-link-hover-color;
+ }
+ }
+
+ .btn-link {
+ color: $navbar-default-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-hover-color;
+ }
+ &[disabled],
+ fieldset[disabled] & {
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-disabled-color;
+ }
+ }
+ }
+}
+
+// Inverse navbar
+
+.navbar-inverse {
+ background-color: $navbar-inverse-bg;
+ border-color: $navbar-inverse-border;
+
+ .navbar-brand {
+ color: $navbar-inverse-brand-color;
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-brand-hover-color;
+ background-color: $navbar-inverse-brand-hover-bg;
+ }
+ }
+
+ .navbar-text {
+ color: $navbar-inverse-color;
+ }
+
+ .navbar-nav {
+ > li > a {
+ color: $navbar-inverse-link-color;
+
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-hover-color;
+ background-color: $navbar-inverse-link-hover-bg;
+ }
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-active-color;
+ background-color: $navbar-inverse-link-active-bg;
+ }
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-disabled-color;
+ background-color: $navbar-inverse-link-disabled-bg;
+ }
+ }
+ }
+
+ // Darken the responsive nav toggle
+ .navbar-toggle {
+ border-color: $navbar-inverse-toggle-border-color;
+ &:hover,
+ &:focus {
+ background-color: $navbar-inverse-toggle-hover-bg;
+ }
+ .icon-bar {
+ background-color: $navbar-inverse-toggle-icon-bar-bg;
+ }
+ }
+
+ .navbar-collapse,
+ .navbar-form {
+ border-color: darken($navbar-inverse-bg, 7%);
+ }
+
+ // Dropdowns
+ .navbar-nav {
+ > .open > a {
+ &,
+ &:hover,
+ &:focus {
+ background-color: $navbar-inverse-link-active-bg;
+ color: $navbar-inverse-link-active-color;
+ }
+ }
+
+ @media (max-width: $grid-float-breakpoint-max) {
+ // Dropdowns get custom display
+ .open .dropdown-menu {
+ > .dropdown-header {
+ border-color: $navbar-inverse-border;
+ }
+ .divider {
+ background-color: $navbar-inverse-border;
+ }
+ > li > a {
+ color: $navbar-inverse-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-hover-color;
+ background-color: $navbar-inverse-link-hover-bg;
+ }
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-active-color;
+ background-color: $navbar-inverse-link-active-bg;
+ }
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-disabled-color;
+ background-color: $navbar-inverse-link-disabled-bg;
+ }
+ }
+ }
+ }
+ }
+
+ .navbar-link {
+ color: $navbar-inverse-link-color;
+ &:hover {
+ color: $navbar-inverse-link-hover-color;
+ }
+ }
+
+ .btn-link {
+ color: $navbar-inverse-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-hover-color;
+ }
+ &[disabled],
+ fieldset[disabled] & {
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-disabled-color;
+ }
+ }
+ }
+}
diff --git a/ui/src/app/css/theme-default/modules/_path.scss
b/ui/src/app/css/theme-default/modules/_path.scss
new file mode 100644
index 0000000..2fb0fa4
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_path.scss
@@ -0,0 +1,9 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('#{$fa-font-path}/fontawesome.ttf') format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/ui/src/app/css/theme-default/modules/_toolbar.scss
b/ui/src/app/css/theme-default/modules/_toolbar.scss
new file mode 100644
index 0000000..5adcc46
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_toolbar.scss
@@ -0,0 +1,40 @@
+.toolbar {
+ height: 40px;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ background: $navbar-default-bg;
+
+ .tools {
+ height: 40px;
+ }
+
+ a {
+ font-family: $font-family-alternate;
+ display: inline-block;
+ color: $highlights-color;
+ text-decoration: none;
+ font-size: 13pt;
+ vertical-align: middle;
+ padding: 6px 0;
+ margin-left: 50px;
+ }
+
+ span, .fa {
+ display: inline-block;
+ vertical-align: middle
+ }
+
+ .fa {
+ font-size: 24px;
+ margin-right: 15px;
+ }
+
+}
+
+@each $page, $bgcolor in $colors {
+
+##{$page}-root-container .toolbar {
+ background-color: $bgcolor !important;
+ }
+}
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/modules/_variables.scss
b/ui/src/app/css/theme-default/modules/_variables.scss
new file mode 100644
index 0000000..c8f3567
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_variables.scss
@@ -0,0 +1,606 @@
+// Variables
+// --------------------------
+
+$fa-font-path: "../font/" !default;
+$fa-font-size-base: 14px !default;
+//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts"
!default; // for referencing Bootstrap CDN font files directly
+$fa-css-prefix: fa !default;
+$fa-version: "4.3.0" !default;
+$fa-border-color: #eee !default;
+$fa-inverse: #fff !default;
+$fa-li-width: (30em / 14) !default;
+
+$fa-var-adjust: "\f042";
+$fa-var-adn: "\f170";
+$fa-var-align-center: "\f037";
+$fa-var-align-justify: "\f039";
+$fa-var-align-left: "\f036";
+$fa-var-align-right: "\f038";
+$fa-var-ambulance: "\f0f9";
+$fa-var-anchor: "\f13d";
+$fa-var-android: "\f17b";
+$fa-var-angellist: "\f209";
+$fa-var-angle-double-down: "\f103";
+$fa-var-angle-double-left: "\f100";
+$fa-var-angle-double-right: "\f101";
+$fa-var-angle-double-up: "\f102";
+$fa-var-angle-down: "\f107";
+$fa-var-angle-left: "\f104";
+$fa-var-angle-right: "\f105";
+$fa-var-angle-up: "\f106";
+$fa-var-apple: "\f179";
+$fa-var-archive: "\f187";
+$fa-var-area-chart: "\f1fe";
+$fa-var-arrow-circle-down: "\f0ab";
+$fa-var-arrow-circle-left: "\f0a8";
+$fa-var-arrow-circle-o-down: "\f01a";
+$fa-var-arrow-circle-o-left: "\f190";
+$fa-var-arrow-circle-o-right: "\f18e";
+$fa-var-arrow-circle-o-up: "\f01b";
+$fa-var-arrow-circle-right: "\f0a9";
+$fa-var-arrow-circle-up: "\f0aa";
+$fa-var-arrow-down: "\f063";
+$fa-var-arrow-left: "\f060";
+$fa-var-arrow-right: "\f061";
+$fa-var-arrow-up: "\f062";
+$fa-var-arrows: "\f047";
+$fa-var-arrows-alt: "\f0b2";
+$fa-var-arrows-h: "\f07e";
+$fa-var-arrows-v: "\f07d";
+$fa-var-asterisk: "\f069";
+$fa-var-at: "\f1fa";
+$fa-var-automobile: "\f1b9";
+$fa-var-backward: "\f04a";
+$fa-var-ban: "\f05e";
+$fa-var-bank: "\f19c";
+$fa-var-bar-chart: "\f080";
+$fa-var-bar-chart-o: "\f080";
+$fa-var-barcode: "\f02a";
+$fa-var-bars: "\f0c9";
+$fa-var-bed: "\f236";
+$fa-var-beer: "\f0fc";
+$fa-var-behance: "\f1b4";
+$fa-var-behance-square: "\f1b5";
+$fa-var-bell: "\f0f3";
+$fa-var-bell-o: "\f0a2";
+$fa-var-bell-slash: "\f1f6";
+$fa-var-bell-slash-o: "\f1f7";
+$fa-var-bicycle: "\f206";
+$fa-var-binoculars: "\f1e5";
+$fa-var-birthday-cake: "\f1fd";
+$fa-var-bitbucket: "\f171";
+$fa-var-bitbucket-square: "\f172";
+$fa-var-bitcoin: "\f15a";
+$fa-var-bold: "\f032";
+$fa-var-bolt: "\f0e7";
+$fa-var-bomb: "\f1e2";
+$fa-var-book: "\f02d";
+$fa-var-bookmark: "\f02e";
+$fa-var-bookmark-o: "\f097";
+$fa-var-briefcase: "\f0b1";
+$fa-var-btc: "\f15a";
+$fa-var-bug: "\f188";
+$fa-var-building: "\f1ad";
+$fa-var-building-o: "\f0f7";
+$fa-var-bullhorn: "\f0a1";
+$fa-var-bullseye: "\f140";
+$fa-var-bus: "\f207";
+$fa-var-buysellads: "\f20d";
+$fa-var-cab: "\f1ba";
+$fa-var-calculator: "\f1ec";
+$fa-var-calendar: "\f073";
+$fa-var-calendar-o: "\f133";
+$fa-var-camera: "\f030";
+$fa-var-camera-retro: "\f083";
+$fa-var-car: "\f1b9";
+$fa-var-caret-down: "\f0d7";
+$fa-var-caret-left: "\f0d9";
+$fa-var-caret-right: "\f0da";
+$fa-var-caret-square-o-down: "\f150";
+$fa-var-caret-square-o-left: "\f191";
+$fa-var-caret-square-o-right: "\f152";
+$fa-var-caret-square-o-up: "\f151";
+$fa-var-caret-up: "\f0d8";
+$fa-var-cart-arrow-down: "\f218";
+$fa-var-cart-plus: "\f217";
+$fa-var-cc: "\f20a";
+$fa-var-cc-amex: "\f1f3";
+$fa-var-cc-discover: "\f1f2";
+$fa-var-cc-mastercard: "\f1f1";
+$fa-var-cc-paypal: "\f1f4";
+$fa-var-cc-stripe: "\f1f5";
+$fa-var-cc-visa: "\f1f0";
+$fa-var-certificate: "\f0a3";
+$fa-var-chain: "\f0c1";
+$fa-var-chain-broken: "\f127";
+$fa-var-check: "\f00c";
+$fa-var-check-circle: "\f058";
+$fa-var-check-circle-o: "\f05d";
+$fa-var-check-square: "\f14a";
+$fa-var-check-square-o: "\f046";
+$fa-var-chevron-circle-down: "\f13a";
+$fa-var-chevron-circle-left: "\f137";
+$fa-var-chevron-circle-right: "\f138";
+$fa-var-chevron-circle-up: "\f139";
+$fa-var-chevron-down: "\f078";
+$fa-var-chevron-left: "\f053";
+$fa-var-chevron-right: "\f054";
+$fa-var-chevron-up: "\f077";
+$fa-var-child: "\f1ae";
+$fa-var-circle: "\f111";
+$fa-var-circle-o: "\f10c";
+$fa-var-circle-o-notch: "\f1ce";
+$fa-var-circle-thin: "\f1db";
+$fa-var-clipboard: "\f0ea";
+$fa-var-clock-o: "\f017";
+$fa-var-close: "\f00d";
+$fa-var-cloud: "\f0c2";
+$fa-var-cloud-download: "\f0ed";
+$fa-var-cloud-upload: "\f0ee";
+$fa-var-cny: "\f157";
+$fa-var-code: "\f121";
+$fa-var-code-fork: "\f126";
+$fa-var-codepen: "\f1cb";
+$fa-var-coffee: "\f0f4";
+$fa-var-cog: "\f013";
+$fa-var-cogs: "\f085";
+$fa-var-columns: "\f0db";
+$fa-var-comment: "\f075";
+$fa-var-comment-o: "\f0e5";
+$fa-var-comments: "\f086";
+$fa-var-comments-o: "\f0e6";
+$fa-var-compass: "\f14e";
+$fa-var-compress: "\f066";
+$fa-var-connectdevelop: "\f20e";
+$fa-var-copy: "\f0c5";
+$fa-var-copyright: "\f1f9";
+$fa-var-credit-card: "\f09d";
+$fa-var-crop: "\f125";
+$fa-var-crosshairs: "\f05b";
+$fa-var-css3: "\f13c";
+$fa-var-cube: "\f1b2";
+$fa-var-cubes: "\f1b3";
+$fa-var-cut: "\f0c4";
+$fa-var-cutlery: "\f0f5";
+$fa-var-dashboard: "\f0e4";
+$fa-var-dashcube: "\f210";
+$fa-var-database: "\f1c0";
+$fa-var-dedent: "\f03b";
+$fa-var-delicious: "\f1a5";
+$fa-var-desktop: "\f108";
+$fa-var-deviantart: "\f1bd";
+$fa-var-diamond: "\f219";
+$fa-var-digg: "\f1a6";
+$fa-var-dollar: "\f155";
+$fa-var-dot-circle-o: "\f192";
+$fa-var-download: "\f019";
+$fa-var-dribbble: "\f17d";
+$fa-var-dropbox: "\f16b";
+$fa-var-drupal: "\f1a9";
+$fa-var-edit: "\f044";
+$fa-var-eject: "\f052";
+$fa-var-ellipsis-h: "\f141";
+$fa-var-ellipsis-v: "\f142";
+$fa-var-empire: "\f1d1";
+$fa-var-envelope: "\f0e0";
+$fa-var-envelope-o: "\f003";
+$fa-var-envelope-square: "\f199";
+$fa-var-eraser: "\f12d";
+$fa-var-eur: "\f153";
+$fa-var-euro: "\f153";
+$fa-var-exchange: "\f0ec";
+$fa-var-exclamation: "\f12a";
+$fa-var-exclamation-circle: "\f06a";
+$fa-var-exclamation-triangle: "\f071";
+$fa-var-expand: "\f065";
+$fa-var-external-link: "\f08e";
+$fa-var-external-link-square: "\f14c";
+$fa-var-eye: "\f06e";
+$fa-var-eye-slash: "\f070";
+$fa-var-eyedropper: "\f1fb";
+$fa-var-facebook: "\f09a";
+$fa-var-facebook-f: "\f09a";
+$fa-var-facebook-official: "\f230";
+$fa-var-facebook-square: "\f082";
+$fa-var-fast-backward: "\f049";
+$fa-var-fast-forward: "\f050";
+$fa-var-fax: "\f1ac";
+$fa-var-female: "\f182";
+$fa-var-fighter-jet: "\f0fb";
+$fa-var-file: "\f15b";
+$fa-var-file-archive-o: "\f1c6";
+$fa-var-file-audio-o: "\f1c7";
+$fa-var-file-code-o: "\f1c9";
+$fa-var-file-excel-o: "\f1c3";
+$fa-var-file-image-o: "\f1c5";
+$fa-var-file-movie-o: "\f1c8";
+$fa-var-file-o: "\f016";
+$fa-var-file-pdf-o: "\f1c1";
+$fa-var-file-photo-o: "\f1c5";
+$fa-var-file-picture-o: "\f1c5";
+$fa-var-file-powerpoint-o: "\f1c4";
+$fa-var-file-sound-o: "\f1c7";
+$fa-var-file-text: "\f15c";
+$fa-var-file-text-o: "\f0f6";
+$fa-var-file-video-o: "\f1c8";
+$fa-var-file-word-o: "\f1c2";
+$fa-var-file-zip-o: "\f1c6";
+$fa-var-files-o: "\f0c5";
+$fa-var-film: "\f008";
+$fa-var-filter: "\f0b0";
+$fa-var-fire: "\f06d";
+$fa-var-fire-extinguisher: "\f134";
+$fa-var-flag: "\f024";
+$fa-var-flag-checkered: "\f11e";
+$fa-var-flag-o: "\f11d";
+$fa-var-flash: "\f0e7";
+$fa-var-flask: "\f0c3";
+$fa-var-flickr: "\f16e";
+$fa-var-floppy-o: "\f0c7";
+$fa-var-folder: "\f07b";
+$fa-var-folder-o: "\f114";
+$fa-var-folder-open: "\f07c";
+$fa-var-folder-open-o: "\f115";
+$fa-var-font: "\f031";
+$fa-var-forumbee: "\f211";
+$fa-var-forward: "\f04e";
+$fa-var-foursquare: "\f180";
+$fa-var-frown-o: "\f119";
+$fa-var-futbol-o: "\f1e3";
+$fa-var-gamepad: "\f11b";
+$fa-var-gavel: "\f0e3";
+$fa-var-gbp: "\f154";
+$fa-var-ge: "\f1d1";
+$fa-var-gear: "\f013";
+$fa-var-gears: "\f085";
+$fa-var-genderless: "\f1db";
+$fa-var-gift: "\f06b";
+$fa-var-git: "\f1d3";
+$fa-var-git-square: "\f1d2";
+$fa-var-github: "\f09b";
+$fa-var-github-alt: "\f113";
+$fa-var-github-square: "\f092";
+$fa-var-gittip: "\f184";
+$fa-var-glass: "\f000";
+$fa-var-globe: "\f0ac";
+$fa-var-google: "\f1a0";
+$fa-var-google-plus: "\f0d5";
+$fa-var-google-plus-square: "\f0d4";
+$fa-var-google-wallet: "\f1ee";
+$fa-var-graduation-cap: "\f19d";
+$fa-var-gratipay: "\f184";
+$fa-var-group: "\f0c0";
+$fa-var-h-square: "\f0fd";
+$fa-var-hacker-news: "\f1d4";
+$fa-var-hand-o-down: "\f0a7";
+$fa-var-hand-o-left: "\f0a5";
+$fa-var-hand-o-right: "\f0a4";
+$fa-var-hand-o-up: "\f0a6";
+$fa-var-hdd-o: "\f0a0";
+$fa-var-header: "\f1dc";
+$fa-var-headphones: "\f025";
+$fa-var-heart: "\f004";
+$fa-var-heart-o: "\f08a";
+$fa-var-heartbeat: "\f21e";
+$fa-var-history: "\f1da";
+$fa-var-home: "\f015";
+$fa-var-hospital-o: "\f0f8";
+$fa-var-hotel: "\f236";
+$fa-var-html5: "\f13b";
+$fa-var-ils: "\f20b";
+$fa-var-image: "\f03e";
+$fa-var-inbox: "\f01c";
+$fa-var-indent: "\f03c";
+$fa-var-info: "\f129";
+$fa-var-info-circle: "\f05a";
+$fa-var-inr: "\f156";
+$fa-var-instagram: "\f16d";
+$fa-var-institution: "\f19c";
+$fa-var-ioxhost: "\f208";
+$fa-var-italic: "\f033";
+$fa-var-joomla: "\f1aa";
+$fa-var-jpy: "\f157";
+$fa-var-jsfiddle: "\f1cc";
+$fa-var-key: "\f084";
+$fa-var-keyboard-o: "\f11c";
+$fa-var-krw: "\f159";
+$fa-var-language: "\f1ab";
+$fa-var-laptop: "\f109";
+$fa-var-lastfm: "\f202";
+$fa-var-lastfm-square: "\f203";
+$fa-var-leaf: "\f06c";
+$fa-var-leanpub: "\f212";
+$fa-var-legal: "\f0e3";
+$fa-var-lemon-o: "\f094";
+$fa-var-level-down: "\f149";
+$fa-var-level-up: "\f148";
+$fa-var-life-bouy: "\f1cd";
+$fa-var-life-buoy: "\f1cd";
+$fa-var-life-ring: "\f1cd";
+$fa-var-life-saver: "\f1cd";
+$fa-var-lightbulb-o: "\f0eb";
+$fa-var-line-chart: "\f201";
+$fa-var-link: "\f0c1";
+$fa-var-linkedin: "\f0e1";
+$fa-var-linkedin-square: "\f08c";
+$fa-var-linux: "\f17c";
+$fa-var-list: "\f03a";
+$fa-var-list-alt: "\f022";
+$fa-var-list-ol: "\f0cb";
+$fa-var-list-ul: "\f0ca";
+$fa-var-location-arrow: "\f124";
+$fa-var-lock: "\f023";
+$fa-var-long-arrow-down: "\f175";
+$fa-var-long-arrow-left: "\f177";
+$fa-var-long-arrow-right: "\f178";
+$fa-var-long-arrow-up: "\f176";
+$fa-var-magic: "\f0d0";
+$fa-var-magnet: "\f076";
+$fa-var-mail-forward: "\f064";
+$fa-var-mail-reply: "\f112";
+$fa-var-mail-reply-all: "\f122";
+$fa-var-male: "\f183";
+$fa-var-map-marker: "\f041";
+$fa-var-mars: "\f222";
+$fa-var-mars-double: "\f227";
+$fa-var-mars-stroke: "\f229";
+$fa-var-mars-stroke-h: "\f22b";
+$fa-var-mars-stroke-v: "\f22a";
+$fa-var-maxcdn: "\f136";
+$fa-var-meanpath: "\f20c";
+$fa-var-medium: "\f23a";
+$fa-var-medkit: "\f0fa";
+$fa-var-meh-o: "\f11a";
+$fa-var-mercury: "\f223";
+$fa-var-microphone: "\f130";
+$fa-var-microphone-slash: "\f131";
+$fa-var-minus: "\f068";
+$fa-var-minus-circle: "\f056";
+$fa-var-minus-square: "\f146";
+$fa-var-minus-square-o: "\f147";
+$fa-var-mobile: "\f10b";
+$fa-var-mobile-phone: "\f10b";
+$fa-var-money: "\f0d6";
+$fa-var-moon-o: "\f186";
+$fa-var-mortar-board: "\f19d";
+$fa-var-motorcycle: "\f21c";
+$fa-var-music: "\f001";
+$fa-var-navicon: "\f0c9";
+$fa-var-neuter: "\f22c";
+$fa-var-newspaper-o: "\f1ea";
+$fa-var-openid: "\f19b";
+$fa-var-outdent: "\f03b";
+$fa-var-pagelines: "\f18c";
+$fa-var-paint-brush: "\f1fc";
+$fa-var-paper-plane: "\f1d8";
+$fa-var-paper-plane-o: "\f1d9";
+$fa-var-paperclip: "\f0c6";
+$fa-var-paragraph: "\f1dd";
+$fa-var-paste: "\f0ea";
+$fa-var-pause: "\f04c";
+$fa-var-paw: "\f1b0";
+$fa-var-paypal: "\f1ed";
+$fa-var-pencil: "\f040";
+$fa-var-pencil-square: "\f14b";
+$fa-var-pencil-square-o: "\f044";
+$fa-var-phone: "\f095";
+$fa-var-phone-square: "\f098";
+$fa-var-photo: "\f03e";
+$fa-var-picture-o: "\f03e";
+$fa-var-pie-chart: "\f200";
+$fa-var-pied-piper: "\f1a7";
+$fa-var-pied-piper-alt: "\f1a8";
+$fa-var-pinterest: "\f0d2";
+$fa-var-pinterest-p: "\f231";
+$fa-var-pinterest-square: "\f0d3";
+$fa-var-plane: "\f072";
+$fa-var-play: "\f04b";
+$fa-var-play-circle: "\f144";
+$fa-var-play-circle-o: "\f01d";
+$fa-var-plug: "\f1e6";
+$fa-var-plus: "\f067";
+$fa-var-plus-circle: "\f055";
+$fa-var-plus-square: "\f0fe";
+$fa-var-plus-square-o: "\f196";
+$fa-var-power-off: "\f011";
+$fa-var-print: "\f02f";
+$fa-var-puzzle-piece: "\f12e";
+$fa-var-qq: "\f1d6";
+$fa-var-qrcode: "\f029";
+$fa-var-question: "\f128";
+$fa-var-question-circle: "\f059";
+$fa-var-quote-left: "\f10d";
+$fa-var-quote-right: "\f10e";
+$fa-var-ra: "\f1d0";
+$fa-var-random: "\f074";
+$fa-var-rebel: "\f1d0";
+$fa-var-recycle: "\f1b8";
+$fa-var-reddit: "\f1a1";
+$fa-var-reddit-square: "\f1a2";
+$fa-var-refresh: "\f021";
+$fa-var-remove: "\f00d";
+$fa-var-renren: "\f18b";
+$fa-var-reorder: "\f0c9";
+$fa-var-repeat: "\f01e";
+$fa-var-reply: "\f112";
+$fa-var-reply-all: "\f122";
+$fa-var-retweet: "\f079";
+$fa-var-rmb: "\f157";
+$fa-var-road: "\f018";
+$fa-var-rocket: "\f135";
+$fa-var-rotate-left: "\f0e2";
+$fa-var-rotate-right: "\f01e";
+$fa-var-rouble: "\f158";
+$fa-var-rss: "\f09e";
+$fa-var-rss-square: "\f143";
+$fa-var-rub: "\f158";
+$fa-var-ruble: "\f158";
+$fa-var-rupee: "\f156";
+$fa-var-save: "\f0c7";
+$fa-var-scissors: "\f0c4";
+$fa-var-search: "\f002";
+$fa-var-search-minus: "\f010";
+$fa-var-search-plus: "\f00e";
+$fa-var-sellsy: "\f213";
+$fa-var-send: "\f1d8";
+$fa-var-send-o: "\f1d9";
+$fa-var-server: "\f233";
+$fa-var-share: "\f064";
+$fa-var-share-alt: "\f1e0";
+$fa-var-share-alt-square: "\f1e1";
+$fa-var-share-square: "\f14d";
+$fa-var-share-square-o: "\f045";
+$fa-var-shekel: "\f20b";
+$fa-var-sheqel: "\f20b";
+$fa-var-shield: "\f132";
+$fa-var-ship: "\f21a";
+$fa-var-shirtsinbulk: "\f214";
+$fa-var-shopping-cart: "\f07a";
+$fa-var-sign-in: "\f090";
+$fa-var-sign-out: "\f08b";
+$fa-var-signal: "\f012";
+$fa-var-simplybuilt: "\f215";
+$fa-var-sitemap: "\f0e8";
+$fa-var-skyatlas: "\f216";
+$fa-var-skype: "\f17e";
+$fa-var-slack: "\f198";
+$fa-var-sliders: "\f1de";
+$fa-var-slideshare: "\f1e7";
+$fa-var-smile-o: "\f118";
+$fa-var-soccer-ball-o: "\f1e3";
+$fa-var-sort: "\f0dc";
+$fa-var-sort-alpha-asc: "\f15d";
+$fa-var-sort-alpha-desc: "\f15e";
+$fa-var-sort-amount-asc: "\f160";
+$fa-var-sort-amount-desc: "\f161";
+$fa-var-sort-asc: "\f0de";
+$fa-var-sort-desc: "\f0dd";
+$fa-var-sort-down: "\f0dd";
+$fa-var-sort-numeric-asc: "\f162";
+$fa-var-sort-numeric-desc: "\f163";
+$fa-var-sort-up: "\f0de";
+$fa-var-soundcloud: "\f1be";
+$fa-var-space-shuttle: "\f197";
+$fa-var-spinner: "\f110";
+$fa-var-spoon: "\f1b1";
+$fa-var-spotify: "\f1bc";
+$fa-var-square: "\f0c8";
+$fa-var-square-o: "\f096";
+$fa-var-stack-exchange: "\f18d";
+$fa-var-stack-overflow: "\f16c";
+$fa-var-star: "\f005";
+$fa-var-star-half: "\f089";
+$fa-var-star-half-empty: "\f123";
+$fa-var-star-half-full: "\f123";
+$fa-var-star-half-o: "\f123";
+$fa-var-star-o: "\f006";
+$fa-var-steam: "\f1b6";
+$fa-var-steam-square: "\f1b7";
+$fa-var-step-backward: "\f048";
+$fa-var-step-forward: "\f051";
+$fa-var-stethoscope: "\f0f1";
+$fa-var-stop: "\f04d";
+$fa-var-street-view: "\f21d";
+$fa-var-strikethrough: "\f0cc";
+$fa-var-stumbleupon: "\f1a4";
+$fa-var-stumbleupon-circle: "\f1a3";
+$fa-var-subscript: "\f12c";
+$fa-var-subway: "\f239";
+$fa-var-suitcase: "\f0f2";
+$fa-var-sun-o: "\f185";
+$fa-var-superscript: "\f12b";
+$fa-var-support: "\f1cd";
+$fa-var-table: "\f0ce";
+$fa-var-tablet: "\f10a";
+$fa-var-tachometer: "\f0e4";
+$fa-var-tag: "\f02b";
+$fa-var-tags: "\f02c";
+$fa-var-tasks: "\f0ae";
+$fa-var-taxi: "\f1ba";
+$fa-var-tencent-weibo: "\f1d5";
+$fa-var-terminal: "\f120";
+$fa-var-text-height: "\f034";
+$fa-var-text-width: "\f035";
+$fa-var-th: "\f00a";
+$fa-var-th-large: "\f009";
+$fa-var-th-list: "\f00b";
+$fa-var-thumb-tack: "\f08d";
+$fa-var-thumbs-down: "\f165";
+$fa-var-thumbs-o-down: "\f088";
+$fa-var-thumbs-o-up: "\f087";
+$fa-var-thumbs-up: "\f164";
+$fa-var-ticket: "\f145";
+$fa-var-times: "\f00d";
+$fa-var-times-circle: "\f057";
+$fa-var-times-circle-o: "\f05c";
+$fa-var-tint: "\f043";
+$fa-var-toggle-down: "\f150";
+$fa-var-toggle-left: "\f191";
+$fa-var-toggle-off: "\f204";
+$fa-var-toggle-on: "\f205";
+$fa-var-toggle-right: "\f152";
+$fa-var-toggle-up: "\f151";
+$fa-var-train: "\f238";
+$fa-var-transgender: "\f224";
+$fa-var-transgender-alt: "\f225";
+$fa-var-trash: "\f1f8";
+$fa-var-trash-o: "\f014";
+$fa-var-tree: "\f1bb";
+$fa-var-trello: "\f181";
+$fa-var-trophy: "\f091";
+$fa-var-truck: "\f0d1";
+$fa-var-try: "\f195";
+$fa-var-tty: "\f1e4";
+$fa-var-tumblr: "\f173";
+$fa-var-tumblr-square: "\f174";
+$fa-var-turkish-lira: "\f195";
+$fa-var-twitch: "\f1e8";
+$fa-var-twitter: "\f099";
+$fa-var-twitter-square: "\f081";
+$fa-var-umbrella: "\f0e9";
+$fa-var-underline: "\f0cd";
+$fa-var-undo: "\f0e2";
+$fa-var-university: "\f19c";
+$fa-var-unlink: "\f127";
+$fa-var-unlock: "\f09c";
+$fa-var-unlock-alt: "\f13e";
+$fa-var-unsorted: "\f0dc";
+$fa-var-upload: "\f093";
+$fa-var-usd: "\f155";
+$fa-var-user: "\f007";
+$fa-var-user-md: "\f0f0";
+$fa-var-user-plus: "\f234";
+$fa-var-user-secret: "\f21b";
+$fa-var-user-times: "\f235";
+$fa-var-users: "\f0c0";
+$fa-var-venus: "\f221";
+$fa-var-venus-double: "\f226";
+$fa-var-venus-mars: "\f228";
+$fa-var-viacoin: "\f237";
+$fa-var-video-camera: "\f03d";
+$fa-var-vimeo-square: "\f194";
+$fa-var-vine: "\f1ca";
+$fa-var-vk: "\f189";
+$fa-var-volume-down: "\f027";
+$fa-var-volume-off: "\f026";
+$fa-var-volume-up: "\f028";
+$fa-var-warning: "\f071";
+$fa-var-wechat: "\f1d7";
+$fa-var-weibo: "\f18a";
+$fa-var-weixin: "\f1d7";
+$fa-var-whatsapp: "\f232";
+$fa-var-wheelchair: "\f193";
+$fa-var-wifi: "\f1eb";
+$fa-var-windows: "\f17a";
+$fa-var-won: "\f159";
+$fa-var-wordpress: "\f19a";
+$fa-var-wrench: "\f0ad";
+$fa-var-xing: "\f168";
+$fa-var-xing-square: "\f169";
+$fa-var-yahoo: "\f19e";
+$fa-var-yelp: "\f1e9";
+$fa-var-yen: "\f157";
+$fa-var-youtube: "\f167";
+$fa-var-youtube-play: "\f16a";
+$fa-var-youtube-square: "\f166";
+
diff --git a/ui/src/app/css/theme-default/modules/_wok-variables.scss
b/ui/src/app/css/theme-default/modules/_wok-variables.scss
new file mode 100644
index 0000000..a7c5ad4
--- /dev/null
+++ b/ui/src/app/css/theme-default/modules/_wok-variables.scss
@@ -0,0 +1,960 @@
+$bootstrap-sass-asset-helper: false !default;
+//
+// Variables
+// --------------------------------------------------
+
+$kimchi-logo: "../images/theme-default/logo-white.png";
+$icon-font-path: '../fonts/fontawesome';
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+$gray-base: #000 !default;
+$gray-darker: #222 !default;
+$gray-dark: $gray-darker !default;
+$gray: #444 !default;
+$gray-light: #999 !default;
+$gray-lighter: #fff !default;
+
+$brand-primary: #3a393b !default; // #3a393b
+$brand-success: #5cb85c !default;
+$brand-info: #5bc0de !default;
+$brand-warning: #f0ad4e !default;
+$brand-danger: #d9534f !default;
+$kimchi-dropdown: #4d4c4e !default;
+
+
+//## Kimchi default colors - TODO remove these references and link do Sass Maps below
+
+$hosts-color: #008abf !default;
+$guests-color: #8cc63f !default;
+$templates-color: #00a6a0 !default;
+$storage-color: #feb813 !default;
+$networks-color: #7f1c7d !default;
+$administration-color: #d9182d !default;
+
+$colors: (
+ host: #008abf,
+ guests: #8cc63f,
+ templates: #00a6a0,
+ storage: #feb813,
+ network: #7f1c7d,
+ administration: #d9182d
+);
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for `<body>`.
+$body-bg: #fff !default;
+//** Global text color on `<body>`.
+$text-color: $gray-darker !default;
+$highlights-color: #fff !default;
+$disabled-color: #999 !default;
+
+//** Global textual link color.
+$link-color: $brand-primary !default;
+//** Link hover color set via `darken()` function.
+$link-hover-color: darken($link-color, 15%) !default;
+//** Link hover decoration.
+$link-hover-decoration: underline !default;
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+$font-family-sans-serif: "HelveticaNeueMedium",
"HelveticaNeue-Medium", "Helvetica Neue Medium",
"HelveticaNeue", "Helvetica Neue", Helvetica, Arial, "Lucida
Grande", sans-serif !default;
+$font-family-serif: Georgia, "Times New Roman", Times, serif !default;
+//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
+$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace
!default;
+$font-family-base: $font-family-sans-serif !default;
+$font-family-light: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif !default;
+$font-family-bold: "HelveticaNeueBold", "HelveticaNeue-Bold",
"HelveticaNeue Bold", "Helvetica Neue Bold", "Helvetica
Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande",
sans-serif !default;
+$font-family-alternate: "Helvetica Neue LT W1G 55 Roman", "Helvetica Neue
LT W1G", "HelveticaNeue Roman", "HelveticaNeue-Roman",
"Helvetica Neue Roman", "Helvetica Neue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif !default;
+
+
+$font-size-base: 14px !default;
+$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px
+$font-size-btn: 13.5pt;
+
+$font-size-h1: 1.571em !default;
+$font-size-h2: 22px !default;
+$font-size-h3: 17px !default;
+$font-size-h4: $font-size-base !default;
+$font-size-h5: $font-size-base !default;
+$font-size-h6: $font-size-base !default;
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base: 1.428571429 !default; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with
`margin`, `padding`, etc.
+$line-height-computed: floor(($font-size-base * $line-height-base)) !default; //
~20px
+
+//** By default, this inherits from the `<body>`.
+$headings-font-family: inherit !default;
+$headings-font-weight: 500 !default;
+$headings-line-height: 1.1 !default;
+$headings-color: inherit !default;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful
for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the
assets load path.
+// [converter] This is because some asset helpers, such as Sprockets, do not work with
file-relative paths.
+// $icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/",
"../fonts/bootstrap/") !default;
+
+//** File name for all font files.
+// $icon-font-name: "glyphicons-halflings-regular" !default;
+//** Element ID within SVG icon file.
+// $icon-font-svg-id: "glyphicons_halflingsregular" !default;
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text
and 1.428 line-height (~20px to start).
+
+$padding-base-vertical: 6px !default;
+$padding-base-horizontal: 12px !default;
+
+$padding-large-vertical: 10px !default;
+$padding-large-horizontal: 16px !default;
+
+$padding-small-vertical: 5px !default;
+$padding-small-horizontal: 10px !default;
+
+$padding-xs-vertical: 1px !default;
+$padding-xs-horizontal: 5px !default;
+
+$line-height-large: 1.3333333 !default; // extra decimals for Win 8.1 Chrome
+$line-height-small: 1.5 !default;
+
+$border-radius-base: 3px !default;
+$border-radius-large: 3px !default;
+$border-radius-small: 3px !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color: #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg: $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+$caret-width-base: 4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large: 5px !default;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table
variations.
+
+//** Padding for `<th>`s and `<td>`s.
+$table-cell-padding: 8px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding: 5px !default;
+
+//** Default background color used for all tables.
+$table-bg: transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent: #f9f9f9 !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover: #f5f5f5 !default;
+$table-bg-active: $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color: #ddd !default;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight: normal !default;
+
+$btn-default-color: #444 !default;
+$btn-default-bg: #fff !default;
+$btn-default-border: #ccc !default;
+
+$btn-primary-color: #fff !default;
+$btn-primary-bg: $brand-primary !default;
+$btn-primary-border: $btn-primary-bg !default;
+
+$btn-login-color: #fff !default;
+$btn-login-bg: #008abf !default;
+$btn-login-border: $btn-login-bg !default;
+
+$btn-success-color: #fff !default;
+$btn-success-bg: $brand-success !default;
+$btn-success-border: $btn-success-bg !default;
+
+$btn-info-color: #fff !default;
+$btn-info-bg: $brand-info !default;
+$btn-info-border: $brand-info !default;
+
+$btn-warning-color: #fff !default;
+$btn-warning-bg: $brand-warning !default;
+$btn-warning-border: $brand-warning !default;
+
+$btn-danger-color: #fff !default;
+$btn-danger-bg: $brand-danger !default;
+$btn-danger-border: $brand-danger !default;
+
+$btn-link-disabled-color: $gray-light !default;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius-base: $border-radius-base !default;
+$btn-border-radius-large: $border-radius-large !default;
+$btn-border-radius-small: $border-radius-small !default;
+
+
+//== Forms
+//
+//##
+
+//** `<input>` background color
+$input-bg: #fff !default;
+//** `<input disabled>` background color
+$input-bg-disabled: $gray-lighter !default;
+
+//** Text color for `<input>`s
+$input-color: $gray !default;
+//** `<input>` border color
+$input-border: #ccc !default;
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on `<select>`s in some browsers, due to the limited
stylability of `<select>`s in CSS.
+$input-border-radius: $border-radius-base !default;
+//** Large `.form-control` border radius
+$input-border-radius-large: $border-radius-large !default;
+//** Small `.form-control` border radius
+$input-border-radius-small: $border-radius-small !default;
+
+//** Border color for inputs on focus
+$input-border-focus: #66afe9 !default;
+
+//** Placeholder text color
+$input-color-placeholder: #999 !default;
+
+//** Default `.form-control` height
+$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) +
2) !default;
+//** Large `.form-control` height
+$input-height-large: (ceil($font-size-large * $line-height-large) +
($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small: (floor($font-size-small * $line-height-small) +
($padding-small-vertical * 2) + 2) !default;
+
+//** `.form-group` margin
+$form-group-margin-bottom: 15px !default;
+
+$legend-color: $gray-dark !default;
+$legend-border-color: #e5e5e5 !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg: $gray-lighter !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled: not-allowed !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg: #fcfcfc !default;
+//** Dropdown menu `border-color`.
+$dropdown-border: #ccc !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border: #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg: #eee !default;
+
+//** Dropdown link text color.
+$dropdown-link-color: $gray-dark !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg: #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color: $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg: $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color: $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color: $gray-light !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color: #000 !default;
+
+
+//== Menu-Flat Dropdowns
+//
+//## Menu-Flat Dropdown menu container and contents.
+
+$menu-flat-text: #fff !default;
+$menu-flat-dropdown-bg: #3a393b !default;
+$line-height-menu-flat: 31px;
+//** Menu-Flat Dropdown menu `border-color`.
+$menu-flat-dropdown-border: #2e2e2e !default;
+$menu-flat-dropdown-divider-bg: #404042 !default;
+$menu-flat-dropdown-critical-bg: #d9182d !default;
+//** Dropdown link text color.
+$menu-flat-dropdown-link-color: $menu-flat-text !default;
+//** Hover color for dropdown links.
+$menu-flat-dropdown-link-hover-color: $menu-flat-text !default;
+//** Hover background for dropdown links.
+$menu-flat-dropdown-link-hover-bg: $menu-flat-dropdown-bg !default;
+//** Active dropdown menu item text color.
+$menu-flat-dropdown-link-active-color: $menu-flat-text !default;
+//** Active dropdown menu item background color.
+$menu-flat-dropdown-link-active-bg: $menu-flat-dropdown-bg !default;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar: 1000 !default;
+$zindex-dropdown: 1000 !default;
+$zindex-popover: 1060 !default;
+$zindex-tooltip: 1070 !default;
+$zindex-navbar-fixed: 1030 !default;
+$zindex-modal-background: 1040 !default;
+$zindex-modal: 1050 !default;
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different
screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs: 480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min: $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone: $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm: 992px !default;
+$screen-sm-min: $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet: $screen-sm-min !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md: 1200px !default;
+$screen-md-min: $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop: $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg: 1680 !default;
+$screen-lg-min: $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop: $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max: ($screen-sm-min - 1) !default;
+$screen-sm-max: ($screen-md-min - 1) !default;
+$screen-md-max: ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns: 12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width: 0 !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint: $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet: (940px + $grid-gutter-width) !default;
+//** For `$screen-sm-min` and up.
+$container-sm: $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop: (1140px + $grid-gutter-width) !default;
+//** For `$screen-md-min` and up.
+$container-md: $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop: (1540px + $grid-gutter-width) !default;
+//** For `$screen-lg-min` and up.
+$container-lg: $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height: 40px !default;
+$navbar-margin-bottom: 0 !default;
+$navbar-border-radius: 0 !default;
+$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2)
!default;
+$navbar-collapse-max-height: 340px !default;
+
+$navbar-default-color: $highlights-color !default;
+$navbar-default-bg: $brand-primary !default;
+$navbar-default-border: $navbar-default-bg !default;
+
+// Navbar links
+$navbar-default-link-color: $navbar-default-color !default;
+$navbar-default-link-hover-color: $navbar-default-color !default;
+$navbar-default-link-hover-bg: transparent !default;
+$navbar-default-link-active-color: $navbar-default-color !default;
+$navbar-default-link-active-bg: transparent !default;
+$navbar-default-link-disabled-color: $disabled-color !default;
+$navbar-default-link-disabled-bg: transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color: $navbar-default-link-color !default;
+$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%)
!default;
+$navbar-default-brand-hover-bg: transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg: #ddd !default;
+$navbar-default-toggle-icon-bar-bg: #888 !default;
+$navbar-default-toggle-border-color: #ddd !default;
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color: $highlights-color !default;
+$navbar-inverse-bg: #222 !default;
+$navbar-inverse-border: $navbar-inverse-bg !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color: $highlights-color !default;
+$navbar-inverse-link-hover-color: $navbar-inverse-link-color !default;
+$navbar-inverse-link-hover-bg: transparent !default;
+$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg: $navbar-inverse-link-hover-bg !default;
+$navbar-inverse-link-disabled-color: #999 !default;
+$navbar-inverse-link-disabled-bg: transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color: $highlights-color !default;
+$navbar-inverse-brand-hover-color: $navbar-inverse-brand-color !default;
+$navbar-inverse-brand-hover-bg: transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg: transparent !default;
+$navbar-inverse-toggle-icon-bar-bg: #fff !default;
+$navbar-inverse-toggle-border-color: #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding: 10px 15px !default;
+$nav-link-hover-bg: $gray-lighter !default;
+
+$nav-disabled-link-color: $gray-light !default;
+$nav-disabled-link-hover-color: $gray-light !default;
+
+//== Tabs
+$nav-tabs-border-color: #ddd !default;
+
+$nav-tabs-link-hover-border-color: $gray-lighter !default;
+
+$nav-tabs-active-link-hover-bg: $body-bg !default;
+$nav-tabs-active-link-hover-color: $gray !default;
+$nav-tabs-active-link-hover-border-color: #ddd !default;
+
+$nav-tabs-justified-link-border-color: #ddd !default;
+$nav-tabs-justified-active-link-border-color: $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius: $border-radius-base !default;
+$nav-pills-active-link-hover-bg: $component-active-bg !default;
+$nav-pills-active-link-hover-color: $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color: $link-color !default;
+$pagination-bg: #fff !default;
+$pagination-border: #ddd !default;
+
+$pagination-hover-color: $link-hover-color !default;
+$pagination-hover-bg: $gray-lighter !default;
+$pagination-hover-border: #ddd !default;
+
+$pagination-active-color: #fff !default;
+$pagination-active-bg: $brand-primary !default;
+$pagination-active-border: $brand-primary !default;
+
+$pagination-disabled-color: $gray-light !default;
+$pagination-disabled-bg: #fff !default;
+$pagination-disabled-border: #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg: $pagination-bg !default;
+$pager-border: $pagination-border !default;
+$pager-border-radius: 15px !default;
+
+$pager-hover-bg: $pagination-hover-bg !default;
+
+$pager-active-bg: $pagination-active-bg !default;
+$pager-active-color: $pagination-active-color !default;
+
+$pager-disabled-color: $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding: 30px !default;
+$jumbotron-color: inherit !default;
+$jumbotron-bg: $gray-lighter !default;
+$jumbotron-heading-color: inherit !default;
+$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;
+$jumbotron-heading-font-size: ceil(($font-size-base * 4.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text: #6c6c6c !default;
+$state-success-bg: #dae6cb !default;
+$state-success-border: #8cc63f !default;
+
+$state-info-text: #6c6c6c !default;
+$state-info-bg: #d9edf7 !default;
+$state-info-border: #008abf !default;
+
+$state-warning-text: #6c6c6c !default;
+$state-warning-bg: #f1e3c2 !default;
+$state-warning-border: #fdb813 !default;
+
+$state-danger-text: #6c6c6c !default;
+$state-danger-bg: #eac3c7 !default;
+$state-danger-border: #d9182d !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width: 200px !default;
+//** Tooltip text color
+$tooltip-color: #fff !default;
+//** Tooltip background color
+$tooltip-bg: #000 !default;
+$tooltip-opacity: .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width: 5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color: $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg: #fff !default;
+//** Popover maximum width
+$popover-max-width: 276px !default;
+//** Popover border color
+$popover-border-color: rgba(0,0,0,.2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color: #ccc !default;
+
+//** Popover title background color
+$popover-title-bg: darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width: 10px !default;
+//** Popover arrow color
+$popover-arrow-color: $popover-bg !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color: fade_in($popover-border-color, 0.05) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%)
!default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg: $gray-light !default;
+//** Primary label background color
+$label-primary-bg: $brand-primary !default;
+//** Success label background color
+$label-success-bg: $brand-success !default;
+//** Info label background color
+$label-info-bg: $brand-info !default;
+//** Warning label background color
+$label-warning-bg: $brand-warning !default;
+//** Danger label background color
+$label-danger-bg: $brand-danger !default;
+
+//** Default label text color
+$label-color: #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color: #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding: 20px 30px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding: 27px 14px 14px 30px !default;
+//** Modal title line-height
+$modal-title-line-height: 23px !default;
+
+//** Background color of modal content area
+$modal-content-bg: #fff !default;
+//** Modal content border color
+$modal-content-border-color: rgba(170,170,170,.3) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color: #aaa !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg: #fff !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity: .5 !default;
+//** Modal header border color
+$modal-header-border-color: transparent !default;
+//** Modal footer border color
+$modal-footer-border-color: $modal-header-border-color !default;
+
+$modal-lg: 1124px !default;
+$modal-md: 824px !default;
+$modal-sm: 524px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding: 8px 15px !default;
+$alert-border-radius: 0 !default;
+$alert-link-font-weight: bold !default;
+$alert-border-width: 0 0 0 5px !default;
+$alert-font-size: 10.5pt !default;
+
+$alert-success-bg: $state-success-bg !default;
+$alert-success-text: $state-success-text !default;
+$alert-success-border: $state-success-border !default;
+
+$alert-info-bg: $state-info-bg !default;
+$alert-info-text: $state-info-text !default;
+$alert-info-border: $state-info-border !default;
+
+$alert-warning-bg: $state-warning-bg !default;
+$alert-warning-text: $state-warning-text !default;
+$alert-warning-border: $state-warning-border !default;
+
+$alert-danger-bg: $state-danger-bg !default;
+$alert-danger-text: $state-danger-text !default;
+$alert-danger-border: $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg: #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color: #fff !default;
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius: $border-radius-base !default;
+
+//** Default progress bar color
+$progress-bar-bg: $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg: $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg: $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg: $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg: $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg: #fff !default;
+//** `.list-group-item` border color
+$list-group-border: #ddd !default;
+//** List group border radius
+$list-group-border-radius: $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg: #f5f5f5 !default;
+//** Text color of active list items
+$list-group-active-color: $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg: $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border: $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color: $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg: $gray-lighter !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color: #555 !default;
+$list-group-link-hover-color: $list-group-link-color !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg: #fff !default;
+$panel-body-padding: 15px !default;
+$panel-heading-padding: 10px 15px !default;
+$panel-footer-padding: $panel-heading-padding !default;
+$panel-border-radius: $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border: #ddd !default;
+$panel-footer-bg: #f5f5f5 !default;
+
+$panel-default-text: $gray-dark !default;
+$panel-default-border: #ddd !default;
+$panel-default-heading-bg: #f5f5f5 !default;
+
+$panel-primary-text: #fff !default;
+$panel-primary-border: $brand-primary !default;
+$panel-primary-heading-bg: $brand-primary !default;
+
+$panel-success-text: $state-success-text !default;
+$panel-success-border: $state-success-border !default;
+$panel-success-heading-bg: $state-success-bg !default;
+
+$panel-info-text: $state-info-text !default;
+$panel-info-border: $state-info-border !default;
+$panel-info-heading-bg: $state-info-bg !default;
+
+$panel-warning-text: $state-warning-text !default;
+$panel-warning-border: $state-warning-border !default;
+$panel-warning-heading-bg: $state-warning-bg !default;
+
+$panel-danger-text: $state-danger-text !default;
+$panel-danger-border: $state-danger-border !default;
+$panel-danger-heading-bg: $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding: 4px !default;
+//** Thumbnail background color
+$thumbnail-bg: $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border: #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius: $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color: $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding: 9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg: #f5f5f5 !default;
+$well-border: darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color: #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color: #fff !default;
+$badge-bg: $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color: $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg: #fff !default;
+
+$badge-font-weight: bold !default;
+$badge-line-height: 1 !default;
+$badge-border-radius: 10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical: 8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg: #f5f5f5 !default;
+//** Breadcrumb text color
+$breadcrumb-color: #ccc !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color: $gray-light !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator: "/" !default;
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;
+
+$carousel-control-color: #fff !default;
+$carousel-control-width: 15% !default;
+$carousel-control-opacity: .5 !default;
+$carousel-control-font-size: 20px !default;
+
+$carousel-indicator-active-bg: #fff !default;
+$carousel-indicator-border-color: #fff !default;
+
+$carousel-caption-color: #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight: bold !default;
+$close-color: #000 !default;
+$close-text-shadow: 0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color: #c7254e !default;
+$code-bg: #f9f2f4 !default;
+
+$kbd-color: #fff !default;
+$kbd-bg: #333 !default;
+
+$pre-bg: #f5f5f5 !default;
+$pre-color: $gray-dark !default;
+$pre-border-color: #ccc !default;
+$pre-scrollable-max-height: 340px !default;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+//** Text muted color
+$text-muted: $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color: $gray-light !default;
+//** Headings small color
+$headings-small-color: $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color: $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size: ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color: $gray-lighter !default;
+//** Page header border color
+$page-header-border-color: $gray-lighter !default;
+//** Width of horizontal description list titles
+$dl-horizontal-offset: $component-offset-horizontal !default;
+//** Horizontal line color.
+$hr-border: $gray-lighter !default;
+
+//*
+// The MIT License (MIT)
+
+// Copyright (c) 2013-2015 bootstrap-select
+
+// 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. */
+
+$color-red-error: rgb(185, 74, 72);
+$color-blue-hover: rgb(100, 177, 216);
+$color-grey-arrow: rgb(204, 204, 204);
+
+$width-default: 220px;
+
+$zindex-select-dropdown: 1035 !default;
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/radio-flat.css
b/ui/src/app/css/theme-default/radio-flat.css
new file mode 100644
index 0000000..0c03485
--- /dev/null
+++ b/ui/src/app/css/theme-default/radio-flat.css
@@ -0,0 +1,30 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ .radio-label {
+ position: relative;
+ cursor: pointer;
+ }
+
+ .radio-content {
+ margin-right: 10px;
+ }
+
+ .inline-radio {
+ display: inline-block;
+ }
\ No newline at end of file
diff --git a/ui/src/app/css/theme-default/selectmenu-flat.css
b/ui/src/app/css/theme-default/selectmenu-flat.css
new file mode 100644
index 0000000..0f91d80
--- /dev/null
+++ b/ui/src/app/css/theme-default/selectmenu-flat.css
@@ -0,0 +1,88 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.select-content {
+ position: relative;
+ height: 30px;
+ width: 170px;
+}
+
+.selected-box {
+ width: 75%;
+ height: 30px;
+ border: 1px solid #d8d8d8;
+ border-radius: 3px;
+ cursor: pointer;
+ background: #FFFFFF;
+ float: right;
+}
+
+.select-val {
+ display: none;
+}
+
+.select-label {
+ line-height: 32px;
+ vertical-align: middle;
+ position: relative;
+ margin-left: 20px;
+}
+
+.select-icon {
+ position: relative;
+ float: right;
+ line-height: 30px;
+ vertical-align: middle;
+ padding-right: 10px;
+ padding-left: 10px;
+ color: #555555;
+ font-size: 10px;
+}
+
+.select-icon:hover {
+ background: #FCFCFC;
+}
+
+.selectmenu-opt {
+ background: #FFFFFF;
+}
+
+.selectmenu-list {
+ border: 1px solid #d8d8d8;
+ width: 99%;
+ position: absolute;
+ top: 31px;
+ cursor: pointer;
+ padding: 0;
+ margin: 0;
+}
+
+.selectmenu-list li {
+ list-style: none;
+ position: relative;
+ height: 20px;
+ padding: 5px 0 5px 20px;
+ line-height: 21px;
+ vertical-align: middle;
+ border-bottom: 1px solid #d8d8d8;
+ z-index: 3;
+}
+
+.selectmenu-opt:hover {
+ background: #FCFCFC;
+}
diff --git a/ui/src/app/css/theme-default/tabs.css
b/ui/src/app/css/theme-default/tabs.css
new file mode 100644
index 0000000..47404b7
--- /dev/null
+++ b/ui/src/app/css/theme-default/tabs.css
@@ -0,0 +1,46 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ui-tabs {
+ border: 0 none !important;
+ padding: 0;
+ position: relative;
+}
+
+.ui-tabs .ui-tabs-nav {
+ background: none;
+ border-color: #ededed;
+ border-width: 0 0 2px;
+}
+
+.ui-tabs .ui-tabs-nav li {
+ background: none;
+ border-width: 0;
+ padding: 0 0px 1px;
+}
+
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ border-bottom: 2px solid #008abf;
+ margin-bottom: -2px;
+ font-weight: bold;
+}
+
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ line-height: 1;
+ padding: 10px 20px 5px;
+}
diff --git a/ui/src/app/css/theme-default/textbox-flat.css
b/ui/src/app/css/theme-default/textbox-flat.css
new file mode 100644
index 0000000..39d5ffb
--- /dev/null
+++ b/ui/src/app/css/theme-default/textbox-flat.css
@@ -0,0 +1,22 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ .textbox-container {
+ border: 1px solid #CCC;
+ border-radius: 3px;
+ }
\ No newline at end of file
diff --git a/ui/src/app/favicon-16x16.png b/ui/src/app/favicon-16x16.png
new file mode 100644
index 0000000000000000000000000000000000000000..16085801d05bf8a5e7aeee24f6ed40f778352ff0
GIT binary patch
literal 1301
zcmb7CeN@tC6n-H~#X0q8nUR5l{b*?Z5D<l|6iE>=Gc&bxnxd_=+(O&>*wJijbEnl7
z_BB&$ZnZq()M^{9lYLlfsW}!V8cHA}5`G|Z0EzwlYk%#J-E-dioO{oG?s?C1pRbdX
z;@mN-FaQ8|ZhUMCf}V@dWeJi=As*Wia4L-EM+4Au#%&>YDN^I};#2ql99auM`AGn*
zNUQt}0HrVhx*PzQ7Xk1ssgZ2k0025MIWd)k49K^%tJ4QwP=1};A)HLxKTN-C%0Bu6
z7Ef#(nM*5uNx3y15NS*#j<{q+<T)Gwykh)mY#`YBxYF>3*_t4Sg9RNLc}o4xd?yGl
zmV+HT&-Ah#^~)W{9k_$7mxkFmK`*YT<tJU7pGp-eu?G(rT8-&Y_giFF+e{YJsc)J|
zYM#u5{?J0I`BSE{IyJja#jbnJmb2T{sRPO#-SvR=D(ZoD`=BbVzn|Ugz$IBoX=dgg
zV`9;4rch3ms5U-VZhfkOKb^<(%!F-LO7;T3)S7!@?!zOaj7}A+Z*)VaG(tRuW6$8?
z^!S+BzyuSVVM-`AW*$BVu&){23i|zC@|8JvFpgtsa4dBILrdJGA;hl{^edU2BjJ+S
zTEcuQ!Pd3TJ{V!`Nnb7Kh6IY>z2jm|tBiK-ZxCd<NwnO9>@OniLn;1(9+F^`wqF}o
zA~UxTY|rTSk(32l-b%s!Ai)rIpJsir%+!QzTmMeMv&*vy0vTnmj&@*-TGr#X?|ikK
zeXB3h_K3V7jarZ<d*uEeTBwUE(Napfutkjx6LB|ZxQ;fG<sLlWOb_bUuls8XQ8jd6
zI=I&WG999q3`Ej9mbBZ(Z0NBblFh8snyGIsRK*-!Jr9pru8py7OvScYw@R#8(8EdS
z`4m}iAsZ|qdJ9!+`B@*+Y>pRCZ-egZpl1e1Zd|K16O9WEI`(w~8_6|_nA+EiH>y>#
zC-}o8rK!=xb~qdbhGX@JpE`soNsHe6-+}UU0m+Z6mbrwdC-_j5j{?sd9JVI+N^^Y#
z=i`ja#ttt~e_<KGpj?@OPKBGDd7m@U#H&ZJ-oU$NB4f8r89<&GB7HDC9gZ8bW$o69
z@n|gZd`B3XS()vzrPSF2wTk3~as^J+Elxi7G$#{_q5?$o7kwVQGgNzurndxS6>fCR
z=_ztr;<coCXZ+&-QG0lCu@9^Eej9@n&O$Dq<2>q&@g^}`udcs_w5;6N=+u?cyc{HG
z6nfsC&7k0r8;`snyNh+yc}3b;@WYQ%RH5%q#$k`Gp=J2GO6l;E!TwEnm=r-2xsf{j
zSFG{!TkikR8|&Nu^hrlY9scY^qKn8gA&JZ9`4)6_J?rW7LSeqrXvTegswh6oFNmsm
z<xS^;$;~(NZ`>6BQvLn18A1M}4!g=vefjdP%wcr}8uQlwO4h6Qs-o^5w|k4q(LLS}
zzc#G8BAQbwpYz*CE$pqO9#$MHtv~tr#24SJ2+fcbS*ofVX}8PK^2Wi{yW0=gzdU^^
zyjV7{6!T`{;E<%)_I~A+_OdBT>}=bB;<)W}1q}cXuKKsY?CXdMK|)TtFh5r)VCH=y
zKmdfn6nY5E2%*5Klt?BGX42_oIE)Fy8tbJ+Yy3+nKA8Ve!Ds(XxNtpS3LyY4Cn;7O
HlXK!9%tbg#
literal 0
HcmV?d00001
diff --git a/ui/src/app/favicon-194x194.png b/ui/src/app/favicon-194x194.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a53d0fd8f71375c866fcbfa1b8f1ae4c86f0bba
GIT binary patch
literal 21106
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/favicon-32x32.png b/ui/src/app/favicon-32x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6e103f554d36acc5f1e1e217664b5b49ff0bff7
GIT binary patch
literal 2165
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/favicon-96x96.png b/ui/src/app/favicon-96x96.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1c1f2c3f10bdbd7dfe0bd66396a06310997a3cd
GIT binary patch
literal 8147
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/fontawesome/font/fontawesome-webfont.ttf
b/ui/src/app/fontawesome/font/fontawesome-webfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..ed9372f8ea0fbaa04f42630a48887e4b38945345
GIT binary patch
literal 122092
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 +|+&Vdls@0SAya!5R?!
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
W2%>->3J9Wr?l-V&_Su?ry8j2p&Q&b{
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/high.png
b/ui/src/app/images/theme-default/high.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f5fcea79a4be9eb82d05df7ee8d981df6967bf0
GIT binary patch
literal 812
zcmV+{1JnG8P)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!zDYzuRCwB~
z)@x|ZaU93-|2ghQ=90@8#kSOpMPW#pMGceN+(T|PJP@LI;F2P87si9RKd@ykQ`YhT
zVJ;8IWw}JkEpy4`9O`iJ{_68DozB^gv-7Lhes%u8|L^;|{lC9?%1)O%QA%U9#sG{_
z-2qMT6K`=FmAHtP2uA9tVUz$}F#&UthHv<U*XpPNT3|TF=~*!j<6$g8`eB!9>-;=U
zXw+}u*DP&TS;)Z@EJr?;;PSt-3J=l)$IuNQunpTIEW>v^m$RtAZgkgxrfLa;;XzWd
zLrYbPeYj~2GYePcYXE6_ZnLSz6RRH-ZK%|;&Bh|^$9!C{jy>A=me_(>xPkF_N9Tj|
z;!G`3q;eNK2~?~$MVOAK7-_Ths$m|+B7l_&(4Tre=G79w(Y|b@eW8|TBkm&|)2x97
zX@&(z(kQBUAypfh>%>-CVGZx)X$d#uhfZf33t}VA)JE?`2$N9Y{9j4NG6LD=pTc$h
zHqfi%XR|qj_cTh^=EYNnp|6(hxI17A(o?7Go*phlXD9xWq583cWLS{)cFL3%LONOX
zDZN!&+WCcc7Nog;^s8=E&mhUF1FC(tOkXUTa*@M%PjM1cl5~3g_NNBFk)p(xsM1z-
zjRm=))SazUmZ*}Yy}squnGPs}c1%zJ8|)07+7ho4U4<UZNzjswKrek3)n29TqxcBR
zKSS#oz&c;8Q+g1e-2`cu%mK~DF03wb&d9R)CVh~Xv=t#YNKp63N!=@lFshF18(y-N
z`*M|q|7LSH3%kXBSZkjO2IC0USr)CMbDQyG4X{9;#8TXecKuqKo~UcrHgB=&5?sX#
zd__}qQU)Kb+J|eFiM8RO+WwJvrc;)q8`0_&`e4J0M}0iP9+bOF6wALvcGAjl4t=x?
qLzJC;x{zMk1*bMudM9G}BftP0OtN`NjudzR0000<MNUMnLSTXlM1j8m
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/icon-centos.png
b/ui/src/app/images/theme-default/icon-centos.png
new file mode 100644
index 0000000000000000000000000000000000000000..5afb7b4b63462412d825f63542beb1f7e26b3d7f
GIT binary patch
literal 4734
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
M07*qoM6N<$f~4IfuK)l5
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/icon-debian.png
b/ui/src/app/images/theme-default/icon-debian.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff49a39696fdfa5f232b0e79de04d90af6557111
GIT binary patch
literal 4239
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
D^V29c
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/icon-fedora.png
b/ui/src/app/images/theme-default/icon-fedora.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b9dd06d1f766a3285cd0fb587c0be4114bfac47
GIT binary patch
literal 4449
zcmaJ_c{J2t*#FKj_9goWk+p>ETQP%#7_w#Gml9b*CXBIV-zj9vQiQRDDBCEzWGAvU
zmPupzp|OPVj`RNep7-4I+~?lso^#K=_dK8H`8+rNzM&2y-DNre02uXj@0gHv_=V6=
zk^8UePD5lx<*cuB2ROfIZ`#W<$rf5)T`PY8pl7=f5b!!5N;Xml=pnSJ7bv+InZ>uS
z*nKCP_&m%k1GIdeJaO|5AWs26>#3VlfSap8kVn8H0UbTWeOD<rY5=&@qjyKc3^}(|
z@I1g~s-O>MlqYGG5wxjnsL9DnNqZHp3obSjF;FgZ@?dg`!8B6HOH&x|y`n8p!H#~N
z7I?)J3(r+q%QCs96+s2QTIQ_RuQ?9L7%SeoYL8p^AUR;Yln1LGkM2GQ8P7ajZQD^%
zRaFl&I&42VTU<I@2tgkPX~Z(|sRsNWE!O%!2c>LZ9-(BiTi@~KygD^NgjoPg*syLT
zIPm)xu9f2lYPAnfJPHIo%JZf0z2d9ACug-L_>96w43>woPc5T&T-6()-~=qdi4mC}
z%mV1^E+gqJclLt?KLa0hg0KGf)%8Z_Dvg}F2@T+x>5QDg69Wj~euiBLoY6Pv!}+ve
zB$f?(uV`kXoF2}HLtqiuGq_vI?<Phh4RR4r><$2x8Io9+f0c0+C00;`fliI93`^e_
z<8D%3p;%AK&=`ESY+p3fV9$je?M{UhQgbGcZ^SoYCDm*3X;R@X12Clxy;P@wQjV5!
zJke|X%U7tpCMgixCk7l#OY>|5e)9BI{v`>2da%v1Txjbo4I9z4dQNM%&>kIG91!-$
z&+)|wfyGD})H1JNxXdAWco-=ly`SV^`?uXHU(t<Wtp}3D_4ArUU1$ix!Y8`-0AR$Z
z$@6YIpNTnqAQ04aoi)8>sv<l??TwbBS;B|x<W!DvQj)Cb#WpJmYhNa={6JZ^7sm-Z
zOZByxv0?i%)C6YM-R6E4Ey=nccp@(^5$yZPb6u|PjY)|DuH2|-aA8Qw<-lX3Rj|Dn
z8dN)XZ;SLm6GI($#2h8RY6cH6p|rV+0Wu`fRnz^om6eXiPhhx==cbp;s?*=4TvAd$
zp#AkI@{Y1@g&S<F<NL2WzTS$G5i*IZx59~7q+~j}>-gb*XX?3JxskZV%TS<v*uei`
z94fgTYQVXdAT9$%bVo+jaB%?igJR!L?E1P8W5#j}2Eiw_K)FZ!Y0;uD_lVk&k+RqN
zxAv2xl2V;ZZY#cpx7oTLU2YTu+v`owR^(D6b0S1+5m*5z@-NAzh0sec1C{+rFWT*L
zf@)}w{xX1fY_z0qed6~NnSXL|{Tj&jl*y1o{i&){tFQHg!MT|q{-+&EBQY+xT$)}D
z%!t}-j)bgh&gm>R(OU5QkH|T;Df|1kdsYi5WA%ku)fNi(dK?s1a5X=b%Xa(qbCv4=
z+20c)KAnYP(qJJ64BIx({2mP6i(^ggJm664Dn_X^wC6<1MAbaQgM2>EE3EjBfp1fr
zdAtbC8&1G?pu4@y@GphxDRF-P4x_KtyP(BjXH(@~&=Mm58uV344^D!AbBO~>ucE-5
zmcMyyrvL8zz|F#sF#hTK0*{eyXh&5pv1rSg@QfcLS@0JErlAu0u1PK8_BQK5l1Bf{
zvSJ}kiQ>@5Fc#WhOU-T-10|5$II;dLKoR8Mq#35?!NT9x2DT~G`@}Z0j9=nML5ga<
zj|SzT_2!16osFt*@eGPvSLdhXe{?oeG)$$C-zNN2#9EMl*}><tiOeyrF|G&p#AN`H
z+AqitXJw<zI~=#^q>!1bJyOANu(2>ieIG7hl$dIS=u-KHCC4})@jko7LkfVoXNF>e
zh}tb%Fne58L5NAMWfV&Y@x3M8jmbuEV7UG;+_Xs&JN!r@eB$iPpFN%Vzh$|q3Bhxp
zX@Sv}yl72*>1a6`iq?X#cLP$`wVHalOP?{<Z39RF+B3Bz*PDdtDmIKrJS~{96*yk_
zIBOs62>sCdZ)Ejz!ny?3Zs2O7yQ5;BiqE?8>`e2s7e{M@OI80EcJDKv@iE@}$0YH6
zytqdBy4B3w1<*_xBxbA$MIqbV?5jgTq$?;A>L2(I_4?oDNuk~^doKvr__j0F22^K~
zAeP<zJ7c$~R;t!^I2dDAs?V><)k8CcSvNc~QSD>SJlh#yGizH@eZb<4Mpm|pn?vhH
z6&0=?*;^<wHz8HT-XP)`SojghuxaFaYyybvLF&%)J|?N_3-V?eCFs2ZILR(_Y+VO%
zd5oPh)4)kCO@Xe8pg7^)H61$onBrIQshd<%(~*F@2MLt0xyPg14BI!JrPJ(TN$Rbh
zL|I>8fRd`jLY`K`xY6jH(heOoX-{jUtfe{)+p`gq^41fyo^dPWK!=?wllzl#xrtzk
z@SwG^1od}*J&<jU=?#A`pKO>H*Ghs3lU*^r0JZct-t#eVoOVO6#^A-~3E`%Jk7HwH
zMq*~IL{I)9J4^m*W@f6eG<bso_S{s_2amZT1v)EB+qdq~=PI&-eK%H_m_28e4L)i@
z&d^!N3MDbhH#Xr;2sCJVP%mLS{@_`etT4g~5VZri_x{l*)Tf%d{{xkfrp*#~SU_gK
z<@w9|jD)1+Ie%Yyyz=|Lu8Ov|s$Doro+apCBW-08k-q$!p^CWj<OkSP37?P?h}Y_|
z2{{5WxYI{Emi0Ti;aX&qWEGL@mTN}s_Nal}zp<sE#x}6kz;@Kxq(VTNZXAuM991U7
zrGqcA!C+f_(T`=fS)7mbejJK;{Q-ysHMBz$8yFfem!hsScge$X%<jp**7*%fKUWI~
zsrvu;HXk;8+@EWe+|3$#5XfWHzN=u@z9B}J&FZHq8JKj(WilF4r+jbVMostTwOih{
zr+ZcJ{CiGmA3>hG3vJ8w`F@|2-9FkG-t_r{h(g78Xf-8h_D*^wZ5#m}56z`#^OeO4
zUaYL<l97|5PlCvaD`=B~FukamZ{0a}QzDjsp}N6#LI+Gj8P~=gFJf2JMO2i!c6o1(
z|7L!P2Yxr}v6#Q@`{C}GTX{4=ij}+2h<ujtS$oZ~tXWIC*jo990qm-{n02hDW;!n9
z-%lo1uf@`7p|VZ2*B`8mkKI<TSL92C*v)$@ILSUfH%Jt04c$RI_NAphO0ATM10~bL
zvGyqO=RJdaJAsGV9y_$A_Bpj4ph<-x&+zz1un4WD4TeLrX25C#?DaB}J@Z`2Yks!U
zW6#Ae{YmSsn6|q~I<$&AU7bPxqW!TEZ1)<khqsl`Rj<7d*{xcfMT8hxHh_<c4iCnE
zu<*Ku@(WE`r=mwhzZ4+8y3rx1L*%amnNu2FKmI;Qjym%TBW-d%LzQCuc}iu{&8vd;
zV~IK=yb1Nvzf!1z2|=T4KjG+~8roynSx)$RD4>B=-wvSE3cj4l>i4J9<JUU}Mc>6F
zal<0Z-T@c7*nB#vI_n$-qOi6K5XASp>?<tv&*7pY<x&Kb;+9v*t}mDK?MP^%V6TvH
z$ytJ8c+z9gDpzV(&O`n5ztCSb?j>ql-6!YjLm%IHQ+v9SdXqLxpKoy=+ialsE3=yj
zis_}JuK>y@7SEottnK83z)N29$xx%4=G))r+Bbdv%Dw#@XPlx+W;`|5L95xxrfssK
z@qUrRCvgG%54KbU>nX*6MZ+PZq3#@qjo=n&;;3n}+5#k<jl<`yf5V?rAanSA3z7PD
zsOs_iV!j_0*FpWcE3iR>AO$u8Vf?)TW7UM3?>!Xg+8l^Y6p8FKT%pNDPeI5jHFhup
z%|LcvU1!^J83oFSz}KwdU4rPbyBXcC3~edw_0xD_bdv~RTDa-CqJdU?ryICmWDd$%
z3ptP1)h(9}qzn&g6ayff@FeYk%cgy7>b2!I{$P05msDXlQj2Y(73n?lm#@4<zYoQO
z%DcI*jot~@N3eRPix1MRrRrMGJ$0ADbxz)XXlV}8r8CKce#_;67xrkT+l6sUN^X6E
zlful@)$h8|3pfDxp01ZgKHqmARHv2aMT}0c^+Q1O<?B|UKlB1MW%PB9AKau?L%JY)
zsWG01hj{R@4a$Cm@c6u<5*!yBmEe9*Er$4}i$LT^ztYDK!J2VZ?XmtEz@aNnXNnJ^
zD_CD_)TchDAC#40QN2CzG*aNd{}KrO&HenK(4!4QOy+sb2;tcB1Pt^{v_i~HrE{hd
zPtFI3iMa~qVI9%B5?x|EA3bwVzgC1A7{owEY3X{8BD<p7tqZ*5GDVZ|2cGyFpC9T!
zkvltkovckmVR6(}_>K%v;a(0Ka_phRmsurnW_Bd%-^?8uGLjTB>RM&S7R@}FcuMG;
zCG*r_R}gnREkn~Zb2o%$@9T$QNDq5~Z0!9ZQUros*4WIf|LoAV@5`sbsQY9Wb{#(9
zX}m{TA#>g}1Fj4fkg(v@FAKw~*-7T>SnectGsIWi?Re71sBTS?M$iO1r>bR(qg1oQ
zIqF`)d#e;Nd!$8!A%C4955&#O0gfhs$V@L*m3ANc1LH2G-kLCAE(bOJoaTs5Dl7!l
zP*;P4qb&C&v$B<Qq(4T>y~`?pnd7u#k?b|M_m*?u5HwT9^G5*(zO-Vji6OElsc26V
zmu{72tm&7V;`&c7Ye@6r(;qI53Le{GoyjoB!+_;JtKFU-3m^C+Q2Xe&5Jc2M<@s{2
zRVCk+dYQCHJjactvJO%j=RoH?o;c~&Fq$-jtn)iG{@I!mdn-Ht6~`W^Fyx6GKgq3u
zbC~o=y;h8H#iQ5LF5}L>j#-u8n(1Q#(r2r<>b6blJi_yX7v~d~k3GXb&3Yd{4gk@@
zU&Sib?LXv6p_P-iO0@?nuYD9(pI6~H-Cnqf{I(y0Nk6Cb9Z6?ef&{g-K42|VLHlUL
z35FWMgW>WA4xJkVZ<lIphdW(}6d8^`T6Q<I33oLCb@;)+H)jb=p9P2O73#!mMQ`4=
z7Wv8-KiamZEs;s5E<&X$ou6_^vhYK~*7t+MLXxyMo9qnJVKAxJu$RK#i7rRua}Sey
z3%W#NqKR6L9N1HvC2r*!i>%W!mMevZ6DPM{ZVQaoC6Y76(p}2LlJ4HQZ)FiGlXHEH
zLG2X^dq080-G1t$-_6_q=@{8<P_t$j|Ngm0(C-X<LwTf>MhOf^NNT<C!faTEKfxNA
z@bTR_!&u%B&2X^osa=}y;k8hCR%P|_^7bZU!yjfIBr%y;w_AZDxP!B$2Tv@MrHmJ#
z;oIM_ZRj`KM8Ot0Y-8wnv<zk&fu#a58pSQ{OIkg`q_vF^<m&pY*~>W-5&|vorD_M&
zm3R{)%06zE*7v_<n|c91%ca6B;rF6r-2FP2o<-D&E$lN*uwWe`FxXEUx8Z`UB|G;e
ze_jsq58UFiZ92Lg_BU#xLMl6({quV@tWMF)?k_Qi|BmrZaTygNI6}Asfd2bj&EsKQ
zr597j)a~AntQtr&)@U0@yta@#h+KtzS*tmgsiV*h(Qsg02~gyBp4yMKBu0WB`pK+R
z-GEw{8wQ$Rce#<EC(POycrd;=re&j}gg`vuRsIo2HAZ!t@^;Z(28a6ziB93_i9${y
zztLyJxAFTsNIYn{CfVqwwbJ?bASqcI6KS=o3{i5m(HibhOhKjSr4FjTIGG4#zW>Q(
zd^*!|I(p>f_(UYHu&s=+Y4hNxXyBoaJsRcVEDUkfRaK%lygyDcaEMNf7{zSc1|!W`
zcgZyJ?y~o?2KFg9Z4q2;n9)J5kXJX=mCWU2TIUty!n4DzO4I%>FbKN_^ZcleF;)6Q
znZ_Q$okNii$uBs4cGZ6lNqNadVD_oQc>W;>qxYrr?5OPu?Em>4xL8V;J3`mux>fJu
S9$oyI0D9VncWN{pBmW0TFKp8Q
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/icon-gentoo.png
b/ui/src/app/images/theme-default/icon-gentoo.png
new file mode 100644
index 0000000000000000000000000000000000000000..50d928fbfa30560fe873cf3de438a8f0c10a8f96
GIT binary patch
literal 15307
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/icon-opensuse.png
b/ui/src/app/images/theme-default/icon-opensuse.png
new file mode 100644
index 0000000000000000000000000000000000000000..83fe4d5df0f59b52dd609b3bd16838f4d2570ab8
GIT binary patch
literal 3046
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/icon-ubuntu.png
b/ui/src/app/images/theme-default/icon-ubuntu.png
new file mode 100644
index 0000000000000000000000000000000000000000..d92c00f357b6b0e1542413f6aaf0de8ef4b8d130
GIT binary patch
literal 4818
zcmb7Ig;!Kv_a1VFPU&ut7*J4<Zs`<6YUl>(W>CbDj+c1pW*7<S96}_eTUzNFy6YQ%
z@dtc&t$oir=j^l3UF+`W+3`h3ON9uZ4j%vj5WQAa)I*QZzXHNVzq_R&KhXoWm;7r3
z5c&xQ*}%|qJP*~kUTFQ<zk(splj)CMr1e%Z_SSc|^Y(*y+5-Ii`~)4{oV~0e9=3w+
zp7xn2Njd<4T>G`6oPmGVL3V(@!Sqs}Os#FrXATWaMN$=b)07FBLtU{UzX%&9N-x^P
zuR8vzp=_|DfH9SBZi_*klK;~tgHLRPM~JBk1O6sS7z>z<6>lIR!lq`#cSQ!pX_q;a
z-MlrTk$x>XDoLH>HF`ZPzLFI*D&BGW3ioxAYGNDBnyYNoRT8;uQu2Qx)^Uv(fxkWH
zPM~CiTLv2@gzJD`jFo^`XlZvn{v1(og{j{{HtNQBp7|+Z-%rnPKOxTmh2aB(ThF_c
z_AzJpa$S8(Z=2vv(gJ|AZaW-7KnWlj8ZOM<(H!$5^g?wd5+yXY?{e3n2JefH@s@
zXCxhd*m~?g4suaM(axZ4x4c}SAPZ6cyASjSG%@!_)r#jkU@`$y=d#_j+hTPUz7uqA
ze0vLBfHuqOW)17AiyrYDwJq&j^em(=s~ThQ2>BRcoQ5Z_xoFkx12+LxoV)7Q^7!a8
zu~<}?>}#&kEDcyB^VulBHCI(5ay9f#uApy(O+3pD+dsHg-?UDKfR`f~*df@fo^xv9
zjS1Y&arOvknQv*3a~n}O_P_YP;x3cn0t}C_Bqx501;JZQ6thfd^R(f8(3PHH*i{WE
z-PW(=<FN>f8>WZ2%dbwpb=o!?J4Wy@%KJrc;ZYL^txcr#@W=i~n+GGfsF*$AUA;{;
zMY@e&3kj@RRZ5r|`V&I`aq+4lor<4S-<&l--<{k3?s<&(HO&xJ8}M@M?6=IZi+OBE
z3x9^oQa{_3;<sibxjqI@*!9A8cWkcsu6)$i9nnY8!oC$Com1J(y-ywL=6S~cQs=hu
z1-38+^kis7jTv=O(LG`__Q!{2;#rU;cfh-{EUzaOuL|jQ4zSg%&$URCA$cba9Z}MY
zR{*8jN4kb%xlnGNw(GD0flWfo6g~SEimw6CzU?*l+Zp|lUJ(xm>>ZV)_cL=2(U}pZ
z_AQ02fPe7frDaA&CETrkTo&a9#-*}_QAZE3nc?JV912d>#u!6X_pXbpUc@xxm_(bE
zOy#?6Z&D)o_uFuc&-oOHaFc2GV2SC`pDhLXx)wXIy~gp<T~DSh8%U3)$j%rzx68VX
zPzA1sTXi9)w98l)?AIF`ca{pS>z{z4+DC808%>E99FSBAXJ`24$_!f<6{T647dS>q
z_orp)C-^~{&Vme}Pc^R~HzcE+_TPN~*iOV=N0GIOchYSusHnNfO>HqHH-EpV#68as
zu%VWMpJ1K0qhTuky$~=7jr_>9QGyhTkDt>jSQW9kqB^PK{;{inbxY=l$Q2NQBA7Bf
zU8)KNC4F;zAUHqbCVe2z^FQII%&ww4;aX9CID7k@j+tdPzwPsDIj6Kyqv^b)6_xX(
zRz)%CPWfWDPX&GItA;-YllvTY&sJIt)j?ukmO2uT*DNe)y~zQZ?_TKCuX1s?3z@HW
z0aS9@(oz}UMa+krmKuE-F@OUofg{&!r-Yx%^3vthXA*@^?k;k1q<p3-%=sEvK89n&
zw?{QQfB~A!NX;IswAFyE6fLV{%uvZpBYoe!X8+|7!*ZgPXBK7F5KssZ?Z$o>VN|IQ
zP&xYuq;oM1{DgAt>B?ySLLb{T5<tW6NNC>h<P^#(|MQHwEYI`e$<^RR!{d;pR=4Dl
z;)hrjJh3TOoIClSgkA0jT9=arA`~-NJfXK<N*mNsS$G|GV}I(?@z*gTi`Q*V1X~O5
zFOx>q4^C7*r8%QyU~<v3i2)-o3AqA}IIfXs%j9scKEyG`CZCT0Hbe>ymRqSKSi+F}
z*x_yvPZLC|F;~4}_@5=cs7F<$+flU~4=cueM=n8*uHM4uVK;)qkH1tG+J(R*FUiyg
z28`9TdW|lKi1sWdiWiCRx=`LK$hk2xR!p4+=al@lxa{)kWZuwi9Prs4+u~Ih9fG;F
z`2KOHG}dZtjb4HqANOdMp*O7PLuaDeTW}Yk<c{rHUq@p;ff*{N(8u%IK%nVMN&Jjb
zu8MyKw2Q4F|4Rla0~QzSE@jK1bSXnobBs~br`1&p!4a?s#+Kcy)ONgaVEnh3*reks
zq4#oj?Cg*Tn?C-+B$c-+VaQ96!|P0FfX0WlHwM&^+9f+aWM2lCR$O?ItK?f1Sd*}K
zcWCmAd>X5b*fd|fkO@ppRI*++oPKjok~tIPL9*fZP;ejMvOCMn@kKU7)4(><lc2xV
z3O68anS26+gEG9uY4ETa6n35uAAHj#v#)iTV)AU9A7C4OL3TD*><rd9`Jr51npJU=
znnBH!|1i82kpUTO)b;4@UXRJ88V_*|k}17IMJsB97z@d^t9+bWV7i?++jUB>whAni
zrmm72i5?-x&RpRVFHqd5lEC9^RaXJTVJ)#tw5hF`9Iz&F&zyn{8>}SDv;?->_-hz3
z38atL6TkJ$ctDzycmW)O4}As?nV1v%PpWcbg`a8*B|o1<a$)dzO}6;oP-=wn?DH)P
z-%Wq!>2PPOu-G}&*}Hdpky0zft+VweW%(Z?)d!!J>u!yS7U{ftAWbYW<n2Ucjv9*d
z1w!p<y_mlEo=C9m3QUZhqkRyIA#|PYgTU^cm>2iG@;RSX1finaNBB4&bb#*gFp;6}
z%#A=QA0F_YsXfa599(ELe-ZK}=r|iOL8oEo$-SJH#+xzE@*CR{{O`cSwSl4Iy9W1s
z$i3${7reyrYjR2a%9|9ipnb~eg1Ce$knERkZV5_yTJ}++^L-Mr>9x>5ZsR>F8pB?-
zcw(PPfHs4TX#B&G5kYIuiv<eg)k(ne-ALAfcG;yx<?hIoD`&oQFe}@gXv);1!qOkp
zxWPjz9Nk7GdAv?bk!10}Hbh;{@K;4@W>KO{BRMdsn3>&956#2``j8;zOVJ5>eokM{
zUJLa{T7n%JYgX~KsvbQn_eUh<k=NNYclYLG%c;y2@j-N*{}O15q2zk<2o=~H!#@$J
zZ0hO+lh7B4mO~iYe=E}UxOWLyYTr}Kq%1<a2;8h1FtD|;{Z-qF@q)c3H1Ku*on)qY
z+`I$w=x)VHq%YzS$^Y^5UbQM^8k20w&&IB#-n?S16T#f^Q<1M-s>>VCXzHfEbS2?J
zgLcf2aeJ8!5{0$KDkgre`YD135x)Z|nd@(nR2c9RHQuIBu^EVcq^3QiFBi`2C@#y~
zgktxC6v^QS&GYY!GD@WIuW#yi9cT-p0R<PN6Kv3L1hT2*LEL^79_wblDz~rX;2k_+
zh6Y{KRv#`Gs=k-JrY}dUn#W9@5R<;~*(r_xGSu2@$#H)sd~(4*YouB+ywqTQiy-Iv
zVgADDK?JBDnz$cNdgRxPn}8Y0k!uuRP>8~)1F@9vmUoXvz0}`3sy%WsC+Y%J1T`cd
z7v}ohgveh4Rt_Q$eftWx;X%*{7)3f;sKX8hUAXzBOyj}5<R6WNL*Wcnnc`bqcCX`A
z*lElYNA5VCa}Z1fX5g;KsHGeYkc=Rc-80JVN9j1NU=>;3X0%U-2FCw3=I^n35ezFj
zy10fEez+QJ&)=UpRitJ-|AlSBgaI+!dg`aNo@?~D>2)<|1}Ms%ITi6ke-3vxlUQtH
z_Xu0K;u4kv8I*5&y3$w{O`6>$&I^~E^-rn#m2GW4d4q)QHg<Nbo`|Ap&+uz{`^Od#
zi=dQjN`@kuz<WZ7cUSyN><^83RqyFXb>8O|hQMrE4|mL^9BR}U$KRH-=LeQo`jhOi
z0SsNoDNL3zd<!RN<xT?1(10QuNh!*eE(!6UYq<0>>9{FEE&u~=jokMDEI|Z8%K@B$
zKYduX(q<8ATa#O4q~~+`(SY{2GhB;i0*hvKrmah8mrcpa^ku{__kB#Rr8va+dpRfr
zADAHSWIE^FmCDryWUCYtRm?6+Re>JSlJKsU1}xYaI<hYn<#RW$m6my4IxV-zIqU4`
zC@xXqaRL%T4yO}>j=ja3^s|Jii8&6VS`CWN;dgGjq(K-w_B+Z<5>E*Q78>CuhR^Ia
zAg!0Yf3f?UkpOHLnHxni)$Dk^k0qrsSG-|rU7_FQEV{fxgue9nzR{p~m?l8FnPU2Y
zdF*4k9`Nnf`NQ|Xm|l_@xF>xyrlxCx2PWX?r4gdC{CnnBJ@9=LC)&rYGOx=Kb$Xpu
z_G7Rnd`tQhxk343rYnge1yv)$oqq{~_cf8e%V#j#RUO>B-%ny_cd35U&D?8NWvi$3
zyON4#VCQ8;mZ|f^%%_CuA*)tQy)ik}XMa8bC6ayrfN%x<vGm(po(W-|i%#8#B${uQ
zPX@A;!8TS!F;BLYzm?_8r#-+WkixCZSk!HDGtG%A=Wo=}$(7#8)FzBAVY<RNuaqEj
zvxS-!dO7xuW}H4pQ)sfm{`2lx<nymbM;<JPyVXm#luFNXV|nyc7nVmI=iuT|>O6FR
zBR~dDo+5k>E}F}f$bq0*)L7jnGaNvoGv99)pDrFVZ_bU7J#E|?%{Y{Ic7h72?(zPA
zcy)|4r<vWSo=Si^l`F>OWK9#`_1l!}{T61uzXN849mY)v9g!+IRRI_ITE{mxqsElC
zEV}*nxQsb|**VAIvST3rCtQL9-9L&km6W@VDS7nP!^za43*l_x0lt6G>_rZ*%72WJ
zfq+ZvAKTo{C$wU7rF^3VW0~PqT}T^Tfn4Ouj_%smtJGA+M{;v>5F&BU1oXY_!+};K
zkd(Qoksv4bQN3qq0Ncry8Dw$&pyg(dt4@dWB8uegzKot+&(Q1VkC#gqy)V)yzY#LU
z@vh7;$-KmsL`>C_D!#jy^dMnD{fK08Sh%+!zV~J5ArUG?ZS))@e#h_>LcYDy88bQ-
zNU0Tczuc@xN7F@hcebxn<ER`ioV(}kw-PEAK{d%Aqb)DkXRE;x%(QEsbCtMOYn9f|
zeN3K#H`kxpT$fsf;BtPc$?U7^V;#KN;iMeCQ{N_g4Mwx>QeZZ%N9@uLRYo-vy@EMb
z!(M{BUkg9YhIWu_Q@6uU`^TI1V|Aet{|k#C<~TadvyLr1kr8Pb?~LuaIMYUXGC_c?
z+l}1#H6lOs;B=}Yn9$-n6cQlz(rEAzOvBssJ`TZJ(B+c99bQ^b#NB$DHxuxfGj?#~
zkk;Km)})#?WJo$t{XT!&-^KLJP7kF_4O_wOQ|2uBpJ~i0hQ8Edzp~xT;$kOHr_bN4
z7Y{aNG0rvE16_lBby{626F#y}YDG!1m~3iu!ANDFc$)2gaKrreY6)mYykKBS@Lp2N
z0RL*^z>coFU)hJyMQDp2UPP3Rm@UiCJ4IQxP9mQ$PSdM%RNe6W?t|?%{Tf+B{4G@4
zr4~`%RoLFAFxV4KW)-GSZ9efOmO9b@v`nTL_W;vBY2_$X7r2fR2d4np)T(|T_51Yu
zl)MrqgD&k5V@^V|t9i7A5Y&qiQ}YaB+3T*wn>_*JRJ9c8B~$;Re(=k~mUi3}rQgY#
z<=tZ!xvr$0j8`MG=*S)5#hx>^b*Px#@dI2gUY{ov-kCtqr~j!Kd&*7`8nPMzpVl>z
z*;&Vv=>KXBes{#Qs4)5Y@kecdPaT<ToM`()skt}HCME!#)+;0`c_<GN%wi~*w9H6_
zy-K8igwjM$QKYfx4pIvg$9K>$DOj&nVX3W+Uy=6lKnA_s@cX(*b+MwMyw$;*ew>2w
z(8?x;hMi84KQFCmtmhNB1H75HKC`o81OB&whE2}P5thm4EKmDHY75{|@aUB#jCYp!
zFBGt6LdU;MTqVd#$*Q0WwU?HxV^VrHD>koA0z<F#IjuClp8*(k`J5;{h-#QkEo@~@
z{Af~Ou_So&Sl&PWuLrQb?J1b<WJ9vEg+`gsa_^b)cY;-#|L-0!`ms0`;rTNdvrYKC
z)4quT#O1pvWWpE<JuoG*O_?xa`!lU)G53^QW}`UKO$o;L;x2F2*{4cbgr4{CxfpYv
z5H8cLN|CjCuPNnH$*TOLU#G%;NtjF)hS(8Y?>MRN6qAzlUh8_#4z1+rD~r>SF6EoG
zT3<7)d1Wex>Xl-wH0-awY=2YPS|4GhZWH$oqew?Zegvxs#>k7oA^zXUBZ(xz@KQls
T?|XFr3GiA;OR-Yk^22`sn~zF<
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/icon-vm.png
b/ui/src/app/images/theme-default/icon-vm.png
new file mode 100644
index 0000000000000000000000000000000000000000..50dac50c5a0ee59f4e79170434f53bb3b94390e3
GIT binary patch
literal 2976
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/logo-white.png
b/ui/src/app/images/theme-default/logo-white.png
new file mode 100644
index 0000000000000000000000000000000000000000..0add8428122507bd2993aa01a939b9247294a0f9
GIT binary patch
literal 7438
zcmV+p9r5CcP)<h;3K|Lk000e1NJLTq001%o001lq1^@s6C*$i{00009a7bBm000XU
z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag
z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V
z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H
zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T
zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j
zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p
z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i
z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i
z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf
z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G
zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u
zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm
z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v
zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW
zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo
z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X
zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t
z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl
zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4
z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_
zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l
znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U
zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0
zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O
zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p
z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya?
z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y
zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB
zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt
z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc=
zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C
z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB
zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe
zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0
z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ
zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$
z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4
z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu
zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu
z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E
ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw
zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX
z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i&
z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01
z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R
z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw
zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD
zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3|
zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy
zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z
zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h
z1DNytV>2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C`
z008P>0026e000+nl3&F}000sxNkl<Zc-o{|d2k%no&MhI*VlB<sTpY`jU-E!b@-4h
zTiC|fK*-`?aO4B*#Sk3Ffx=|TZe_!kmm(C|Y;9n(R1T;lCSf^>5H?=IQKUi+lCZ&m
z7aVhJd?DYmb&WI{jppj}?H}}bJBq-Hx2s;wjAq{J_r2fs{k|5#>@EU;0$|>dy}`Wi
z8~`Q&%lGPdbLq6Xf;TFc>kZo*mCu#=d^Q_oe*q8%Kmwou2mp{pQPe4?Vb|q^5ELL_
z$g->q=bU;Qpa4W~uHwBHy!FVmO;>=J-fIQqtia3$NM$n;02P1^K+<(R(U@pjtCZ9}
zE9W**m1UG9+kI^0=<e~c@sbaK>Vc2}5F!YoCMzKkBp`q=8*agbn=Kl~1RU4(?nAwM
z+p`73E?@=t+(HJR0g%JNP-DH;usJZH_eljc5pzS}rl>1AyH#mY-rHZ?_i~|FBpwJ2
zfFvqPKoi8dK}l+@QMGo-bZTTmf)>G;AqfMc#lqo9%RE#t%7-k|<eudm0MK<ES6_Yg
zMO&n@SjD9R0OUv{(%7Q4+$oMK>%vwPDKsOFdN^R1JU7*%G_>AuJb3K&Lh+30%_Ff`
ztT8F6Yik^=4dl!1%4C*?KoJCi01AT;6lCURBl<h1HD}L&Yy5P4bo2}WF3U21_~D1K
zef#!{210#qB?FK(U60HSw|-VTr?0DVl4vIFsNpF{&|!i=v~!3Hftq5jqyQ)bu<8>v
zJ<Uw{hfpSWdE9U?2QnHELIMmS5Qrcs!9})c(a~aY>6rkQ_BYfl?ypJS^_iP*8cd~9
z^yZsy#)aIA%_2TNv<LxdOf+5@8jkceI8B%@E<nPn2Zaa&9Fv#=V**lb$-y7ovAgue
zzrWKUmfO)zq<@YKjV+!Bh9ywZ0SQSk1R#SE*^77=1~>}b!MS1{@1GpqdTQe}?{2$g
z+qY}$YAXPoj{_pi0)z}ejwceyMz`_r8nR8zJ?auPyYnD(6(w#UhZ4$gF@N)%L#w~M
z=%MAG>^*e&$YI?+dg9y3bb9p?2v`$HVp%X@G-xp^7*MEGwkYE{FbEKd1O)^kA|Orz
zsCP@?HA!Vaa9`={T~hV{@Qbww@#TD{I+*B)r>p08$eoxg%!6VFFy>~#8OPjD)(<4F
zsD7<|bK{<9Yw!;M+?eTZkEKV}bO&pltCy`h(6MysTk^7nr#TVr^7y#U_a9nF4;{Ib
zz4dN`VCKL{2m}NYY}9ZI-5v8M-4)9#t_@#Gz9`os0JtcM2=P#7y;ZNYNUew=iYc=M
zIVPH2Uuk=3&J7KFv>K(KN^}B1dC#6b^~Zks+gsa`&Er?@*zxV2FWvr%5Kv97$~Hh;
z!Ld1RylzkN*r`<EKVJTv{_lG>i{k?lpu)u@+y%Ya_-C$vQSVw{cn4`#HuS&)58$!K
z9{Y<e!U6Drq%qwM*4B_DO^DSHrWA-VtGw*{-A|-8C7+~><N*``n4I&%|Gc{QW&$FA
z@}9fyzU1?_{7z6+4nQEDuM@^>1evY%%pWrnv3t^8t?z|?{%W6i<YWTNyN3AYzUM<L
zx?b@Bm;h|sw)sO3J%s!2yAP&m&Kd~uy*jF>5M2qysz^f6xCRi1r@mPG>xRwA#|a??
z0EU;PN=H99DvXYfh`pQo{`HD&TYoL8s^gui<+(?tin|2hRjFhdH?RMGc24RA=iUBr
zV9lzWG%qzaHa2E?bF7zNewpvsv4cB~LpbL%W-m5F@vHEv3YFj-yc}Tac!&mFp(s+Z
zQ_Re{v+fB($b>hq=nX@aWOl{1YoA%Wq0iJp!OB{dtYbNj<D58g;=^i9h(iIFG6r!@
zvR{~6ixLMi2M=Q5!iDhaknG*V@y3jmp80rBh15~s5CG7EnJ+-aDMmyG7N=EfL;uY}
z^aJl?4G%;afZf#GOq!aTE#F$_`BXlicfR+%@435n?W!D_8d0T`s_FGrL9Hq#av7>-
zojN<1iAO?{dBYwt%B4xq3XadJe+Gv6(r|@Oi9T=u!1Kj|S<(vcmnFk;$}Uqn<Uay*
z(p$Xjf$`sfdY}Di(;XNX;JbG1s#wWMR>gwNwbh@d<>LCJ#(GJ4O5x=^s_J#aWXj2$
zBmURfboQ6Slf`|dLO$p1)14_5Gam@qBX>+z6bXb01a7%pDi#0;L&nIyT*Jgs`=Ht7
z*v^<Jv9h;@<uf_=v06U}J~cIkr=EJsPu<bl);4j&#*KRdit>wRe)!$ar3)5r=oGRW
zoyj3}5=O^_QR)~91^SK^<4+zslm5YYdTapT%y(eevSkaR(dc>eGXN4}EKrq5bWlC9
z#&m?J%-kW#%Dr^z<jMWlZ`pXpK5jlab!6(BQ|Wxnv?7iqO7LwO)2R2KTq7eRxc~n9
z0RX8~3b)>REBSO^pRuH;=L`Upnf%8kJzX!0!$)3E9(?JmZu)Q{;|e&H$=3EyX8*A+
zTwlNUnD&+7!Lw%^+hzc;efxGi{`lkPgIw`gs;udu1@XB(|1@d@R@zh|3~+0M&H*QV
z<n{w^y?G!rkxjjQ=legZ3dPm>uT^hZ(9w~Z=DQzRd5;}ChI#Ymp{Aw=&pr1XR<2x0
zrX>~tFh+BE3?KN-jyd}t{*G*p>QjP<;qfuNpLX!O(!B3J`r?~+Z{2)-{)#Iu$8ERW
z#wn!)02jQtkN|+n+9h_p>x<=J3z6%)VTD@AgcGW(OGf#P>#lrzPE*t5xH5V?eQbPn
zR-8Cj-B9&GAQ0fbfd0r!Q55v{_G0JGomjDA1!l;O1OU}!$+_{4FCFac>TRyh9qG|k
zf=EzCwUmb@x(m}%>ixU!`P!lDH>{_Gkn?52Uq@UA0wv)_1RGX?#u`Cv3x$a><n0d@
zx>Sk)Fqf_EeQ$4J-@UoXtZf-KnGFa42m}JyxN+n3Ho+fPWZSlF&hg{N=^Jmn;p}Ou
zdoo%b-_UA|#F#3hIvPYT84Ijm)c%>ErtSkU=!Jv>FK{Z0azX`12-Skbnn40#@X{2h
z8beF{g0iA01ON$W8ZO^***mV~5=B#-*|edhQVHGN-5=NYZ~*A<@2_wx`jcm07+Ah-
zWq-9YxI8M`0F#i=T=cl<OQWLE4&a<;O%A|e{^p+oHf0hVra~YTa5)G#>T0ToB~daf
zlN42Pp`NeOAInV3<uaO^n=vvnf?4!FtkTy{<qJ46Qasm_a1oApJ}5~@sZ-TKp_uTI
zS{H!Jd{x(`6h%q^i*qpIv%h74fIB`0YWq{JWm$Z3a+1shrn9pXV`F0<$LIVkyV8+T
z&Ot}A1uLUFupJkYD1d`P7fM7SR?yGPD|O_&iXl==1elX8ICew=2O)rCahO(lZmCot
zVNEKZIB|kHj^n2ac;=aBaNm9R%}TbJ5d;CF0%hO?uH$$#$rbE!skUgka9jd#4iE-e
z02px<pGZL~!OknGQ)PUhKIrTpvFyLHEEkLt5CM4iOsVr{zunu|R->Q3;>xS0r%Zpq
z@{0gM1t!o$Q>;@WiaL05=#XvO4&mU8+cCHfIHBN#fO8iDcR)Sr<WpPDb0NnoS|@St
ztw-ksi}}ft3lIWH5^!R~j{NR$cIW25-l}^5B%ekl_!qngt59&b!9b)Xn$jO^XlYyu
zz;Fq&2Gd@X8G&d{La_26g;6+4mFuciMPJ%J&#`zY6vFoH+j&pV61TZFe4-{<9X&J|
zTu~@<NX&s_m>3)$o40ml+i+=o;1A=Oi3%w^pF&$(Td{fbX7u*<VsvyAxm<2GKqvsl
zUCx4mNKS7gI}**2UVD=LqF5*mefgfRo`#iQ(x8<SB6FD|>qcquZNHS-uYG|rY0}pc
zSb|rq$lkqsd0*eB>8Gw)Yq8?cL79}Qk4;Ej`3VCM9TW>D8_8xb?QDz~DCPPy6BD@)
z7b5PO>-zY^-}x4H?%YY%ty_mzUwsuvj~=~{CH{o0TDEP>?Vi&_=bYWNaPI1}jn#AC
z`1;rHpE9B?@3_&HVVY?BfG^tmE4h2?)3U0ap&uS#g{(Sk_wL;Yg+kotv(nltR}M8b
zoW6H%s(kjP_vKsm9xm3yRxn(O#D1R%JkXfxzP!pH&r6JdU^;xbZ_^FumM>pk$!Nqd
z3_e3FOs^fppLT826kJ1^6!nr7s?OcAxOMGM0c5&*F6qzb+RrhVG7E%l#>5I0GJV+-
z?DpGlpMC=nCd>2ZwT?75mcG^9l->LGB5lpv$HSMudn(W|GAJlV(`18|#I-WA@5G7q
zBW{+S@D?NhTv?X=P1<xI&a{*(0uTj35DWQyG;A`$>xVlTcb5YA6#!8Wg({jb@wt=f
zYqmI>;iOyuE}@hKRIPN?0_FEtEvz|kGF^OPAip5S*yZ|(Gv}Df^ENe0*@!Hhy=>_s
z699Ja-t9j1)KmP>p+o*8;Fp~2X)Q#hb&!>S7BZY%7k8<^)B+6ztnQ)V;osCIlg>1;
z+yCB~sb}~15*70ikqH2hZcB!SK6lwFjE;`LvK@R#IteHtL=Y(DoC|}4gS1d6`1>4o
zzSR{3TZ_e%LONaWzN=`-Isi8q4PIhOlO2kx5K#qZTDfj8eNL%OCd<>*dOodn;4_I2
zA9nVfJC5TxcinXtfBNaCE84F%HZ~?TbuFnwv?^p}C&tgdxBu)6J-^^<n+X7yF-GTg
zcVC?@6of)L{e-vqin1?O#S?KFu|7+KR#cD1ASe`&9FdBG=moSp4akL66x+7>gAYE4
zd+)uMI*uc8&Se0qq9~ENMLnAhHMGIBc}fXKPqp<fe>Q#c_zT(0c){zd1z&vu0dWP9
zk*axZpUN=tZxfNo*T??v8H-8?m4lIBQma#Lw?Y%kYEwbz2@#CB2&-{B9!dCP?c*OS
z^!NAw$sb;P@kQKy_uYQUR1^d%)wZ^+Plx086tt+qVsT6mS|b;8OY6c_E7|eGPfrY<
z>j&om=MD&Agi@vjLwdMAwJuG_=R<n1KU_9`4j@3OpfHieBUO<_fqM0(f;4(rtU(g0
z<^`aHIRqjjsx}YS#*^+08E<AFZEbBA`i-l_60#Ajy2hw&Qlj&FK<nnfrWE<HQFi9k
zk&RVqaCKGn;C|$De-y0p5ClQvirQfibe(aWg;Jv0T-DY6$g|)4Mkb(XDLo!ut=1?v
z<;lddjFJh(np7lvLI^ji;LJimZYss~)+3Awm}ZTO(tgitQB+oJ8i|UmtsBzfOTmLt
zxTXO$T8(ljiV-~;r-8^da%T7%l=CHSTY?EluEc;y7+bHq?)lGlbpH6+Z+=7SytHf0
z$<ncZ84w1m^=bjp#vp3iHAI>eNE(4<m(UWsYJWo{b!?iPbkR?&&P(~(v!_REyO#Vm
zUz=K03dbP}1h6d-QHB^#fJ+Q^RUD<UVIV)D!Yl%m19}J>S1j50jdj=EUq}zz0Al4p
zX?+IiYJI+hc$<z$oq}Lkf+Pzl+gUWI9i_$bzUO0_lJV`~{{;j9ob~J1JBz!!jmGwl
zAO6Y_+Fx_|mT{L8I1b=g;GDyeRiLT{(8GXT1j+@3g9_i?wdj>y%NPAyLKcSvD=K{9
zZ@wV>_~1{%SOf%@2cXtUkR=8RilUuGg2k}9?#`dIgj!#lL6GCK;XE^5n>KACk3RY+
zk4B>c0O$C?VAJy%>-slMar0Zb(vtCfUMiQ0;N=ofE`h>9R27U>wXq}H+M9oNZDaBm
z3c(p~Lz(p0xY~L{$0NDx#<oNjD@bZVXby+q7-(QA+}LpMPd`<6!^1&Q90X7TkoN>Y
z^Fq47M_OdVh7EY+kw<tm8m*+iz}$wq^c{)vV>h|<&7)IB`@soq;n7^7W_YTgCnce@
zI3CV)MgvD%BKq;9BAxVV04nq%pUdZZ>Xtt<7&^T?Bb;h-;X*<Hiz1>wk;8`A;OS
z{ZEzALGSlvAD_CQxItcj{q-5YXlrXjJRT?0v|-5yUM!ndbhKpZla?iiMA1zJ17(4d
zymxcrS)$|tvMkfG_Pui;^637j?>INV|5jVigf7umpV*N6+;ht!3tkZ^CcHVtX;Lh|
zplf-B>_V<L{XZYhiv-}Df`9^q`Z`8GvGe=60Dxt3*{CDgNtf6GRnQzw2<8NG9&p(M
zKkN9I4Uj);OQ$Iw(_2nH4Tv-CA*SH_M*@GB$$h|$>Egz0Hu%2-0Eb?;I1+RHpa1{>
M07*qoM6N<$f{<Y(^#A|>
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/logo.png
b/ui/src/app/images/theme-default/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..5be8d514bacdcc0d080a5b2f12314aa7ee94a8b2
GIT binary patch
literal 17195
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/logo.svg
b/ui/src/app/images/theme-default/logo.svg
new file mode 100644
index 0000000..a3e57e1
--- /dev/null
+++ b/ui/src/app/images/theme-default/logo.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg
xmlns="http://www.w3.org/2000/svg" version="1.1"
width="387" height="366"
+ viewBox="0 0 387 366" overflow="visible"
enable-background="new 0 0 387 366" xml:space="preserve">
+<path fill="#D91F2F"
d="M303.868,82.71c25.172-8.604,27.898-42.319,7.13-55.331c-1.923-1.04-16.93-10.998-43.506-11.999
+
c-39.783,1.486-71.632,13.167-92.662,62.139c-0.25,2.109-0.508,6.054,1.977,3.206c0,0,0.284-0.329,0.443-0.515
+
c15.153-23.034,69.707-29.756,88.572-8.681c0.625,0.72,1.297,1.634,2.003,2.274C276.457,82.654,293.688,86.191,303.868,82.71"/>
+<path fill="#F19125"
d="M336.691,227.692c20.913,16.439,50.687,0.387,50.306-24.119c-0.174-2.18,0.018-20.188-13.601-43.033
+
c-22.892-32.571-50.019-52.939-102.551-43.944c-1.906,0.938-5.355,2.866-1.615,3.403c0,0,0.432,0.059,0.674,0.093
+
c27.571,0.183,62.889,42.3,55.469,69.596c-0.263,0.916-0.665,1.977-0.817,2.918C321.826,204.661,328.231,221.044,336.691,227.692"/>
+<path fill="#8CC643"
d="M228.105,329.358c-4.421,26.23,23.926,44.686,45.259,32.619c1.831-1.197,17.731-9.65,31.27-32.543
+
c17.636-35.689,22.531-69.258-10.515-111.072c-1.737-1.225-5.082-3.33-3.762,0.211c0,0,0.152,0.406,0.24,0.637
+
c13.04,24.293-7.028,75.463-34.545,82.018c-0.932,0.207-2.055,0.361-2.955,0.68C241.207,305.282,229.893,318.749,228.105,329.358"/>
+<path fill="#27AEE4"
d="M81.133,285.823c-25.04,8.973-27.272,42.725-6.314,55.43c1.939,1.01,17.088,10.746,43.677,11.357
+
c39.757-2.072,71.43-14.219,91.738-63.496c0.22-2.113,0.421-6.061-2.023-3.176c0,0-0.279,0.33-0.438,0.521
+
c-14.811,23.254-69.259,30.777-88.434,9.982c-0.637-0.711-1.321-1.615-2.038-2.246C108.544,285.476,91.262,282.192,81.133,285.823"
+ />
+<path fill="#06659E"
d="M48.671,141.301c-21.969-14.995-50.596,3.023-48.569,27.447c0.321,2.165,1.34,20.143,16.463,42.022
+
c25.03,30.957,53.465,49.455,105.273,36.947c1.839-1.063,5.151-3.219,1.382-3.502c0,0-0.432-0.031-0.678-0.047
+
c-27.52,1.672-65.589-37.975-60.023-65.709c0.202-0.933,0.531-2.018,0.62-2.968C65.053,163.281,57.561,147.365,48.671,141.301"/>
+<path fill="#BA1E70"
d="M164.882,38.837c6.497-25.793-20.29-46.448-42.516-36.122c-1.919,1.049-18.444,8.206-33.764,29.946
+
c-20.424,34.171-27.98,67.243,1.628,111.558c1.632,1.359,4.798,3.726,3.765,0.089c0,0-0.119-0.417-0.188-0.651
+
c-11.062-25.255,13.021-74.663,40.974-79.004c0.945-0.132,2.076-0.198,3-0.441C149.9,61.794,162.255,49.273,164.882,38.837"/>
+</svg>
diff --git a/ui/src/app/images/theme-default/low.png
b/ui/src/app/images/theme-default/low.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f891d648d7d72c558a942ab77befb1cdd368235
GIT binary patch
literal 813
zcmV+|1JeA7P)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!zez+vRCwB~
zmRU$tVHC&j+-%X%DAIN?+o)`y2U}iR9)g0RqJ;|TAtCCeg*HOyHCk<7p@<61z!rr>
zC~UBW7K%zKgCQylCmUL{z?|xL;(uWnX3S<h@bfU<`+aBm&UeoBm0c-!5=b}b4U=H5
zbU)}0ZO{mhp$e+u9kj;VC@q13Tvz~wFbuxKXLzrTx<Dq(fcbiM8qUItju<I`gVMJ7
zb+{<6KR~mhw5a?r4VJ)Wm<<~s5FJ&lkuh){hQcS<2gPyH@B?0pYfuS?V5A&csuccR
z=SD5egZ)a?C8eu4QJ!O@N@=qUq{9iA;yv_?^nz^){XVRRnhqN9qz;Op1P01rZnTk^
zFb`T}?4y&Mm{U98IShwoo)HUg4P?P_xa*`QuV5GaRCV?-BNJe(4*DoWoYdtq+=Kow
z*;V;jG*_X?=^U}NU68|z%}BmV`PqLS^uMHDMn;>F9Pp_vL^{!kwVhv(Z4va;KkX(v
z!JIt}D#2vsVP0rcfhyG`!y@^rADPlOQj8!dou%q+wm%{G4TIG94yS0OR=Tfr$kolZ
z);&>G)}-5;tUQ(W>#QHRs_7PW&;jJr!rh&u0c);L<m_@)ZK*4-EA?QdQg#zgCUF+0
zaMC*SEEuP2QRk{{pMx;0hUvWc27Ls|I%vS&FJfIln{S7%a0b434Kg6l)73qPu%K4W
za;r9pCvBQ1g}h&)ZobnlAl%YXM0`;*K3ns|=E!Y0pft8}cl??+Hq=IG+}fn9XY)H+
zZ-ui~>&?Mc@W>wcVm>5BXddJ%jmK03;dWAGXSfjd%F#w0dX3jX(&Dt~MH;(yc<ZD~
z72R9-20hdjtb@;y&H#&QqYgaM-iJg`Rc2Fih4dC(*jVvtkC!Tx@^}L;(I-(@l~n=b
rm5!+}SRUIzYS4hIkWQG=KLQK@;61`6RS)H800000NkvXXu0mjfY}$8n
literal 0
HcmV?d00001
diff --git a/ui/src/app/images/theme-default/med.png
b/ui/src/app/images/theme-default/med.png
new file mode 100644
index 0000000000000000000000000000000000000000..06106551316ec16a148c346941ddec92f9d16bc9
GIT binary patch
literal 873
zcmV-v1D5=WP)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!`$<GWRCwB?
zmT5@TVGxIR*Dg1-gDktK)CxPKp!-V}1r|oxMF$mSMF$ii6%o{jK17+_cVI*XW}sb=
zNJWWd2T@o`8A*3|Bpqvlxz#i96Bb)#+Z}jz*!{onJM+%We`cLIm##XRkv7l?#=vyx
zZqODQpaPyiKHP>6Q19=cR?Qgb3$q{<V&Nxzg-<#t3?g7Mr07{DoPigC7#Rr%rS0(R
za6w*w29IuOw@QFSm<Jmn88$$H@2#2|83gB`AAEtmu+L8z>fnvI0(o!<2FRiL3SoUy
zBQdaFp}Gji;Gr!{>64Ny2V(WyZc_@cOy|DM%~#l#!df^1E8vD5>{Q}Az#dov4`3!#
zariiGT&xiJlVUi4p-ing4h!KmOtss(v@i)~KrL*Mfl=rku)GBW4&^0-^{W(~o$wsu
zV1X?#BjK<bBIQL98)B5miH^XeBW!11l0vu}eyKV;n-TMPuo8U~yf7DLJN{3iAq_*8
z{9L%N-^RLBes-J7P|cz^B`+A61S1r-^NkLhks+$GXL`5>dO3oZc<C}3i8mu%t;*CE
zysE5FWSF$Io!<~;M%wE~k96x0jYLb=O1sU-cYTSFz8RvCa_LA_ug5+r;Scmw<2xLp
zkrL@H(v@bUP_28ks;pWqBUmZ+c}XqTk6fzhT6NIwv<JIxdXNUJxjvP%i&VAQE_t1&
z2g?+)TW~UnT%5v5>&#PNs9uXwm)iDOr~&Ig6Il2TeFSm>G+^tuvadjgZ&Q_?hHs4x
zvOu1PYhd+eLy4N@W*y>B8Z=K*S)ZkDzDqCU9i_tS^qKKdnkP1P?^^p-7;T;;Xx`XN
z8K`k<ld_D%?`gjk&N}Tk2Uo&l-+9s~{UJ-OrcQ$^U7>7F!qiMN<Y<MGUZ@W8&-k@A
zJx62LlDA$uTeo`;KcF4-PzRqT?FPG5niB49>5oLYsw`0x(ex(0uua9OGhV7tEG$)l
z{w1nWWnF{e3deYLXSW8@M;mZjQ`AyO{|Ybw4NBe};aPP+00000NkvXXu0mjfdFFsc
literal 0
HcmV?d00001
diff --git a/ui/src/app/index.html b/ui/src/app/index.html
new file mode 100755
index 0000000..c00d642
--- /dev/null
+++ b/ui/src/app/index.html
@@ -0,0 +1,238 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <!-- build:css libs/themes/base/jquery-ui.css -->
+ <link rel="stylesheet"
href="/bower_components/jquery-ui/themes/base/jquery-ui.css">
+ <!-- build:css css/menu-flat.css -->
+ <link rel="stylesheet" href="css/menu-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/button-flat.css -->
+ <link rel="stylesheet" href="css/button-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/radio-flat.css -->
+ <link rel="stylesheet" href="css/radio-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/checkbox-flat.css -->
+ <link rel="stylesheet" href="css/checkbox-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/textbox-flat.css -->
+ <link rel="stylesheet" href="css/textbox-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/selectmenu-flat.css -->
+ <link rel="stylesheet" href="css/selectmenu-flat.css">
+ <!-- build:css fontawesome/css/fontawesome.css -->
+ <link rel="stylesheet" href="css/fontawesome.css">
+ <!-- endbuild -->
+ <!-- build:css libs/themes/base/bootstrap.custom.css -->
+ <link rel="stylesheet" href="css/bootstrap.custom.css">
+ <!-- endbuild -->
+ <!-- build:js libs/modernizr.js -->
+ <script
src="/bower_components/modernizr/modernizr.js"></script>
+ <!-- endbuild -->
+</head>
+
+<body>
+ <div class="topbar">
+ <nav class="navbar navbar-inverse">
+ <div class="container">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <a class="navbar-brand"
href="#">Kimchi</a>
+ </div>
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <ul class="nav navbar-nav navbar-right">
+ <li class="dropdown" id="peers"
class="hide-content">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><span class="topbar-text">Peer
Hosts</span><span class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li
id="search-peers"><span>$_("Searching")...</span></li>
+ <li id="no-peers"
class="hide-content">$_("No peers found.")</li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><i class="fa
fa-user"></i><span class="topbar-text empty-when-logged-off"
id="user-name">User</span><span
class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li class="critical"><a id="btn-logout"
href="javascript: void(0);"><i class="fa
fa-ban"></i><span>$_("Log
out")</span></a></li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><i class="fa
fa-question-circle"></i><span
class="topbar-text">$_("Help")</span><span
class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li><a id="btn-help" href="javascript:
void(0);">$_("Help")</a></li>
+ <li><a id="btn-about"
href="javascript:void(0);">$_("About")</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </nav>
+ <nav class="tab-area navbar navbar-default">
+ <div class="container">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle
collapsed" data-toggle="collapse" data-target="#nav-menu"
aria-expanded="false">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"><!-- Hamburguer button here
--></span>
+ </button>
+ </div>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse"
id="nav-menu">
+ <ul class="nav navbar-nav">
+ <li class="hostname"><span
class="host-location"></span></li>
+ <li class="active"><a href="#"
class="host">Host <span
class="sr-only">(current)</span></a></li>
+ <li class="active"><a href="#"
class="guests">Guests <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="templates">Templates <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="storage">Storage <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="networks">Networks <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="administration">Administration</a></li>
+ </ul>
+ </div><!-- /.navbar-collapse -->
+ </div><!-- /.container-fluid -->
+ </nav>
+ </div>
+ <div class="content">
+ <div class="login-area">
+ <div class="err-area">
+ <div id="messUserPass" class="alert alert-danger"
role="alert">O usuário ou senha inseridos estão incorretos. Por favor, tente
novamente.</div>
+ <div id="messSession" class="alert alert-danger"
role="alert">Fim do limite do tempo da sessão, por favor se autentique
novamente.</div>
+ </div>
+ <form id="form-login" class="form-horizontal">
+ <div class="form-group">
+ <label for="username"
class="sr-only">Usuário</label>
+ <input type="text" class="form-control"
id="username" name="username" required="required"
placeholder="Usuário" autofocus="">
+ </div>
+ <div class="form-group">
+ <label for="password"
class="sr-only">Senha</label>
+ <input type="password" class="form-control"
id="password" name="password" required="required"
placeholder="Senha">
+ </div>
+ <div class="form-group">
+ <button type="submit" class="btn btn-login
col-md-12 col-lg-12">Log In</button>
+ </div>
+ <div class="form-group">
+ <select id="userLang" class="selectpicker col-md-12
col-lg-12 ">
+ <option value="en_US">English
(US)</option>
+ <option value="zh_CN">中文(简体)</option>
+ <option value="pt_BR">Português
(Brasil)</option>
+ <option value="de_DE">Deutsch
(Deutschland)</option>
+ <option value="es_ES">Español
(España)</option>
+ <option value="fr_FR">Français
(France)</option>
+ <option value="it_IT">Italiano
(Italia)</option>
+ <option value="ja_JP">日本語 (日本)</option>
+ <option value="ko_KR">한국어 (대한민국)</option>
+ <option value="ru_RU">Русский
(Россия)</option>
+ <option value="zh_TW">中文(繁體)</option>
+ </select>
+ </div>
+ </form>
+ <div class="handlebars"></div>
+ </div>
+ </div>
+ <!-- build:js libs/jquery.js -->
+ <script
src="/bower_components/jquery/dist/jquery.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/jquery-ui.js -->
+ <script
src="/bower_components/jquery-ui/jquery-ui.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/jquery-i18n.min.js -->
+ <script
src="/bower_components/jquery-i18n/jquery-i18n.min.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/vendor.js -->
+ <!-- bower:js -->
+ <script src="/bower_components/es5-shim/es5-shim.js"></script>
+ <script src="/bower_components/json2/json2.js"></script>
+ <script src="/bower_components/base64/base64.js"></script>
+ <script
src="/bower_components/typeahead.js/dist/typeahead.bundle.js"></script>
+ <script src="/bower_components/bag.js/bag.js"></script>
+ <!-- endbower -->
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap.js -->
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/affix.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official//assets/javascripts/bootstrap/alert.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/dropdown.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tooltip.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/modal.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/transition.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/button.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/popover.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/carousel.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/scrollspy.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/collapse.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tab.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap-select.min.js -->
+ <script
src="/bower_components/bootstrap-select-sass/dist/js/bootstrap-select.min.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/main.js -->
+ <script src="js/main.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/menu-flat.js -->
+ <script src="js/menu-flat.js"></script>
+ <!-- endbuild -->
+ <script type="text/javascript">
+
+ var getHostname = function() {
+ host = window.location.hostname;
+ return host;
+ };
+
+ var fixHostnameText = function() {
+ var host = getHostname();
+ host.lenght > 20 ? $('span.host-location').text(host).prop(
'title', host) : $('span.host-location').text(host);
+
+ };
+
+ $(document).ready(function() {
+ $('span.hostname').text(window.location.hostname + ':' +
window.location.port);
+
+ $('#nav-menu ul.navbar-nav li.hostname
.host-location').text(getHostname());
+
+ $('.selectpicker').selectpicker();
+ fixHostnameText();
+ });
+ </script>
+</body>
+
+</html>
diff --git a/ui/src/app/js/main.js b/ui/src/app/js/main.js
new file mode 100755
index 0000000..80d83e9
--- /dev/null
+++ b/ui/src/app/js/main.js
@@ -0,0 +1 @@
+console.log('\'Allo \'Allo!');
diff --git a/ui/src/app/js/widgets/button-dropDown.js
b/ui/src/app/js/widgets/button-dropDown.js
new file mode 100644
index 0000000..ec6bd2a
--- /dev/null
+++ b/ui/src/app/js/widgets/button-dropDown.js
@@ -0,0 +1,35 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function($) {
+ $.widget('wok.dropdownButton', {
+
+ _create : function() {
+ this.actionDiv = this.element;
+ this.actionDiv.addClass('btn dropdown popable');
+ this.actionDiv.find('div').addClass('popover');
+ this.actionDiv.find('button').addClass('button-big');
+ },
+
+ destroy : function() {
+ this.actionDiv.removeClass('btn dropdown popable');
+ this.actionDiv.find('div').removeClass('popover');
+ this.actionDiv.find('button').removeClass('button-big');
+ $.Widget.prototype.destroy.call(this);
+ }
+ });
+}(jQuery));
diff --git a/ui/src/app/js/widgets/button-flat.js b/ui/src/app/js/widgets/button-flat.js
new file mode 100755
index 0000000..bc72544
--- /dev/null
+++ b/ui/src/app/js/widgets/button-flat.js
@@ -0,0 +1,419 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+
+ // AMD. Register as an anonymous module.
+ define([
+ "jquery",
+ "./core",
+ "./widget"
+ ], factory );
+ } else {
+
+ // Browser globals
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+var lastActive,
+ baseClasses = "ui-button ui-widget",
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons
ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+ formResetHandler = function() {
+ var form = $( this );
+ setTimeout(function() {
+ form.find( ":ui-button" ).button( "refresh" );
+ }, 1 );
+ },
+ radioGroup = function( radio ) {
+ var name = radio.name,
+ form = radio.form,
+ radios = $( [] );
+ if ( name ) {
+ name = name.replace( /'/g, "\\'" );
+ if ( form ) {
+ radios = $( form ).find( "[name='" + name +
"'][type=radio]" );
+ } else {
+ radios = $( "[name='" + name +
"'][type=radio]", radio.ownerDocument )
+ .filter(function() {
+ return !this.form;
+ });
+ }
+ }
+ return radios;
+ };
+
+$.widget( "wok.buttonFlat", {
+ version: "@VERSION",
+ defaultElement: "<button>",
+ options: {
+ disabled: null,
+ text: true,
+ label: null,
+ icons: {
+ primary: null,
+ secondary: null
+ }
+ },
+ _create: function() {
+ this.element.closest( "form" )
+ .unbind( "reset" + this.eventNamespace )
+ .bind( "reset" + this.eventNamespace, formResetHandler );
+
+ if ( typeof this.options.disabled !== "boolean" ) {
+ this.options.disabled = !!this.element.prop( "disabled" );
+ } else {
+ this.element.prop( "disabled", this.options.disabled );
+ }
+
+ this._determineButtonType();
+ this.hasTitle = !!this.buttonElement.attr( "title" );
+
+ var that = this,
+ options = this.options,
+ toggleButton = this.type === "checkbox" || this.type ===
"radio",
+ activeClass = !toggleButton ? "ui-state-active" : "";
+
+ if ( options.label === null ) {
+ options.label = (this.type === "input" ? this.buttonElement.val() :
this.buttonElement.html());
+ }
+
+ this._hoverable( this.buttonElement );
+
+ this.buttonElement
+ .addClass( baseClasses )
+ .attr( "role", "button" )
+ .bind( "mouseenter" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return;
+ }
+ if ( this === lastActive ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "mouseleave" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( activeClass );
+ })
+ .bind( "click" + this.eventNamespace, function( event ) {
+ if ( options.disabled ) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+ });
+
+ // Can't use _focusable() because the element that receives focus
+ // and the element that gets the ui-state-focus class are different
+ this._on({
+ focus: function() {
+ this.buttonElement.addClass( "ui-state-focus" );
+ },
+ blur: function() {
+ this.buttonElement.removeClass( "ui-state-focus" );
+ }
+ });
+
+ if ( toggleButton ) {
+ this.element.bind( "change" + this.eventNamespace, function() {
+ that.refresh();
+ });
+ }
+
+ if ( this.type === "checkbox" ) {
+ this.buttonElement.bind( "click" + this.eventNamespace, function()
{
+ if ( options.disabled ) {
+ return false;
+ }
+ });
+ } else if ( this.type === "radio" ) {
+ this.buttonElement.bind( "click" + this.eventNamespace, function()
{
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ that.buttonElement.attr( "aria-pressed", "true" );
+
+ var radio = that.element[ 0 ];
+ radioGroup( radio )
+ .not( radio )
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ });
+ } else {
+ this.buttonElement
+ .bind( "mousedown" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ lastActive = this;
+ that.document.one( "mouseup", function() {
+ lastActive = null;
+ });
+ })
+ .bind( "mouseup" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).removeClass( "ui-state-active" );
+ })
+ .bind( "keydown" + this.eventNamespace, function(event) {
+ if ( options.disabled ) {
+ return false;
+ }
+ if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode ===
$.ui.keyCode.ENTER ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ // see #8559, we bind to blur here in case the button element loses
+ // focus between keydown and keyup, it would be left in an
"active" state
+ .bind( "keyup" + this.eventNamespace + " blur" +
this.eventNamespace, function() {
+ $( this ).removeClass( "ui-state-active" );
+ });
+
+ if ( this.buttonElement.is("a") ) {
+ this.buttonElement.keyup(function(event) {
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
+ // TODO pass through original event correctly (just as 2nd
argument doesn't work)
+ $( this ).click();
+ }
+ });
+ }
+ }
+
+ this._setOption( "disabled", options.disabled );
+ this._resetButton();
+ },
+
+ _determineButtonType: function() {
+ var ancestor, labelSelector, checked;
+
+ if ( this.element.is("[type=checkbox]") ) {
+ this.type = "checkbox";
+ } else if ( this.element.is("[type=radio]") ) {
+ this.type = "radio";
+ } else if ( this.element.is("input") ) {
+ this.type = "input";
+ } else {
+ this.type = "button";
+ }
+
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ // we don't search against the document in case the element
+ // is disconnected from the DOM
+ ancestor = this.element.parents().last();
+ labelSelector = "label[for='" +
this.element.attr("id") + "']";
+ this.buttonElement = ancestor.find( labelSelector );
+ if ( !this.buttonElement.length ) {
+ ancestor = ancestor.length ? ancestor.siblings() :
this.element.siblings();
+ this.buttonElement = ancestor.filter( labelSelector );
+ if ( !this.buttonElement.length ) {
+ this.buttonElement = ancestor.find( labelSelector );
+ }
+ }
+ this.element.addClass( "ui-helper-hidden-accessible" );
+
+ checked = this.element.is( ":checked" );
+ if ( checked ) {
+ this.buttonElement.addClass( "ui-state-active" );
+ }
+ this.buttonElement.prop( "aria-pressed", checked );
+ } else {
+ this.buttonElement = this.element;
+ }
+ },
+
+ widget: function() {
+ return this.buttonElement;
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-helper-hidden-accessible" );
+ this.buttonElement
+ .removeClass( baseClasses + " ui-state-active " + typeClasses )
+ .removeAttr( "role" )
+ .removeAttr( "aria-pressed" )
+ .html( this.buttonElement.find(".ui-button-text").html() );
+
+ if ( !this.hasTitle ) {
+ this.buttonElement.removeAttr( "title" );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+ if ( key === "disabled" ) {
+ this.widget().toggleClass( "ui-state-disabled", !!value );
+ this.element.prop( "disabled", !!value );
+ if ( value ) {
+ if ( this.type === "checkbox" || this.type ===
"radio" ) {
+ this.buttonElement.removeClass( "ui-state-focus" );
+ } else {
+ this.buttonElement.removeClass( "ui-state-focus
ui-state-active" );
+ }
+ }
+ return;
+ }
+ this._resetButton();
+ },
+
+ refresh: function() {
+ //See #8237 & #8828
+ var isDisabled = this.element.is( "input, button" ) ? this.element.is(
":disabled" ) : this.element.hasClass( "ui-button-disabled" );
+
+ if ( isDisabled !== this.options.disabled ) {
+ this._setOption( "disabled", isDisabled );
+ }
+ if ( this.type === "radio" ) {
+ radioGroup( this.element[0] ).each(function() {
+ if ( $( this ).is( ":checked" ) ) {
+ $( this ).button( "widget" )
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ $( this ).button( "widget" )
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ });
+ } else if ( this.type === "checkbox" ) {
+ if ( this.element.is( ":checked" ) ) {
+ this.buttonElement
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ this.buttonElement
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ }
+ },
+
+ _resetButton: function() {
+ if ( this.type === "input" ) {
+ if ( this.options.label ) {
+ this.element.val( this.options.label );
+ }
+ return;
+ }
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
+ buttonText = $( "<span></span>", this.document[0] )
+ .addClass( "ui-button-text" )
+ .html( this.options.label )
+ .appendTo( buttonElement.empty() )
+ .text(),
+ icons = this.options.icons,
+ multipleIcons = icons.primary && icons.secondary,
+ buttonClasses = [];
+
+ if ( icons.primary || icons.secondary ) {
+ if ( this.options.text ) {
+ buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ?
"s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+ }
+
+ if ( icons.primary ) {
+ buttonElement.prepend( "<span class='ui-button-icon-primary
ui-icon " + icons.primary + "'></span>" );
+ }
+
+ if ( icons.secondary ) {
+ buttonElement.append( "<span class='ui-button-icon-secondary
ui-icon " + icons.secondary + "'></span>" );
+ }
+
+ if ( !this.options.text ) {
+ buttonClasses.push( multipleIcons ? "ui-button-icons-only" :
"ui-button-icon-only" );
+
+ if ( !this.hasTitle ) {
+ buttonElement.attr( "title", $.trim( buttonText ) );
+ }
+ }
+ } else {
+ buttonClasses.push( "ui-button-text-only" );
+ }
+ buttonElement.addClass( buttonClasses.join( " " ) );
+ }
+});
+
+$.widget( "ui.buttonset", {
+ version: "@VERSION",
+ options: {
+ items: "button, input[type=button], input[type=submit], input[type=reset],
input[type=checkbox], input[type=radio], a, :data(ui-button)"
+ },
+
+ _create: function() {
+ this.element.addClass( "ui-buttonset" );
+ },
+
+ _init: function() {
+ this.refresh();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "disabled" ) {
+ this.buttons.button( "option", key, value );
+ }
+
+ this._super( key, value );
+ },
+
+ refresh: function() {
+ var rtl = this.element.css( "direction" ) === "rtl",
+ allButtons = this.element.find( this.options.items ),
+ existingButtons = allButtons.filter( ":ui-button" );
+
+ // Initialize new buttons
+ allButtons.not( ":ui-button" ).button();
+
+ // Refresh existing buttons
+ existingButtons.button( "refresh" );
+
+ this.buttons = allButtons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+ .filter( ":first" )
+ .addClass( rtl ? "ui-corner-right" :
"ui-corner-left" )
+ .end()
+ .filter( ":last" )
+ .addClass( rtl ? "ui-corner-left" :
"ui-corner-right" )
+ .end()
+ .end();
+ },
+
+ _destroy: function() {
+ this.element.removeClass( "ui-buttonset" );
+ this.buttons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-left ui-corner-right" )
+ .end()
+ .button( "destroy" );
+ }
+});
+
+return $.ui.button;
+
+}));
diff --git a/ui/src/app/js/widgets/checkbox-flat.js
b/ui/src/app/js/widgets/checkbox-flat.js
new file mode 100644
index 0000000..8a2564f
--- /dev/null
+++ b/ui/src/app/js/widgets/checkbox-flat.js
@@ -0,0 +1,86 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+// How to use:
+// $(".selector").checkboxFlat({
+// id: "t", //Checkbox base id.
+// name: "test", //Checkbox name.
+// content: ["apple", "banana", "orange",
"cherry"], //Contents of the checkbox set.
+// checked: [1,3] //Set the checked item, which starts with number 1.
+// });
+// $(".selector").click(function() {
+// console.log($(".selector").checkboxFlat("value")); //Get
value of the checked checkbox.
+// });
+
+ (function($) {
+ $.widget("wok.checkboxFlat", {
+ options: {
+ id: "",
+ name: "",
+ content: [],
+ checked: []
+ },
+
+ _create: function() {
+ var that = this;
+ var idBase = that.options.id;
+ var name = that.options.name;
+ var checked = that.options.checked;
+ var content = that.options.content;
+ var html = "";
+ for (var i=1;i<content.length+1;i++) {
+ if($.inArray(i,checked) < 0) {
+ html += "<div class='checkbox-item checkbox-inline
icon-check-empty-1' id='" + idBase + i + "' name='" + name
+ "'></div>" +
+ "<label class='checkbox-label
checkbox-inline' for='" + idBase + i + "'>" + content[i-1] +
"</label>";
+ } else {
+ html += "<div class='checkbox-item checkbox-inline
icon-ok-squared' id='" + idBase + i + "' name='" + name +
"'></div>" +
+ "<label class='checkbox-label
checkbox-inline' for='" + idBase + i + "'>" + content[i-1] +
"</label>";
+ }
+ }
+ $(html).appendTo(that.element);
+ $(".checkbox-item").on("click", function() {
+ var tickID = $(this).attr("id");
+ var tick = tickID.substring(idBase.length,tickID.length);
+ if($(this).hasClass("icon-check-empty-1")) {
+ $(this).removeClass("icon-check-empty-1");
+ $(this).addClass("icon-ok-squared");
+ checked.push(Number(tick));
+ } else {
+ $(this).removeClass("icon-ok-squared");
+ $(this).addClass("icon-check-empty-1");
+ checked.splice($.inArray(Number(tick),checked),1);
+ }
+ });
+ },
+
+ value: function() {
+ var value = new Array();
+ var vContent = this.options.content;
+ var vChencked = this.options.checked;
+ for(var i=0;i<vChencked.length;i++) {
+ value.push(vContent[vChencked[i]-1]);
+ }
+ return value;
+ },
+
+ _destroy: function() {
+ this.element.remove();
+ }
+ });
+ })(jQuery);
diff --git a/ui/src/app/js/widgets/combobox.js b/ui/src/app/js/widgets/combobox.js
new file mode 100644
index 0000000..92244a2
--- /dev/null
+++ b/ui/src/app/js/widgets/combobox.js
@@ -0,0 +1,127 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function($) {
+ $.widget('wok.combobox', {
+ _create : function() {
+ this.selectDiv = this.element;
+ this.listControl = this.selectDiv.find('ul').first();
+ this.listControl.html('');
+ this.target = this.selectDiv.find('input').first();
+ this.selectDiv.addClass('btn-select dropdown popable');
+ this.target.addClass('input');
+ this.target.width(this.selectDiv.width()+10);
+ this.listControl.addClass('select-list');
+ this.listControl.parent().addClass('popover');
+ },
+
+ setData : function(options) {
+ var that = this;
+ var value = this.target.val();
+ var selectedClass = 'active';
+ var itemTag = 'li';
+ if (options.length > 0) {
+ that.target.after($('<span
class="arrow"></span>'));
+ that.listControl.on('click', itemTag, function(e) {
+ that.listControl.children().removeClass(selectedClass);
+ $(this).addClass(selectedClass);
+ var oldValue = that.target.val();
+ var newValue = $(this).data('value');
+ that.target.val(newValue);
+ if (oldValue !== newValue) {
+ that.target.change();
+ }
+ });
+
+ that.selectDiv.click(function(e) {
+ that.listControl.html('');
+ var items = that._dataList(options);
+ $.each(items, function(index, item) {
+ that.listControl.append(item);
+ })
+ });
+
+ that.target.keyup(function(event) {
+ that.listControl.html('');
+ var items = that._dataList(options);
+ var temp = 0;
+ $.each(items, function(index, item) {
+ if (item.text().indexOf(that.target.val()) == 0) {
+ that.listControl.append(item);
+ temp++;
+ }
+ });
+ if (temp > 0 && that.listControl.html() !== '') {
+ that._open();
+ } else {
+ that._close();
+ }
+ });
+ }
+ },
+
+ value : function(value) {
+ if (value === undefined) {
+ return this.target.val();
+ }
+ this.target.val(value);
+ },
+
+ _dataList : function(options) {
+ var item;
+ var itemTag = 'li';
+ var selectedClass = 'active';
+ var items = [];
+ var that = this;
+ $.each(options, function(index, option) {
+ item = $('<' + itemTag + '>' + option.label
+'</' + itemTag + '>');
+ item.data('value', option.value);
+ if (option.value === that.target.val()) {
+ item.addClass(selectedClass);
+ }
+ items.push(item);
+ });
+ return items;
+ },
+
+ clear : function() {
+ this.target.val("");
+ },
+
+ _open : function() {
+ var isOpen = this.selectDiv.hasClass('open');
+ if (!isOpen) {
+ this.selectDiv.addClass('open');
+ }
+ },
+
+ _close : function() {
+ var isOpen = this.selectDiv.hasClass('open');
+ if (isOpen) {
+ this.selectDiv.removeClass('open');
+ }
+ },
+
+ destroy : function() {
+ this.selectDiv.removeClass('btn-select dropdown popable');
+ this.target.removeClass('input');
+ this.listControl.removeClass('select-list');
+ this.listControl.parent().removeClass('popover');
+ $.Widget.prototype.destroy.call(this);
+ }
+ });
+}(jQuery));
diff --git a/ui/src/app/js/widgets/dialog-flat.js b/ui/src/app/js/widgets/dialog-flat.js
new file mode 100644
index 0000000..14bc00d
--- /dev/null
+++ b/ui/src/app/js/widgets/dialog-flat.js
@@ -0,0 +1,120 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* How to use:
+ * $(".selector").dialogFlat({
+ * title: "Demo", //Title of the dialog.
+ * confirmText: "Ok", //Text of the confirm button, "Ok" is
the default value.
+ * cancelText: "Cancel", //Text of the cancel button.
+ * width: "300", //Width of the dialog, "px" is the default
unit.
+ * height: "500", //Height of the dialog, "px" is the
default unit.
+ * confirmFunc: function() {
+ * //Function after confirm
+ * }
+ * });
+ */
+
+(function( $ ) {
+ $.widget("wok.dialogFlat", {
+ options: {
+ title: "",
+ autoOpen: true,
+ confirmText: "Ok",
+ cancelText: "Cancel",
+ confirmFunc: null,
+ height: "150",
+ width: "150"
+ },
+
+ _create: function() {
+ var that = this;
+ var w = that.options.width;
+ var h = that.options.height;
+ $(".body").addClass("style:'opacity:0.5'");
+ that._open();
+ that._setSize(w, h);
+ $(".dialog-container .dialog-cancel").on("click",
that._destroy);
+ $(".dialog-container .dialog-okay").on("click",
function() {
+ that._trigger("confirmFunc");
+ that._destroy();
+ });
+ },
+
+ _open: function() {
+ var cfmTxt = this.options.confirmText;
+ var celTxt = this.options.cancelText;
+ var titleTxt = this.options.title;
+ var html =
+ "<div id='dialog-overlay'></div>" +
+ "<div class='dialog-border-grey'>" +
+ "<div class='dialog-container'>" +
+ "<div class='dialog-title h1 dark-gray'>" +
titleTxt + "</div>" +
+ "<div
class='dialog-body'>dafafdafdas</div>" +
+ "<div class='dialog-footer'>" +
+ "<div class='dialog-button dialog-okay'>"
+ cfmTxt + "</div>" +
+ "<div class='dialog-button
dialog-cancel'>" + celTxt + "</div>" +
+ "</div>" +
+ "</div>" +
+ "</div>";
+ if (this.options.autoOpen) {
+ $(html).appendTo($("body"));
+ var pageWidth = window.screen.width;
+ var pageHeight = window.screen.height;
+ var pageLeft = document.screenLeft
+ var pageTop = document.screenTop;
+ var topOffset = "-" + pageHeight + "px";
+ $("#dialog-overlay").css({
+ "opacity": "0.5",
+ "Left": pageLeft,
+ "Top": pageTop,
+ "background-color": "white",
+ "width": pageWidth,
+ "height": pageHeight,
+ "margin-top": topOffset,
+ "overflow": "hidden"
+ });
+ }
+ },
+
+ _setSize: function(width, height) {
+ var wid = width + "px";
+ var hei = height + "px";
+ var cHeight = (height - 12) + "px";
+ var bHeight = (height - 68) + "px";
+ var tWidth = (width - 25) + "px";
+ $(".dialog-border-grey").css({
+ "width": wid,
+ "height": hei
+ });
+ $(".dialog-container").css({
+ "height": cHeight
+ });
+ $(".dialog-container .dialog-body").css({
+ "height": bHeight
+ });
+ $(".dialog-container .dialog-title").css({
+ "width": tWidth
+ });
+ },
+
+ _destroy: function() {
+ $(".dialog-border-grey").remove();
+ $("#dialog-overlay").remove();
+ }
+ });
+})(jQuery);
diff --git a/ui/src/app/js/widgets/filter-select.js
b/ui/src/app/js/widgets/filter-select.js
new file mode 100644
index 0000000..db6b4b0
--- /dev/null
+++ b/ui/src/app/js/widgets/filter-select.js
@@ -0,0 +1,136 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function($) {
+ $.widget('wok.filterselect', {
+ _create : function() {
+ this.selectDiv = this.element;
+ this.listControl = this.selectDiv.find('ul').first();
+ this.listControl.html('');
+ this.target = this.selectDiv.find('input').first();
+ this.selectDiv.addClass('btn-select dropdown popable');
+ this.target.addClass('input');
+ this.target.width(this.selectDiv.width()+10);
+ this.listControl.addClass('select-list');
+ this.listControl.parent().addClass('popover');
+ },
+
+ setData : function(options) {
+ var that = this;
+ var value = this.target.val();
+ var selectedClass = 'active';
+ var itemTag = 'li';
+ if (options.length > 0) {
+ that.target.after($('<span
class="arrow"></span>'));
+ that.listControl.on('click', itemTag, function(e) {
+ that.listControl.children().removeClass(selectedClass);
+ $(this).addClass(selectedClass);
+ var oldValue = that.target.val();
+ var newValue = $(this).data('value');
+ that.target.val(newValue);
+ if (oldValue !== newValue) {
+ that.target.change();
+ that.target.removeClass("invalid-field");
+ }
+ });
+
+ that.selectDiv.click(function(e) {
+ that.listControl.html('');
+ var items = that._dataList(options);
+ if (items.length === 0) {
+ that.listControl.html(i18n['KCHAPI6005E']);
+ } else {
+ $.each(items, function(index, item) {
+ that.listControl.append(item);
+ });
+ }
+ });
+
+ that.target.keyup(function(event) {
+ that.listControl.html('');
+ var items = that._dataList(options);
+ var temp = 0;
+ $.each(items, function(index, item) {
+ if (item.text().indexOf(that.target.val()) == 0) {
+ that.listControl.append(item);
+ temp++;
+ }
+ });
+ if (that.listControl.html() === '') {
+ that.target.addClass("invalid-field");
+ that.listControl.html(i18n['KCHAPI6005E']);
+ } else {
+ that.target.removeClass("invalid-field");
+ }
+ if (temp > 0) {
+ that._open();
+ }
+ });
+ }
+ },
+
+ value : function(value) {
+ if (value === undefined) {
+ return this.target.val();
+ }
+ this.target.val(value);
+ },
+
+ _dataList : function(options) {
+ var item;
+ var itemTag = 'li';
+ var selectedClass = 'active';
+ var items = [];
+ var that = this;
+ $.each(options, function(index, option) {
+ item = $('<' + itemTag + '>' + option.label
+'</' + itemTag + '>');
+ item.data('value', option.value);
+ if (option.value === that.target.val()) {
+ item.addClass(selectedClass);
+ }
+ items.push(item);
+ });
+ return items;
+ },
+
+ clear : function() {
+ this.target.val("");
+ },
+
+ _open : function() {
+ var isOpen = this.selectDiv.hasClass('open');
+ if (!isOpen) {
+ this.selectDiv.addClass('open');
+ }
+ },
+
+ _close : function() {
+ var isOpen = this.selectDiv.hasClass('open');
+ if (isOpen) {
+ this.selectDiv.removeClass('open');
+ }
+ },
+
+ destroy : function() {
+ this.selectDiv.removeClass('btn-select dropdown popable');
+ this.target.removeClass('input');
+ this.listControl.removeClass('select-list');
+ this.listControl.parent().removeClass('popover')
+ $.Widget.prototype.destroy.call(this);
+ }
+ });
+}(jQuery));
diff --git a/ui/src/app/js/widgets/gauge-flat.js b/ui/src/app/js/widgets/gauge-flat.js
new file mode 100755
index 0000000..f715bb6
--- /dev/null
+++ b/ui/src/app/js/widgets/gauge-flat.js
@@ -0,0 +1,126 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * How to use:
+ * $(".selector").gaugeFlat({
+ * value: 25, // Value that you the gauge is going to show, varies from 0 to 100.
+ * color: "red" // Color showed, currently only "red",
"yellow", "blue" and "purple" are supported.
+ * });
+ *
+ * Set value:
+ * $(".selector").gaugeFlat("value", <value>); // Replace
<value> with the value that is going to be showed.
+ *
+ * Get value:
+ * $(".selector").gaugeFlat("value"); // This returns the value of
gauge.
+ *
+ */
+
+(function( $ ) {
+
+return $.widget( "wok.gaugeFlat", {
+ version: "@VERSION",
+ options: {
+ max: 100,
+ value: 0,
+ color: "red"
+ },
+
+ min: 0,
+
+ _create: function() {
+ this.oldValue = this.options.value = this._constrainedValue();
+
+ this.element
+ .addClass( "ui-gauge-flat ui-widget ui-widget-content
ui-corner-all" )
+ .attr({
+ role: "gaugeflat",
+ "aria-valuemin": this.min
+ });
+ var color = this.options.color;
+ if(color != "red" && color != "yellow" &&
color != "blue" && color != "purple") {
+ color = "red";
+ }
+
+ this.valueDiv = $( "<div class='ui-gauge-flat-value " + color +
" ui-widget-header ui-corner-left'></div>" )
+ .appendTo( this.element );
+
+ this._refreshValue();
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-gauge-flat ui-widget ui-widget-content
ui-corner-all" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+
+ this.valueDiv.remove();
+ },
+
+ value: function( newValue ) {
+ if ( newValue === undefined ) {
+ return this.options.value;
+ }
+
+ this.options.value = this._constrainedValue( newValue );
+ this._refreshValue();
+ },
+
+ _constrainedValue: function( newValue ) {
+ if ( newValue === undefined ) {
+ newValue = this.options.value;
+ }
+
+ this.indeterminate = newValue === false;
+
+ if ( typeof newValue !== "number" ) {
+ newValue = 0;
+ }
+
+ return this.indeterminate ? false :
+ Math.min( this.options.max, Math.max( this.min, newValue ) );
+ },
+
+ _setOptions: function( options ) {
+ var value = options.value;
+ delete options.value;
+
+ this._super( options );
+
+ this.options.value = this._constrainedValue( value );
+ this._refreshValue();
+ },
+
+ _percentage: function() {
+ return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / (
this.options.max - this.min );
+ },
+
+ _refreshValue: function() {
+ var value = this.options.value,
+ percentage = this._percentage();
+
+ this.valueDiv
+ .toggle( this.indeterminate || value > this.min )
+ .toggleClass( "ui-corner-right", value === this.options.max )
+ .width( percentage.toFixed(0) + "%" );
+ }
+});
+
+})(jQuery);
diff --git a/ui/src/app/js/widgets/grid.js b/ui/src/app/js/widgets/grid.js
new file mode 100644
index 0000000..bc6a11d
--- /dev/null
+++ b/ui/src/app/js/widgets/grid.js
@@ -0,0 +1,121 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+$(function(){
+$.widget("wok.grid", {
+ options: {
+ enableSorting: true
+ },
+ _create: function() {
+ var that = this;
+ this.element.addClass('grid');
+ var head = $(this.element.children().get(0));
+ var body = $(this.element.children().get(1));
+ head.addClass('header c1 bold grey');
+ if(this.options.enableSorting){
+ head.children().each(function(){
+ var addSorting =
"<span>"+$(this).html()+"</span>";
+ addSorting += "<span><div class='icon-angle-up
sort-up'></div><div class='icon-angle-down
sort-down'></div></span>";
+ $(this).empty().append(addSorting);
+ });
+ }
+ $('.icon-angle-up', head).click(function(){
+ that.sort(head.children().index($(this).parent().parent()), true);
+ });
+ $('.icon-angle-down', head).click(function(){
+ that.sort(head.children().index($(this).parent().parent()), false);
+ });
+ body.addClass('body c1 normal dark-grey');
+ body.children().addClass('row');
+ this._setRowBackgroud();
+ },
+ _setRowBackgroud: function(){
+ var i=0, classes=['odd', 'even'];
+ $(this.element.children().get(1)).children().each(function(){
+ $(this).removeClass('odd');
+ $(this).removeClass('even');
+ $(this).addClass(classes[i]);
+ i = i==0?1:0;
+ });
+ },
+ sort: function(column, assending) {
+ var head = $(this.element.children().get(0));
+ $('.icon-up-dir',
head).removeClass('icon-up-dir').addClass('icon-angle-up');
+ $('.icon-down-dir',
head).removeClass('icon-down-dir').addClass('icon-angle-down');
+ var columnCell = $(head.children().get(column));
+ if(assending){
+ $('.icon-angle-up',
columnCell).removeClass('icon-angle-up').addClass('icon-up-dir');
+ }else{
+ $('.icon-angle-down',
columnCell).removeClass('icon-angle-down').addClass('icon-down-dir');
+ }
+ var container = $(this.element.children().get(1));
+ var nodes = [];
+ container.children().each(function(){
+ nodes.push($(this));
+ });
+ nodes.sort(function(a, b){
+ aVal = $(a.children().get(column)).attr('val');
+ bVal = $(b.children().get(column)).attr('val');
+ return aVal.localeCompare(bVal);
+ });
+ if(!assending) nodes.reverse();
+ container.empty();
+ for(var i=0;i<nodes.length;i++){
+ container.append(nodes[i]);
+ }
+ this._setRowBackgroud();
+ },
+ filter: function(keyword) {
+ keyword = keyword.toLowerCase();
+ var container = $(this.element.children().get(1));
+ container.children().each(function(){
+ var hide = true;
+ $(this).children().each(function(){
+
if($(this).attr('val')&&$(this).attr('val').toLowerCase().indexOf(keyword)!=-1){
+ hide = false;
+ return false;
+ }
+ });
+ $(this).css('display', hide?'none':'');
+ });
+ this._setRowBackgroud();
+ },
+ addRow: function(rowNode){
+ $(rowNode).addClass('row');
+ this._setRowBackgroud();
+ },
+ deleteRow: function(rowNode){
+ $(rowNode).remove();
+ this._setRowBackgroud();
+ },
+ _destroy: function() {
+ this.element.removeClass('grid');
+ var head = $(this.element.children().get(0));
+ var body = $(this.element.children().get(1));
+ head.removeClass('header c1 bold grey');
+ if(this.options.enableSorting){
+ head.children().each(function(){
+ var oriContent = $($(this).children().get(0)).html()
+ $(this).empty().append(oriContent);
+ });
+ }
+ body.removeClass('body c1 normal dark-grey');
+ body.children().removeClass('row odd even');
+ }
+});
+});
diff --git a/ui/src/app/js/widgets/line.js b/ui/src/app/js/widgets/line.js
new file mode 100644
index 0000000..8fcc4ba
--- /dev/null
+++ b/ui/src/app/js/widgets/line.js
@@ -0,0 +1,72 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+$(function(){
+$.widget("wok.line", {
+ options: {
+ xShift: true,
+ minVal: 0,
+ maxVal: 100,
+ datasets: []
+ },
+ _create: function() {
+ this._build();
+ },
+ _build: function() {
+ this.element.empty();
+ var maxX = this.element.width();
+ var maxY = this.element.height();
+ var svg = "<svg class='line' width='"+maxX+"'
height='"+maxY+"'>";
+ svg += "<line x1='0' y1='0'
x2='"+maxX+"' y2='0' class='max'/>";
+ svg += "<line x1='0' y1='"+maxY+"'
x2='"+maxX+"' y2='"+maxY+"'
class='min'/>";
+ for(var i=0;i<this.options.datasets.length;i++){
+ var data = this.options.datasets[i].data;
+ var points = "";
+ for(var j=0;j<data.length;j++){
+ if(data[j]){
+ var xVal = maxX/(data.length-1)*j;
+ var yVal = (this.options.maxVal-data[j])*maxY/this.options.maxVal;
+ points += xVal+","+yVal+" ";
+ }
+ }
+ svg += "<polyline points='"+points+"'
style='stroke:"+this.options.datasets[i].color+";'/>";
+ }
+ svg += "</svg>";
+ this.element.append(svg);
+ },
+ addData: function(values){
+ if(values.length<this.options.datasets.length) return;
+ for(var i=0;i<this.options.datasets.length;i++){
+ this.options.datasets[i].data.push(values[i]);
+ if(this.options.xShift) this.options.datasets[i].data.splice(0,1);
+ }
+ this._build();
+ },
+ removeData: function(){
+ for(var i=0;i<this.options.datasets.length;i++){
+ var data = this.options.datasets[i].data;
+ data.splice(0,1);
+ if(this.options.xShift) data.push(null);
+ }
+ this._build();
+ },
+ _destroy: function() {
+ this.element.empty();
+ }
+});
+});
diff --git a/ui/src/app/js/widgets/list-flat.js b/ui/src/app/js/widgets/list-flat.js
new file mode 100644
index 0000000..8e9ea84
--- /dev/null
+++ b/ui/src/app/js/widgets/list-flat.js
@@ -0,0 +1,76 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ // How to use:
+ // $(".test-bar").listFlat({
+ // title: "Hello World" //Set title.
+ // });
+ // $(".test-bar").listFlat("addItem", "Hello",
"2015", "icon-user", "button1");
+ // //Add one item of the list, parameters are: name, info, icon and
button-id
+
+
+ (function($) {
+
+ $.widget("wok.listFlat", {
+
+ options: {
+ title: null
+ },
+
+ _create: function() {
+ var that = this;
+ var listTitle = that.options.title;
+ var titleTrim = listTitle.replace(/\s*/g, "");
+ var html = "";
+ html += "<div class='list-titlef'>" + listTitle +
"</div>" +
+ "<div class='list-content' id='list" +
titleTrim + "'></div>";
+ $(html).appendTo(that.element);
+ },
+
+ _getTitle: function() {
+ return this.options.title;
+ },
+
+ addItem: function(name, detail, icon, id) {
+ var title = this._getTitle().replace(/\s/g, "");
+ var usedIcon = icon || "";
+ var html = "";
+ html += "<div class='list-item'>" +
+ "<span class='list-inline list-item-icon " +
usedIcon + "'></span>" +
+ "<span class='list-inline
list-item-info'>"+
+ "<div class='list-item-name'>" + name
+ "</div>" +
+ "<div class='list-item-detail'>" +
detail + "</div>" +
+ "</span>" +
+ "<span class='list-inline list-item-button'
id='" + id + "'></span>" +
+ "</div>";
+ $(html).appendTo($("#list" + title));
+ $.each($(".list-item"), function(index, data) {
+ if(index%2 >0) {
+ $(this).addClass("list-item-even");
+ } else {
+ $(this).addClass("list-item-odd");
+ }
+ })
+ console.log("title");
+ },
+
+ _destory: function() {
+ this.element.remove();
+ }
+ });
+ })(jQuery);
diff --git a/ui/src/app/js/widgets/menu-flat.js b/ui/src/app/js/widgets/menu-flat.js
new file mode 100644
index 0000000..3352a2b
--- /dev/null
+++ b/ui/src/app/js/widgets/menu-flat.js
@@ -0,0 +1,98 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// How to use:
+// $("#test-bar").menuFlat({
+// content: [1,2,3,4,5,6], //Set content of the menu.
+// icon: "icon-edit-alt", //Set icon of the menu button.
+// listIconList:
["icon-edit-alt","icon-edit-alt","icon-edit-alt","icon-edit-alt","icon-edit-alt","icon-user"]
+// //Set icons of the menu list.
+// // name is optional which set the name of the menu
list.
+// });
+// $("#test-bar0").on("click", function() {
+// alert("hello");
+// });
+// $("#test-bar1").on("click", function() {
+// console.log("hello");
+// });
+
+
+(function($) {
+ $.widget("wok.menuFlat", {
+
+ options: {
+ name: null,
+ icon: null,
+ label: null,
+ content: null
+ },
+
+ _create: function() {
+ var that = this;
+ var icon = that.options.icon;
+ var label = that.options.label;
+ var content = that.options.content;
+ var name = that._setName(that.options.name);
+ var html = "<div class='dropdown menu-flat' id='" +
name + "'>" +
+ "<button class='btn btn-primary dropdown-toggle'
type='button' data-toggle='dropdown'>" +
+ "<i class=" + icon + "></i>" + label +
"<span class='caret'></span></button>" +
+ "</div>";
+ $(html).appendTo(that.element);
+ html = that._setValue(content);
+ $(html).appendTo(that.element[0].children[0]);
+ },
+
+ _setName: function(name) { // Set name
+ var ids = [];
+ $(".menu-flat").each(function() { // Store each .menu-flat instance
ID in an array
+ ids.push(this.id);
+ });
+
+ for (this.uuid; $.inArray('wok-dropdown-menu-' + this.uuid, ids) !==
-1; ) {
+ this.uuid++; // increment uuid based on .menu-flat instances in the page
+ } // this is necessary to make widget factory skip non-existing uuids from
static elements
+ // and prevent duplicated id attributes in the proccess
+
+ if (!name) { // if name is null, a new name will be given with the widget
uuid
+ name = 'wok-dropdown-menu-' + this.uuid;
+ } else if ($('#' + name).length) { // if name already exists...
+ name = name.concat('_', +this.uuid); // adds a suffix with uuid
+ }
+
+ return name;
+ },
+
+ _setValue: function(content) {
+ var that = this;
+ var name = that.element[0].children[0].id;
+ var html = "<ul class='dropdown-menu'>";
+ $.each(content, function(index, data) {
+ that.options.content[index] = data.toString();
+ html += (data.critical ? "<li class='critical'>"
: "<li>");
+ // <a id=" widget id _ list index" class="action
name" href="# action name ">
+ html += "<a id=" + name + '_' + index + "
class=" + data.action + " href='#" + data.action + "'><i
class='" + data.icon + "'></i>" + data.name +
"</a></li>";
+ });
+ html += "</ul>";
+ return html;
+ },
+
+ _destroy: function() {
+ this.element.remove();
+ }
+ });
+})(jQuery);
diff --git a/ui/src/app/js/widgets/message-flat.js
b/ui/src/app/js/widgets/message-flat.js
new file mode 100644
index 0000000..d59d452
--- /dev/null
+++ b/ui/src/app/js/widgets/message-flat.js
@@ -0,0 +1,97 @@
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+/* How to use:
+* $(".selector").messageFlat({
+* contentMain: "This is a test", //Content you are going to add
+* contentConfirm: "Sure?" //Content that inform user whether they
want to continue.
+* //Default value is: "Are you sure you want to go
on?"
+* confirm: function() {
+* //Function after confirm
+* }
+* });
+*/
+
+(function( $ ) {
+ $.widget("wok.messageFlat", {
+ options: {
+ autoOpen: true,
+ contentMain: null,
+ contentConfirm: "Are you sure you want to go on?",
+ confirm: null
+ },
+
+ _create: function() {
+ var that = this;
+ var msg = that.options.contentMain;
+ var cfm = that.options.contentConfirm;
+ $(".body").addClass("style:'opacity:0.5'");
+ that._open();
+ $(".message-type-icon").addClass("icon-help-circled-1");
+ $(".message-dialog .message-content .message-main").text(msg);
+ $(".message-dialog .message-confirm-info").text(cfm);
+ $(".message-dialog .message-cancel").on("click",
that.destroy);
+ $(".message-dialog .message-okay").on("click", function()
{
+ that._trigger("confirm");
+ that.destroy();
+ });
+ },
+
+ _open: function() {
+ var html =
+ "<div id='overlay'></div>" +
+ "<div class='border-grey'>" +
+ "<div class='message-dialog'>" +
+ "<div class='message-content'>" +
+ "<div class='message-inline
message-type-icon'></div>" +
+ "<div class='message-inline
message-main'></div>" +
+ "</div>" +
+ "<div
class='message-confirm-info'></div>" +
+ "<div class='message-footer'>" +
+ "<div class='message-button
message-okay'>Ok</div>" +
+ "<div class='message-button
message-cancel'>Cancel</div>" +
+ "</div>" +
+ "</div>" +
+ "</div>";
+ if (this.options.autoOpen) {
+ $(html).appendTo($("body"));
+ var pageWidth = window.screen.width;
+ var pageHeight = window.screen.height;
+ var pageLeft = document.screenLeft
+ var pageTop = document.screenTop;
+ var topOffset = "-" + pageHeight + "px";
+ console.log(topOffset);
+ $("#overlay").css({
+ "opacity": "0.5",
+ "Left": pageLeft,
+ "Top": pageTop,
+ "background-color": "white",
+ "width": pageWidth,
+ "height": pageHeight,
+ "margin-top": topOffset,
+ "overflow": "hidden"
+ });
+ }
+ },
+
+ destroy: function() {
+ $(".border-grey").remove();
+ $("#overlay").remove();
+ }
+ });
+})(jQuery);
diff --git a/ui/src/app/js/widgets/messagebar-flat.js
b/ui/src/app/js/widgets/messagebar-flat.js
new file mode 100644
index 0000000..b7bd86f
--- /dev/null
+++ b/ui/src/app/js/widgets/messagebar-flat.js
@@ -0,0 +1,71 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+* Usage:
+ $(selector).messagebarFlat({
+ content: "Test", //message you want to show in the messagebar
+ color: "red", //Three color supported: "red",
"yellow" and "green",
+ dismissTime: 3000 //when set to "never", the messagebar will never
disappear.
+ // Or setting it to numbers for the dismiss time you want
to delay.
+ });
+*/
+
+(function($) {
+ $.widget("wok.messagebarFlat", {
+ options : {
+ content : null,
+ color : "red",
+ dismissTime: 3000
+ },
+
+ _create: function() {
+ var now = this._getTime();
+ var that = this;
+ $("<div class='messagebar'><span
class='messageHead'></span>" +
+ "<span class='messagebar-text'> " +
this.options.content +": " + now + "</span></div>")
+ .addClass(this.options.color)
+ .appendTo(that.element);
+ $(".messageHead").addClass("dark-" +
this.options.color);
+ $("<span class='messagebar-close
icon-cancel-circled'></span>").on("click", function() {
+ that.destroy();
+ }).appendTo($(".messagebar"));
+ var dismissDelay = this.options.dismissTime;
+ if (dismissDelay != "never") {
+ setTimeout(function() {
+ that.destroy()
+ }, dismissDelay);
+ }
+ },
+
+ _getTime: function() {
+ var CT = new Date();
+ var currentDate = CT.getDate() + "/" + CT.getMonth()+1 +
"/" +CT.getFullYear();
+ var currentTime = CT.getHours() + ":" + CT.getMinutes() +
":" + CT.getSeconds();
+ var now = currentDate + " " + currentTime;
+ return now;
+ },
+
+ destroy: function() {
+ var that = this;
+ that.element.fadeOut("normal", function() {
+ that.element.remove();
+ });
+ }
+ });
+})(jQuery);
diff --git a/ui/src/app/js/widgets/radio-flat.js b/ui/src/app/js/widgets/radio-flat.js
new file mode 100644
index 0000000..401ef62
--- /dev/null
+++ b/ui/src/app/js/widgets/radio-flat.js
@@ -0,0 +1,86 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * //How to use:
+ * $(".selector").radioFlat({
+ * id: "t", //Base id of the radio set.
+ * name: "test", //name of the radio.
+ * whichChecked: 2, //First selected position, starts from 1.
+ * content: ["apple", "banana", "orange",
"cherry"] //set the content array.
+ * });
+ *
+ *
+ * $(".test-bar").click(function() {
+ * console.log($(".test-bar").radioFlat("value")); //this is how
to get the value of selected radio value
+ * });
+ *
+ *
+ *
+ */
+
+ (function($) {
+
+ $.widget("wok.radioFlat", {
+ options: {
+ id: "",
+ name: "",
+ whichChecked: "",
+ content:[],
+ },
+
+ _create: function() {
+ var that = this;
+ var radioName = this.options.name;
+ var labelID = this.options.id;
+ var checked = this.options.whichChecked;
+ var num = Number(this.options.content.length);
+ var html ="";
+ if(num >0) {
+ for(var i=1;i < num+1;i++) {
+ var tmpLabelID = labelID + i;
+ html += "<div class='icon-circle-empty inline-radio
radio-label' id='" + tmpLabelID + "'></div>" +
+ "<label class='radio-content inline-radio'
for='" + tmpLabelID + "'>" + that.options.content[i-1] +
"</label>";
+ }
+ $(html).appendTo(that.element);
+ $("#" + labelID + checked).attr("checked",
"true");
+ $("#" + labelID +
checked).removeClass("icon-circle-empty");
+ $("#" + labelID +
checked).addClass("icon-dot-circled");
+ }
+ $(".radio-label").on("click", function() {
+ $(".radio-label").removeClass("icon-dot-circled");
+ $(".radio-label").addClass("icon-circle-empty");
+ $(".radio-label").removeAttr("checked");
+ $(this).removeClass("icon-circle-empty");
+ $(this).addClass("icon-dot-circled");
+ $(this).attr("checked", "true");
+ var thisID = $(this).attr("id");
+ that.options.whichChecked =
thisID.substring(labelID.length,thisID.length);
+ });
+ },
+
+ value: function() {
+ var value = Number(this.options.whichChecked) -1;
+ return this.options.content[value];
+ },
+
+ _destroy: function() {
+ this.element.remove();
+ }
+ });
+ })(jQuery);
diff --git a/ui/src/app/js/widgets/samples/README.md
b/ui/src/app/js/widgets/samples/README.md
new file mode 100644
index 0000000..9c8e425
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/README.md
@@ -0,0 +1 @@
+This folder contains the usage of Kimchi new UI design widgets.
\ No newline at end of file
diff --git a/ui/src/app/js/widgets/samples/action_button.html
b/ui/src/app/js/widgets/samples/action_button.html
new file mode 100644
index 0000000..b06192a
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/action_button.html
@@ -0,0 +1,224 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <!-- build:css libs/themes/base/jquery-ui.css -->
+ <link rel="stylesheet"
href="/bower_components/jquery-ui/themes/base/jquery-ui.css">
+ <!-- endbuild -->
+ <!-- build:css fontawesome/css/fontawesome.css -->
+ <link rel="stylesheet" href="../../css/fontawesome.css">
+ <!-- endbuild -->
+ <!-- build:css libs/themes/base/bootstrap.custom.css -->
+ <link rel="stylesheet"
href="../../css/bootstrap.custom.css">
+ <!-- endbuild -->
+ <!-- build:js libs/modernizr.js -->
+ <script
src="/bower_components/modernizr/modernizr.js"></script>
+ <!-- endbuild -->
+</head>
+
+<body>
+ <nav class="navbar navbar-inverse navbar-static-top">
+ <div class="container">
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">Action Button
(menu-flat.js)</a>
+ </div>
+ </div>
+ </nav>
+ <div class="container">
+ <h2>Bootstrap (static)</h2>
+ <div class="dropdown menu-flat"
id="wok-dropdown-menu-x">
+ <button class="btn btn-primary dropdown-toggle"
type="button" data-toggle="dropdown"><i
class="icon-edit-alt"></i>Actions<span
class="caret"></span></button>
+ <ul class="dropdown-menu">
+ <li><a id="wok-dropdown-menu-x_0"
class="add" href="#add"><i
class="icon-plus-circled-1"></i>Add</a></li>
+ <li><a id="wok-dropdown-menu-x_1"
class="enable" href="#enable_"><i
class="icon-play-circled2"></i>Enable</a></li>
+ <li><a id="wok-dropdown-menu-x_2"
class="edit" href="#edit_"><i
class="icon-pencil-2"></i>Edit</a></li>
+ <li class="critical"><a
id="wok-dropdown-menu-x_0" class="delete"
href="#delete_"><i
class="icon-minus-circled-1"></i>Delete</a></li>
+ </ul>
+ </div>
+ <h2>jQuery UI Widget (using Bootstrap classes)</h2>
+ <div class="btn-wrapper"></div>
+ <h2>How to use</h2>
+ <pre>
+ <code>
+ $(".btn-wrapper").menuFlat({
+ name: "wok-dropdown-menu-0", // not required
+ icon: "icon-edit-alt", //Set icon of the menu button.
+ label: 'Actions', //Set button text
+ content: [
+ { name: 'Add',
+ action: 'add',
+ icon: 'icon-plus-circled-1',
+ critical: false
+ },
+ { name: 'Enable',
+ action: 'enable',
+ icon: 'icon-play-circled2',
+ critical: false
+ },
+ { name: 'Edit',
+ action: 'edit',
+ icon: 'icon-pencil-2',
+ critical: false
+ },
+ { name: 'Delete',
+ action: 'delete',
+ icon: 'icon-minus-circled-1',
+ critical: true // set this to true if this action should be
highlighted
+ }
+ ]
+ });
+
+ // List actions
+
+ // You can set an event to a link based on its ID, css class or href
attribute
+
+ $("#wok-dropdown-menu-0_0").on("click",
function(event) {
+ event.preventDefault();
+ alert("Add");
+ });
+
+ $("#wok-dropdown-menu-0
a[href='#enable']").on("click", function(event) {
+ event.preventDefault();
+ alert("Enable");
+ });
+
+ $("#wok-dropdown-menu-0 .edit").on("click",
function(event) {
+ event.preventDefault();
+ alert("Edit");
+ });
+
+ </code>
+ </pre>
+ </div>
+ <!-- build:js libs/jquery.js -->
+ <script
src="/bower_components/jquery/dist/jquery.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/jquery-ui.js -->
+ <script
src="/bower_components/jquery-ui/jquery-ui.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/vendor.js -->
+ <!-- bower:js -->
+ <script src="/bower_components/es5-shim/es5-shim.js"></script>
+ <script src="/bower_components/json2/json2.js"></script>
+ <script src="/bower_components/base64/base64.js"></script>
+ <script
src="/bower_components/typeahead.js/dist/typeahead.bundle.js"></script>
+ <script src="/bower_components/bag.js/bag.js"></script>
+ <!-- endbower -->
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap.js -->
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/affix.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official//assets/javascripts/bootstrap/alert.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/dropdown.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tooltip.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/modal.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/transition.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/button.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/popover.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/carousel.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/scrollspy.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/collapse.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tab.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap-select.min.js -->
+ <script
src="/bower_components/bootstrap-select-sass/dist/js/bootstrap-select.min.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/main.js -->
+ <script src="../js/main.js"></script>
+ <!-- endbuild -->
+ <script>
+ $(document).ready(function() {
+ $(".btn-wrapper").menuFlat({
+ name: "wok-dropdown-menu-0",
+ icon: "icon-edit-alt", //Set icon of the menu button.
+ label: 'Actions', //Set button text
+ content: [{
+ name: 'Add',
+ action: 'add',
+ icon: 'icon-plus-circled-1',
+ critical: false
+ }, {
+ name: 'Enable',
+ action: 'enable',
+ icon: 'icon-play-circled2',
+ critical: false
+ }, {
+ name: 'Edit',
+ action: 'edit',
+ icon: 'icon-pencil-2',
+ critical: false
+ }, {
+ name: 'Delete',
+ action: 'delete',
+ icon: 'icon-minus-circled-1',
+ critical: true
+ }]
+ });
+
+
+ $("#wok-dropdown-menu-0_0").on("click", function(event) {
+ event.preventDefault();
+ alert("Add");
+ });
+
+ $("#wok-dropdown-menu-0
a[href='#enable']").on("click", function(event) {
+ event.preventDefault();
+ alert("Enable");
+ });
+
+ $("#wok-dropdown-menu-0 .edit").on("click", function(event)
{
+ event.preventDefault();
+ alert("Edit");
+ });
+
+
+ });
+ </script>
+ <!-- build:js js/menu-flat.js -->
+ <script src="../js/menu-flat.js"></script>
+ <!-- endbuild -->
+</body>
+
+</html>
diff --git a/ui/src/app/js/widgets/samples/dialog.html
b/ui/src/app/js/widgets/samples/dialog.html
new file mode 100644
index 0000000..8819b1f
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/dialog.html
@@ -0,0 +1,111 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <!-- build:css libs/themes/base/jquery-ui.css -->
+ <link rel="stylesheet"
href="/bower_components/jquery-ui/themes/base/jquery-ui.css">
+ <!-- endbuild -->
+ <!-- build:css fontawesome/css/fontawesome.css -->
+ <link rel="stylesheet" href="../../css/fontawesome.css">
+ <!-- endbuild -->
+ <!-- build:css libs/themes/base/bootstrap.custom.css -->
+ <link rel="stylesheet"
href="../../css/bootstrap.custom.css">
+ <!-- endbuild -->
+ <!-- build:js libs/modernizr.js -->
+ <script
src="/bower_components/modernizr/modernizr.js"></script>
+ <!-- endbuild -->
+ <body>
+ <div class="dialog-demo">Teste</div>
+ <!-- build:js libs/jquery.js -->
+ <script
src="/bower_components/jquery/dist/jquery.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/jquery-ui.js -->
+ <script
src="/bower_components/jquery-ui/jquery-ui.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/vendor.js -->
+ <!-- bower:js -->
+ <script src="/bower_components/es5-shim/es5-shim.js"></script>
+ <script src="/bower_components/json2/json2.js"></script>
+ <script src="/bower_components/base64/base64.js"></script>
+ <script
src="/bower_components/typeahead.js/dist/typeahead.bundle.js"></script>
+ <script src="/bower_components/bag.js/bag.js"></script>
+ <!-- endbower -->
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap.js -->
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/affix.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official//assets/javascripts/bootstrap/alert.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/dropdown.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tooltip.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/modal.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/transition.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/button.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/popover.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/carousel.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/scrollspy.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/collapse.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tab.js"></script>
+ <script
src="/bower_components/bootstrap-select-sass/dist/js/bootstrap-select.min.js"></script>
+ <!-- endbuild -->
+
+ <!-- build:js js/dialog-flat.js -->
+ <script src="../js/dialog-flat.js"></script>
+ <!-- endbuild -->
+ <script>
+ $(document).ready(function() {
+ $(".dialog-demo").dialogFlat({
+ title: "Demo", //Title of the dialog.
+ confirmText: "Ok", //Text of the confirm button,
"Ok" is the default value.
+ cancelText: "Cancel", //Text of the cancel button.
+ width: "600", //Width of the dialog, "px" is the
default unit.
+ height: "500", //Height of the dialog, "px" is
the default unit.
+ confirmFunc: function() {
+ alert("success");//Function after confirm
+ }
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/ui/src/app/js/widgets/samples/dialog_bootstrap.html
b/ui/src/app/js/widgets/samples/dialog_bootstrap.html
new file mode 100644
index 0000000..b0bef63
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/dialog_bootstrap.html
@@ -0,0 +1,140 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <!-- build:css libs/themes/base/jquery-ui.css -->
+ <link rel="stylesheet"
href="/bower_components/jquery-ui/themes/base/jquery-ui.css">
+ <!-- endbuild -->
+ <!-- build:css fontawesome/css/fontawesome.css -->
+ <link rel="stylesheet" href="../../css/fontawesome.css">
+ <!-- endbuild -->
+ <!-- build:css libs/themes/base/bootstrap.custom.css -->
+ <link rel="stylesheet"
href="../../css/bootstrap.custom.css">
+ <!-- endbuild -->
+ <!-- build:js libs/modernizr.js -->
+ <script
src="/bower_components/modernizr/modernizr.js"></script>
+ <!-- endbuild -->
+</head>
+
+<body>
+ <nav class="navbar navbar-inverse navbar-static-top">
+ <div class="container">
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">Dialog
(Bootstrap Modal)</a>
+ </div>
+ </div>
+ </nav>
+ <div class="container hosts">
+ <h2>Bootstrap (static)</h2>
+ <!-- Button trigger modal -->
+ <button type="button" class="btn btn-primary btn-lg"
data-toggle="modal" data-target="#myModal">
+ Launch demo modal
+ </button>
+ <!-- Modal -->
+ <div class="modal fade in" id="myModal"
tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close"
data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
+ <h4 class="modal-title"
id="myModalLabel">Modal title</h4>
+ </div>
+ <div class="modal-body">
+ <select id="userLang" class="col-md-12
col-lg-12 ">
+ <option data-icon="icon-list-add"
value="en_US">Add</option>
+ <option data-icon="icon-play-circled"
value="zh_CN">Enable</option>
+ <option data-icon="icon-pencil-1"
value="pt_BR">Edit</option>
+ <option data-icon="icon-minus-circled-1"
value="de_DE">Remove</option>
+ </select>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn
btn-default">Ok</button>
+ <button type="button" class="btn
btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- build:js libs/jquery.js -->
+ <script
src="/bower_components/jquery/dist/jquery.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/jquery-ui.js -->
+ <script
src="/bower_components/jquery-ui/jquery-ui.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/vendor.js -->
+ <!-- bower:js -->
+ <script src="/bower_components/es5-shim/es5-shim.js"></script>
+ <script src="/bower_components/json2/json2.js"></script>
+ <script src="/bower_components/base64/base64.js"></script>
+ <script
src="/bower_components/typeahead.js/dist/typeahead.bundle.js"></script>
+ <script src="/bower_components/bag.js/bag.js"></script>
+ <!-- endbower -->
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap.js -->
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/affix.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official//assets/javascripts/bootstrap/alert.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/dropdown.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tooltip.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/modal.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/transition.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/button.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/popover.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/carousel.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/scrollspy.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/collapse.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tab.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap-select.min.js -->
+ <script
src="/bower_components/bootstrap-select-sass/dist/js/bootstrap-select.min.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/main.js -->
+ <script src="../js/main.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/dialog-flat.js -->
+ <script src="../js/dialog-flat.js"></script>
+ <!-- endbuild -->
+</body>
+
+</html>
diff --git a/ui/src/app/js/widgets/samples/gauge-flat.html
b/ui/src/app/js/widgets/samples/gauge-flat.html
new file mode 100644
index 0000000..92ce07a
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/gauge-flat.html
@@ -0,0 +1,53 @@
+<!--Sample code of gauge-->
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>Gauge Demo</title>
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../gauge-flat.js"></script>
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/gauge-flat.css">
+ </head>
+ <body>
+ <div class="gauge-demo"></div>
+ <script>
+ $(document).ready(function() {
+ console.log("test started1");
+ var gauged = $(".gauge-demo");
+ gauged.gaugeFlat({
+ value: 25,
+ color: "red"
+ });
+ var gaugeAdd = function() {
+ var gaugeValue = gauged.gaugeFlat("value");
+ gauged.gaugeFlat("value", gaugeValue + 1);
+ if (gaugeValue < 99) {
+ setTimeout(gaugeAdd, 300);
+ }
+ }
+ gaugeAdd();
+ });
+ </script>
+ </body>
+</html>
\ No newline at end of file
diff --git a/ui/src/app/js/widgets/samples/grid.html
b/ui/src/app/js/widgets/samples/grid.html
new file mode 100644
index 0000000..9b92d62
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/grid.html
@@ -0,0 +1,80 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Wok</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
+
+<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../css/theme-default.min.css">
+
+<script src="../../../libs/jquery-1.10.0.min.js"></script>
+<script src="../../../libs/jquery-ui.min.js"></script>
+<script src="../../../libs/jquery-ui-i18n.min.js"></script>
+<script src="../../../js/wok.min.js"></script>
+
+<style type="text/css">
+body {
+ background: none;
+}
+input {
+ float: right;
+}
+.name {
+ width: 30%;
+}
+.project {
+ width: 30%;
+}
+.role {
+ width: 39%;
+}
+</style>
+<script>
+function init(){
+ $('#ibmers').grid({enableSorting: true});
+ $('input').on('keyup', function(){
+ $('#ibmers').grid('filter', ($(this).val()));
+ });
+}
+</script>
+</head>
+<body onload="init()">
+<div style="height: 50px; padding-top: 10px; padding-right:
50px;"><input type='text' placeholder='Filter'
style='padding-left: 5px; height: 20px;'></div>
+<div id="ibmers">
+<div><span class="name">Name</span><span
class="project">Project</span><span
class="role">Role</span></div>
+<div>
+<div><span class="name"
val="tify">tify</span><span class="project"
val="kimchi">kimchi</span><span class="role"
val="designer">designer</span></div>
+<div><span class="name"
val="rick">rick</span><span class="project"
val="finance">finance</span><span class="role"
val="sponsor">sponsor</span></div>
+<div><span class="name"
val="icy">icy</span><span class="project" val="human
resource">human resource</span><span class="role"
val="administrator*">administrator</span></div>
+<div><span class="name"
val="paul">paul</span><span class="project"
val="tomcat">tomcat</span><span class="role" val="dev
lead">dev lead</span></div>
+<div><span class="name"
val="kapil">kapil</span><span class="project"
val="apache">apache</span><span class="role"
val="developer">developer</span></div>
+<div><span class="name"
val="adam">adam</span><span class="name"
val="mongodb">mongodb</span><span class="role"
val="dev lead">dev lead</span></div>
+<div><span class="name"
val="shikha">shikha</span><span class="project"
val="mysql">mysql</span><span class="role" val="dev
lead">dev lead</span></div>
+</div>
+</div>
+</body>
+</html>
diff --git a/ui/src/app/js/widgets/samples/line.html
b/ui/src/app/js/widgets/samples/line.html
new file mode 100644
index 0000000..cc0b738
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/line.html
@@ -0,0 +1,168 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Wok</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
+
+<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../css/theme-default.min.css">
+
+<script src="../../../libs/jquery-1.10.0.min.js"></script>
+<script src="../../../libs/jquery-ui.min.js"></script>
+<script src="../../../libs/jquery-ui-i18n.min.js"></script>
+<script src="../../../js/wok.min.js"></script>
+
+<style type="text/css">
+body {
+ background: none;
+}
+.cell {
+ display: inline-block;
+ width: 49%;
+}
+.monitor {
+ width: 391px;
+ margin: 15px auto;
+}
+.chart {
+ width: 390px;
+ height: 200px;
+ margin-top: 20px;
+}
+.legend {
+ height: 25px;
+ line-height: 25px;
+ padding-left: 8px;
+ margin: 5px 30px 5px 0;
+ border-left: 3px solid;
+ display: inline-block;
+}
+</style>
+<script>
+function init(){
+$('#chart1').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#d9182d"
+ }]
+});
+$('#chart2').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#008abf"
+ }]
+});
+$('#chart3').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#fdb813"
+ }, {
+ data: new Array(50),
+ color: "#00a6a0"
+ }]
+});
+$('#chart4').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#561289"
+ }, {
+ data: new Array(50),
+ color: "#238901"
+ }]
+});
+setInterval(function(){
+ $('#chart1').line('addData', [Math.round(Math.random()*500)]);
+}, 1000);
+setInterval(function(){
+ $('#chart2').line('addData', [Math.round(Math.random()*500)]);
+}, 1000);
+setInterval(function(){
+ $('#chart3').line('addData',
[Math.round(Math.random()*500),Math.round(Math.random()*500)]);
+}, 1000);
+setInterval(function(){
+ $('#chart4').line('addData',
[Math.round(Math.random()*500),Math.round(Math.random()*500)]);
+}, 1000);
+}
+</script>
+</head>
+<body onload="init()">
+<div>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Processor</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#d9182d;">Used: 41%</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 100%</div>
+ <div id="chart1" class='chart'></div>
+ </div>
+</span>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Memory</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#008abf;">Available: 49%</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 280GB</div>
+ <div id="chart2" class='chart'></div>
+ </div>
+</span>
+</div>
+<div>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Storage IO</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#fdb813">Write: 6KB/S</span>
+ <span class="legend" style="border-color:
#00a6a0">Read: 123KB/S</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 79.04KB/S</div>
+ <div id="chart3" class='chart'></div>
+ </div>
+</span>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Network IO</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#561289">Received: 2KB/S</span>
+ <span class="legend" style="border-color:
#238901">Sent: 1KB/S</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 33.35KB/S</div>
+ <div id="chart4" class='chart'></div>
+ </div>
+</span>
+</div>
+</body>
+</html>
diff --git a/ui/src/app/js/widgets/samples/list.html
b/ui/src/app/js/widgets/samples/list.html
new file mode 100644
index 0000000..850550c
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/list.html
@@ -0,0 +1,46 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>List Demo</title>
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../list-flat.js"></script>
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/list-flat.css">
+ <link rel="stylesheet"
href="../../../fontello/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ </head>
+ <body>
+ <div class="list-demo"></div>
+ <script>
+ $(document).ready(function() {
+ $(".list-demo").listFlat({
+ title: "Hello World" //Set title.
+ });
+ $(".list-demo").listFlat("addItem",
"Hello", "2015", "icon-user", "button1");
+ //Add one item of the list, parameters are: name, info, icon and
button-id
+ });
+ </script>
+ </body>
+</html>
diff --git a/ui/src/app/js/widgets/samples/menu-button-radio-checkbox-text-select.html
b/ui/src/app/js/widgets/samples/menu-button-radio-checkbox-text-select.html
new file mode 100644
index 0000000..e098f23
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/menu-button-radio-checkbox-text-select.html
@@ -0,0 +1,226 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <!-- build:css libs/themes/base/jquery-ui.css -->
+ <link rel="stylesheet"
href="/bower_components/jquery-ui/themes/base/jquery-ui.css">
+ <!-- endbuild -->
+
+ <!-- build:css css/menu-flat.css -->
+ <link rel="stylesheet" href="../css/menu-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/button-flat.css -->
+ <link rel="stylesheet" href="../css/button-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/radio-flat.css -->
+ <link rel="stylesheet" href="../css/radio-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/checkbox-flat.css -->
+ <link rel="stylesheet" href="../css/checkbox-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/textbox-flat.css -->
+ <link rel="stylesheet" href="../css/textbox-flat.css">
+ <!-- endbuild -->
+ <!-- build:css css/selectmenu-flat.css -->
+ <link rel="stylesheet" href="../css/selectmenu-flat.css">
+ <!-- endbuild -->
+ <!-- build:js libs/modernizr.js -->
+ <script
src="/bower_components/modernizr/modernizr.js"></script>
+ <!-- endbuild -->
+
+ <!-- build:css fontawesome/css/fontawesome.css -->
+ <link rel="stylesheet" href="../../css/fontawesome.css">
+ <!-- endbuild -->
+ <!-- build:css libs/themes/base/bootstrap.custom.css -->
+ <link rel="stylesheet"
href="../../css/bootstrap.custom.css">
+ <!-- endbuild -->
+</head>
+
+<body>
+ <nav class="navbar navbar-inverse navbar-static-top">
+ <div class="container">
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">Action Button
(menu-flat.js)</a>
+ </div>
+ </div>
+ </nav>
+ <div class="container">
+ <div id="menu"></div>
+ <div style="height:50px">
+ <div id="select"></div>
+ </div>
+ <div class="radio-demo"></div>
+ <div class="checkbox-demo"></div>
+ <input class="text-demo">
+ <button class="button-demo">submit</button>
+ </div>
+ <!-- build:js libs/jquery.js -->
+ <script
src="/bower_components/jquery/dist/jquery.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/jquery-ui.js -->
+ <script
src="/bower_components/jquery-ui/jquery-ui.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/vendor.js -->
+ <!-- bower:js -->
+ <script src="/bower_components/es5-shim/es5-shim.js"></script>
+ <script src="/bower_components/json2/json2.js"></script>
+ <script src="/bower_components/base64/base64.js"></script>
+ <script
src="/bower_components/typeahead.js/dist/typeahead.bundle.js"></script>
+ <script src="/bower_components/bag.js/bag.js"></script>
+ <!-- endbower -->
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap.js -->
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/affix.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official//assets/javascripts/bootstrap/alert.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/dropdown.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tooltip.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/modal.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/transition.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/button.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/popover.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/carousel.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/scrollspy.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/collapse.js"></script>
+ <script
src="/bower_components/bootstrap-sass-official/assets/javascripts/bootstrap/tab.js"></script>
+ <!-- endbuild -->
+ <!-- build:js libs/bootstrap-select.min.js -->
+ <script
src="/bower_components/bootstrap-select-sass/dist/js/bootstrap-select.min.js"></script>
+ <!-- endbuild -->
+
+ <!-- build:js js/menu-flat.js -->
+ <script src="js/menu-flat.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/button-flat.js -->
+ <script src="js/button-flat.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/radio-flat.js -->
+ <script src="js/radio-flat.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/checkbox-flat.js -->
+ <script src="js/checkbox-flat.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/textbox-flat.js -->
+ <script src="js/textbox-flat.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/selectmenu-flat.js -->
+ <script src="js/selectmenu-flat.js"></script>
+ <!-- endbuild -->
+ <!-- build:js js/main.js -->
+ <script src="js/main.js"></script>
+ <!-- endbuild -->
+
+ <script>
+ $(document).ready(function() {
+ $("#menu").menuFlat({
+ name: "wok-dropdown-menu-0",
+ icon: "icon-edit-alt", //Set icon of the menu button.
+ label: 'Actions', //Set button text
+ content: [{
+ name: 'Add',
+ action: 'add',
+ icon: 'icon-plus-circled-1',
+ critical: false
+ }, {
+ name: 'Enable',
+ action: 'enable',
+ icon: 'icon-play-circled2',
+ critical: false
+ }, {
+ name: 'Edit',
+ action: 'edit',
+ icon: 'icon-pencil-2',
+ critical: false
+ }, {
+ name: 'Delete',
+ action: 'delete',
+ icon: 'icon-minus-circled-1',
+ critical: true
+ }]
+ });
+ $("wok-dropdown-menu-0-0").on("click", function() {
+ alert("First option selected");
+ });
+ $("wok-dropdown-menu-0-1").on("click", function() {
+ console.log("Second option selected");
+ });
+ $("#select").selectmenuFlat({
+ content: [1, 2, 3, 4, 5, 6], //Set content of the select menu
+ selected: 2 // set the selected option, starts from "1"
+ });
+ $("#select").selectmenuFlat("value", "4"); //Set
value.
+ var t = $("#select").selectmenuFlat("value"); //Get value
+ console.log(t);
+ $(".radio-demo").radioFlat({
+ id: "t", //Base id of the radio set.
+ name: "test", //name of the radio.
+ whichChecked: 2, //First selected position, starts from 1.
+ content: ["apple", "banana", "orange",
"cherry"] //set the content array.
+ });
+ $(".radio-demo").click(function() {
+ console.log($(".radio-demo").radioFlat("value")); //this
is how to get the value of selected radio value
+ });
+ $(".checkbox-demo").checkboxFlat({
+ id: "t", //Checkbox base id.
+ name: "test", //Checkbox name.
+ content: ["apple", "banana", "orange",
"cherry"], //Contents of the checkbox set.
+ checked: [1, 3] //Set the checked item, which starts with number 1.
+ });
+ $(".checkbox-demo").click(function() {
+ console.log($(".selector").checkboxFlat("value")); //Get
value of the checked checkbox.
+ });
+ $(".text-demo").textboxFlat({
+ hint: "hint"
+ });
+ $(".text-demo").css({
+ "height": "30px",
+ "width": "200px"
+ });
+ $(".button-demo").buttonFlat();
+ });
+ </script>
+</body>
+
+</html>
diff --git a/ui/src/app/js/widgets/samples/message.html
b/ui/src/app/js/widgets/samples/message.html
new file mode 100644
index 0000000..b8a2cf4
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/message.html
@@ -0,0 +1,49 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>Message Demo</title>
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../message-flat.js"></script>
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/message-flat.css">
+ <link rel="stylesheet"
href="../../../fontello/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ </head>
+ <body>
+ <div class="message-demo"></div>
+ <script>
+ $(document).ready(function() {
+ $(".message-demo").messageFlat({
+ contentMain: "This is a test", //Content you are going to
add
+ contentConfirm: "Sure?", //Content that inform user
whether they want to continue.
+ //Default value is: "Are you sure you want
to go on?"
+ confirm: function() {
+ alert("comfirmed")
+ }
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/ui/src/app/js/widgets/samples/messagebar-flat.html
b/ui/src/app/js/widgets/samples/messagebar-flat.html
new file mode 100644
index 0000000..fd1417a
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/messagebar-flat.html
@@ -0,0 +1,49 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>Sample of messagebar</title>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+ <meta name="viewport" content="width=device-width,
initial-scale=1.0, user-scalable=yes" />
+ <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ <link rel="stylesheet"
href="../../../fontello/css/animation.css">
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/messagebar-flat.css">
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../messagebar-flat.js"></script>
+ </head>
+ <body>
+ <div class="message"></div>
+ <script>
+ $(document).ready(function() {
+ $(".message").messagebarFlat({
+ content: "This is a test",
+ color: "red",
+ dismissTime: 1000
+ });
+ });
+ </script>
+ </body>
+
+</html>
diff --git a/ui/src/app/js/widgets/samples/tabs.html
b/ui/src/app/js/widgets/samples/tabs.html
new file mode 100644
index 0000000..a8c4b4d
--- /dev/null
+++ b/ui/src/app/js/widgets/samples/tabs.html
@@ -0,0 +1,68 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Wok</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
+
+<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../css/theme-default.min.css">
+
+<script src="../../../libs/jquery-1.10.0.min.js"></script>
+<script src="../../../libs/jquery-ui.min.js"></script>
+<script src="../../../libs/jquery-ui-i18n.min.js"></script>
+<script src="../../../js/wok.min.js"></script>
+
+<style type="text/css">
+body {
+ background: none;
+}
+</style>
+<script>
+function init(){
+ $( "#tabs" ).tabs();
+}
+</script>
+</head>
+<body onload="init()">
+<div id="tabs">
+ <ul>
+ <li><a href="#tabs-1">Nunc tincidunt</a></li>
+ <li><a href="#tabs-2">Proin dolor</a></li>
+ <li><a href="#tabs-3">Aenean lacinia</a></li>
+ </ul>
+ <div id="tabs-1">
+ <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus.
Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper
ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor
ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam
sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel
pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc
tristique tempus lectus.</p>
+ </div>
+ <div id="tabs-2">
+ <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida
ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla,
massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor.
Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent
in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat
nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque
convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod
felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+ </div>
+ <div id="tabs-3">
+ <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti.
Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem
eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo
pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim,
pretium nec, feugiat nec, luctus a, lacus.</p>
+ <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at,
magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent
blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit,
magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non
libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor
ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo.
Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit
hendrerit.</p>
+ </div>
+</body>
+</html>
diff --git a/ui/src/app/js/widgets/select-menu.js b/ui/src/app/js/widgets/select-menu.js
new file mode 100644
index 0000000..bd7a207
--- /dev/null
+++ b/ui/src/app/js/widgets/select-menu.js
@@ -0,0 +1,84 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function($) {
+ $.widget('wok.selectMenu', {
+
+ _create : function() {
+ this.selectDiv = this.element;
+ this.listControl = this.selectDiv.find('ul').first();
+ this.listControl.html('');
+ this.target = this.selectDiv.find('input').first();
+ this.label = this.selectDiv.find('span').first();
+ this.selectDiv.addClass('btn dropdown popable');
+ this.target.addClass('input');
+ this.listControl.addClass('select-list');
+ this.listControl.parent().addClass('popover');
+ },
+
+ setData : function (options) {
+ var that = this;
+ var value = this.target.val();
+ var selectedClass = 'active';
+ var itemTag = 'li';
+ var item;
+ that.listControl.find('li').remove();
+ that.label.text("");
+ that.target.val("");
+ if (options.length > 0) {
+ $.each(options, function(index, option) {
+ item = $('<' + itemTag + '>' + option.label
+'</' + itemTag + '>');
+ item.data('value', option.value);
+ if(option.value === value) {
+ item.addClass(selectedClass);
+ that.label.text(option.label);
+ that.target.val(option.value);
+ }
+ that.listControl.append(item);
+ });
+ that.listControl.on('click', itemTag, function() {
+ that.listControl.children().removeClass(selectedClass);
+ $(this).addClass(selectedClass);
+ that.label.text($(this).text());
+ var oldValue = that.target.val();
+ var newValue = $(this).data('value');
+ that.target.val(newValue);
+ if(oldValue !== newValue) {
+ that.target.change();
+ }
+ });
+ }
+ },
+
+ value : function(data) {
+ if (data === undefined) {
+ return this.target.val();
+ }
+ this.target.val(data.value);
+ this.label.val(data.label);
+ },
+
+ destroy : function() {
+ this.selectDiv.removeClass('btn dropdown popable');
+ this.target.removeClass('input');
+ this.label.removeClass('input');
+ this.listControl.removeClass('select-list');
+ this.listControl.parent().removeClass('popover');
+ $.Widget.prototype.destroy.call(this);
+ }
+ });
+}(jQuery));
diff --git a/ui/src/app/js/widgets/selectmenu-flat.js
b/ui/src/app/js/widgets/selectmenu-flat.js
new file mode 100644
index 0000000..de17dcd
--- /dev/null
+++ b/ui/src/app/js/widgets/selectmenu-flat.js
@@ -0,0 +1,130 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+// How to use:
+// $(".selector").selectmenuFlat({
+// content: [1,2,3,4,5,6], //Set content of the select menu
+// selected: 2 // set the selected option, starts from "1"
+// });
+// $(".selector").selectmenuFlat("value", "4"); //Set
value.
+// var t = $(".selector").selectmenuFlat("value"); //Get value
+// console.log(t);
+
+
+ (function( $ ) {
+ $.widget("wok.selectmenuFlat", {
+
+ options: {
+ content: null,
+ name: null,
+ selected: null,
+ parentid: null
+ },
+
+ _create: function() {
+ var that = this;
+ var name = that.options.name || $(this.element).attr("id");
+ var value = that.options.content;
+ var parentid = $(this.element).attr("id");
+ that.options.parentid = parentid;
+ var html = "<div class='selected-box'>" +
+ "<input class='select-val'>" +
+ "<span class='select-label'></span>" +
+ "<span class='select-icon
icon-down-open'></span>" +
+ "</div>";
+ $(html).appendTo(that.element);
+ html = that._setValue(value);
+ $(html).appendTo(that.element);
+ $("#" + parentid).addClass("select-content");
+ var sel = that.options.selected || 1;
+ sel = that.options.content[Number(sel) -1];
+ that.options.selected = $.inArray(sel, that.options.content) + 1;
+ $(".select-val", "#" + parentid).text(sel);
+ $(".select-label", "#" + parentid).text(sel);
+ $(".selected-box", "#" + parentid).on("click",
this._toggleOpt);
+ $(".selectmenu-opt", "#" +
parentid).on("click", function() {
+ var selectedText = $(this).text();
+ that.options.selected = $.inArray(selectedText, that.options.content)
+1;
+ $(".selected-box .select-label", "#" +
parentid).text(selectedText);
+ $(".select-val", "#" + parentid).text(selectedText);
+ $(".selectmenu-list", "#" +
parentid).prop("style", "display:none");
+ $(".select-icon", "#" +
parentid).removeClass("icon-up-open");
+ $(".select-icon", "#" +
parentid).addClass("icon-down-open").css({
+ "border-left": "none"
+ });
+ });
+ $(document).mouseup(function(e) {
+ var container = $(".selectmenu-opt");
+ if(!container.is(e.target) && container.has(e.target).length ===
0 && $(".select-icon").hasClass("icon-up-open")) {
+ $(".selectmenu-list", "#" +
parentid).prop("style", "display:none");
+ $(".select-icon", "#" +
parentid).removeClass("icon-up-open");
+ $(".select-icon", "#" +
parentid).addClass("icon-down-open").css({
+ "border-left": "none"
+ });
+ }
+ });
+ },
+
+ _setValue: function(value) {
+ var that = this;
+ var html = "<ul class='selectmenu-list'
style='display:none'>";
+ var name = this.options.name || $(this.element).attr("id");
+ $.each(value, function(index, data) {
+ that.options.content[index] = data.toString();
+ html += "<li id='" + name + index + "'
class='selectmenu-opt'>" + data + "</li>";
+ });
+ html += "</ul>";
+ return html;
+ },
+
+ _toggleOpt: function() {
+ var thisButton = $(this).parent().attr("id");
+ if($(".select-icon", "#" +
thisButton).hasClass("icon-down-open")) {
+ $(".selectmenu-list", "#" +
thisButton).prop("style", "display");
+ $(".select-icon", "#" +
thisButton).removeClass("icon-down-open");
+ $(".select-icon", "#" +
thisButton).addClass("icon-up-open").css({
+ "border-left": "1px solid #d8d8d8"
+ });
+ } else {
+ $(".selectmenu-list", "#" +
thisButton).prop("style", "display:none");
+ $(".select-icon", "#" +
thisButton).removeClass("icon-up-open");
+ $(".select-icon", "#" +
thisButton).addClass("icon-down-open").css({
+ "border-left": "none"
+ });
+ }
+ },
+
+ value: function(value) {
+ var parentid = this.options.parentid;
+ if(!value) {
+ return $(".selected-box .select-val", "#" +
parentid).text();
+ }
+ if (value <= this.options.content.length) {
+ this.options.selected = value;
+ var selectedText = this.options.content[value-1];
+ $(".selected-box .select-label", "#" +
parentid).text(selectedText);
+ $(".selected-box .select-val", "#" +
parentid).text(selectedText);
+ }
+ },
+
+ _destroy: function() {
+ this.element.remove();
+ }
+ });
+ })(jQuery);
diff --git a/ui/src/app/js/widgets/textbox-flat.js
b/ui/src/app/js/widgets/textbox-flat.js
new file mode 100644
index 0000000..cd9eca0
--- /dev/null
+++ b/ui/src/app/js/widgets/textbox-flat.js
@@ -0,0 +1,39 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// How to use:
+// $(".selector").textboxFlat({
+// hint: "hint"
+// });
+
+ (function($) {
+ $.widget("wok.textboxFlat", {
+ optons: {
+ hint: ""
+ },
+
+ _create: function() {
+ this.element.addClass("textbox-container");
+ this.element.attr("placeholder", this.options.hint);
+ },
+
+ destroy:function() {
+ this.element.remove();
+ }
+ });
+ })(jQuery);
diff --git a/ui/src/app/logo.ico b/ui/src/app/logo.ico
new file mode 100644
index 0000000000000000000000000000000000000000..cb3a3dc2f9c9ce0e5d3e14f0adab89c28c729ce0
GIT binary patch
literal 15086
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¥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
literal 0
HcmV?d00001
diff --git a/ui/src/app/manifest.json b/ui/src/app/manifest.json
new file mode 100644
index 0000000..bbcc45e
--- /dev/null
+++ b/ui/src/app/manifest.json
@@ -0,0 +1,41 @@
+{
+ "name": "Kimchi",
+ "icons": [
+ {
+ "src": "\/android-chrome-36x36.png",
+ "sizes": "36x36",
+ "type": "image\/png",
+ "density": "0.75"
+ },
+ {
+ "src": "\/android-chrome-48x48.png",
+ "sizes": "48x48",
+ "type": "image\/png",
+ "density": "1.0"
+ },
+ {
+ "src": "\/android-chrome-72x72.png",
+ "sizes": "72x72",
+ "type": "image\/png",
+ "density": "1.5"
+ },
+ {
+ "src": "\/android-chrome-96x96.png",
+ "sizes": "96x96",
+ "type": "image\/png",
+ "density": "2.0"
+ },
+ {
+ "src": "\/android-chrome-144x144.png",
+ "sizes": "144x144",
+ "type": "image\/png",
+ "density": "3.0"
+ },
+ {
+ "src": "\/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image\/png",
+ "density": "4.0"
+ }
+ ]
+}
diff --git a/ui/src/app/mstile-144x144.png b/ui/src/app/mstile-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a8f5ee642cae8225316dfd52f44b3743b6e76ed
GIT binary patch
literal 4103
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
FV1lW#!Yu#*
literal 0
HcmV?d00001
diff --git a/ui/src/app/mstile-150x150.png b/ui/src/app/mstile-150x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..22867370353f63645f87dc45304aeb8f0f66dfd3
GIT binary patch
literal 3891
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
BpiBS&
literal 0
HcmV?d00001
diff --git a/ui/src/app/mstile-310x150.png b/ui/src/app/mstile-310x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..414ca16c30286ff16abffe1ef629199eaae9253f
GIT binary patch
literal 4172
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/mstile-310x310.png b/ui/src/app/mstile-310x310.png
new file mode 100644
index 0000000000000000000000000000000000000000..94e1537cf844a19328b7e251818b1cf373e3dbc6
GIT binary patch
literal 5531
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/mstile-70x70.png b/ui/src/app/mstile-70x70.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc6016d0ca97ff28431e94e8b95960cb5cc9ea3f
GIT binary patch
literal 2602
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
literal 0
HcmV?d00001
diff --git a/ui/src/app/robots.txt b/ui/src/app/robots.txt
new file mode 100755
index 0000000..3969cb1
--- /dev/null
+++ b/ui/src/app/robots.txt
@@ -0,0 +1,4 @@
+#
robotstxt.org/
+
+User-agent: *
+Disallow:
diff --git a/ui/src/bower.json b/ui/src/bower.json
new file mode 100644
index 0000000..cded17a
--- /dev/null
+++ b/ui/src/bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "wok",
+ "private": true,
+ "dependencies": {
+ "modernizr": "~2.8.1",
+ "bootstrap-sass-official": "~3.3.5",
+ "bootstrap-select-sass": "~1.6.3",
+ "compass-mixins": "~1.0.2",
+ "es5-shim": "~4.1.10",
+ "json2": "*",
+ "base64": "~0.3.0",
+ "typeahead.js": "~0.11.1",
+ "bag.js": "~0.1.4",
+ "jquery": "~2.1.4",
+ "jquery-ui": "~1.11.4",
+ "jquery-i18n": "~1.1.1"
+ },
+ "overrides": {
+ "bootstrap-sass-official": {
+ "main": [
+ "assets/stylesheets/_bootstrap.scss",
+ "assets/javascripts/bootstrap.js"
+ ]
+ }
+ },
+ "devDependencies": {
+ "chai": "~3.2.0",
+ "mocha": "~2.2.5"
+ },
+ "resolutions": {
+ "es5-shim": "~4.1.10",
+ "base64": "~0.3.0",
+ "typeahead.js": "~0.11.1",
+ "jquery": "~2.1.4",
+ "jquery-ui": "~1.11.4"
+ }
+}
diff --git a/ui/src/dist/button-flat.css b/ui/src/dist/button-flat.css
new file mode 100755
index 0000000..0897b10
--- /dev/null
+++ b/ui/src/dist/button-flat.css
@@ -0,0 +1,135 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ui-button {
+ display: inline-block;
+ position: relative;
+ color: #FFFFFF;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ border-radius: 3px;
+ border: 1px none;
+ background: #4e4d4f;
+ font-weight: normal;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button:hover{
+ background: #000000;
+ font-weight: normal;
+}
+.ui-button:active {
+ background: #4e4d4f;
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see
h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
diff --git a/ui/src/dist/checkbox-flat.css b/ui/src/dist/checkbox-flat.css
new file mode 100644
index 0000000..b8712b3
--- /dev/null
+++ b/ui/src/dist/checkbox-flat.css
@@ -0,0 +1,25 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ .checkbox-item {
+ cursor: pointer;
+ }
+
+ .checkbox-inline {
+ display: inline-block;
+ }
\ No newline at end of file
diff --git a/ui/src/dist/fontawesome/css/fontawesome.css
b/ui/src/dist/fontawesome/css/fontawesome.css
new file mode 100644
index 0000000..1e22c51
--- /dev/null
+++ b/ui/src/dist/fontawesome/css/fontawesome.css
@@ -0,0 +1,2355 @@
+@charset "UTF-8";
+/*!
+ * Font Awesome 4.3.0 by @davegandy -
http://fontawesome.io - @fontawesome
+ * License -
http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url("../font//fontawesome.ttf") format("truetype");
+ font-weight: normal;
+ font-style: normal;
+}
+
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.3333333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
+}
+
+.fa-2x {
+ font-size: 2em;
+}
+
+.fa-3x {
+ font-size: 3em;
+}
+
+.fa-4x {
+ font-size: 4em;
+}
+
+.fa-5x {
+ font-size: 5em;
+}
+
+.fa-fw {
+ width: 1.2857142857em;
+ text-align: center;
+}
+
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.1428571429em;
+ list-style-type: none;
+}
+
+.fa-ul > li {
+ position: relative;
+}
+
+.fa-li {
+ position: absolute;
+ left: -2.1428571429em;
+ width: 2.1428571429em;
+ top: 0.1428571429em;
+ text-align: center;
+}
+
+.fa-li.fa-lg {
+ left: -1.8571428571em;
+}
+
+.fa-border {
+ padding: 0.2em 0.25em 0.15em;
+ border: solid 0.08em #eee;
+ border-radius: .1em;
+}
+
+.pull-right {
+ float: right;
+}
+
+.pull-left {
+ float: left;
+}
+
+.fa.pull-left {
+ margin-right: .3em;
+}
+
+.fa.pull-right {
+ margin-left: .3em;
+}
+
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+
+.fa-rotate-90 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+
+.fa-rotate-180 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.fa-rotate-270 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+
+.fa-flip-horizontal {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0);
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.fa-flip-vertical {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ -webkit-filter: none;
+ filter: none;
+}
+
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+
+.fa-stack-1x, .fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+
+.fa-stack-1x {
+ line-height: inherit;
+}
+
+.fa-stack-2x {
+ font-size: 2em;
+}
+
+.fa-inverse {
+ color: #fff;
+}
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "";
+}
+
+.fa-music:before {
+ content: "";
+}
+
+.fa-search:before {
+ content: "";
+}
+
+.fa-envelope-o:before {
+ content: "";
+}
+
+.fa-heart:before {
+ content: "";
+}
+
+.fa-star:before {
+ content: "";
+}
+
+.fa-star-o:before {
+ content: "";
+}
+
+.fa-user:before {
+ content: "";
+}
+
+.fa-film:before {
+ content: "";
+}
+
+.fa-th-large:before {
+ content: "";
+}
+
+.fa-th:before {
+ content: "";
+}
+
+.fa-th-list:before {
+ content: "";
+}
+
+.fa-check:before {
+ content: "";
+}
+
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "";
+}
+
+.fa-search-plus:before {
+ content: "";
+}
+
+.fa-search-minus:before {
+ content: "";
+}
+
+.fa-power-off:before {
+ content: "";
+}
+
+.fa-signal:before {
+ content: "";
+}
+
+.fa-gear:before,
+.fa-cog:before {
+ content: "";
+}
+
+.fa-trash-o:before {
+ content: "";
+}
+
+.fa-home:before {
+ content: "";
+}
+
+.fa-file-o:before {
+ content: "";
+}
+
+.fa-clock-o:before {
+ content: "";
+}
+
+.fa-road:before {
+ content: "";
+}
+
+.fa-download:before {
+ content: "";
+}
+
+.fa-arrow-circle-o-down:before {
+ content: "";
+}
+
+.fa-arrow-circle-o-up:before {
+ content: "";
+}
+
+.fa-inbox:before {
+ content: "";
+}
+
+.fa-play-circle-o:before {
+ content: "";
+}
+
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "";
+}
+
+.fa-refresh:before {
+ content: "";
+}
+
+.fa-list-alt:before {
+ content: "";
+}
+
+.fa-lock:before {
+ content: "";
+}
+
+.fa-flag:before {
+ content: "";
+}
+
+.fa-headphones:before {
+ content: "";
+}
+
+.fa-volume-off:before {
+ content: "";
+}
+
+.fa-volume-down:before {
+ content: "";
+}
+
+.fa-volume-up:before {
+ content: "";
+}
+
+.fa-qrcode:before {
+ content: "";
+}
+
+.fa-barcode:before {
+ content: "";
+}
+
+.fa-tag:before {
+ content: "";
+}
+
+.fa-tags:before {
+ content: "";
+}
+
+.fa-book:before {
+ content: "";
+}
+
+.fa-bookmark:before {
+ content: "";
+}
+
+.fa-print:before {
+ content: "";
+}
+
+.fa-camera:before {
+ content: "";
+}
+
+.fa-font:before {
+ content: "";
+}
+
+.fa-bold:before {
+ content: "";
+}
+
+.fa-italic:before {
+ content: "";
+}
+
+.fa-text-height:before {
+ content: "";
+}
+
+.fa-text-width:before {
+ content: "";
+}
+
+.fa-align-left:before {
+ content: "";
+}
+
+.fa-align-center:before {
+ content: "";
+}
+
+.fa-align-right:before {
+ content: "";
+}
+
+.fa-align-justify:before {
+ content: "";
+}
+
+.fa-list:before {
+ content: "";
+}
+
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "";
+}
+
+.fa-indent:before {
+ content: "";
+}
+
+.fa-video-camera:before {
+ content: "";
+}
+
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "";
+}
+
+.fa-pencil:before {
+ content: "";
+}
+
+.fa-map-marker:before {
+ content: "";
+}
+
+.fa-adjust:before {
+ content: "";
+}
+
+.fa-tint:before {
+ content: "";
+}
+
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "";
+}
+
+.fa-share-square-o:before {
+ content: "";
+}
+
+.fa-check-square-o:before {
+ content: "";
+}
+
+.fa-arrows:before {
+ content: "";
+}
+
+.fa-step-backward:before {
+ content: "";
+}
+
+.fa-fast-backward:before {
+ content: "";
+}
+
+.fa-backward:before {
+ content: "";
+}
+
+.fa-play:before {
+ content: "";
+}
+
+.fa-pause:before {
+ content: "";
+}
+
+.fa-stop:before {
+ content: "";
+}
+
+.fa-forward:before {
+ content: "";
+}
+
+.fa-fast-forward:before {
+ content: "";
+}
+
+.fa-step-forward:before {
+ content: "";
+}
+
+.fa-eject:before {
+ content: "";
+}
+
+.fa-chevron-left:before {
+ content: "";
+}
+
+.fa-chevron-right:before {
+ content: "";
+}
+
+.fa-plus-circle:before {
+ content: "";
+}
+
+.fa-minus-circle:before {
+ content: "";
+}
+
+.fa-times-circle:before {
+ content: "";
+}
+
+.fa-check-circle:before {
+ content: "";
+}
+
+.fa-question-circle:before {
+ content: "";
+}
+
+.fa-info-circle:before {
+ content: "";
+}
+
+.fa-crosshairs:before {
+ content: "";
+}
+
+.fa-times-circle-o:before {
+ content: "";
+}
+
+.fa-check-circle-o:before {
+ content: "";
+}
+
+.fa-ban:before {
+ content: "";
+}
+
+.fa-arrow-left:before {
+ content: "";
+}
+
+.fa-arrow-right:before {
+ content: "";
+}
+
+.fa-arrow-up:before {
+ content: "";
+}
+
+.fa-arrow-down:before {
+ content: "";
+}
+
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "";
+}
+
+.fa-expand:before {
+ content: "";
+}
+
+.fa-compress:before {
+ content: "";
+}
+
+.fa-plus:before {
+ content: "";
+}
+
+.fa-minus:before {
+ content: "";
+}
+
+.fa-asterisk:before {
+ content: "";
+}
+
+.fa-exclamation-circle:before {
+ content: "";
+}
+
+.fa-gift:before {
+ content: "";
+}
+
+.fa-leaf:before {
+ content: "";
+}
+
+.fa-fire:before {
+ content: "";
+}
+
+.fa-eye:before {
+ content: "";
+}
+
+.fa-eye-slash:before {
+ content: "";
+}
+
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "";
+}
+
+.fa-plane:before {
+ content: "";
+}
+
+.fa-calendar:before {
+ content: "";
+}
+
+.fa-random:before {
+ content: "";
+}
+
+.fa-comment:before {
+ content: "";
+}
+
+.fa-magnet:before {
+ content: "";
+}
+
+.fa-chevron-up:before {
+ content: "";
+}
+
+.fa-chevron-down:before {
+ content: "";
+}
+
+.fa-retweet:before {
+ content: "";
+}
+
+.fa-shopping-cart:before {
+ content: "";
+}
+
+.fa-folder:before {
+ content: "";
+}
+
+.fa-folder-open:before {
+ content: "";
+}
+
+.fa-arrows-v:before {
+ content: "";
+}
+
+.fa-arrows-h:before {
+ content: "";
+}
+
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "";
+}
+
+.fa-twitter-square:before {
+ content: "";
+}
+
+.fa-facebook-square:before {
+ content: "";
+}
+
+.fa-camera-retro:before {
+ content: "";
+}
+
+.fa-key:before {
+ content: "";
+}
+
+.fa-gears:before,
+.fa-cogs:before {
+ content: "";
+}
+
+.fa-comments:before {
+ content: "";
+}
+
+.fa-thumbs-o-up:before {
+ content: "";
+}
+
+.fa-thumbs-o-down:before {
+ content: "";
+}
+
+.fa-star-half:before {
+ content: "";
+}
+
+.fa-heart-o:before {
+ content: "";
+}
+
+.fa-sign-out:before {
+ content: "";
+}
+
+.fa-linkedin-square:before {
+ content: "";
+}
+
+.fa-thumb-tack:before {
+ content: "";
+}
+
+.fa-external-link:before {
+ content: "";
+}
+
+.fa-sign-in:before {
+ content: "";
+}
+
+.fa-trophy:before {
+ content: "";
+}
+
+.fa-github-square:before {
+ content: "";
+}
+
+.fa-upload:before {
+ content: "";
+}
+
+.fa-lemon-o:before {
+ content: "";
+}
+
+.fa-phone:before {
+ content: "";
+}
+
+.fa-square-o:before {
+ content: "";
+}
+
+.fa-bookmark-o:before {
+ content: "";
+}
+
+.fa-phone-square:before {
+ content: "";
+}
+
+.fa-twitter:before {
+ content: "";
+}
+
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: "";
+}
+
+.fa-github:before {
+ content: "";
+}
+
+.fa-unlock:before {
+ content: "";
+}
+
+.fa-credit-card:before {
+ content: "";
+}
+
+.fa-rss:before {
+ content: "";
+}
+
+.fa-hdd-o:before {
+ content: "";
+}
+
+.fa-bullhorn:before {
+ content: "";
+}
+
+.fa-bell:before {
+ content: "";
+}
+
+.fa-certificate:before {
+ content: "";
+}
+
+.fa-hand-o-right:before {
+ content: "";
+}
+
+.fa-hand-o-left:before {
+ content: "";
+}
+
+.fa-hand-o-up:before {
+ content: "";
+}
+
+.fa-hand-o-down:before {
+ content: "";
+}
+
+.fa-arrow-circle-left:before {
+ content: "";
+}
+
+.fa-arrow-circle-right:before {
+ content: "";
+}
+
+.fa-arrow-circle-up:before {
+ content: "";
+}
+
+.fa-arrow-circle-down:before {
+ content: "";
+}
+
+.fa-globe:before {
+ content: "";
+}
+
+.fa-wrench:before {
+ content: "";
+}
+
+.fa-tasks:before {
+ content: "";
+}
+
+.fa-filter:before {
+ content: "";
+}
+
+.fa-briefcase:before {
+ content: "";
+}
+
+.fa-arrows-alt:before {
+ content: "";
+}
+
+.fa-group:before,
+.fa-users:before {
+ content: "";
+}
+
+.fa-chain:before,
+.fa-link:before {
+ content: "";
+}
+
+.fa-cloud:before {
+ content: "";
+}
+
+.fa-flask:before {
+ content: "";
+}
+
+.fa-cut:before,
+.fa-scissors:before {
+ content: "";
+}
+
+.fa-copy:before,
+.fa-files-o:before {
+ content: "";
+}
+
+.fa-paperclip:before {
+ content: "";
+}
+
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "";
+}
+
+.fa-square:before {
+ content: "";
+}
+
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "";
+}
+
+.fa-list-ul:before {
+ content: "";
+}
+
+.fa-list-ol:before {
+ content: "";
+}
+
+.fa-strikethrough:before {
+ content: "";
+}
+
+.fa-underline:before {
+ content: "";
+}
+
+.fa-table:before {
+ content: "";
+}
+
+.fa-magic:before {
+ content: "";
+}
+
+.fa-truck:before {
+ content: "";
+}
+
+.fa-pinterest:before {
+ content: "";
+}
+
+.fa-pinterest-square:before {
+ content: "";
+}
+
+.fa-google-plus-square:before {
+ content: "";
+}
+
+.fa-google-plus:before {
+ content: "";
+}
+
+.fa-money:before {
+ content: "";
+}
+
+.fa-caret-down:before {
+ content: "";
+}
+
+.fa-caret-up:before {
+ content: "";
+}
+
+.fa-caret-left:before {
+ content: "";
+}
+
+.fa-caret-right:before {
+ content: "";
+}
+
+.fa-columns:before {
+ content: "";
+}
+
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "";
+}
+
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "";
+}
+
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "";
+}
+
+.fa-envelope:before {
+ content: "";
+}
+
+.fa-linkedin:before {
+ content: "";
+}
+
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "";
+}
+
+.fa-legal:before,
+.fa-gavel:before {
+ content: "";
+}
+
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "";
+}
+
+.fa-comment-o:before {
+ content: "";
+}
+
+.fa-comments-o:before {
+ content: "";
+}
+
+.fa-flash:before,
+.fa-bolt:before {
+ content: "";
+}
+
+.fa-sitemap:before {
+ content: "";
+}
+
+.fa-umbrella:before {
+ content: "";
+}
+
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "";
+}
+
+.fa-lightbulb-o:before {
+ content: "";
+}
+
+.fa-exchange:before {
+ content: "";
+}
+
+.fa-cloud-download:before {
+ content: "";
+}
+
+.fa-cloud-upload:before {
+ content: "";
+}
+
+.fa-user-md:before {
+ content: "";
+}
+
+.fa-stethoscope:before {
+ content: "";
+}
+
+.fa-suitcase:before {
+ content: "";
+}
+
+.fa-bell-o:before {
+ content: "";
+}
+
+.fa-coffee:before {
+ content: "";
+}
+
+.fa-cutlery:before {
+ content: "";
+}
+
+.fa-file-text-o:before {
+ content: "";
+}
+
+.fa-building-o:before {
+ content: "";
+}
+
+.fa-hospital-o:before {
+ content: "";
+}
+
+.fa-ambulance:before {
+ content: "";
+}
+
+.fa-medkit:before {
+ content: "";
+}
+
+.fa-fighter-jet:before {
+ content: "";
+}
+
+.fa-beer:before {
+ content: "";
+}
+
+.fa-h-square:before {
+ content: "";
+}
+
+.fa-plus-square:before {
+ content: "";
+}
+
+.fa-angle-double-left:before {
+ content: "";
+}
+
+.fa-angle-double-right:before {
+ content: "";
+}
+
+.fa-angle-double-up:before {
+ content: "";
+}
+
+.fa-angle-double-down:before {
+ content: "";
+}
+
+.fa-angle-left:before {
+ content: "";
+}
+
+.fa-angle-right:before {
+ content: "";
+}
+
+.fa-angle-up:before {
+ content: "";
+}
+
+.fa-angle-down:before {
+ content: "";
+}
+
+.fa-desktop:before {
+ content: "";
+}
+
+.fa-laptop:before {
+ content: "";
+}
+
+.fa-tablet:before {
+ content: "";
+}
+
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "";
+}
+
+.fa-circle-o:before {
+ content: "";
+}
+
+.fa-quote-left:before {
+ content: "";
+}
+
+.fa-quote-right:before {
+ content: "";
+}
+
+.fa-spinner:before {
+ content: "";
+}
+
+.fa-circle:before {
+ content: "";
+}
+
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "";
+}
+
+.fa-github-alt:before {
+ content: "";
+}
+
+.fa-folder-o:before {
+ content: "";
+}
+
+.fa-folder-open-o:before {
+ content: "";
+}
+
+.fa-smile-o:before {
+ content: "";
+}
+
+.fa-frown-o:before {
+ content: "";
+}
+
+.fa-meh-o:before {
+ content: "";
+}
+
+.fa-gamepad:before {
+ content: "";
+}
+
+.fa-keyboard-o:before {
+ content: "";
+}
+
+.fa-flag-o:before {
+ content: "";
+}
+
+.fa-flag-checkered:before {
+ content: "";
+}
+
+.fa-terminal:before {
+ content: "";
+}
+
+.fa-code:before {
+ content: "";
+}
+
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "";
+}
+
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "";
+}
+
+.fa-location-arrow:before {
+ content: "";
+}
+
+.fa-crop:before {
+ content: "";
+}
+
+.fa-code-fork:before {
+ content: "";
+}
+
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "";
+}
+
+.fa-question:before {
+ content: "";
+}
+
+.fa-info:before {
+ content: "";
+}
+
+.fa-exclamation:before {
+ content: "";
+}
+
+.fa-superscript:before {
+ content: "";
+}
+
+.fa-subscript:before {
+ content: "";
+}
+
+.fa-eraser:before {
+ content: "";
+}
+
+.fa-puzzle-piece:before {
+ content: "";
+}
+
+.fa-microphone:before {
+ content: "";
+}
+
+.fa-microphone-slash:before {
+ content: "";
+}
+
+.fa-shield:before {
+ content: "";
+}
+
+.fa-calendar-o:before {
+ content: "";
+}
+
+.fa-fire-extinguisher:before {
+ content: "";
+}
+
+.fa-rocket:before {
+ content: "";
+}
+
+.fa-maxcdn:before {
+ content: "";
+}
+
+.fa-chevron-circle-left:before {
+ content: "";
+}
+
+.fa-chevron-circle-right:before {
+ content: "";
+}
+
+.fa-chevron-circle-up:before {
+ content: "";
+}
+
+.fa-chevron-circle-down:before {
+ content: "";
+}
+
+.fa-html5:before {
+ content: "";
+}
+
+.fa-css3:before {
+ content: "";
+}
+
+.fa-anchor:before {
+ content: "";
+}
+
+.fa-unlock-alt:before {
+ content: "";
+}
+
+.fa-bullseye:before {
+ content: "";
+}
+
+.fa-ellipsis-h:before {
+ content: "";
+}
+
+.fa-ellipsis-v:before {
+ content: "";
+}
+
+.fa-rss-square:before {
+ content: "";
+}
+
+.fa-play-circle:before {
+ content: "";
+}
+
+.fa-ticket:before {
+ content: "";
+}
+
+.fa-minus-square:before {
+ content: "";
+}
+
+.fa-minus-square-o:before {
+ content: "";
+}
+
+.fa-level-up:before {
+ content: "";
+}
+
+.fa-level-down:before {
+ content: "";
+}
+
+.fa-check-square:before {
+ content: "";
+}
+
+.fa-pencil-square:before {
+ content: "";
+}
+
+.fa-external-link-square:before {
+ content: "";
+}
+
+.fa-share-square:before {
+ content: "";
+}
+
+.fa-compass:before {
+ content: "";
+}
+
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "";
+}
+
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "";
+}
+
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "";
+}
+
+.fa-euro:before,
+.fa-eur:before {
+ content: "";
+}
+
+.fa-gbp:before {
+ content: "";
+}
+
+.fa-dollar:before,
+.fa-usd:before {
+ content: "";
+}
+
+.fa-rupee:before,
+.fa-inr:before {
+ content: "";
+}
+
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "";
+}
+
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "";
+}
+
+.fa-won:before,
+.fa-krw:before {
+ content: "";
+}
+
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "";
+}
+
+.fa-file:before {
+ content: "";
+}
+
+.fa-file-text:before {
+ content: "";
+}
+
+.fa-sort-alpha-asc:before {
+ content: "";
+}
+
+.fa-sort-alpha-desc:before {
+ content: "";
+}
+
+.fa-sort-amount-asc:before {
+ content: "";
+}
+
+.fa-sort-amount-desc:before {
+ content: "";
+}
+
+.fa-sort-numeric-asc:before {
+ content: "";
+}
+
+.fa-sort-numeric-desc:before {
+ content: "";
+}
+
+.fa-thumbs-up:before {
+ content: "";
+}
+
+.fa-thumbs-down:before {
+ content: "";
+}
+
+.fa-youtube-square:before {
+ content: "";
+}
+
+.fa-youtube:before {
+ content: "";
+}
+
+.fa-xing:before {
+ content: "";
+}
+
+.fa-xing-square:before {
+ content: "";
+}
+
+.fa-youtube-play:before {
+ content: "";
+}
+
+.fa-dropbox:before {
+ content: "";
+}
+
+.fa-stack-overflow:before {
+ content: "";
+}
+
+.fa-instagram:before {
+ content: "";
+}
+
+.fa-flickr:before {
+ content: "";
+}
+
+.fa-adn:before {
+ content: "";
+}
+
+.fa-bitbucket:before {
+ content: "";
+}
+
+.fa-bitbucket-square:before {
+ content: "";
+}
+
+.fa-tumblr:before {
+ content: "";
+}
+
+.fa-tumblr-square:before {
+ content: "";
+}
+
+.fa-long-arrow-down:before {
+ content: "";
+}
+
+.fa-long-arrow-up:before {
+ content: "";
+}
+
+.fa-long-arrow-left:before {
+ content: "";
+}
+
+.fa-long-arrow-right:before {
+ content: "";
+}
+
+.fa-apple:before {
+ content: "";
+}
+
+.fa-windows:before {
+ content: "";
+}
+
+.fa-android:before {
+ content: "";
+}
+
+.fa-linux:before {
+ content: "";
+}
+
+.fa-dribbble:before {
+ content: "";
+}
+
+.fa-skype:before {
+ content: "";
+}
+
+.fa-foursquare:before {
+ content: "";
+}
+
+.fa-trello:before {
+ content: "";
+}
+
+.fa-female:before {
+ content: "";
+}
+
+.fa-male:before {
+ content: "";
+}
+
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: "";
+}
+
+.fa-sun-o:before {
+ content: "";
+}
+
+.fa-moon-o:before {
+ content: "";
+}
+
+.fa-archive:before {
+ content: "";
+}
+
+.fa-bug:before {
+ content: "";
+}
+
+.fa-vk:before {
+ content: "";
+}
+
+.fa-weibo:before {
+ content: "";
+}
+
+.fa-renren:before {
+ content: "";
+}
+
+.fa-pagelines:before {
+ content: "";
+}
+
+.fa-stack-exchange:before {
+ content: "";
+}
+
+.fa-arrow-circle-o-right:before {
+ content: "";
+}
+
+.fa-arrow-circle-o-left:before {
+ content: "";
+}
+
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "";
+}
+
+.fa-dot-circle-o:before {
+ content: "";
+}
+
+.fa-wheelchair:before {
+ content: "";
+}
+
+.fa-vimeo-square:before {
+ content: "";
+}
+
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "";
+}
+
+.fa-plus-square-o:before {
+ content: "";
+}
+
+.fa-space-shuttle:before {
+ content: "";
+}
+
+.fa-slack:before {
+ content: "";
+}
+
+.fa-envelope-square:before {
+ content: "";
+}
+
+.fa-wordpress:before {
+ content: "";
+}
+
+.fa-openid:before {
+ content: "";
+}
+
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "";
+}
+
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "";
+}
+
+.fa-yahoo:before {
+ content: "";
+}
+
+.fa-google:before {
+ content: "";
+}
+
+.fa-reddit:before {
+ content: "";
+}
+
+.fa-reddit-square:before {
+ content: "";
+}
+
+.fa-stumbleupon-circle:before {
+ content: "";
+}
+
+.fa-stumbleupon:before {
+ content: "";
+}
+
+.fa-delicious:before {
+ content: "";
+}
+
+.fa-digg:before {
+ content: "";
+}
+
+.fa-pied-piper:before {
+ content: "";
+}
+
+.fa-pied-piper-alt:before {
+ content: "";
+}
+
+.fa-drupal:before {
+ content: "";
+}
+
+.fa-joomla:before {
+ content: "";
+}
+
+.fa-language:before {
+ content: "";
+}
+
+.fa-fax:before {
+ content: "";
+}
+
+.fa-building:before {
+ content: "";
+}
+
+.fa-child:before {
+ content: "";
+}
+
+.fa-paw:before {
+ content: "";
+}
+
+.fa-spoon:before {
+ content: "";
+}
+
+.fa-cube:before {
+ content: "";
+}
+
+.fa-cubes:before {
+ content: "";
+}
+
+.fa-behance:before {
+ content: "";
+}
+
+.fa-behance-square:before {
+ content: "";
+}
+
+.fa-steam:before {
+ content: "";
+}
+
+.fa-steam-square:before {
+ content: "";
+}
+
+.fa-recycle:before {
+ content: "";
+}
+
+.fa-automobile:before,
+.fa-car:before {
+ content: "";
+}
+
+.fa-cab:before,
+.fa-taxi:before {
+ content: "";
+}
+
+.fa-tree:before {
+ content: "";
+}
+
+.fa-spotify:before {
+ content: "";
+}
+
+.fa-deviantart:before {
+ content: "";
+}
+
+.fa-soundcloud:before {
+ content: "";
+}
+
+.fa-database:before {
+ content: "";
+}
+
+.fa-file-pdf-o:before {
+ content: "";
+}
+
+.fa-file-word-o:before {
+ content: "";
+}
+
+.fa-file-excel-o:before {
+ content: "";
+}
+
+.fa-file-powerpoint-o:before {
+ content: "";
+}
+
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "";
+}
+
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "";
+}
+
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "";
+}
+
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "";
+}
+
+.fa-file-code-o:before {
+ content: "";
+}
+
+.fa-vine:before {
+ content: "";
+}
+
+.fa-codepen:before {
+ content: "";
+}
+
+.fa-jsfiddle:before {
+ content: "";
+}
+
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "";
+}
+
+.fa-circle-o-notch:before {
+ content: "";
+}
+
+.fa-ra:before,
+.fa-rebel:before {
+ content: "";
+}
+
+.fa-ge:before,
+.fa-empire:before {
+ content: "";
+}
+
+.fa-git-square:before {
+ content: "";
+}
+
+.fa-git:before {
+ content: "";
+}
+
+.fa-hacker-news:before {
+ content: "";
+}
+
+.fa-tencent-weibo:before {
+ content: "";
+}
+
+.fa-qq:before {
+ content: "";
+}
+
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "";
+}
+
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "";
+}
+
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "";
+}
+
+.fa-history:before {
+ content: "";
+}
+
+.fa-genderless:before,
+.fa-circle-thin:before {
+ content: "";
+}
+
+.fa-header:before {
+ content: "";
+}
+
+.fa-paragraph:before {
+ content: "";
+}
+
+.fa-sliders:before {
+ content: "";
+}
+
+.fa-share-alt:before {
+ content: "";
+}
+
+.fa-share-alt-square:before {
+ content: "";
+}
+
+.fa-bomb:before {
+ content: "";
+}
+
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "";
+}
+
+.fa-tty:before {
+ content: "";
+}
+
+.fa-binoculars:before {
+ content: "";
+}
+
+.fa-plug:before {
+ content: "";
+}
+
+.fa-slideshare:before {
+ content: "";
+}
+
+.fa-twitch:before {
+ content: "";
+}
+
+.fa-yelp:before {
+ content: "";
+}
+
+.fa-newspaper-o:before {
+ content: "";
+}
+
+.fa-wifi:before {
+ content: "";
+}
+
+.fa-calculator:before {
+ content: "";
+}
+
+.fa-paypal:before {
+ content: "";
+}
+
+.fa-google-wallet:before {
+ content: "";
+}
+
+.fa-cc-visa:before {
+ content: "";
+}
+
+.fa-cc-mastercard:before {
+ content: "";
+}
+
+.fa-cc-discover:before {
+ content: "";
+}
+
+.fa-cc-amex:before {
+ content: "";
+}
+
+.fa-cc-paypal:before {
+ content: "";
+}
+
+.fa-cc-stripe:before {
+ content: "";
+}
+
+.fa-bell-slash:before {
+ content: "";
+}
+
+.fa-bell-slash-o:before {
+ content: "";
+}
+
+.fa-trash:before {
+ content: "";
+}
+
+.fa-copyright:before {
+ content: "";
+}
+
+.fa-at:before {
+ content: "";
+}
+
+.fa-eyedropper:before {
+ content: "";
+}
+
+.fa-paint-brush:before {
+ content: "";
+}
+
+.fa-birthday-cake:before {
+ content: "";
+}
+
+.fa-area-chart:before {
+ content: "";
+}
+
+.fa-pie-chart:before {
+ content: "";
+}
+
+.fa-line-chart:before {
+ content: "";
+}
+
+.fa-lastfm:before {
+ content: "";
+}
+
+.fa-lastfm-square:before {
+ content: "";
+}
+
+.fa-toggle-off:before {
+ content: "";
+}
+
+.fa-toggle-on:before {
+ content: "";
+}
+
+.fa-bicycle:before {
+ content: "";
+}
+
+.fa-bus:before {
+ content: "";
+}
+
+.fa-ioxhost:before {
+ content: "";
+}
+
+.fa-angellist:before {
+ content: "";
+}
+
+.fa-cc:before {
+ content: "";
+}
+
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "";
+}
+
+.fa-meanpath:before {
+ content: "";
+}
+
+.fa-buysellads:before {
+ content: "";
+}
+
+.fa-connectdevelop:before {
+ content: "";
+}
+
+.fa-dashcube:before {
+ content: "";
+}
+
+.fa-forumbee:before {
+ content: "";
+}
+
+.fa-leanpub:before {
+ content: "";
+}
+
+.fa-sellsy:before {
+ content: "";
+}
+
+.fa-shirtsinbulk:before {
+ content: "";
+}
+
+.fa-simplybuilt:before {
+ content: "";
+}
+
+.fa-skyatlas:before {
+ content: "";
+}
+
+.fa-cart-plus:before {
+ content: "";
+}
+
+.fa-cart-arrow-down:before {
+ content: "";
+}
+
+.fa-diamond:before {
+ content: "";
+}
+
+.fa-ship:before {
+ content: "";
+}
+
+.fa-user-secret:before {
+ content: "";
+}
+
+.fa-motorcycle:before {
+ content: "";
+}
+
+.fa-street-view:before {
+ content: "";
+}
+
+.fa-heartbeat:before {
+ content: "";
+}
+
+.fa-venus:before {
+ content: "";
+}
+
+.fa-mars:before {
+ content: "";
+}
+
+.fa-mercury:before {
+ content: "";
+}
+
+.fa-transgender:before {
+ content: "";
+}
+
+.fa-transgender-alt:before {
+ content: "";
+}
+
+.fa-venus-double:before {
+ content: "";
+}
+
+.fa-mars-double:before {
+ content: "";
+}
+
+.fa-venus-mars:before {
+ content: "";
+}
+
+.fa-mars-stroke:before {
+ content: "";
+}
+
+.fa-mars-stroke-v:before {
+ content: "";
+}
+
+.fa-mars-stroke-h:before {
+ content: "";
+}
+
+.fa-neuter:before {
+ content: "";
+}
+
+.fa-facebook-official:before {
+ content: "";
+}
+
+.fa-pinterest-p:before {
+ content: "";
+}
+
+.fa-whatsapp:before {
+ content: "";
+}
+
+.fa-server:before {
+ content: "";
+}
+
+.fa-user-plus:before {
+ content: "";
+}
+
+.fa-user-times:before {
+ content: "";
+}
+
+.fa-hotel:before,
+.fa-bed:before {
+ content: "";
+}
+
+.fa-viacoin:before {
+ content: "";
+}
+
+.fa-train:before {
+ content: "";
+}
+
+.fa-subway:before {
+ content: "";
+}
+
+.fa-medium:before {
+ content: "";
+}
+
+/*#
sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvbnRhd2Vzb21lLmNzcyIsImZvbnRhd2Vzb21lLnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX3BhdGguc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm9udGF3ZXNvbWUvc2Nzcy9fY29yZS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL19sYXJnZXIuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm9udGF3ZXNvbWUvc2Nzcy9fZml4ZWQtd2lkdGguc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm9udGF3ZXNvbWUvc2Nzcy9fbGlzdC5zY3NzIiwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL192YXJpYWJsZXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm9udGF3ZXNvbWUvc2Nzcy9fYm9yZGVyZWQtcHVsbGVkLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvbnRhd2Vzb21lL3Njc3MvX2FuaW1hdGVkLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvbnRhd2Vzb21lL3Njc3MvX3JvdGF0ZWQtZmxpcHBlZC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL19taXhpbnMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm9udGF3ZXNvbWUvc2Nzcy9fc3RhY2tlZC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL19pY29ucy5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjtBQ0FqQjs7O0dBR0c7QUNISDtnQ0FDZ0M7QUFFaEM7RUFDRSwyQkFBMkI7RUFDM0Isd0RBQW1EO0VBQ25ELG9CQUFvQjtFQUNwQixtQkFBbUI7Q0ZLcEI7O0FHWkQ7RUFDRSxzQkFBc0I7RUFDdEIsOENBQThEO0VBQzlELG1CQUFtQjtFQUNuQixxQkFBcUI7RUFDckIsb0NBQW9D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Qy9CLGFOdWFtQjtDTXZhcEI7O0FBQWlDO0VBQ2hDLGFOaVlnQjtDTWpZakI7O0FBQThCO0VBQzdCLGFOd2JhO0NNeGJkOztBQUEyQjs7RUFDMUIsYU4ySFU7Q00zSFg7O0FBQXdCO0VBQ3ZCLGFONGdCYztDTTVnQmY7O0FBQTRCO0VBQzNCLGFOc1FXO0NNdFFaOztBQUF5QjtFQUN4QixhTmdNYTtDTWhNZDs7QUFBMkI7RUFDMUIsYU42R2M7Q003R2Y7O0FBQTRCO0VBQzNCLGFOa1pXO0NNbFpaOztBQUF5QjtFQUN4QixhTm9KZTtDTXBKaEI7O0FBQTZCO0VBQzVCLGFOTzBCO0NNUDNCOztBQUF3QztFQUN2QyxhTlN3QjtDTVR6Qjs7QUFBc0M7RUFDckMsYU5xUVk7Q01yUWI7O0FBQTBCO0VBQ3pCLGFOK1dvQjtDTS9XckI7O0FBQWtDOztFQUNqQyxhTnVZYTtDTXZZZDs7QUFBMkI7RUFDMUIsYU5rWWM7Q01sWWY7O0FBQTRCO0VBQzNCLGFOcVNlO0NNclNoQjs7QUFBNkI7RUFDNUIsYU53U1c7Q014U1o7O0FBQXlCO0VBQ3hCLGFOb01XO0NNcE1aOztBQUF5QjtFQUN4QixhTm1QaUI7Q01uUGxCOztBQUErQjtFQUM5QixhTmtpQmlCO0NNbGlCbEI7O0FBQStCO0VBQzlCLGFOZ2lCa0I7Q01oaUJuQjs7QUFBZ0M7RUFDL0IsYU5paUJnQjtDTWppQmpCOztBQUE4QjtFQUM3QixhTitXYTtDTS9XZDs7QUFBMkI7RUFDMUIsYU5lYztDTWZmOztBQUE0QjtFQUMzQixhTndkVTtDTXhkWDs7QUFBd0I7RUFDdkIsYU53ZFc7Q014ZFo7O0FBQXlCO0VBQ3hCLGFOK0JXO0NNL0JaOztBQUF5QjtFQUN4QixhTitCZTtDTS9CaEI7O0FBQTZCO0VBQzVCLGFOc1dZO0NNdFdiOztBQUEwQjtFQUN6QixhTjRDYTtDTTVDZDs7QUFBMkI7RUFDMUIsYU5rTVc7Q01sTVo7O0FBQXlCO0VBQ3hCLGFOdUJXO0NNdkJaOztBQUF5QjtFQUN4QixhTndQYTtDTXhQZDs7QUFBMkI7RUFDMUIsYU5xZGtCO0NNcmRuQjs7QUFBZ0M7RUFDL0IsYU5xZGlCO0NNcmRsQjs7QUFBK0I7RUFDOUIsYU50Q2lCO0NNc0NsQjs7QUFBK0I7RUFDOUIsYU56Q21CO0NNeUNwQjs7QUFBaUM7RUFDaEMsYU52Q2tCO0NNdUNuQjs7QUFBZ0M7RUFDL0IsYU4xQ29CO0NNMENyQjs7QUFBa0M7RUFDakMsYU40UVc7Q001UVo7O0FBQXlCOztFQUN4QixhTndUYztDTXhUZjs7QUFBNEI7RUFDM0IsYU53T2E7Q014T2Q7O0FBQTJCO0VBQzFCLGFOc2dCbUI7Q010Z0JwQjs7QUFBaUM7OztFQUNoQyxhTnNVZ0I7Q010VWpCOztBQUE4QjtFQUM3QixhTitUYTtDTS9UZDs7QUFBMkI7RUFDMUIsYU5zUmlCO0NNdFJsQjs7QUFBK0I7RUFDOUIsYU5yRGE7Q01xRGQ7O0FBQTJCO0VBQzFCLGFOcWRXO0NNcmRaOztBQUF5Qjs7RUFDeEIsYU42VHNCO0NNN1R2Qjs7QUFBb0M7RUFDbkMsYU4rWHFCO0NNL1h0Qjs7QUFBbUM7RUFDbEMsYU5rRHFCO0NNbER0Qjs7QUFBbUM7RUFDbEMsYU56QmE7Q015QmQ7O0FBQTJCO0VBQzFCLGFOMmFvQjtDTTNhckI7O0FBQWtDO0VBQ2pDLGFOb0lvQjtDTXBJckI7O0FBQWtDO0VBQ2pDLGFOckJlO0NNcUJoQjs7QUFBNkI7RUFDNUIsYU5rVVc7Q01sVVo7O0FBQXlCO0VBQ3hCLGFOZ1RZO0NNaFRiOztBQUEwQjtFQUN6QixhTnlhVztDTXphWjs7QUFBeUI7RUFDeEIsYU53S2M7Q014S2Y7O0FBQTRCO0VBQzNCLGFOK0htQjtDTS9IcEI7O0FBQWlDO0VBQ2hDLGFOb2FtQjtDTXBhcEI7O0FBQWlDO0VBQ2hDLGFOb0dZO0NNcEdiOztBQUEwQjtFQUN6QixhTjRDbUI7Q001Q3BCOztBQUFpQztFQUNoQyxhTjRDb0I7Q001Q3JCOztBQUFrQztFQUNqQyxhTjhUa0I7Q005VG5COztBQUFnQztFQUMvQixhTmlSbUI7Q01qUnBCOztBQUFpQztFQUNoQyxhTmdjbUI7Q01oY3BCOztBQUFpQztFQUNoQyxhTjhCbUI7Q005QnBCOztBQUFpQztFQUNoQyxhTm1Vc0I7Q01uVXZCOztBQUFvQztFQUNuQyxhTjhNa0I7Q005TW5COztBQUFnQztFQUMvQixhTnFFaUI7Q01yRWxCOztBQUErQjtFQUM5QixhTjRicUI7Q001YnRCOztBQUFtQztFQUNsQyxhTjBCcUI7Q00xQnRCOztBQUFtQztFQUNsQyxhTnZDVTtDTXVDWDs7QUFBd0I7RUFDdkIsYU5uRGlCO0NNbURsQjs7QUFBK0I7RUFDOUIsYU5uRGtCO0NNbURuQjs7QUFBZ0M7RUFDL0IsYU5uRGU7Q01tRGhCOztBQUE2QjtFQUM1QixhTnZEaUI7Q011RGxCOztBQUErQjs7RUFDOUIsYU44Vlk7Q005VmI7O0FBQTBCO0VBQ3pCLGFOZ0dhO0NNaEdkOztBQUEyQjtFQUMxQixhTnFEZTtDTXJEaEI7O0FBQTZCO0VBQzVCLGFONFNXO0NNNVNaOztBQUF5QjtFQUN4QixhTitQWTtDTS9QYjs7QUFBMEI7RUFDekIsYU5yRGU7Q01xRGhCOztBQUE2QjtFQUM1QixhTnlGeUI7Q016RjFCOztBQUF1QztFQUN0QyxhTndKVztDTXhKWjs7QUFBeUI7RUFDeEIsYU42TVc7Q003TVo7O0FBQXlCO0VBQ3hCLGFONEhXO0NNNUhaOztBQUF5QjtFQUN4QixhTjBGVTtDTTFGWDs7QUFBd0I7RUFDdkIsYU4wRmdCO0NNMUZqQjs7QUFBOEI7O0VBQzdCLGFOb0YyQjtDTXBGNUI7O0FBQXlDO0VBQ3hDLGFONlJZO0NNN1JiOztBQUEwQjtFQUN6QixhTnJCZTtDTXFCaEI7O0FBQTZCO0VBQzVCLGFOOFNhO0NNOVNkOztBQUEyQjtFQUMxQixhTmtDYztDTWxDZjs7QUFBNEI7RUFDM0IsYU4rTmE7Q00vTmQ7O0FBQTJCO0VBQzFCLGFOWWlCO0NNWmxCOztBQUErQjtFQUM5QixhTlFtQjtDTVJwQjs7QUFBaUM7RUFDaEMsYU5xVGM7Q01yVGY7O0FBQTRCO0VBQzNCLGFObVZvQjtDTW5WckI7O0FBQWtDO0VBQ2pDLGFOd0hhO0NNeEhkOztBQUEyQjtFQUMxQixhTnlIa0I7Q016SG5COztBQUFnQztFQUMvQixhTnpFZTtDTXlFaEI7O0FBQTZCO0VBQzVCLGFOM0VlO0NNMkVoQjs7QUFBNkI7O0VBQzVCLGFOcEVnQjtDTW9FakI7O0FBQThCO0VBQzdCLGFOa2JxQjtDTWxidEI7O0FBQW1DO0VBQ2xDLGFOOEVzQjtDTTlFdkI7O0FBQW9DO0VBQ25DLGFOakNtQjtDTWlDcEI7O0FBQWlDO0VBQ2hDLGFOZ0xVO0NNaExYOztBQUF3Qjs7RUFDdkIsYU5pQlc7Q01qQlo7O0FBQXlCO0VBQ3hCLGFOb0JlO0NNcEJoQjs7QUFBNkI7RUFDNUIsYU4rWWtCO0NNL1luQjs7QUFBZ0M7RUFDL0IsYU42WW9CO0NNN1lyQjs7QUFBa0M7RUFDakMsYU51V2dCO0NNdldqQjs7QUFBOEI7RUFDN0IsYU5xSmM7Q01ySmY7O0FBQTRCO0VBQzNCLGFOcVVlO0NNclVoQjs7QUFBNkI7RUFDNUIsYU42THNCO0NNN0x2Qjs7QUFBb0M7RUFDbkMsYU5zWWlCO0NNdFlsQjs7QUFBK0I7RUFDOUIsYU4wRG9CO0NNMURyQjs7QUFBa0M7RUFDakMsYU5nVWM7Q01oVWY7O0FBQTRCO0VBQzNCLGFOMFphO0NNMVpkOztBQUEyQjtFQUMxQixhTnlIb0I7Q016SHJCOztBQUFrQztFQUNqQyxhTjBhYTtDTTFhZDs7QUFBMkI7RUFDMUIsYU4yS2M7Q00zS2Y7O0FBQTRCO0VBQzNCLGFOa1BZO0NNbFBiOztBQUEwQjtFQUN6QixhTnVWZTtDTXZWaEI7O0FBQTZCO0VBQzVCLGFObkVpQjtDTW1FbEI7O0FBQStCO0VBQzlCLGFOZ1BtQjtDTWhQcEI7O0FBQWlDO0VBQ2hDLGFOMFpjO0NNMVpmOztBQUE0Qjs7RUFDM0IsYU5vRGU7Q01wRGhCOztBQUE2QjtFQUM1QixhTjhHYTtDTTlHZDs7QUFBMkI7RUFDMUIsYU44WmE7Q005WmQ7O0FBQTJCO0VBQzFCLGFOS2tCO0NNTG5COztBQUFnQztFQUMvQixhTnlSVTtDTXpSWDs7QUFBd0I7RUFDdkIsYU42SFk7Q003SGI7O0FBQTBCO0VBQ3pCLGFOdEVlO0NNc0VoQjs7QUFBNkI7RUFDNUIsYU41Rlc7Q000Rlo7O0FBQXlCO0VBQ3hCLGFONUNrQjtDTTRDbkI7O0FBQWdDO0VBQy9CLGFOdUhtQjtDTXZIcEI7O0FBQWlDO0VBQ2hDLGFOcUhrQjtDTXJIbkI7O0FBQWdDO0VBQy9CLGFOc0hnQjtDTXRIakI7O0FBQThCO0VBQzdCLGFOa0hrQjtDTWxIbkI7O0FBQWdDO0VBQy9CLGFOL0h3QjtDTStIekI7O0FBQXNDO0VBQ3JDLGFOM0h5QjtDTTJIMUI7O0FBQXVDO0VBQ3RDLGFOM0hzQjtDTTJIdkI7O0FBQW9DO0VBQ25DLGFObkl3QjtDTW1JekI7O0FBQXNDO0VBQ3JDLGFObUdZO0NNbkdiOztBQUEwQjtFQUN6QixhTjhhYTtDTTlhZDs7QUFBMkI7RUFDMUIsYU44Vlk7Q005VmI7O0FBQTBCO0VBQ3pCLGFONkRhO0NNN0RkOztBQUEyQjtFQUMxQixhTjFGZ0I7Q00wRmpCOztBQUE4QjtFQUM3QixhTjVIaUI7Q000SGxCOztBQUErQjs7RUFDOUIsYU5tWlk7Q01uWmI7O0FBQTBCOztFQUN6QixhTnNKVztDTXRKWjs7QUFBeUI7RUFDeEIsYU5yQ1k7Q01xQ2I7O0FBQTBCO0VBQ3pCLGFOOERZO0NNOURiOztBQUEwQjs7RUFDekIsYU53UWU7Q014UWhCOztBQUE2Qjs7RUFDNUIsYU5tRGM7Q01uRGY7O0FBQTRCO0VBQzNCLGFOdU1nQjtDTXZNakI7O0FBQThCOztFQUM3QixhTjREZTtDTTVEaEI7O0FBQTZCO0VBQzVCLGFObVRhO0NNblRkOztBQUEyQjs7O0VBQzFCLGFOMUhXO0NNMEhaOztBQUF5QjtFQUN4QixhTm9KYztDTXBKZjs7QUFBNEI7RUFDM0IsYU5rSmM7Q01sSmY7O0FBQTRCO0VBQzNCLGFOZ1VvQjtDTWhVckI7O0FBQWtDO0VBQ2pDLGFOd1hnQjtDTXhYakI7O0FBQThCO0VBQzdCLGFOdVVZO0NNdlViOztBQUEwQjtFQUN6QixhTnNKWTtDTXRKYjs7QUFBMEI7RUFDekIsYU4yV1k7Q00zV2I7O0FBQTBCO0VBQ3pCLGFONE1nQjtDTTVNakI7O0FBQThCO0VBQzdCLGFONk11QjtDTTdNeEI7O0FBQXFDO0VBQ3BDLGFONkV5QjtDTTdFMUI7O0FBQXVDO0VBQ3RDLGFOMkVrQjtDTTNFbkI7O0FBQWdDO0VBQy9CLGFOMEtZO0NNMUtiOztBQUEwQjtFQUN6QixhTmxHaUI7Q01rR2xCOztBQUErQjtFQUM5QixhTjVGZTtDTTRGaEI7O0FBQTZCO0VBQzVCLGFObkdpQjtDTW1HbEI7O0FBQStCO0VBQzlCLGFObkdrQjtDTW1HbkI7O0FBQWdDO0VBQy9CLGFObkRjO0NNbURmOztBQUE0Qjs7RUFDM0IsYU5nUlc7Q01oUlo7O0FBQXlCOztFQUN4QixhTnFSZ0I7Q01yUmpCOztBQUE4Qjs7RUFDN0IsYU5tUmU7Q01uUmhCOztBQUE2QjtFQUM1QixhTmpCZTtDTWlCaEI7O0FBQTZCO0VBQzVCLGFOeUhlO0NNekhoQjs7QUFBNkI7O0VBQzVCLGFOc1dXO0NNdFdaOztBQUF5Qjs7RUFDeEIsYU44Q1k7Q005Q2I7O0FBQTBCOztFQUN6QixhTnFUaUI7Q01yVGxCOztBQUErQjtFQUM5QixhTjFEZ0I7Q00wRGpCOztBQUE4QjtFQUM3QixhTnpEaUI7Q015RGxCOztBQUErQjs7RUFDOUIsYU50SVc7Q01zSVo7O0FBQXlCO0VBQ3hCLGFONlBjO0NNN1BmOztBQUE0QjtFQUMzQixhTjZWZTtDTTdWaEI7O0FBQTZCOztFQUM1QixhTjlFZ0I7Q004RWpCOztBQUE4QjtFQUM3QixhTjRHa0I7Q001R25COztBQUFnQztFQUMvQixhTnZCZTtDTXVCaEI7O0FBQTZCO0VBQzVCLGFON0VxQjtDTTZFdEI7O0FBQW1DO0VBQ2xDLGFON0VtQjtDTTZFcEI7O0FBQWlDO0VBQ2hDLGFOa1djO0NNbFdmOztBQUE0QjtFQUMzQixhTjJSa0I7Q00zUm5COztBQUFnQztFQUMvQixhTmtTZTtDTWxTaEI7O0FBQTZCO0VBQzVCLGFOM0phO0NNMkpkOztBQUEyQjtFQUMxQixhTjdFYTtDTTZFZDs7QUFBMkI7RUFDMUIsYU4xRGM7Q00wRGY7O0FBQTRCO0VBQzNCLGFOQ2tCO0NNRG5COztBQUFnQztFQUMvQixhTjVJaUI7Q000SWxCOztBQUErQjtFQUM5QixhTjhEaUI7Q005RGxCOztBQUErQjtFQUM5QixhTi9NZ0I7Q00rTWpCOztBQUE4QjtFQUM3QixhTjZIYTtDTTdIZDs7QUFBMkI7RUFDMUIsYU5uQmtCO0NNbUJuQjs7QUFBZ0M7RUFDL0IsYU54S1c7Q013S1o7O0FBQXlCO0VBQ3hCLGFOMkNlO0NNM0NoQjs7QUFBNkI7RUFDNUIsYU40S2tCO0NNNUtuQjs7QUFBZ0M7RUFDL0IsYU5oTndCO0NNZ056Qjs7QUFBc0M7RUFDckMsYU5oTnlCO0NNZ04xQjs7QUFBdUM7RUFDdEMsYU5oTnNCO0NNZ052Qjs7QUFBb0M7RUFDbkMsYU5wTndCO0NNb056Qjs7QUFBc0M7RUFDckMsYU5oTmlCO0NNZ05sQjs7QUFBK0I7RUFDOUIsYU5oTmtCO0NNZ05uQjs7QUFBZ0M7RUFDL0IsYU5oTmU7Q01nTmhCOztBQUE2QjtFQUM1QixhTnBOaUI7Q01vTmxCOztBQUErQjtFQUM5QixhTnRFYztDTXNFZjs7QUFBNEI7RUFDM0IsYU5tRWE7Q01uRWQ7O0FBQTJCO0VBQzFCLGFOZ1JhO0NNaFJkOztBQUEyQjs7RUFDMUIsYU5zSGE7Q010SGQ7O0FBQTJCO0VBQzFCLGFOakhlO0NNaUhoQjs7QUFBNkI7RUFDNUIsYU51S2lCO0NNdktsQjs7QUFBK0I7RUFDOUIsYU51S2tCO0NNdktuQjs7QUFBZ0M7RUFDL0IsYU42T2M7Q003T2Y7O0FBQTRCO0VBQzNCLGFOdEhhO0NNc0hkOztBQUEyQjs7RUFDMUIsYU5nTFk7Q01oTGI7O0FBQTBCO0VBQ3pCLGFOV2lCO0NNWGxCOztBQUErQjtFQUM5QixhTlZlO0NNVWhCOztBQUE2QjtFQUM1QixhTlRvQjtDTVNyQjs7QUFBa0M7RUFDakMsYU53TmM7Q014TmY7O0FBQTRCO0VBQzNCLGFOTmM7Q01NZjs7QUFBNEI7RUFDM0IsYU5rR1k7Q01sR2I7O0FBQTBCO0VBQ3pCLGFOTmM7Q01NZjs7QUFBNEI7RUFDM0IsYU5nRGlCO0NNaERsQjs7QUFBK0I7RUFDOUIsYU52QmE7Q011QmQ7O0FBQTJCO0VBQzFCLGFOekJxQjtDTXlCdEI7O0FBQW1DO0VBQ2xDLGFOcVFlO0NNclFoQjs7QUFBNkI7RUFDNUIsYU54SFc7Q013SFo7O0FBQXlCOztFQUN4QixhTm9LZ0I7Q01wS2pCOztBQUE4Qjs7O0VBQzdCLGFOd09rQjtDTXhPbkI7O0FBQWdDO0VBQy9CLGFObUVxQjtDTW5FdEI7O0FBQW1DO0VBQ2xDLGFOM0dXO0NNMkdaOztBQUF5QjtFQUN4QixhTjVIZ0I7Q000SGpCOztBQUE4Qjs7RUFDN0IsYU54Sm1CO0NNd0pwQjs7QUFBaUM7RUFDaEMsYU44SWU7Q005SWhCOztBQUE2QjtFQUM1QixhTnlCVztDTXpCWjs7QUFBeUI7RUFDeEIsYU45RWtCO0NNOEVuQjs7QUFBZ0M7RUFDL0IsYU5nUGtCO0NNaFBuQjs7QUFBZ0M7RUFDL0IsYU4yT2dCO0NNM09qQjs7QUFBOEI7RUFDN0IsYU5yRmE7Q01xRmQ7O0FBQTJCO0VBQzFCLGFOcUltQjtDTXJJcEI7O0FBQWlDO0VBQ2hDLGFOZ0ZpQjtDTWhGbEI7O0FBQStCO0VBQzlCLGFOZ0Z1QjtDTWhGeEI7O0FBQXFDO0VBQ3BDLGFOa0xhO0NNbExkOztBQUEyQjtFQUMxQixhTjFMaUI7Q00wTGxCOztBQUErQjtFQUM5QixhTi9Dd0I7Q00rQ3pCOztBQUFzQztFQUNyQyxhTnNKYTtDTXRKZDs7QUFBMkI7RUFDMUIsYU5vRWE7Q01wRWQ7O0FBQTJCO0VBQzFCLGFOaEswQjtDTWdLM0I7O0FBQXdDO0VBQ3ZDLGFOaEsyQjtDTWdLNUI7O0FBQXlDO0VBQ3hDLGFOaEt3QjtDTWdLekI7O0FBQXNDO0VBQ3JDLGFOcEswQjtDTW9LM0I7O0FBQXdDO0VBQ3ZDLGFOR1k7Q01IYjs7QUFBMEI7RUFDekIsYU4vSFc7Q00rSFo7O0FBQXlCO0VBQ3hCLGFONVFhO0NNNFFkOztBQUEyQjtFQUMxQixhTnFSaUI7Q01yUmxCOztBQUErQjtFQUM5QixhTjVNZTtDTTRNaEI7O0FBQTZCO0VBQzVCLGFON0dpQjtDTTZHbEI7O0FBQStCO0VBQzlCLGFON0dpQjtDTTZHbEI7O0FBQStCO0VBQzlCLGFOOElpQjtDTTlJbEI7O0FBQStCO0VBQzlCLGFOd0drQjtDTXhHbkI7O0FBQWdDO0VBQy9CLGFONk9hO0NNN09kOztBQUEyQjtFQUMxQixhTitEbUI7Q00vRHBCOztBQUFpQztFQUNoQyxhTitEcUI7Q00vRHRCOztBQUFtQztFQUNsQyxhTmtCZTtDTWxCaEI7O0FBQTZCO0VBQzVCLGFOZ0JpQjtDTWhCbEI7O0FBQStCO0VBQzlCLGFOckxtQjtDTXFMcEI7O0FBQWlDO0VBQ2hDLGFObUZvQjtDTW5GckI7O0FBQWtDO0VBQ2pDLGFOekcyQjtDTXlHNUI7O0FBQXlDO0VBQ3hDLGFOb0ptQjtDTXBKcEI7O0FBQWlDO0VBQ2hDLGFOeEpjO0NNd0pmOztBQUE0Qjs7RUFDM0IsYU45TTBCO0NNOE0zQjs7QUFBd0M7O0VBQ3ZDLGFONU13QjtDTTRNekI7O0FBQXNDOztFQUNyQyxhTjlNMkI7Q004TTVCOztBQUF5Qzs7RUFDeEMsYU52SFU7Q011SFg7O0FBQXdCO0VBQ3ZCLGFOekRVO0NNeURYOztBQUF3Qjs7RUFDdkIsYU5tUVU7Q01uUVg7O0FBQXdCOztFQUN2QixhTmZVO0NNZVg7O0FBQXdCOzs7O0VBQ3ZCLGFOVlU7Q01VWDs7QUFBd0I7OztFQUN2QixhTjJIVTtDTTNIWDs7QUFBd0I7O0VBQ3ZCLGFOUlU7Q01RWDs7QUFBd0I7O0VBQ3ZCLGFOMU9VO0NNME9YOztBQUF3QjtFQUN2QixhTjFHVztDTTBHWjs7QUFBeUI7RUFDeEIsYU45RmdCO0NNOEZqQjs7QUFBOEI7RUFDN0IsYU4wSnFCO0NNMUp0Qjs7QUFBbUM7RUFDbEMsYU4wSnNCO0NNMUp2Qjs7QUFBb0M7RUFDbkMsYU4wSnNCO0NNMUp2Qjs7QUFBb0M7RUFDbkMsYU4wSnVCO0NNMUp4Qjs7QUFBcUM7RUFDcEMsYU42SnVCO0NNN0p4Qjs7QUFBcUM7RUFDcEMsYU42SndCO0NNN0p6Qjs7QUFBc0M7RUFDckMsYU4rTWdCO0NNL01qQjs7QUFBOEI7RUFDN0IsYU4yTWtCO0NNM01uQjs7QUFBZ0M7RUFDL0IsYU51UnFCO0NNdlJ0Qjs7QUFBbUM7RUFDbEMsYU5vUmM7Q01wUmY7O0FBQTRCO0VBQzNCLGFOOFFXO0NNOVFaOztBQUF5QjtFQUN4QixhTjhRa0I7Q005UW5COztBQUFnQztFQUMvQixhTmtSbUI7Q01sUnBCOztBQUFpQztFQUNoQyxhTnpKYztDTXlKZjs7QUFBNEI7RUFDM0IsYU44SnFCO0NNOUp0Qjs7QUFBbUM7RUFDbEMsYU5wQ2dCO0NNb0NqQjs7QUFBOEI7RUFDN0IsYU5oR2E7Q01nR2Q7O0FBQTJCO0VBQzFCLGFOalVVO0NNaVVYOztBQUF3QjtFQUN2QixhTnpRZ0I7Q015UWpCOztBQUE4QjtFQUM3QixhTnpRdUI7Q015UXhCOztBQUFxQztFQUNwQyxhTndOYTtDTXhOZDs7QUFBMkI7RUFDMUIsYU53Tm9CO0NNeE5yQjs7QUFBa0M7RUFDakMsYU5Qc0I7Q01PdkI7O0FBQW9DO0VBQ25DLGFOTG9CO0NNS3JCOztBQUFrQztFQUNqQyxhTlJzQjtDTVF2Qjs7QUFBb0M7RUFDbkMsYU5SdUI7Q01ReEI7O0FBQXFDO0VBQ3BDLGFOelRZO0NNeVRiOztBQUEwQjtFQUN6QixhTnlQYztDTXpQZjs7QUFBNEI7RUFDM0IsYU5yVWM7Q01xVWY7O0FBQTRCO0VBQzNCLGFOckJZO0NNcUJiOztBQUEwQjtFQUN6QixhTjNLZTtDTTJLaEI7O0FBQTZCO0VBQzVCLGFOb0hZO0NNcEhiOztBQUEwQjtFQUN6QixhTnZHaUI7Q011R2xCOztBQUErQjtFQUM5QixhTnNNYTtDTXRNZDs7QUFBMkI7RUFDMUIsYU5oSmE7Q01nSmQ7O0FBQTJCO0VBQzFCLGFOWFc7Q01XWjs7QUFBeUI7O0VBQ3hCLGFObkZlO0NNbUZoQjs7QUFBNkI7RUFDNUIsYU4ySlk7Q00zSmI7O0FBQTBCO0VBQ3pCLGFOUWE7Q01SZDs7QUFBMkI7RUFDMUIsYU5yVWM7Q01xVWY7O0FBQTRCO0VBQzNCLGFOcFJVO0NNb1JYOztBQUF3QjtFQUN2QixhTmdPUztDTWhPVjs7QUFBdUI7RUFDdEIsYU5xT1k7Q01yT2I7O0FBQTBCO0VBQ3pCLGFONkRhO0NNN0RkOztBQUEyQjtFQUMxQixhTldnQjtDTVhqQjs7QUFBOEI7RUFDN0IsYU44SHFCO0NNOUh0Qjs7QUFBbUM7RUFDbEMsYU50VTJCO0NNc1U1Qjs7QUFBeUM7RUFDeEMsYU54VTBCO0NNd1UzQjs7QUFBd0M7O0VBQ3ZDLGFOMVEwQjtDTTBRM0I7O0FBQXdDO0VBQ3ZDLGFOaE1tQjtDTWdNcEI7O0FBQWlDO0VBQ2hDLGFOZ09pQjtDTWhPbEI7O0FBQStCO0VBQzlCLGFOb05tQjtDTXBOcEI7O0FBQWlDOztFQUNoQyxhTnNMVTtDTXRMWDs7QUFBd0I7RUFDdkIsYU5pQ29CO0NNakNyQjs7QUFBa0M7RUFDakMsYU4rR29CO0NNL0dyQjs7QUFBa0M7RUFDakMsYU42Rlk7Q003RmI7O0FBQTBCO0VBQ3pCLGFOM0xzQjtDTTJMdkI7O0FBQW9DO0VBQ25DLGFONk5nQjtDTTdOakI7O0FBQThCO0VBQzdCLGFOTGE7Q01LZDs7QUFBMkI7OztFQUMxQixhTjBMaUI7Q00xTGxCOztBQUErQjs7RUFDOUIsYU41R3FCO0NNNEd0Qjs7QUFBbUM7RUFDbEMsYU42Tlk7Q003TmI7O0FBQTBCO0VBQ3pCLGFObEhhO0NNa0hkOztBQUEyQjtFQUMxQixhTnFDYTtDTXJDZDs7QUFBMkI7RUFDMUIsYU5xQ29CO0NNckNyQjs7QUFBa0M7RUFDakMsYU4ySHlCO0NNM0gxQjs7QUFBdUM7RUFDdEMsYU55SGtCO0NNekhuQjs7QUFBZ0M7RUFDL0IsYU54TmdCO0NNd05qQjs7QUFBOEI7RUFDN0IsYU5yTlc7Q01xTlo7O0FBQXlCO0VBQ3hCLGFOSWlCO0NNSmxCOztBQUErQjtFQUM5QixhTklxQjtDTUp0Qjs7QUFBbUM7RUFDbEMsYU5sTmE7Q01rTmQ7O0FBQTJCO0VBQzFCLGFOekZhO0NNeUZkOztBQUEyQjtFQUMxQixhTnBGZTtDTW9GaEI7O0FBQTZCO0VBQzVCLGFOekxVO0NNeUxYOztBQUF3QjtFQUN2QixhTnRUZTtDTXNUaEI7O0FBQTZCO0VBQzVCLGFOelFZO0NNeVFiOztBQUEwQjtFQUN6QixhTmRVO0NNY1g7O0FBQXdCO0VBQ3ZCLGFOeUZZO0NNekZiOztBQUEwQjtFQUN6QixhTjVPVztDTTRPWjs7QUFBeUI7RUFDeEIsYU41T1k7Q000T2I7O0FBQTBCO0VBQ3pCLGFOalZjO0NNaVZmOztBQUE0QjtFQUMzQixhTmpWcUI7Q01pVnRCOztBQUFtQztFQUNsQyxhTmdHWTtDTWhHYjs7QUFBMEI7RUFDekIsYU5nR21CO0NNaEdwQjs7QUFBaUM7RUFDaEMsYU5jYztDTWRmOztBQUE0Qjs7RUFDM0IsYU5yVFU7Q01xVFg7O0FBQXdCOztFQUN2QixhTmtIVztDTWxIWjs7QUFBeUI7RUFDeEIsYU44SVc7Q005SVo7O0FBQXlCO0VBQ3hCLGFOK0VjO0NNL0VmOztBQUE0QjtFQUMzQixhTjdPaUI7Q002T2xCOztBQUErQjtFQUM5QixhTnlFaUI7Q016RWxCOztBQUErQjtFQUM5QixhTm5QZTtDTW1QaEI7O0FBQTZCO0VBQzVCLGFOak1pQjtDTWlNbEI7O0FBQStCO0VBQzlCLGFOMUxrQjtDTTBMbkI7O0FBQWdDO0VBQy9CLGFOdk1tQjtDTXVNcEI7O0FBQWlDO0VBQ2hDLGFOak13QjtDTWlNekI7O0FBQXNDOzs7RUFDckMsYU54TW1CO0NNd01wQjs7QUFBaUM7O0VBQ2hDLGFON01xQjtDTTZNdEI7O0FBQW1DOztFQUNsQyxhTjdNbUI7Q002TXBCOztBQUFpQzs7RUFDaEMsYU5qTW1CO0NNaU1wQjs7QUFBaUM7RUFDaEMsYU45TWtCO0NNOE1uQjs7QUFBZ0M7RUFDL0IsYU5rS1c7Q01sS1o7O0FBQXlCO0VBQ3hCLGFOdFJjO0NNc1JmOztBQUE0QjtFQUMzQixhTnZIZTtDTXVIaEI7O0FBQTZCOzs7OztFQUM1QixhTnhHZ0I7Q013R2pCOztBQUE4QjtFQUM3QixhTnBTcUI7Q01vU3RCOztBQUFtQzs7RUFDbEMsYU5UWTtDTVNiOztBQUEwQjs7RUFDekIsYU5sUGE7Q01rUGQ7O0FBQTJCO0VBQzFCLGFOeEtpQjtDTXdLbEI7O0FBQStCO0VBQzlCLGFOMUtVO0NNMEtYOztBQUF3QjtFQUN2QixhTjNKa0I7Q00ySm5COztBQUFnQztFQUMvQixhTjBGb0I7Q00xRnJCOztBQUFrQztFQUNqQyxhTnZCUztDTXVCVjs7QUFBdUI7O0VBQ3RCLGFOOEphO0NNOUpkOztBQUEyQjs7RUFDMUIsYU4xRGtCO0NNMERuQjs7QUFBZ0M7O0VBQy9CLGFOMURvQjtDTTBEckI7O0FBQWtDO0VBQ2pDLGFOdEpjO0NNc0pmOztBQUE0Qjs7RUFDM0IsYU4vU2tCO0NNK1NuQjs7QUFBZ0M7RUFDL0IsYU43SmE7Q002SmQ7O0FBQTJCO0VBQzFCLGFONURnQjtDTTREakI7O0FBQThCO0VBQzdCLGFONEJjO0NNNUJmOztBQUE0QjtFQUMzQixhTlNnQjtDTVRqQjs7QUFBOEI7RUFDN0IsYU5TdUI7Q01UeEI7O0FBQXFDO0VBQ3BDLGFOOVdXO0NNOFdaOztBQUF5Qjs7RUFDeEIsYU5sTWU7Q01rTWhCOztBQUE2QjtFQUM1QixhTjZHVTtDTTdHWDs7QUFBd0I7RUFDdkIsYU54WGlCO0NNd1hsQjs7QUFBK0I7RUFDOUIsYU45Q1c7Q004Q1o7O0FBQXlCO0VBQ3hCLGFOcUJpQjtDTXJCbEI7O0FBQStCO0VBQzlCLGFONkdhO0NNN0dkOztBQUEyQjtFQUMxQixhTndKVztDTXhKWjs7QUFBeUI7RUFDeEIsYU5oRmtCO0NNZ0ZuQjs7QUFBZ0M7RUFDL0IsYU44SVc7Q005SVo7O0FBQXlCO0VBQ3hCLGFOMVdpQjtDTTBXbEI7O0FBQStCO0VBQzlCLGFOdkVhO0NNdUVkOztBQUEyQjtFQUMxQixhTnpMb0I7Q015THJCOztBQUFrQztFQUNqQyxhTnZWYztDTXVWZjs7QUFBNEI7RUFDM0IsYU4zVm9CO0NNMlZyQjs7QUFBa0M7RUFDakMsYU43VmtCO0NNNlZuQjs7QUFBZ0M7RUFDL0IsYU4vVmM7Q00rVmY7O0FBQTRCO0VBQzNCLGFON1ZnQjtDTTZWakI7O0FBQThCO0VBQzdCLGFON1ZnQjtDTTZWakI7O0FBQThCO0VBQzdCLGFOM1lpQjtDTTJZbEI7O0FBQStCO0VBQzlCLGFOM1ltQjtDTTJZcEI7O0FBQWlDO0VBQ2hDLGFObUZZO0NNbkZiOztBQUEwQjtFQUN6QixhTnBUZ0I7Q01vVGpCOztBQUE4QjtFQUM3QixhTjlaUztDTThaVjs7QUFBdUI7RUFDdEIsYU4xUWlCO0NNMFFsQjs7QUFBK0I7RUFDOUIsYU43RmtCO0NNNkZuQjs7QUFBZ0M7RUFDL0IsYU45WW9CO0NNOFlyQjs7QUFBa0M7RUFDakMsYU5wYmlCO0NNb2JsQjs7QUFBK0I7RUFDOUIsYU5oRmdCO0NNZ0ZqQjs7QUFBOEI7RUFDN0IsYU5ySmlCO0NNcUpsQjs7QUFBK0I7RUFDOUIsYU5uS2E7Q01tS2Q7O0FBQTJCO0VBQzFCLGFObktvQjtDTW1LckI7O0FBQWtDO0VBQ2pDLGFOaUVpQjtDTWpFbEI7O0FBQStCO0VBQzlCLGFOaUVnQjtDTWpFakI7O0FBQThCO0VBQzdCLGFOeFpjO0NNd1pmOztBQUE0QjtFQUMzQixhTnRZVTtDTXNZWDs7QUFBd0I7RUFDdkIsYU5uTGM7Q01tTGY7O0FBQTRCO0VBQzNCLGFOemNnQjtDTXljakI7O0FBQThCO0VBQzdCLGFOdFhTO0NNc1hWOztBQUF1Qjs7O0VBQ3RCLGFOL0xVO0NNK0xYOztBQUF3QjtFQUN2QixhTnBJZTtDTW9JaEI7O0FBQTZCO0VBQzVCLGFOM1lpQjtDTTJZbEI7O0FBQStCO0VBQzlCLGFOMVVxQjtDTTBVdEI7O0FBQW1DO0VBQ2xDLGFOL1RlO0NNK1RoQjs7QUFBNkI7RUFDNUIsYU5qUGU7Q01pUGhCOztBQUE2QjtFQUM1QixhTi9LYztDTStLZjs7QUFBNEI7RUFDM0IsYU41Q2E7Q000Q2Q7O0FBQTJCO0VBQzFCLGFOaENtQjtDTWdDcEI7O0FBQWlDO0VBQ2hDLGFONUJrQjtDTTRCbkI7O0FBQWdDO0VBQy9CLGFOM0JlO0NNMkJoQjs7QUFBNkI7RUFDNUIsYU5uWWdCO0NNbVlqQjs7QUFBOEI7RUFDN0IsYU5yWXNCO0NNcVl2Qjs7QUFBb0M7RUFDbkMsYU5sVWM7Q01rVWY7O0FBQTRCO0VBQzNCLGFOdkNXO0NNdUNaOztBQUF5QjtFQUN4QixhTjZFa0I7Q003RW5COztBQUFnQztFQUMvQixhTm5JaUI7Q01tSWxCOztBQUErQjtFQUM5QixhTktrQjtDTUxuQjs7QUFBZ0M7RUFDL0IsYU52TmdCO0NNdU5qQjs7QUFBOEI7RUFDN0IsYU40RVk7Q001RWI7O0FBQTBCO0VBQ3pCLGFON0pXO0NNNkpaOztBQUF5QjtFQUN4QixhTnBKYztDTW9KZjs7QUFBNEI7RUFDM0IsYU55Q2tCO0NNekNuQjs7QUFBZ0M7RUFDL0IsYU55Q3NCO0NNekN2Qjs7QUFBb0M7RUFDbkMsYU53RW1CO0NNeEVwQjs7QUFBaUM7RUFDaEMsYU5qS2tCO0NNaUtuQjs7QUFBZ0M7RUFDL0IsYU51RWlCO0NNdkVsQjs7QUFBK0I7RUFDOUIsYU5sS2tCO0NNa0tuQjs7QUFBZ0M7RUFDL0IsYU5qS29CO0NNaUtyQjs7QUFBa0M7RUFDakMsYU5uS29CO0NNbUtyQjs7QUFBa0M7RUFDakMsYU45SWE7Q004SWQ7O0FBQTJCO0VBQzFCLGFOclR3QjtDTXFUekI7O0FBQXNDO0VBQ3JDLGFOdkhrQjtDTXVIbkI7O0FBQWdDO0VBQy9CLGFONkVlO0NNN0VoQjs7QUFBNkI7RUFDNUIsYU5wRWE7Q01vRWQ7O0FBQTJCO0VBQzFCLGFOd0RnQjtDTXhEakI7O0FBQThCO0VBQzdCLGFOeURpQjtDTXpEbEI7O0FBQStCOztFQUM5QixhTjFjVTtDTTBjWDs7QUFBd0I7RUFDdkIsYU40RGM7Q001RGY7O0FBQTRCO0VBQzNCLGFOdUJZO0NNdkJiOztBQUEwQjtFQUN6QixhTmJhO0NNYWQ7O0FBQTJCO0VBQzFCLGFOM0thO0NNMktkIiwiZmlsZSI6ImZvbnRhd2Vzb21lLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIkBjaGFyc2V0IFwiVVRGLThcIjtcbi8qIVxuICogIEZvbnQgQXdlc29tZSA0LjMuMCBieSBAZGF2ZWdhbmR5IC0gaHR0cDovL2ZvbnRhd2Vzb21lLmlvIC0gQGZvbnRhd2Vzb21lXG4gKiAgTGljZW5zZSAtIGh0dHA6Ly9mb250YXdlc29tZS5pby9saWNlbnNlIChGb250OiBTSUwgT0ZMIDEuMSwgQ1NTOiBNSVQgTGljZW5zZSlcbiAqL1xuLyogRk9OVCBQQVRIXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnRm9udEF3ZXNvbWUnO1xuICBzcmM6IHVybChcIi4uL2ZvbnQvL2ZvbnRhd2Vzb21lLnR0ZlwiKSBmb3JtYXQoXCJ0cnVldHlwZVwiKTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG4uZmEge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMSBGb250QXdlc29tZTtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICB0ZXh0LXJlbmRlcmluZzogYXV0bztcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xufVxuXG4vKiBtYWtlcyB0aGUgZm9udCAzMyUgbGFyZ2VyIHJlbGF0aXZlIHRvIHRoZSBpY29uIGNvbnRhaW5lciAqL1xuLmZhLWxnIHtcbiAgZm9udC1zaXplOiAxLjMzMzMzMzMzMzNlbTtcbiAgbGluZS1oZWlnaHQ6IDAuNzVlbTtcbiAgdmVydGljYWwtYWxpZ246IC0xNSU7XG59XG5cbi5mYS0yeCB7XG4gIGZvbnQtc2l6ZTogMmVtO1xufVxuXG4uZmEtM3gge1xuICBmb250LXNpemU6IDNlbTtcbn1cblxuLmZhLTR4IHtcbiAgZm9udC1zaXplOiA0ZW07XG59XG5cbi5mYS01eCB7XG4gIGZvbnQtc2l6ZTogNWVtO1xufVxuXG4uZmEtZncge1xuICB3aWR0aDogMS4yODU3MTQyODU3ZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmZhLXVsIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBtYXJnaW4tbGVmdDogMi4xNDI4NTcxNDI5ZW07XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbn1cblxuLmZhLXVsID4gbGkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5mYS1saSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogLTIuMTQyODU3MTQyOWVtO1xuICB3aWR0aDogMi4xNDI4NTcxNDI5ZW07XG4gIHRvcDogMC4xNDI4NTcxNDI5ZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmZhLWxpLmZhLWxnIHtcbiAgbGVmdDogLTEuODU3MTQyODU3MWVtO1xufVxuXG4uZmEtYm9yZGVyIHtcbiAgcGFkZGluZzogMC4yZW0gMC4yNWVtIDAuMTVlbTtcbiAgYm9yZGVyOiBzb2xpZCAwLjA4ZW0gI2VlZTtcbiAgYm9yZGVyLXJhZGl1czogLjFlbTtcbn1cblxuLnB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5wdWxsLWxlZnQge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLmZhLnB1bGwtbGVmdCB7XG4gIG1hcmdpbi1yaWdodDogLjNlbTtcbn1cblxuLmZhLnB1bGwtcmlnaHQge1xuICBtYXJnaW4tbGVmdDogLjNlbTtcbn1cblxuLmZhLXNwaW4ge1xuICAtd2Via2l0LWFuaW1hdGlvbjogZmEtc3BpbiAycyBpbmZpbml0ZSBsaW5lYXI7XG4gIGFuaW1hdGlvbjogZmEtc3BpbiAycyBpbmZpbml0ZSBsaW5lYXI7XG59XG5cbi5mYS1wdWxzZSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBmYS1zcGluIDFzIGluZmluaXRlIHN0ZXBzKDgpO1xuICBhbmltYXRpb246IGZhLXNwaW4gMXMgaW5maW5pdGUgc3RlcHMoOCk7XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBmYS1zcGluIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBmYS1zcGluIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7XG4gIH1cbn1cblxuLmZhLXJvdGF0ZS05MCB7XG4gIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkJhc2ljSW1hZ2Uocm90YXRpb249MSk7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG59XG5cbi5mYS1yb3RhdGUtMTgwIHtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yKTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbn1cblxuLmZhLXJvdGF0ZS0yNzAge1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTMpO1xuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG4gIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xufVxuXG4uZmEtZmxpcC1ob3Jpem9udGFsIHtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0wKTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKC0xLCAxKTtcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoLTEsIDEpO1xuICB0cmFuc2Zvcm06IHNjYWxlKC0xLCAxKTtcbn1cblxuLmZhLWZsaXAtdmVydGljYWwge1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTIpO1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xufVxuXG46cm9vdCAuZmEtcm90YXRlLTkwLFxuOnJvb3QgLmZhLXJvdGF0ZS0xODAsXG46cm9vdCAuZmEtcm90YXRlLTI3MCxcbjpyb290IC5mYS1mbGlwLWhvcml6b250YWwsXG46cm9vdCAuZmEtZmxpcC12ZXJ0aWNhbCB7XG4gIGZpbHRlcjogbm9uZTtcbn1cblxuLmZhLXN0YWNrIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAyZW07XG4gIGhlaWdodDogMmVtO1xuICBsaW5lLWhlaWdodDogMmVtO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uZmEtc3RhY2stMXgsIC5mYS1zdGFjay0yeCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmZhLXN0YWNrLTF4IHtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG5cbi5mYS1zdGFjay0yeCB7XG4gIGZvbnQtc2l6ZTogMmVtO1xufVxuXG4uZmEtaW52ZXJzZSB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4vKiBGb250IEF3ZXNvbWUgdXNlcyB0aGUgVW5pY29kZSBQcml2YXRlIFVzZSBBcmVhIChQVUEpIHRvIGVuc3VyZSBzY3JlZW5cbiAgIHJlYWRlcnMgZG8gbm90IHJlYWQgb2ZmIHJhbmRvbSBjaGFyYWN0ZXJzIHRoYXQgcmVwcmVzZW50IGljb25zICovXG4uZmEtZ2xhc3M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgIBcIjtcbn1cblxuLmZhLW11c2ljOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CBXCI7XG59XG5cbi5mYS1zZWFyY2g6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgIJcIjtcbn1cblxuLmZhLWVudmVsb3BlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgINcIjtcbn1cblxuLmZhLWhlYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CEXCI7XG59XG5cbi5mYS1zdGFyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CFXCI7XG59XG5cbi5mYS1zdGFyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgIZcIjtcbn1cblxuLmZhLXVzZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgIdcIjtcbn1cblxuLmZhLWZpbG06YmVmb3JlIHtcbiAgY29udGVudDogXCLvgIhcIjtcbn1cblxuLmZhLXRoLWxhcmdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CJXCI7XG59XG5cbi5mYS10aDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AilwiO1xufVxuXG4uZmEtdGgtbGlzdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Ai1wiO1xufVxuXG4uZmEtY2hlY2s6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgIxcIjtcbn1cblxuLmZhLXJlbW92ZTpiZWZvcmUsXG4uZmEtY2xvc2U6YmVmb3JlLFxuLmZhLXRpbWVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CNXCI7XG59XG5cbi5mYS1zZWFyY2gtcGx1czpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AjlwiO1xufVxuXG4uZmEtc2VhcmNoLW1pbnVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CQXCI7XG59XG5cbi5mYS1wb3dlci1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgJFcIjtcbn1cblxuLmZhLXNpZ25hbDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AklwiO1xufVxuXG4uZmEtZ2VhcjpiZWZvcmUsXG4uZmEtY29nOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CTXCI7XG59XG5cbi5mYS10cmFzaC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CUXCI7XG59XG5cbi5mYS1ob21lOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CVXCI7XG59XG5cbi5mYS1maWxlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgJZcIjtcbn1cblxuLmZhLWNsb2NrLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgJdcIjtcbn1cblxuLmZhLXJvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgJhcIjtcbn1cblxuLmZhLWRvd25sb2FkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CZXCI7XG59XG5cbi5mYS1hcnJvdy1jaXJjbGUtby1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CaXCI7XG59XG5cbi5mYS1hcnJvdy1jaXJjbGUtby11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Am1wiO1xufVxuXG4uZmEtaW5ib3g6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgJxcIjtcbn1cblxuLmZhLXBsYXktY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgJ1cIjtcbn1cblxuLmZhLXJvdGF0ZS1yaWdodDpiZWZvcmUsXG4uZmEtcmVwZWF0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CeXCI7XG59XG5cbi5mYS1yZWZyZXNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ChXCI7XG59XG5cbi5mYS1saXN0LWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AolwiO1xufVxuXG4uZmEtbG9jazpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Ao1wiO1xufVxuXG4uZmEtZmxhZzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+ApFwiO1xufVxuXG4uZmEtaGVhZHBob25lczpiZWZvcmUge1xuICBjb250ZW50OiBcIu+ApVwiO1xufVxuXG4uZmEtdm9sdW1lLW9mZjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AplwiO1xufVxuXG4uZmEtdm9sdW1lLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvgKdcIjtcbn1cblxuLmZhLXZvbHVtZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AqFwiO1xufVxuXG4uZmEtcXJjb2RlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CpXCI7XG59XG5cbi5mYS1iYXJjb2RlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CqXCI7XG59XG5cbi5mYS10YWc6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgKtcIjtcbn1cblxuLmZhLXRhZ3M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgKxcIjtcbn1cblxuLmZhLWJvb2s6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgK1cIjtcbn1cblxuLmZhLWJvb2ttYXJrOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CuXCI7XG59XG5cbi5mYS1wcmludDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Ar1wiO1xufVxuXG4uZmEtY2FtZXJhOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CwXCI7XG59XG5cbi5mYS1mb250OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CxXCI7XG59XG5cbi5mYS1ib2xkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74CyXCI7XG59XG5cbi5mYS1pdGFsaWM6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgLNcIjtcbn1cblxuLmZhLXRleHQtaGVpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74C0XCI7XG59XG5cbi5mYS10ZXh0LXdpZHRoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74C1XCI7XG59XG5cbi5mYS1hbGlnbi1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74C2XCI7XG59XG5cbi5mYS1hbGlnbi1jZW50ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgLdcIjtcbn1cblxuLmZhLWFsaWduLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74C4XCI7XG59XG5cbi5mYS1hbGlnbi1qdXN0aWZ5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74C5XCI7XG59XG5cbi5mYS1saXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74C6XCI7XG59XG5cbi5mYS1kZWRlbnQ6YmVmb3JlLFxuLmZhLW91dGRlbnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgLtcIjtcbn1cblxuLmZhLWluZGVudDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AvFwiO1xufVxuXG4uZmEtdmlkZW8tY2FtZXJhOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74C9XCI7XG59XG5cbi5mYS1waG90bzpiZWZvcmUsXG4uZmEtaW1hZ2U6YmVmb3JlLFxuLmZhLXBpY3R1cmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+AvlwiO1xufVxuXG4uZmEtcGVuY2lsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GAXCI7XG59XG5cbi5mYS1tYXAtbWFya2VyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GBXCI7XG59XG5cbi5mYS1hZGp1c3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgYJcIjtcbn1cblxuLmZhLXRpbnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgYNcIjtcbn1cblxuLmZhLWVkaXQ6YmVmb3JlLFxuLmZhLXBlbmNpbC1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BhFwiO1xufVxuXG4uZmEtc2hhcmUtc3F1YXJlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgYVcIjtcbn1cblxuLmZhLWNoZWNrLXNxdWFyZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GGXCI7XG59XG5cbi5mYS1hcnJvd3M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgYdcIjtcbn1cblxuLmZhLXN0ZXAtYmFja3dhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgYhcIjtcbn1cblxuLmZhLWZhc3QtYmFja3dhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgYlcIjtcbn1cblxuLmZhLWJhY2t3YXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GKXCI7XG59XG5cbi5mYS1wbGF5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GLXCI7XG59XG5cbi5mYS1wYXVzZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BjFwiO1xufVxuXG4uZmEtc3RvcDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BjVwiO1xufVxuXG4uZmEtZm9yd2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BjlwiO1xufVxuXG4uZmEtZmFzdC1mb3J3YXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GQXCI7XG59XG5cbi5mYS1zdGVwLWZvcndhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgZFcIjtcbn1cblxuLmZhLWVqZWN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GSXCI7XG59XG5cbi5mYS1jaGV2cm9uLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgZNcIjtcbn1cblxuLmZhLWNoZXZyb24tcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgZRcIjtcbn1cblxuLmZhLXBsdXMtY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GVXCI7XG59XG5cbi5mYS1taW51cy1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgZZcIjtcbn1cblxuLmZhLXRpbWVzLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Bl1wiO1xufVxuXG4uZmEtY2hlY2stY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GYXCI7XG59XG5cbi5mYS1xdWVzdGlvbi1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgZlcIjtcbn1cblxuLmZhLWluZm8tY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GaXCI7XG59XG5cbi5mYS1jcm9zc2hhaXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GbXCI7XG59XG5cbi5mYS10aW1lcy1jaXJjbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BnFwiO1xufVxuXG4uZmEtY2hlY2stY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgZ1cIjtcbn1cblxuLmZhLWJhbjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BnlwiO1xufVxuXG4uZmEtYXJyb3ctbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BoFwiO1xufVxuXG4uZmEtYXJyb3ctcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgaFcIjtcbn1cblxuLmZhLWFycm93LXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GiXCI7XG59XG5cbi5mYS1hcnJvdy1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GjXCI7XG59XG5cbi5mYS1tYWlsLWZvcndhcmQ6YmVmb3JlLFxuLmZhLXNoYXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GkXCI7XG59XG5cbi5mYS1leHBhbmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgaVcIjtcbn1cblxuLmZhLWNvbXByZXNzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GmXCI7XG59XG5cbi5mYS1wbHVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GnXCI7XG59XG5cbi5mYS1taW51czpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BqFwiO1xufVxuXG4uZmEtYXN0ZXJpc2s6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgalcIjtcbn1cblxuLmZhLWV4Y2xhbWF0aW9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BqlwiO1xufVxuXG4uZmEtZ2lmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Bq1wiO1xufVxuXG4uZmEtbGVhZjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BrFwiO1xufVxuXG4uZmEtZmlyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BrVwiO1xufVxuXG4uZmEtZXllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GuXCI7XG59XG5cbi5mYS1leWUtc2xhc2g6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgbBcIjtcbn1cblxuLmZhLXdhcm5pbmc6YmVmb3JlLFxuLmZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74GxXCI7XG59XG5cbi5mYS1wbGFuZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BslwiO1xufVxuXG4uZmEtY2FsZW5kYXI6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgbNcIjtcbn1cblxuLmZhLXJhbmRvbTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BtFwiO1xufVxuXG4uZmEtY29tbWVudDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BtVwiO1xufVxuXG4uZmEtbWFnbmV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74G2XCI7XG59XG5cbi5mYS1jaGV2cm9uLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74G3XCI7XG59XG5cbi5mYS1jaGV2cm9uLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvgbhcIjtcbn1cblxuLmZhLXJldHdlZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgblcIjtcbn1cblxuLmZhLXNob3BwaW5nLWNhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgbpcIjtcbn1cblxuLmZhLWZvbGRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Bu1wiO1xufVxuXG4uZmEtZm9sZGVyLW9wZW46YmVmb3JlIHtcbiAgY29udGVudDogXCLvgbxcIjtcbn1cblxuLmZhLWFycm93cy12OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74G9XCI7XG59XG5cbi5mYS1hcnJvd3MtaDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+BvlwiO1xufVxuXG4uZmEtYmFyLWNoYXJ0LW86YmVmb3JlLFxuLmZhLWJhci1jaGFydDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CgFwiO1xufVxuXG4uZmEtdHdpdHRlci1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgoFcIjtcbn1cblxuLmZhLWZhY2Vib29rLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CglwiO1xufVxuXG4uZmEtY2FtZXJhLXJldHJvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KDXCI7XG59XG5cbi5mYS1rZXk6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgoRcIjtcbn1cblxuLmZhLWdlYXJzOmJlZm9yZSxcbi5mYS1jb2dzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KFXCI7XG59XG5cbi5mYS1jb21tZW50czpiZWZvcmUge1xuICBjb250ZW50OiBcIu+ChlwiO1xufVxuXG4uZmEtdGh1bWJzLW8tdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgodcIjtcbn1cblxuLmZhLXRodW1icy1vLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvgohcIjtcbn1cblxuLmZhLXN0YXItaGFsZjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CiVwiO1xufVxuXG4uZmEtaGVhcnQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CilwiO1xufVxuXG4uZmEtc2lnbi1vdXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgotcIjtcbn1cblxuLmZhLWxpbmtlZGluLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CjFwiO1xufVxuXG4uZmEtdGh1bWItdGFjazpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CjVwiO1xufVxuXG4uZmEtZXh0ZXJuYWwtbGluazpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CjlwiO1xufVxuXG4uZmEtc2lnbi1pbjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CkFwiO1xufVxuXG4uZmEtdHJvcGh5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KRXCI7XG59XG5cbi5mYS1naXRodWItc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KSXCI7XG59XG5cbi5mYS11cGxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgpNcIjtcbn1cblxuLmZhLWxlbW9uLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgpRcIjtcbn1cblxuLmZhLXBob25lOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KVXCI7XG59XG5cbi5mYS1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CllwiO1xufVxuXG4uZmEtYm9va21hcmstbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Cl1wiO1xufVxuXG4uZmEtcGhvbmUtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KYXCI7XG59XG5cbi5mYS10d2l0dGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KZXCI7XG59XG5cbi5mYS1mYWNlYm9vay1mOmJlZm9yZSxcbi5mYS1mYWNlYm9vazpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CmlwiO1xufVxuXG4uZmEtZ2l0aHViOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KbXCI7XG59XG5cbi5mYS11bmxvY2s6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgpxcIjtcbn1cblxuLmZhLWNyZWRpdC1jYXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KdXCI7XG59XG5cbi5mYS1yc3M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgp5cIjtcbn1cblxuLmZhLWhkZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KgXCI7XG59XG5cbi5mYS1idWxsaG9ybjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CoVwiO1xufVxuXG4uZmEtYmVsbDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Ds1wiO1xufVxuXG4uZmEtY2VydGlmaWNhdGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgqNcIjtcbn1cblxuLmZhLWhhbmQtby1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CpFwiO1xufVxuXG4uZmEtaGFuZC1vLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgqVcIjtcbn1cblxuLmZhLWhhbmQtby11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CplwiO1xufVxuXG4uZmEtaGFuZC1vLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvgqdcIjtcbn1cblxuLmZhLWFycm93LWNpcmNsZS1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KoXCI7XG59XG5cbi5mYS1hcnJvdy1jaXJjbGUtcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgqlcIjtcbn1cblxuLmZhLWFycm93LWNpcmNsZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CqlwiO1xufVxuXG4uZmEtYXJyb3ctY2lyY2xlLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvgqtcIjtcbn1cblxuLmZhLWdsb2JlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KsXCI7XG59XG5cbi5mYS13cmVuY2g6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgq1cIjtcbn1cblxuLmZhLXRhc2tzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74KuXCI7XG59XG5cbi5mYS1maWx0ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCLvgrBcIjtcbn1cblxuLmZhLWJyaWVmY2FzZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CsVwiO1xufVxuXG4uZmEtYXJyb3dzLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+CslwiO1xufVxuXG4uZmEtZ3JvdXA6YmVmb3JlLFxuLmZhLXVzZXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OAXCI7XG59XG5cbi5mYS1jaGFpbjpiZWZvcmUsXG4uZmEtbGluazpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DgVwiO1xufVxuXG4uZmEtY2xvdWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg4JcIjtcbn1cblxuLmZhLWZsYXNrOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ODXCI7XG59XG5cbi5mYS1jdXQ6YmVmb3JlLFxuLmZhLXNjaXNzb3JzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OEXCI7XG59XG5cbi5mYS1jb3B5OmJlZm9yZSxcbi5mYS1maWxlcy1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OFXCI7XG59XG5cbi5mYS1wYXBlcmNsaXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg4ZcIjtcbn1cblxuLmZhLXNhdmU6YmVmb3JlLFxuLmZhLWZsb3BweS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OHXCI7XG59XG5cbi5mYS1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg4hcIjtcbn1cblxuLmZhLW5hdmljb246YmVmb3JlLFxuLmZhLXJlb3JkZXI6YmVmb3JlLFxuLmZhLWJhcnM6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg4lcIjtcbn1cblxuLmZhLWxpc3QtdWw6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg4pcIjtcbn1cblxuLmZhLWxpc3Qtb2w6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg4tcIjtcbn1cblxuLmZhLXN0cmlrZXRocm91Z2g6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg4xcIjtcbn1cblxuLmZhLXVuZGVybGluZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DjVwiO1xufVxuXG4uZmEtdGFibGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg45cIjtcbn1cblxuLmZhLW1hZ2ljOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OQXCI7XG59XG5cbi5mYS10cnVjazpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DkVwiO1xufVxuXG4uZmEtcGludGVyZXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OSXCI7XG59XG5cbi5mYS1waW50ZXJlc3Qtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OTXCI7XG59XG5cbi5mYS1nb29nbGUtcGx1cy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg5RcIjtcbn1cblxuLmZhLWdvb2dsZS1wbHVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OVXCI7XG59XG5cbi5mYS1tb25leTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DllwiO1xufVxuXG4uZmEtY2FyZXQtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Dl1wiO1xufVxuXG4uZmEtY2FyZXQtdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg5hcIjtcbn1cblxuLmZhLWNhcmV0LWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg5lcIjtcbn1cblxuLmZhLWNhcmV0LXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OaXCI7XG59XG5cbi5mYS1jb2x1bW5zOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ObXCI7XG59XG5cbi5mYS11bnNvcnRlZDpiZWZvcmUsXG4uZmEtc29ydDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DnFwiO1xufVxuXG4uZmEtc29ydC1kb3duOmJlZm9yZSxcbi5mYS1zb3J0LWRlc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg51cIjtcbn1cblxuLmZhLXNvcnQtdXA6YmVmb3JlLFxuLmZhLXNvcnQtYXNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OeXCI7XG59XG5cbi5mYS1lbnZlbG9wZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DoFwiO1xufVxuXG4uZmEtbGlua2VkaW46YmVmb3JlIHtcbiAgY29udGVudDogXCLvg6FcIjtcbn1cblxuLmZhLXJvdGF0ZS1sZWZ0OmJlZm9yZSxcbi5mYS11bmRvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OiXCI7XG59XG5cbi5mYS1sZWdhbDpiZWZvcmUsXG4uZmEtZ2F2ZWw6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg6NcIjtcbn1cblxuLmZhLWRhc2hib2FyZDpiZWZvcmUsXG4uZmEtdGFjaG9tZXRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DpFwiO1xufVxuXG4uZmEtY29tbWVudC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OlXCI7XG59XG5cbi5mYS1jb21tZW50cy1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OmXCI7XG59XG5cbi5mYS1mbGFzaDpiZWZvcmUsXG4uZmEtYm9sdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Dp1wiO1xufVxuXG4uZmEtc2l0ZW1hcDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DqFwiO1xufVxuXG4uZmEtdW1icmVsbGE6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg6lcIjtcbn1cblxuLmZhLXBhc3RlOmJlZm9yZSxcbi5mYS1jbGlwYm9hcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg6pcIjtcbn1cblxuLmZhLWxpZ2h0YnVsYi1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OrXCI7XG59XG5cbi5mYS1leGNoYW5nZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DrFwiO1xufVxuXG4uZmEtY2xvdWQtZG93bmxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg61cIjtcbn1cblxuLmZhLWNsb3VkLXVwbG9hZDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DrlwiO1xufVxuXG4uZmEtdXNlci1tZDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DsFwiO1xufVxuXG4uZmEtc3RldGhvc2NvcGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg7FcIjtcbn1cblxuLmZhLXN1aXRjYXNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74OyXCI7XG59XG5cbi5mYS1iZWxsLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvgqJcIjtcbn1cblxuLmZhLWNvZmZlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DtFwiO1xufVxuXG4uZmEtY3V0bGVyeTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DtVwiO1xufVxuXG4uZmEtZmlsZS10ZXh0LW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvg7ZcIjtcbn1cblxuLmZhLWJ1aWxkaW5nLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvg7dcIjtcbn1cblxuLmZhLWhvc3BpdGFsLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvg7hcIjtcbn1cblxuLmZhLWFtYnVsYW5jZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DuVwiO1xufVxuXG4uZmEtbWVka2l0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74O6XCI7XG59XG5cbi5mYS1maWdodGVyLWpldDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Du1wiO1xufVxuXG4uZmEtYmVlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+DvFwiO1xufVxuXG4uZmEtaC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvg71cIjtcbn1cblxuLmZhLXBsdXMtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74O+XCI7XG59XG5cbi5mYS1hbmdsZS1kb3VibGUtbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EgFwiO1xufVxuXG4uZmEtYW5nbGUtZG91YmxlLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SBXCI7XG59XG5cbi5mYS1hbmdsZS1kb3VibGUtdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhIJcIjtcbn1cblxuLmZhLWFuZ2xlLWRvdWJsZS1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SDXCI7XG59XG5cbi5mYS1hbmdsZS1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SEXCI7XG59XG5cbi5mYS1hbmdsZS1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EhVwiO1xufVxuXG4uZmEtYW5nbGUtdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhIZcIjtcbn1cblxuLmZhLWFuZ2xlLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvhIdcIjtcbn1cblxuLmZhLWRlc2t0b3A6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhIhcIjtcbn1cblxuLmZhLWxhcHRvcDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EiVwiO1xufVxuXG4uZmEtdGFibGV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SKXCI7XG59XG5cbi5mYS1tb2JpbGUtcGhvbmU6YmVmb3JlLFxuLmZhLW1vYmlsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Ei1wiO1xufVxuXG4uZmEtY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvhIxcIjtcbn1cblxuLmZhLXF1b3RlLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhI1cIjtcbn1cblxuLmZhLXF1b3RlLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SOXCI7XG59XG5cbi5mYS1zcGlubmVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SQXCI7XG59XG5cbi5mYS1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhJFcIjtcbn1cblxuLmZhLW1haWwtcmVwbHk6YmVmb3JlLFxuLmZhLXJlcGx5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SSXCI7XG59XG5cbi5mYS1naXRodWItYWx0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74STXCI7XG59XG5cbi5mYS1mb2xkZXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+ElFwiO1xufVxuXG4uZmEtZm9sZGVyLW9wZW4tbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+ElVwiO1xufVxuXG4uZmEtc21pbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EmFwiO1xufVxuXG4uZmEtZnJvd24tbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EmVwiO1xufVxuXG4uZmEtbWVoLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvhJpcIjtcbn1cblxuLmZhLWdhbWVwYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhJtcIjtcbn1cblxuLmZhLWtleWJvYXJkLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvhJxcIjtcbn1cblxuLmZhLWZsYWctbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EnVwiO1xufVxuXG4uZmEtZmxhZy1jaGVja2VyZWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhJ5cIjtcbn1cblxuLmZhLXRlcm1pbmFsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SgXCI7XG59XG5cbi5mYS1jb2RlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ShXCI7XG59XG5cbi5mYS1tYWlsLXJlcGx5LWFsbDpiZWZvcmUsXG4uZmEtcmVwbHktYWxsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SiXCI7XG59XG5cbi5mYS1zdGFyLWhhbGYtZW1wdHk6YmVmb3JlLFxuLmZhLXN0YXItaGFsZi1mdWxsOmJlZm9yZSxcbi5mYS1zdGFyLWhhbGYtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Eo1wiO1xufVxuXG4uZmEtbG9jYXRpb24tYXJyb3c6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhKRcIjtcbn1cblxuLmZhLWNyb3A6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhKVcIjtcbn1cblxuLmZhLWNvZGUtZm9yazpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EplwiO1xufVxuXG4uZmEtdW5saW5rOmJlZm9yZSxcbi5mYS1jaGFpbi1icm9rZW46YmVmb3JlIHtcbiAgY29udGVudDogXCLvhKdcIjtcbn1cblxuLmZhLXF1ZXN0aW9uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SoXCI7XG59XG5cbi5mYS1pbmZvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74SpXCI7XG59XG5cbi5mYS1leGNsYW1hdGlvbjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EqlwiO1xufVxuXG4uZmEtc3VwZXJzY3JpcHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhKtcIjtcbn1cblxuLmZhLXN1YnNjcmlwdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+ErFwiO1xufVxuXG4uZmEtZXJhc2VyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74StXCI7XG59XG5cbi5mYS1wdXp6bGUtcGllY2U6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhK5cIjtcbn1cblxuLmZhLW1pY3JvcGhvbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhLBcIjtcbn1cblxuLmZhLW1pY3JvcGhvbmUtc2xhc2g6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhLFcIjtcbn1cblxuLmZhLXNoaWVsZDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EslwiO1xufVxuXG4uZmEtY2FsZW5kYXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Es1wiO1xufVxuXG4uZmEtZmlyZS1leHRpbmd1aXNoZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhLRcIjtcbn1cblxuLmZhLXJvY2tldDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EtVwiO1xufVxuXG4uZmEtbWF4Y2RuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74S2XCI7XG59XG5cbi5mYS1jaGV2cm9uLWNpcmNsZS1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74S3XCI7XG59XG5cbi5mYS1jaGV2cm9uLWNpcmNsZS1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+EuFwiO1xufVxuXG4uZmEtY2hldnJvbi1jaXJjbGUtdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhLlcIjtcbn1cblxuLmZhLWNoZXZyb24tY2lyY2xlLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvhLpcIjtcbn1cblxuLmZhLWh0bWw1OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74S7XCI7XG59XG5cbi5mYS1jc3MzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74S8XCI7XG59XG5cbi5mYS1hbmNob3I6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhL1cIjtcbn1cblxuLmZhLXVubG9jay1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhL5cIjtcbn1cblxuLmZhLWJ1bGxzZXllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WAXCI7XG59XG5cbi5mYS1lbGxpcHNpcy1oOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WBXCI7XG59XG5cbi5mYS1lbGxpcHNpcy12OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WCXCI7XG59XG5cbi5mYS1yc3Mtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WDXCI7XG59XG5cbi5mYS1wbGF5LWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FhFwiO1xufVxuXG4uZmEtdGlja2V0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WFXCI7XG59XG5cbi5mYS1taW51cy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhYZcIjtcbn1cblxuLmZhLW1pbnVzLXNxdWFyZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WHXCI7XG59XG5cbi5mYS1sZXZlbC11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FiFwiO1xufVxuXG4uZmEtbGV2ZWwtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FiVwiO1xufVxuXG4uZmEtY2hlY2stc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WKXCI7XG59XG5cbi5mYS1wZW5jaWwtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WLXCI7XG59XG5cbi5mYS1leHRlcm5hbC1saW5rLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FjFwiO1xufVxuXG4uZmEtc2hhcmUtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WNXCI7XG59XG5cbi5mYS1jb21wYXNzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WOXCI7XG59XG5cbi5mYS10b2dnbGUtZG93bjpiZWZvcmUsXG4uZmEtY2FyZXQtc3F1YXJlLW8tZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FkFwiO1xufVxuXG4uZmEtdG9nZ2xlLXVwOmJlZm9yZSxcbi5mYS1jYXJldC1zcXVhcmUtby11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FkVwiO1xufVxuXG4uZmEtdG9nZ2xlLXJpZ2h0OmJlZm9yZSxcbi5mYS1jYXJldC1zcXVhcmUtby1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FklwiO1xufVxuXG4uZmEtZXVybzpiZWZvcmUsXG4uZmEtZXVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WTXCI7XG59XG5cbi5mYS1nYnA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhZRcIjtcbn1cblxuLmZhLWRvbGxhcjpiZWZvcmUsXG4uZmEtdXNkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WVXCI7XG59XG5cbi5mYS1ydXBlZTpiZWZvcmUsXG4uZmEtaW5yOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WWXCI7XG59XG5cbi5mYS1jbnk6YmVmb3JlLFxuLmZhLXJtYjpiZWZvcmUsXG4uZmEteWVuOmJlZm9yZSxcbi5mYS1qcHk6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhZdcIjtcbn1cblxuLmZhLXJ1YmxlOmJlZm9yZSxcbi5mYS1yb3VibGU6YmVmb3JlLFxuLmZhLXJ1YjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FmFwiO1xufVxuXG4uZmEtd29uOmJlZm9yZSxcbi5mYS1rcnc6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhZlcIjtcbn1cblxuLmZhLWJpdGNvaW46YmVmb3JlLFxuLmZhLWJ0YzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FmlwiO1xufVxuXG4uZmEtZmlsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Fm1wiO1xufVxuXG4uZmEtZmlsZS10ZXh0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WcXCI7XG59XG5cbi5mYS1zb3J0LWFscGhhLWFzYzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FnVwiO1xufVxuXG4uZmEtc29ydC1hbHBoYS1kZXNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WeXCI7XG59XG5cbi5mYS1zb3J0LWFtb3VudC1hc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhaBcIjtcbn1cblxuLmZhLXNvcnQtYW1vdW50LWRlc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhaFcIjtcbn1cblxuLmZhLXNvcnQtbnVtZXJpYy1hc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhaJcIjtcbn1cblxuLmZhLXNvcnQtbnVtZXJpYy1kZXNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WjXCI7XG59XG5cbi5mYS10aHVtYnMtdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhaRcIjtcbn1cblxuLmZhLXRodW1icy1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WlXCI7XG59XG5cbi5mYS15b3V0dWJlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FplwiO1xufVxuXG4uZmEteW91dHViZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Fp1wiO1xufVxuXG4uZmEteGluZzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FqFwiO1xufVxuXG4uZmEteGluZy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhalcIjtcbn1cblxuLmZhLXlvdXR1YmUtcGxheTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FqlwiO1xufVxuXG4uZmEtZHJvcGJveDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Fq1wiO1xufVxuXG4uZmEtc3RhY2stb3ZlcmZsb3c6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhaxcIjtcbn1cblxuLmZhLWluc3RhZ3JhbTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FrVwiO1xufVxuXG4uZmEtZmxpY2tyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WuXCI7XG59XG5cbi5mYS1hZG46YmVmb3JlIHtcbiAgY29udGVudDogXCLvhbBcIjtcbn1cblxuLmZhLWJpdGJ1Y2tldDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FsVwiO1xufVxuXG4uZmEtYml0YnVja2V0LXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FslwiO1xufVxuXG4uZmEtdHVtYmxyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74WzXCI7XG59XG5cbi5mYS10dW1ibHItc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74W0XCI7XG59XG5cbi5mYS1sb25nLWFycm93LWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLvhbVcIjtcbn1cblxuLmZhLWxvbmctYXJyb3ctdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhbZcIjtcbn1cblxuLmZhLWxvbmctYXJyb3ctbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Ft1wiO1xufVxuXG4uZmEtbG9uZy1hcnJvdy1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FuFwiO1xufVxuXG4uZmEtYXBwbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhblcIjtcbn1cblxuLmZhLXdpbmRvd3M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhbpcIjtcbn1cblxuLmZhLWFuZHJvaWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhbtcIjtcbn1cblxuLmZhLWxpbnV4OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74W8XCI7XG59XG5cbi5mYS1kcmliYmJsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+FvVwiO1xufVxuXG4uZmEtc2t5cGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhb5cIjtcbn1cblxuLmZhLWZvdXJzcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhoBcIjtcbn1cblxuLmZhLXRyZWxsbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GgVwiO1xufVxuXG4uZmEtZmVtYWxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aCXCI7XG59XG5cbi5mYS1tYWxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aDXCI7XG59XG5cbi5mYS1naXR0aXA6YmVmb3JlLFxuLmZhLWdyYXRpcGF5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aEXCI7XG59XG5cbi5mYS1zdW4tbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GhVwiO1xufVxuXG4uZmEtbW9vbi1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aGXCI7XG59XG5cbi5mYS1hcmNoaXZlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aHXCI7XG59XG5cbi5mYS1idWc6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhohcIjtcbn1cblxuLmZhLXZrOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aJXCI7XG59XG5cbi5mYS13ZWlibzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GilwiO1xufVxuXG4uZmEtcmVucmVuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aLXCI7XG59XG5cbi5mYS1wYWdlbGluZXM6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhoxcIjtcbn1cblxuLmZhLXN0YWNrLWV4Y2hhbmdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aNXCI7XG59XG5cbi5mYS1hcnJvdy1jaXJjbGUtby1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GjlwiO1xufVxuXG4uZmEtYXJyb3ctY2lyY2xlLW8tbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GkFwiO1xufVxuXG4uZmEtdG9nZ2xlLWxlZnQ6YmVmb3JlLFxuLmZhLWNhcmV0LXNxdWFyZS1vLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhpFcIjtcbn1cblxuLmZhLWRvdC1jaXJjbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GklwiO1xufVxuXG4uZmEtd2hlZWxjaGFpcjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Gk1wiO1xufVxuXG4uZmEtdmltZW8tc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aUXCI7XG59XG5cbi5mYS10dXJraXNoLWxpcmE6YmVmb3JlLFxuLmZhLXRyeTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GlVwiO1xufVxuXG4uZmEtcGx1cy1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GllwiO1xufVxuXG4uZmEtc3BhY2Utc2h1dHRsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Gl1wiO1xufVxuXG4uZmEtc2xhY2s6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhphcIjtcbn1cblxuLmZhLWVudmVsb3BlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GmVwiO1xufVxuXG4uZmEtd29yZHByZXNzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aaXCI7XG59XG5cbi5mYS1vcGVuaWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhptcIjtcbn1cblxuLmZhLWluc3RpdHV0aW9uOmJlZm9yZSxcbi5mYS1iYW5rOmJlZm9yZSxcbi5mYS11bml2ZXJzaXR5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74acXCI7XG59XG5cbi5mYS1tb3J0YXItYm9hcmQ6YmVmb3JlLFxuLmZhLWdyYWR1YXRpb24tY2FwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74adXCI7XG59XG5cbi5mYS15YWhvbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GnlwiO1xufVxuXG4uZmEtZ29vZ2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74agXCI7XG59XG5cbi5mYS1yZWRkaXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhqFcIjtcbn1cblxuLmZhLXJlZGRpdC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhqJcIjtcbn1cblxuLmZhLXN0dW1ibGV1cG9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Go1wiO1xufVxuXG4uZmEtc3R1bWJsZXVwb246YmVmb3JlIHtcbiAgY29udGVudDogXCLvhqRcIjtcbn1cblxuLmZhLWRlbGljaW91czpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GpVwiO1xufVxuXG4uZmEtZGlnZzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GplwiO1xufVxuXG4uZmEtcGllZC1waXBlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Gp1wiO1xufVxuXG4uZmEtcGllZC1waXBlci1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhqhcIjtcbn1cblxuLmZhLWRydXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GqVwiO1xufVxuXG4uZmEtam9vbWxhOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74aqXCI7XG59XG5cbi5mYS1sYW5ndWFnZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Gq1wiO1xufVxuXG4uZmEtZmF4OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74asXCI7XG59XG5cbi5mYS1idWlsZGluZzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GrVwiO1xufVxuXG4uZmEtY2hpbGQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhq5cIjtcbn1cblxuLmZhLXBhdzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GsFwiO1xufVxuXG4uZmEtc3Bvb246YmVmb3JlIHtcbiAgY29udGVudDogXCLvhrFcIjtcbn1cblxuLmZhLWN1YmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhrJcIjtcbn1cblxuLmZhLWN1YmVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74azXCI7XG59XG5cbi5mYS1iZWhhbmNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74a0XCI7XG59XG5cbi5mYS1iZWhhbmNlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GtVwiO1xufVxuXG4uZmEtc3RlYW06YmVmb3JlIHtcbiAgY29udGVudDogXCLvhrZcIjtcbn1cblxuLmZhLXN0ZWFtLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Gt1wiO1xufVxuXG4uZmEtcmVjeWNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+GuFwiO1xufVxuXG4uZmEtYXV0b21vYmlsZTpiZWZvcmUsXG4uZmEtY2FyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74a5XCI7XG59XG5cbi5mYS1jYWI6YmVmb3JlLFxuLmZhLXRheGk6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhrpcIjtcbn1cblxuLmZhLXRyZWU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhrtcIjtcbn1cblxuLmZhLXNwb3RpZnk6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhrxcIjtcbn1cblxuLmZhLWRldmlhbnRhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhr1cIjtcbn1cblxuLmZhLXNvdW5kY2xvdWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvhr5cIjtcbn1cblxuLmZhLWRhdGFiYXNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eAXCI7XG59XG5cbi5mYS1maWxlLXBkZi1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eBXCI7XG59XG5cbi5mYS1maWxlLXdvcmQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HglwiO1xufVxuXG4uZmEtZmlsZS1leGNlbC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eDXCI7XG59XG5cbi5mYS1maWxlLXBvd2VycG9pbnQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HhFwiO1xufVxuXG4uZmEtZmlsZS1waG90by1vOmJlZm9yZSxcbi5mYS1maWxlLXBpY3R1cmUtbzpiZWZvcmUsXG4uZmEtZmlsZS1pbWFnZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eFXCI7XG59XG5cbi5mYS1maWxlLXppcC1vOmJlZm9yZSxcbi5mYS1maWxlLWFyY2hpdmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HhlwiO1xufVxuXG4uZmEtZmlsZS1zb3VuZC1vOmJlZm9yZSxcbi5mYS1maWxlLWF1ZGlvLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvh4dcIjtcbn1cblxuLmZhLWZpbGUtbW92aWUtbzpiZWZvcmUsXG4uZmEtZmlsZS12aWRlby1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eIXCI7XG59XG5cbi5mYS1maWxlLWNvZGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HiVwiO1xufVxuXG4uZmEtdmluZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HilwiO1xufVxuXG4uZmEtY29kZXBlbjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Hi1wiO1xufVxuXG4uZmEtanNmaWRkbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh4xcIjtcbn1cblxuLmZhLWxpZmUtYm91eTpiZWZvcmUsXG4uZmEtbGlmZS1idW95OmJlZm9yZSxcbi5mYS1saWZlLXNhdmVyOmJlZm9yZSxcbi5mYS1zdXBwb3J0OmJlZm9yZSxcbi5mYS1saWZlLXJpbmc6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh41cIjtcbn1cblxuLmZhLWNpcmNsZS1vLW5vdGNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eOXCI7XG59XG5cbi5mYS1yYTpiZWZvcmUsXG4uZmEtcmViZWw6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh5BcIjtcbn1cblxuLmZhLWdlOmJlZm9yZSxcbi5mYS1lbXBpcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh5FcIjtcbn1cblxuLmZhLWdpdC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh5JcIjtcbn1cblxuLmZhLWdpdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Hk1wiO1xufVxuXG4uZmEtaGFja2VyLW5ld3M6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh5RcIjtcbn1cblxuLmZhLXRlbmNlbnQtd2VpYm86YmVmb3JlIHtcbiAgY29udGVudDogXCLvh5VcIjtcbn1cblxuLmZhLXFxOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eWXCI7XG59XG5cbi5mYS13ZWNoYXQ6YmVmb3JlLFxuLmZhLXdlaXhpbjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Hl1wiO1xufVxuXG4uZmEtc2VuZDpiZWZvcmUsXG4uZmEtcGFwZXItcGxhbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh5hcIjtcbn1cblxuLmZhLXNlbmQtbzpiZWZvcmUsXG4uZmEtcGFwZXItcGxhbmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HmVwiO1xufVxuXG4uZmEtaGlzdG9yeTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HmlwiO1xufVxuXG4uZmEtZ2VuZGVybGVzczpiZWZvcmUsXG4uZmEtY2lyY2xlLXRoaW46YmVmb3JlIHtcbiAgY29udGVudDogXCLvh5tcIjtcbn1cblxuLmZhLWhlYWRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HnFwiO1xufVxuXG4uZmEtcGFyYWdyYXBoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74edXCI7XG59XG5cbi5mYS1zbGlkZXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74eeXCI7XG59XG5cbi5mYS1zaGFyZS1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6BcIjtcbn1cblxuLmZhLXNoYXJlLWFsdC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6FcIjtcbn1cblxuLmZhLWJvbWI6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6JcIjtcbn1cblxuLmZhLXNvY2Nlci1iYWxsLW86YmVmb3JlLFxuLmZhLWZ1dGJvbC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ejXCI7XG59XG5cbi5mYS10dHk6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6RcIjtcbn1cblxuLmZhLWJpbm9jdWxhcnM6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6VcIjtcbn1cblxuLmZhLXBsdWc6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6ZcIjtcbn1cblxuLmZhLXNsaWRlc2hhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6dcIjtcbn1cblxuLmZhLXR3aXRjaDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HqFwiO1xufVxuXG4uZmEteWVscDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HqVwiO1xufVxuXG4uZmEtbmV3c3BhcGVyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6pcIjtcbn1cblxuLmZhLXdpZmk6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6tcIjtcbn1cblxuLmZhLWNhbGN1bGF0b3I6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh6xcIjtcbn1cblxuLmZhLXBheXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HrVwiO1xufVxuXG4uZmEtZ29vZ2xlLXdhbGxldDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HrlwiO1xufVxuXG4uZmEtY2MtdmlzYTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HsFwiO1xufVxuXG4uZmEtY2MtbWFzdGVyY2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HsVwiO1xufVxuXG4uZmEtY2MtZGlzY292ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh7JcIjtcbn1cblxuLmZhLWNjLWFtZXg6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh7NcIjtcbn1cblxuLmZhLWNjLXBheXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HtFwiO1xufVxuXG4uZmEtY2Mtc3RyaXBlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74e1XCI7XG59XG5cbi5mYS1iZWxsLXNsYXNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74e2XCI7XG59XG5cbi5mYS1iZWxsLXNsYXNoLW86YmVmb3JlIHtcbiAgY29udGVudDogXCLvh7dcIjtcbn1cblxuLmZhLXRyYXNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74e4XCI7XG59XG5cbi5mYS1jb3B5cmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLvh7lcIjtcbn1cblxuLmZhLWF0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74e6XCI7XG59XG5cbi5mYS1leWVkcm9wcGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74e7XCI7XG59XG5cbi5mYS1wYWludC1icnVzaDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HvFwiO1xufVxuXG4uZmEtYmlydGhkYXktY2FrZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HvVwiO1xufVxuXG4uZmEtYXJlYS1jaGFydDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+HvlwiO1xufVxuXG4uZmEtcGllLWNoYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iAXCI7XG59XG5cbi5mYS1saW5lLWNoYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iBXCI7XG59XG5cbi5mYS1sYXN0Zm06YmVmb3JlIHtcbiAgY29udGVudDogXCLviIJcIjtcbn1cblxuLmZhLWxhc3RmbS1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCLviINcIjtcbn1cblxuLmZhLXRvZ2dsZS1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCLviIRcIjtcbn1cblxuLmZhLXRvZ2dsZS1vbjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IhVwiO1xufVxuXG4uZmEtYmljeWNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IhlwiO1xufVxuXG4uZmEtYnVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iHXCI7XG59XG5cbi5mYS1pb3hob3N0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iIXCI7XG59XG5cbi5mYS1hbmdlbGxpc3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCLviIlcIjtcbn1cblxuLmZhLWNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iKXCI7XG59XG5cbi5mYS1zaGVrZWw6YmVmb3JlLFxuLmZhLXNoZXFlbDpiZWZvcmUsXG4uZmEtaWxzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iLXCI7XG59XG5cbi5mYS1tZWFucGF0aDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IjFwiO1xufVxuXG4uZmEtYnV5c2VsbGFkczpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IjVwiO1xufVxuXG4uZmEtY29ubmVjdGRldmVsb3A6YmVmb3JlIHtcbiAgY29udGVudDogXCLviI5cIjtcbn1cblxuLmZhLWRhc2hjdWJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iQXCI7XG59XG5cbi5mYS1mb3J1bWJlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IkVwiO1xufVxuXG4uZmEtbGVhbnB1YjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IklwiO1xufVxuXG4uZmEtc2VsbHN5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iTXCI7XG59XG5cbi5mYS1zaGlydHNpbmJ1bGs6YmVmb3JlIHtcbiAgY29udGVudDogXCLviJRcIjtcbn1cblxuLmZhLXNpbXBseWJ1aWx0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iVXCI7XG59XG5cbi5mYS1za3lhdGxhczpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IllwiO1xufVxuXG4uZmEtY2FydC1wbHVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74iXXCI7XG59XG5cbi5mYS1jYXJ0LWFycm93LWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCLviJhcIjtcbn1cblxuLmZhLWRpYW1vbmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLviJlcIjtcbn1cblxuLmZhLXNoaXA6YmVmb3JlIHtcbiAgY29udGVudDogXCLviJpcIjtcbn1cblxuLmZhLXVzZXItc2VjcmV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ibXCI7XG59XG5cbi5mYS1tb3RvcmN5Y2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74icXCI7XG59XG5cbi5mYS1zdHJlZXQtdmlldzpiZWZvcmUge1xuICBjb250ZW50OiBcIu+InVwiO1xufVxuXG4uZmEtaGVhcnRiZWF0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ieXCI7XG59XG5cbi5mYS12ZW51czpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IoVwiO1xufVxuXG4uZmEtbWFyczpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IolwiO1xufVxuXG4uZmEtbWVyY3VyeTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Io1wiO1xufVxuXG4uZmEtdHJhbnNnZW5kZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCLviKRcIjtcbn1cblxuLmZhLXRyYW5zZ2VuZGVyLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IpVwiO1xufVxuXG4uZmEtdmVudXMtZG91YmxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74imXCI7XG59XG5cbi5mYS1tYXJzLWRvdWJsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+Ip1wiO1xufVxuXG4uZmEtdmVudXMtbWFyczpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IqFwiO1xufVxuXG4uZmEtbWFycy1zdHJva2U6YmVmb3JlIHtcbiAgY29udGVudDogXCLviKlcIjtcbn1cblxuLmZhLW1hcnMtc3Ryb2tlLXY6YmVmb3JlIHtcbiAgY29udGVudDogXCLviKpcIjtcbn1cblxuLmZhLW1hcnMtc3Ryb2tlLWg6YmVmb3JlIHtcbiAgY29udGVudDogXCLviKtcIjtcbn1cblxuLmZhLW5ldXRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IrFwiO1xufVxuXG4uZmEtZmFjZWJvb2stb2ZmaWNpYWw6YmVmb3JlIHtcbiAgY29udGVudDogXCLviLBcIjtcbn1cblxuLmZhLXBpbnRlcmVzdC1wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74ixXCI7XG59XG5cbi5mYS13aGF0c2FwcDpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IslwiO1xufVxuXG4uZmEtc2VydmVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74izXCI7XG59XG5cbi5mYS11c2VyLXBsdXM6YmVmb3JlIHtcbiAgY29udGVudDogXCLviLRcIjtcbn1cblxuLmZhLXVzZXItdGltZXM6YmVmb3JlIHtcbiAgY29udGVudDogXCLviLVcIjtcbn1cblxuLmZhLWhvdGVsOmJlZm9yZSxcbi5mYS1iZWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCLviLZcIjtcbn1cblxuLmZhLXZpYWNvaW46YmVmb3JlIHtcbiAgY29udGVudDogXCLviLdcIjtcbn1cblxuLmZhLXRyYWluOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwi74i4XCI7XG59XG5cbi5mYS1zdWJ3YXk6YmVmb3JlIHtcbiAgY29udGVudDogXCLviLlcIjtcbn1cblxuLmZhLW1lZGl1bTpiZWZvcmUge1xuICBjb250ZW50OiBcIu+IulwiO1xufVxuIiwiLyohXG4gKiAgRm9udCBBd2Vzb21lIDQuMy4wIGJ5IEBkYXZlZ2FuZHkgLSBodHRwOi8vZm9udGF3ZXNvbWUuaW8gLSBAZm9udGF3ZXNvbWVcbiAqICBMaWNlbnNlIC0gaHR0cDovL2ZvbnRhd2Vzb21lLmlvL2xpY2Vuc2UgKEZvbnQ6IFNJTCBPRkwgMS4xLCBDU1M6IE1JVCBMaWNlbnNlKVxuICovXG5cbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvdmFyaWFibGVzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL21peGluc1wiO1xuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9wYXRoXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL2NvcmVcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2ZvbnRhd2Vzb21lL3Njc3MvbGFyZ2VyXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL2ZpeGVkLXdpZHRoXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL2xpc3RcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2ZvbnRhd2Vzb21lL3Njc3MvYm9yZGVyZWQtcHVsbGVkXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL2FuaW1hdGVkXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL3JvdGF0ZWQtZmxpcHBlZFwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvZm9udGF3ZXNvbWUvc2Nzcy9zdGFja2VkXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9mb250YXdlc29tZS9zY3NzL2ljb25zXCI7XG4iLCIvKiBGT05UIFBBVEhcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogJ0ZvbnRBd2Vzb21lJztcbiAgc3JjOiB1cmwoJyN7JGZhLWZvbnQtcGF0aH0vZm9udGF3ZXNvbWUudHRmJykgZm9ybWF0KCd0cnVldHlwZScpO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG59XG4iLCIvLyBCYXNlIENsYXNzIERlZmluaXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLiN7JGZhLWNzcy1wcmVmaXh9IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250OiBub3JtYWwgbm9ybWFsIG5vcm1hbCAjeyRmYS1mb250LXNpemUtYmFzZX0vMSBGb250QXdlc29tZTsgLy8gc2hvcnRlbmluZyBmb250IGRlY2xhcmF0aW9uXG4gIGZvbnQtc2l6ZTogaW5oZXJpdDsgLy8gY2FuJ3QgaGF2ZSBmb250LXNpemUgaW5oZXJpdCBvbiBsaW5lIGFib3ZlLCBzbyBuZWVkIHRvIG92ZXJyaWRlXG4gIHRleHQtcmVuZGVyaW5nOiBhdXRvOyAvLyBvcHRpbWl6ZWxlZ2liaWxpdHkgdGhyb3dzIHRoaW5ncyBvZmYgIzEwOTRcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOyAvLyBlbnN1cmVzIG5vIGhhbGYtcGl4ZWwgcmVuZGVyaW5nIGluIGZpcmVmb3hcblxufVxuIiwiLy8gSWNvbiBTaXplc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiBtYWtlcyB0aGUgZm9udCAzMyUgbGFyZ2VyIHJlbGF0aXZlIHRvIHRoZSBpY29uIGNvbnRhaW5lciAqL1xuLiN7JGZhLWNzcy1wcmVmaXh9LWxnIHtcbiAgZm9udC1zaXplOiAoNGVtIC8gMyk7XG4gIGxpbmUtaGVpZ2h0OiAoM2VtIC8gNCk7XG4gIHZlcnRpY2FsLWFsaWduOiAtMTUlO1xufVxuLiN7JGZhLWNzcy1wcmVmaXh9LTJ4IHsgZm9udC1zaXplOiAyZW07IH1cbi4jeyRmYS1jc3MtcHJlZml4fS0zeCB7IGZvbnQtc2l6ZTogM2VtOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tNHggeyBmb250LXNpemU6IDRlbTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LTV4IHsgZm9udC1zaXplOiA1ZW07IH1cbiIsIi8vIEZpeGVkIFdpZHRoIEljb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uI3skZmEtY3NzLXByZWZpeH0tZncge1xuICB3aWR0aDogKDE4ZW0gLyAxNCk7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbiIsIi8vIExpc3QgSWNvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLiN7JGZhLWNzcy1wcmVmaXh9LXVsIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBtYXJnaW4tbGVmdDogJGZhLWxpLXdpZHRoO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gID4gbGkgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH1cbn1cbi4jeyRmYS1jc3MtcHJlZml4fS1saSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogLSRmYS1saS13aWR0aDtcbiAgd2lkdGg6ICRmYS1saS13aWR0aDtcbiAgdG9wOiAoMmVtIC8gMTQpO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICYuI3skZmEtY3NzLXByZWZpeH0tbGcge1xuICAgIGxlZnQ6IC0kZmEtbGktd2lkdGggKyAoNGVtIC8gMTQpO1xuICB9XG59XG4iLCIvLyBWYXJpYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiRmYS1mb250LXBhdGg6ICAgICAgICBcIi4uL2ZvbnQvXCIgIWRlZmF1bHQ7XG4kZmEtZm9udC1zaXplLWJhc2U6ICAgMTRweCAhZGVmYXVsdDtcbi8vJGZhLWZvbnQtcGF0aDogICAgICAgIFwiLy9uZXRkbmEuYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC4zLjAvZm9udHNcIiAhZGVmYXVsdDsgLy8gZm9yIHJlZmVyZW5jaW5nIEJvb3RzdHJhcCBDRE4gZm9udCBmaWxlcyBkaXJlY3RseVxuJGZhLWNzcy1wcmVmaXg6ICAgICAgIGZhICFkZWZhdWx0O1xuJGZhLXZlcnNpb246ICAgICAgICAgIFwiNC4zLjBcIiAhZGVmYXVsdDtcbiRmYS1ib3JkZXItY29sb3I6ICAgICAjZWVlICFkZWZhdWx0O1xuJGZhLWludmVyc2U6ICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kZmEtbGktd2lkdGg6ICAgICAgICAgKDMwZW0gLyAxNCkgIWRlZmF1bHQ7XG5cbiRmYS12YXItYWRqdXN0OiBcIlxcZjA0MlwiO1xuJGZhLXZhci1hZG46IFwiXFxmMTcwXCI7XG4kZmEtdmFyLWFsaWduLWNlbnRlcjogXCJcXGYwMzdcIjtcbiRmYS12YXItYWxpZ24tanVzdGlmeTogXCJcXGYwMzlcIjtcbiRmYS12YXItYWxpZ24tbGVmdDogXCJcXGYwMzZcIjtcbiRmYS12YXItYWxpZ24tcmlnaHQ6IFwiXFxmMDM4XCI7XG4kZmEtdmFyLWFtYnVsYW5jZTogXCJcXGYwZjlcIjtcbiRmYS12YXItYW5jaG9yOiBcIlxcZjEzZFwiO1xuJGZhLXZhci1hbmRyb2lkOiBcIlxcZjE3YlwiO1xuJGZhLXZhci1hbmdlbGxpc3Q6IFwiXFxmMjA5XCI7XG4kZmEtdmFyLWFuZ2xlLWRvdWJsZS1kb3duOiBcIlxcZjEwM1wiO1xuJGZhLXZhci1hbmdsZS1kb3VibGUtbGVmdDogXCJcXGYxMDBcIjtcbiRmYS12YXItYW5nbGUtZG91YmxlLXJpZ2h0OiBcIlxcZjEwMVwiO1xuJGZhLXZhci1hbmdsZS1kb3VibGUtdXA6IFwiXFxmMTAyXCI7XG4kZmEtdmFyLWFuZ2xlLWRvd246IFwiXFxmMTA3XCI7XG4kZmEtdmFyLWFuZ2xlLWxlZnQ6IFwiXFxmMTA0XCI7XG4kZmEtdmFyLWFuZ2xlLXJpZ2h0OiBcIlxcZjEwNVwiO1xuJGZhLXZhci1hbmdsZS11cDogXCJcXGYxMDZcIjtcbiRmYS12YXItYXBwbGU6IFwiXFxmMTc5XCI7XG4kZmEtdmFyLWFyY2hpdmU6IFwiXFxmMTg3XCI7XG4kZmEtdmFyLWFyZWEtY2hhcnQ6IFwiXFxmMWZlXCI7XG4kZmEtdmFyLWFycm93LWNpcmNsZS1kb3duOiBcIlxcZjBhYlwiO1xuJGZhLXZhci1hcnJvdy1jaXJjbGUtbGVmdDogXCJcXGYwYThcIjtcbiRmYS12YXItYXJyb3ctY2lyY2xlLW8tZG93bjogXCJcXGYwMWFcIjtcbiRmYS12YXItYXJyb3ctY2lyY2xlLW8tbGVmdDogXCJcXGYxOTBcIjtcbiRmYS12YXItYXJyb3ctY2lyY2xlLW8tcmlnaHQ6IFwiXFxmMThlXCI7XG4kZmEtdmFyLWFycm93LWNpcmNsZS1vLXVwOiBcIlxcZjAxYlwiO1xuJGZhLXZhci1hcnJvdy1jaXJjbGUtcmlnaHQ6IFwiXFxmMGE5XCI7XG4kZmEtdmFyLWFycm93LWNpcmNsZS11cDogXCJcXGYwYWFcIjtcbiRmYS12YXItYXJyb3ctZG93bjogXCJcXGYwNjNcIjtcbiRmYS12YXItYXJyb3ctbGVmdDogXCJcXGYwNjBcIjtcbiRmYS12YXItYXJyb3ctcmlnaHQ6IFwiXFxmMDYxXCI7XG4kZmEtdmFyLWFycm93LXVwOiBcIlxcZjA2MlwiO1xuJGZhLXZhci1hcnJvd3M6IFwiXFxmMDQ3XCI7XG4kZmEtdmFyLWFycm93cy1hbHQ6IFwiXFxmMGIyXCI7XG4kZmEtdmFyLWFycm93cy1oOiBcIlxcZjA3ZVwiO1xuJGZhLXZhci1hcnJvd3MtdjogXCJcXGYwN2RcIjtcbiRmYS12YXItYXN0ZXJpc2s6IFwiXFxmMDY5XCI7XG4kZmEtdmFyLWF0OiBcIlxcZjFmYVwiO1xuJGZhLXZhci1hdXRvbW9iaWxlOiBcIlxcZjFiOVwiO1xuJGZhLXZhci1iYWNrd2FyZDogXCJcXGYwNGFcIjtcbiRmYS12YXItYmFuOiBcIlxcZjA1ZVwiO1xuJGZhLXZhci1iYW5rOiBcIlxcZjE5Y1wiO1xuJGZhLXZhci1iYXItY2hhcnQ6IFwiXFxmMDgwXCI7XG4kZmEtdmFyLWJhci1jaGFydC1vOiBcIlxcZjA4MFwiO1xuJGZhLXZhci1iYXJjb2RlOiBcIlxcZjAyYVwiO1xuJGZhLXZhci1iYXJzOiBcIlxcZjBjOVwiO1xuJGZhLXZhci1iZWQ6IFwiXFxmMjM2XCI7XG4kZmEtdmFyLWJlZXI6IFwiXFxmMGZjXCI7XG4kZmEtdmFyLWJlaGFuY2U6IFwiXFxmMWI0XCI7XG4kZmEtdmFyLWJlaGFuY2Utc3F1YXJlOiBcIlxcZjFiNVwiO1xuJGZhLXZhci1iZWxsOiBcIlxcZjBmM1wiO1xuJGZhLXZhci1iZWxsLW86IFwiXFxmMGEyXCI7XG4kZmEtdmFyLWJlbGwtc2xhc2g6IFwiXFxmMWY2XCI7XG4kZmEtdmFyLWJlbGwtc2xhc2gtbzogXCJcXGYxZjdcIjtcbiRmYS12YXItYmljeWNsZTogXCJcXGYyMDZcIjtcbiRmYS12YXItYmlub2N1bGFyczogXCJcXGYxZTVcIjtcbiRmYS12YXItYmlydGhkYXktY2FrZTogXCJcXGYxZmRcIjtcbiRmYS12YXItYml0YnVja2V0OiBcIlxcZjE3MVwiO1xuJGZhLXZhci1iaXRidWNrZXQtc3F1YXJlOiBcIlxcZjE3MlwiO1xuJGZhLXZhci1iaXRjb2luOiBcIlxcZjE1YVwiO1xuJGZhLXZhci1ib2xkOiBcIlxcZjAzMlwiO1xuJGZhLXZhci1ib2x0OiBcIlxcZjBlN1wiO1xuJGZhLXZhci1ib21iOiBcIlxcZjFlMlwiO1xuJGZhLXZhci1ib29rOiBcIlxcZjAyZFwiO1xuJGZhLXZhci1ib29rbWFyazogXCJcXGYwMmVcIjtcbiRmYS12YXItYm9va21hcmstbzogXCJcXGYwOTdcIjtcbiRmYS12YXItYnJpZWZjYXNlOiBcIlxcZjBiMVwiO1xuJGZhLXZhci1idGM6IFwiXFxmMTVhXCI7XG4kZmEtdmFyLWJ1ZzogXCJcXGYxODhcIjtcbiRmYS12YXItYnVpbGRpbmc6IFwiXFxmMWFkXCI7XG4kZmEtdmFyLWJ1aWxkaW5nLW86IFwiXFxmMGY3XCI7XG4kZmEtdmFyLWJ1bGxob3JuOiBcIlxcZjBhMVwiO1xuJGZhLXZhci1idWxsc2V5ZTogXCJcXGYxNDBcIjtcbiRmYS12YXItYnVzOiBcIlxcZjIwN1wiO1xuJGZhLXZhci1idXlzZWxsYWRzOiBcIlxcZjIwZFwiO1xuJGZhLXZhci1jYWI6IFwiXFxmMWJhXCI7XG4kZmEtdmFyLWNhbGN1bGF0b3I6IFwiXFxmMWVjXCI7XG4kZmEtdmFyLWNhbGVuZGFyOiBcIlxcZjA3M1wiO1xuJGZhLXZhci1jYWxlbmRhci1vOiBcIlxcZjEzM1wiO1xuJGZhLXZhci1jYW1lcmE6IFwiXFxmMDMwXCI7XG4kZmEtdmFyLWNhbWVyYS1yZXRybzogXCJcXGYwODNcIjtcbiRmYS12YXItY2FyOiBcIlxcZjFiOVwiO1xuJGZhLXZhci1jYXJldC1kb3duOiBcIlxcZjBkN1wiO1xuJGZhLXZhci1jYXJldC1sZWZ0OiBcIlxcZjBkOVwiO1xuJGZhLXZhci1jYXJldC1yaWdodDogXCJcXGYwZGFcIjtcbiRmYS12YXItY2FyZXQtc3F1YXJlLW8tZG93bjogXCJcXGYxNTBcIjtcbiRmYS12YXItY2FyZXQtc3F1YXJlLW8tbGVmdDogXCJcXGYxOTFcIjtcbiRmYS12YXItY2FyZXQtc3F1YXJlLW8tcmlnaHQ6IFwiXFxmMTUyXCI7XG4kZmEtdmFyLWNhcmV0LXNxdWFyZS1vLXVwOiBcIlxcZjE1MVwiO1xuJGZhLXZhci1jYXJldC11cDogXCJcXGYwZDhcIjtcbiRmYS12YXItY2FydC1hcnJvdy1kb3duOiBcIlxcZjIxOFwiO1xuJGZhLXZhci1jYXJ0LXBsdXM6IFwiXFxmMjE3XCI7XG4kZmEtdmFyLWNjOiBcIlxcZjIwYVwiO1xuJGZhLXZhci1jYy1hbWV4OiBcIlxcZjFmM1wiO1xuJGZhLXZhci1jYy1kaXNjb3ZlcjogXCJcXGYxZjJcIjtcbiRmYS12YXItY2MtbWFzdGVyY2FyZDogXCJcXGYxZjFcIjtcbiRmYS12YXItY2MtcGF5cGFsOiBcIlxcZjFmNFwiO1xuJGZhLXZhci1jYy1zdHJpcGU6IFwiXFxmMWY1XCI7XG4kZmEtdmFyLWNjLXZpc2E6IFwiXFxmMWYwXCI7XG4kZmEtdmFyLWNlcnRpZmljYXRlOiBcIlxcZjBhM1wiO1xuJGZhLXZhci1jaGFpbjogXCJcXGYwYzFcIjtcbiRmYS12YXItY2hhaW4tYnJva2VuOiBcIlxcZjEyN1wiO1xuJGZhLXZhci1jaGVjazogXCJcXGYwMGNcIjtcbiRmYS12YXItY2hlY2stY2lyY2xlOiBcIlxcZjA1OFwiO1xuJGZhLXZhci1jaGVjay1jaXJjbGUtbzogXCJcXGYwNWRcIjtcbiRmYS12YXItY2hlY2stc3F1YXJlOiBcIlxcZjE0YVwiO1xuJGZhLXZhci1jaGVjay1zcXVhcmUtbzogXCJcXGYwNDZcIjtcbiRmYS12YXItY2hldnJvbi1jaXJjbGUtZG93bjogXCJcXGYxM2FcIjtcbiRmYS12YXItY2hldnJvbi1jaXJjbGUtbGVmdDogXCJcXGYxMzdcIjtcbiRmYS12YXItY2hldnJvbi1jaXJjbGUtcmlnaHQ6IFwiXFxmMTM4XCI7XG4kZmEtdmFyLWNoZXZyb24tY2lyY2xlLXVwOiBcIlxcZjEzOVwiO1xuJGZhLXZhci1jaGV2cm9uLWRvd246IFwiXFxmMDc4XCI7XG4kZmEtdmFyLWNoZXZyb24tbGVmdDogXCJcXGYwNTNcIjtcbiRmYS12YXItY2hldnJvbi1yaWdodDogXCJcXGYwNTRcIjtcbiRmYS12YXItY2hldnJvbi11cDogXCJcXGYwNzdcIjtcbiRmYS12YXItY2hpbGQ6IFwiXFxmMWFlXCI7XG4kZmEtdmFyLWNpcmNsZTogXCJcXGYxMTFcIjtcbiRmYS12YXItY2lyY2xlLW86IFwiXFxmMTBjXCI7XG4kZmEtdmFyLWNpcmNsZS1vLW5vdGNoOiBcIlxcZjFjZVwiO1xuJGZhLXZhci1jaXJjbGUtdGhpbjogXCJcXGYxZGJcIjtcbiRmYS12YXItY2xpcGJvYXJkOiBcIlxcZjBlYVwiO1xuJGZhLXZhci1jbG9jay1vOiBcIlxcZjAxN1wiO1xuJGZhLXZhci1jbG9zZTogXCJcXGYwMGRcIjtcbiRmYS12YXItY2xvdWQ6IFwiXFxmMGMyXCI7XG4kZmEtdmFyLWNsb3VkLWRvd25sb2FkOiBcIlxcZjBlZFwiO1xuJGZhLXZhci1jbG91ZC11cGxvYWQ6IFwiXFxmMGVlXCI7XG4kZmEtdmFyLWNueTogXCJcXGYxNTdcIjtcbiRmYS12YXItY29kZTogXCJcXGYxMjFcIjtcbiRmYS12YXItY29kZS1mb3JrOiBcIlxcZjEyNlwiO1xuJGZhLXZhci1jb2RlcGVuOiBcIlxcZjFjYlwiO1xuJGZhLXZhci1jb2ZmZWU6IFwiXFxmMGY0XCI7XG4kZmEtdmFyLWNvZzogXCJcXGYwMTNcIjtcbiRmYS12YXItY29nczogXCJcXGYwODVcIjtcbiRmYS12YXItY29sdW1uczogXCJcXGYwZGJcIjtcbiRmYS12YXItY29tbWVudDogXCJcXGYwNzVcIjtcbiRmYS12YXItY29tbWVudC1vOiBcIlxcZjBlNVwiO1xuJGZhLXZhci1jb21tZW50czogXCJcXGYwODZcIjtcbiRmYS12YXItY29tbWVudHMtbzogXCJcXGYwZTZcIjtcbiRmYS12YXItY29tcGFzczogXCJcXGYxNGVcIjtcbiRmYS12YXItY29tcHJlc3M6IFwiXFxmMDY2XCI7XG4kZmEtdmFyLWNvbm5lY3RkZXZlbG9wOiBcIlxcZjIwZVwiO1xuJGZhLXZhci1jb3B5OiBcIlxcZjBjNVwiO1xuJGZhLXZhci1jb3B5cmlnaHQ6IFwiXFxmMWY5XCI7XG4kZmEtdmFyLWNyZWRpdC1jYXJkOiBcIlxcZjA5ZFwiO1xuJGZhLXZhci1jcm9wOiBcIlxcZjEyNVwiO1xuJGZhLXZhci1jcm9zc2hhaXJzOiBcIlxcZjA1YlwiO1xuJGZhLXZhci1jc3MzOiBcIlxcZjEzY1wiO1xuJGZhLXZhci1jdWJlOiBcIlxcZjFiMlwiO1xuJGZhLXZhci1jdWJlczogXCJcXGYxYjNcIjtcbiRmYS12YXItY3V0OiBcIlxcZjBjNFwiO1xuJGZhLXZhci1jdXRsZXJ5OiBcIlxcZjBmNVwiO1xuJGZhLXZhci1kYXNoYm9hcmQ6IFwiXFxmMGU0XCI7XG4kZmEtdmFyLWRhc2hjdWJlOiBcIlxcZjIxMFwiO1xuJGZhLXZhci1kYXRhYmFzZTogXCJcXGYxYzBcIjtcbiRmYS12YXItZGVkZW50OiBcIlxcZjAzYlwiO1xuJGZhLXZhci1kZWxpY2lvdXM6IFwiXFxmMWE1XCI7XG4kZmEtdmFyLWRlc2t0b3A6IFwiXFxmMTA4XCI7XG4kZmEtdmFyLWRldmlhbnRhcnQ6IFwiXFxmMWJkXCI7XG4kZmEtdmFyLWRpYW1vbmQ6IFwiXFxmMjE5XCI7XG4kZmEtdmFyLWRpZ2c6IFwiXFxmMWE2XCI7XG4kZmEtdmFyLWRvbGxhcjogXCJcXGYxNTVcIjtcbiRmYS12YXItZG90LWNpcmNsZS1vOiBcIlxcZjE5MlwiO1xuJGZhLXZhci1kb3dubG9hZDogXCJcXGYwMTlcIjtcbiRmYS12YXItZHJpYmJibGU6IFwiXFxmMTdkXCI7XG4kZmEtdmFyLWRyb3Bib3g6IFwiXFxmMTZiXCI7XG4kZmEtdmFyLWRydXBhbDogXCJcXGYxYTlcIjtcbiRmYS12YXItZWRpdDogXCJcXGYwNDRcIjtcbiRmYS12YXItZWplY3Q6IFwiXFxmMDUyXCI7XG4kZmEtdmFyLWVsbGlwc2lzLWg6IFwiXFxmMTQxXCI7XG4kZmEtdmFyLWVsbGlwc2lzLXY6IFwiXFxmMTQyXCI7XG4kZmEtdmFyLWVtcGlyZTogXCJcXGYxZDFcIjtcbiRmYS12YXItZW52ZWxvcGU6IFwiXFxmMGUwXCI7XG4kZmEtdmFyLWVudmVsb3BlLW86IFwiXFxmMDAzXCI7XG4kZmEtdmFyLWVudmVsb3BlLXNxdWFyZTogXCJcXGYxOTlcIjtcbiRmYS12YXItZXJhc2VyOiBcIlxcZjEyZFwiO1xuJGZhLXZhci1ldXI6IFwiXFxmMTUzXCI7XG4kZmEtdmFyLWV1cm86IFwiXFxmMTUzXCI7XG4kZmEtdmFyLWV4Y2hhbmdlOiBcIlxcZjBlY1wiO1xuJGZhLXZhci1leGNsYW1hdGlvbjogXCJcXGYxMmFcIjtcbiRmYS12YXItZXhjbGFtYXRpb24tY2lyY2xlOiBcIlxcZjA2YVwiO1xuJGZhLXZhci1leGNsYW1hdGlvbi10cmlhbmdsZTogXCJcXGYwNzFcIjtcbiRmYS12YXItZXhwYW5kOiBcIlxcZjA2NVwiO1xuJGZhLXZhci1leHRlcm5hbC1saW5rOiBcIlxcZjA4ZVwiO1xuJGZhLXZhci1leHRlcm5hbC1saW5rLXNxdWFyZTogXCJcXGYxNGNcIjtcbiRmYS12YXItZXllOiBcIlxcZjA2ZVwiO1xuJGZhLXZhci1leWUtc2xhc2g6IFwiXFxmMDcwXCI7XG4kZmEtdmFyLWV5ZWRyb3BwZXI6IFwiXFxmMWZiXCI7XG4kZmEtdmFyLWZhY2Vib29rOiBcIlxcZjA5YVwiO1xuJGZhLXZhci1mYWNlYm9vay1mOiBcIlxcZjA5YVwiO1xuJGZhLXZhci1mYWNlYm9vay1vZmZpY2lhbDogXCJcXGYyMzBcIjtcbiRmYS12YXItZmFjZWJvb2stc3F1YXJlOiBcIlxcZjA4MlwiO1xuJGZhLXZhci1mYXN0LWJhY2t3YXJkOiBcIlxcZjA0OVwiO1xuJGZhLXZhci1mYXN0LWZvcndhcmQ6IFwiXFxmMDUwXCI7XG4kZmEtdmFyLWZheDogXCJcXGYxYWNcIjtcbiRmYS12YXItZmVtYWxlOiBcIlxcZjE4MlwiO1xuJGZhLXZhci1maWdodGVyLWpldDogXCJcXGYwZmJcIjtcbiRmYS12YXItZmlsZTogXCJcXGYxNWJcIjtcbiRmYS12YXItZmlsZS1hcmNoaXZlLW86IFwiXFxmMWM2XCI7XG4kZmEtdmFyLWZpbGUtYXVkaW8tbzogXCJcXGYxYzdcIjtcbiRmYS12YXItZmlsZS1jb2RlLW86IFwiXFxmMWM5XCI7XG4kZmEtdmFyLWZpbGUtZXhjZWwtbzogXCJcXGYxYzNcIjtcbiRmYS12YXItZmlsZS1pbWFnZS1vOiBcIlxcZjFjNVwiO1xuJGZhLXZhci1maWxlLW1vdmllLW86IFwiXFxmMWM4XCI7XG4kZmEtdmFyLWZpbGUtbzogXCJcXGYwMTZcIjtcbiRmYS12YXItZmlsZS1wZGYtbzogXCJcXGYxYzFcIjtcbiRmYS12YXItZmlsZS1waG90by1vOiBcIlxcZjFjNVwiO1xuJGZhLXZhci1maWxlLXBpY3R1cmUtbzogXCJcXGYxYzVcIjtcbiRmYS12YXItZmlsZS1wb3dlcnBvaW50LW86IFwiXFxmMWM0XCI7XG4kZmEtdmFyLWZpbGUtc291bmQtbzogXCJcXGYxYzdcIjtcbiRmYS12YXItZmlsZS10ZXh0OiBcIlxcZjE1Y1wiO1xuJGZhLXZhci1maWxlLXRleHQtbzogXCJcXGYwZjZcIjtcbiRmYS12YXItZmlsZS12aWRlby1vOiBcIlxcZjFjOFwiO1xuJGZhLXZhci1maWxlLXdvcmQtbzogXCJcXGYxYzJcIjtcbiRmYS12YXItZmlsZS16aXAtbzogXCJcXGYxYzZcIjtcbiRmYS12YXItZmlsZXMtbzogXCJcXGYwYzVcIjtcbiRmYS12YXItZmlsbTogXCJcXGYwMDhcIjtcbiRmYS12YXItZmlsdGVyOiBcIlxcZjBiMFwiO1xuJGZhLXZhci1maXJlOiBcIlxcZjA2ZFwiO1xuJGZhLXZhci1maXJlLWV4dGluZ3Vpc2hlcjogXCJcXGYxMzRcIjtcbiRmYS12YXItZmxhZzogXCJcXGYwMjRcIjtcbiRmYS12YXItZmxhZy1jaGVja2VyZWQ6IFwiXFxmMTFlXCI7XG4kZmEtdmFyLWZsYWctbzogXCJcXGYxMWRcIjtcbiRmYS12YXItZmxhc2g6IFwiXFxmMGU3XCI7XG4kZmEtdmFyLWZsYXNrOiBcIlxcZjBjM1wiO1xuJGZhLXZhci1mbGlja3I6IFwiXFxmMTZlXCI7XG4kZmEtdmFyLWZsb3BweS1vOiBcIlxcZjBjN1wiO1xuJGZhLXZhci1mb2xkZXI6IFwiXFxmMDdiXCI7XG4kZmEtdmFyLWZvbGRlci1vOiBcIlxcZjExNFwiO1xuJGZhLXZhci1mb2xkZXItb3BlbjogXCJcXGYwN2NcIjtcbiRmYS12YXItZm9sZGVyLW9wZW4tbzogXCJcXGYxMTVcIjtcbiRmYS12YXItZm9udDogXCJcXGYwMzFcIjtcbiRmYS12YXItZm9ydW1iZWU6IFwiXFxmMjExXCI7XG4kZmEtdmFyLWZvcndhcmQ6IFwiXFxmMDRlXCI7XG4kZmEtdmFyLWZvdXJzcXVhcmU6IFwiXFxmMTgwXCI7XG4kZmEtdmFyLWZyb3duLW86IFwiXFxmMTE5XCI7XG4kZmEtdmFyLWZ1dGJvbC1vOiBcIlxcZjFlM1wiO1xuJGZhLXZhci1nYW1lcGFkOiBcIlxcZjExYlwiO1xuJGZhLXZhci1nYXZlbDogXCJcXGYwZTNcIjtcbiRmYS12YXItZ2JwOiBcIlxcZjE1NFwiO1xuJGZhLXZhci1nZTogXCJcXGYxZDFcIjtcbiRmYS12YXItZ2VhcjogXCJcXGYwMTNcIjtcbiRmYS12YXItZ2VhcnM6IFwiXFxmMDg1XCI7XG4kZmEtdmFyLWdlbmRlcmxlc3M6IFwiXFxmMWRiXCI7XG4kZmEtdmFyLWdpZnQ6IFwiXFxmMDZiXCI7XG4kZmEtdmFyLWdpdDogXCJcXGYxZDNcIjtcbiRmYS12YXItZ2l0LXNxdWFyZTogXCJcXGYxZDJcIjtcbiRmYS12YXItZ2l0aHViOiBcIlxcZjA5YlwiO1xuJGZhLXZhci1naXRodWItYWx0OiBcIlxcZjExM1wiO1xuJGZhLXZhci1naXRodWItc3F1YXJlOiBcIlxcZjA5MlwiO1xuJGZhLXZhci1naXR0aXA6IFwiXFxmMTg0XCI7XG4kZmEtdmFyLWdsYXNzOiBcIlxcZjAwMFwiO1xuJGZhLXZhci1nbG9iZTogXCJcXGYwYWNcIjtcbiRmYS12YXItZ29vZ2xlOiBcIlxcZjFhMFwiO1xuJGZhLXZhci1nb29nbGUtcGx1czogXCJcXGYwZDVcIjtcbiRmYS12YXItZ29vZ2xlLXBsdXMtc3F1YXJlOiBcIlxcZjBkNFwiO1xuJGZhLXZhci1nb29nbGUtd2FsbGV0OiBcIlxcZjFlZVwiO1xuJGZhLXZhci1ncmFkdWF0aW9uLWNhcDogXCJcXGYxOWRcIjtcbiRmYS12YXItZ3JhdGlwYXk6IFwiXFxmMTg0XCI7XG4kZmEtdmFyLWdyb3VwOiBcIlxcZjBjMFwiO1xuJGZhLXZhci1oLXNxdWFyZTogXCJcXGYwZmRcIjtcbiRmYS12YXItaGFja2VyLW5ld3M6IFwiXFxmMWQ0XCI7XG4kZmEtdmFyLWhhbmQtby1kb3duOiBcIlxcZjBhN1wiO1xuJGZhLXZhci1oYW5kLW8tbGVmdDogXCJcXGYwYTVcIjtcbiRmYS12YXItaGFuZC1vLXJpZ2h0OiBcIlxcZjBhNFwiO1xuJGZhLXZhci1oYW5kLW8tdXA6IFwiXFxmMGE2XCI7XG4kZmEtdmFyLWhkZC1vOiBcIlxcZjBhMFwiO1xuJGZhLXZhci1oZWFkZXI6IFwiXFxmMWRjXCI7XG4kZmEtdmFyLWhlYWRwaG9uZXM6IFwiXFxmMDI1XCI7XG4kZmEtdmFyLWhlYXJ0OiBcIlxcZjAwNFwiO1xuJGZhLXZhci1oZWFydC1vOiBcIlxcZjA4YVwiO1xuJGZhLXZhci1oZWFydGJlYXQ6IFwiXFxmMjFlXCI7XG4kZmEtdmFyLWhpc3Rvcnk6IFwiXFxmMWRhXCI7XG4kZmEtdmFyLWhvbWU6IFwiXFxmMDE1XCI7XG4kZmEtdmFyLWhvc3BpdGFsLW86IFwiXFxmMGY4XCI7XG4kZmEtdmFyLWhvdGVsOiBcIlxcZjIzNlwiO1xuJGZhLXZhci1odG1sNTogXCJcXGYxM2JcIjtcbiRmYS12YXItaWxzOiBcIlxcZjIwYlwiO1xuJGZhLXZhci1pbWFnZTogXCJcXGYwM2VcIjtcbiRmYS12YXItaW5ib3g6IFwiXFxmMDFjXCI7XG4kZmEtdmFyLWluZGVudDogXCJcXGYwM2NcIjtcbiRmYS12YXItaW5mbzogXCJcXGYxMjlcIjtcbiRmYS12YXItaW5mby1jaXJjbGU6IFwiXFxmMDVhXCI7XG4kZmEtdmFyLWlucjogXCJcXGYxNTZcIjtcbiRmYS12YXItaW5zdGFncmFtOiBcIlxcZjE2ZFwiO1xuJGZhLXZhci1pbnN0aXR1dGlvbjogXCJcXGYxOWNcIjtcbiRmYS12YXItaW94aG9zdDogXCJcXGYyMDhcIjtcbiRmYS12YXItaXRhbGljOiBcIlxcZjAzM1wiO1xuJGZhLXZhci1qb29tbGE6IFwiXFxmMWFhXCI7XG4kZmEtdmFyLWpweTogXCJcXGYxNTdcIjtcbiRmYS12YXItanNmaWRkbGU6IFwiXFxmMWNjXCI7XG4kZmEtdmFyLWtleTogXCJcXGYwODRcIjtcbiRmYS12YXIta2V5Ym9hcmQtbzogXCJcXGYxMWNcIjtcbiRmYS12YXIta3J3OiBcIlxcZjE1OVwiO1xuJGZhLXZhci1sYW5ndWFnZTogXCJcXGYxYWJcIjtcbiRmYS12YXItbGFwdG9wOiBcIlxcZjEwOVwiO1xuJGZhLXZhci1sYXN0Zm06IFwiXFxmMjAyXCI7XG4kZmEtdmFyLWxhc3RmbS1zcXVhcmU6IFwiXFxmMjAzXCI7XG4kZmEtdmFyLWxlYWY6IFwiXFxmMDZjXCI7XG4kZmEtdmFyLWxlYW5wdWI6IFwiXFxmMjEyXCI7XG4kZmEtdmFyLWxlZ2FsOiBcIlxcZjBlM1wiO1xuJGZhLXZhci1sZW1vbi1vOiBcIlxcZjA5NFwiO1xuJGZhLXZhci1sZXZlbC1kb3duOiBcIlxcZjE0OVwiO1xuJGZhLXZhci1sZXZlbC11cDogXCJcXGYxNDhcIjtcbiRmYS12YXItbGlmZS1ib3V5OiBcIlxcZjFjZFwiO1xuJGZhLXZhci1saWZlLWJ1b3k6IFwiXFxmMWNkXCI7XG4kZmEtdmFyLWxpZmUtcmluZzogXCJcXGYxY2RcIjtcbiRmYS12YXItbGlmZS1zYXZlcjogXCJcXGYxY2RcIjtcbiRmYS12YXItbGlnaHRidWxiLW86IFwiXFxmMGViXCI7XG4kZmEtdmFyLWxpbmUtY2hhcnQ6IFwiXFxmMjAxXCI7XG4kZmEtdmFyLWxpbms6IFwiXFxmMGMxXCI7XG4kZmEtdmFyLWxpbmtlZGluOiBcIlxcZjBlMVwiO1xuJGZhLXZhci1saW5rZWRpbi1zcXVhcmU6IFwiXFxmMDhjXCI7XG4kZmEtdmFyLWxpbnV4OiBcIlxcZjE3Y1wiO1xuJGZhLXZhci1saXN0OiBcIlxcZjAzYVwiO1xuJGZhLXZhci1saXN0LWFsdDogXCJcXGYwMjJcIjtcbiRmYS12YXItbGlzdC1vbDogXCJcXGYwY2JcIjtcbiRmYS12YXItbGlzdC11bDogXCJcXGYwY2FcIjtcbiRmYS12YXItbG9jYXRpb24tYXJyb3c6IFwiXFxmMTI0XCI7XG4kZmEtdmFyLWxvY2s6IFwiXFxmMDIzXCI7XG4kZmEtdmFyLWxvbmctYXJyb3ctZG93bjogXCJcXGYxNzVcIjtcbiRmYS12YXItbG9uZy1hcnJvdy1sZWZ0OiBcIlxcZjE3N1wiO1xuJGZhLXZhci1sb25nLWFycm93LXJpZ2h0OiBcIlxcZjE3OFwiO1xuJGZhLXZhci1sb25nLWFycm93LXVwOiBcIlxcZjE3NlwiO1xuJGZhLXZhci1tYWdpYzogXCJcXGYwZDBcIjtcbiRmYS12YXItbWFnbmV0OiBcIlxcZjA3NlwiO1xuJGZhLXZhci1tYWlsLWZvcndhcmQ6IFwiXFxmMDY0XCI7XG4kZmEtdmFyLW1haWwtcmVwbHk6IFwiXFxmMTEyXCI7XG4kZmEtdmFyLW1haWwtcmVwbHktYWxsOiBcIlxcZjEyMlwiO1xuJGZhLXZhci1tYWxlOiBcIlxcZjE4M1wiO1xuJGZhLXZhci1tYXAtbWFya2VyOiBcIlxcZjA0MVwiO1xuJGZhLXZhci1tYXJzOiBcIlxcZjIyMlwiO1xuJGZhLXZhci1tYXJzLWRvdWJsZTogXCJcXGYyMjdcIjtcbiRmYS12YXItbWFycy1zdHJva2U6IFwiXFxmMjI5XCI7XG4kZmEtdmFyLW1hcnMtc3Ryb2tlLWg6IFwiXFxmMjJiXCI7XG4kZmEtdmFyLW1hcnMtc3Ryb2tlLXY6IFwiXFxmMjJhXCI7XG4kZmEtdmFyLW1heGNkbjogXCJcXGYxMzZcIjtcbiRmYS12YXItbWVhbnBhdGg6IFwiXFxmMjBjXCI7XG4kZmEtdmFyLW1lZGl1bTogXCJcXGYyM2FcIjtcbiRmYS12YXItbWVka2l0OiBcIlxcZjBmYVwiO1xuJGZhLXZhci1tZWgtbzogXCJcXGYxMWFcIjtcbiRmYS12YXItbWVyY3VyeTogXCJcXGYyMjNcIjtcbiRmYS12YXItbWljcm9waG9uZTogXCJcXGYxMzBcIjtcbiRmYS12YXItbWljcm9waG9uZS1zbGFzaDogXCJcXGYxMzFcIjtcbiRmYS12YXItbWludXM6IFwiXFxmMDY4XCI7XG4kZmEtdmFyLW1pbnVzLWNpcmNsZTogXCJcXGYwNTZcIjtcbiRmYS12YXItbWludXMtc3F1YXJlOiBcIlxcZjE0NlwiO1xuJGZhLXZhci1taW51cy1zcXVhcmUtbzogXCJcXGYxNDdcIjtcbiRmYS12YXItbW9iaWxlOiBcIlxcZjEwYlwiO1xuJGZhLXZhci1tb2JpbGUtcGhvbmU6IFwiXFxmMTBiXCI7XG4kZmEtdmFyLW1vbmV5OiBcIlxcZjBkNlwiO1xuJGZhLXZhci1tb29uLW86IFwiXFxmMTg2XCI7XG4kZmEtdmFyLW1vcnRhci1ib2FyZDogXCJcXGYxOWRcIjtcbiRmYS12YXItbW90b3JjeWNsZTogXCJcXGYyMWNcIjtcbiRmYS12YXItbXVzaWM6IFwiXFxmMDAxXCI7XG4kZmEtdmFyLW5hdmljb246IFwiXFxmMGM5XCI7XG4kZmEtdmFyLW5ldXRlcjogXCJcXGYyMmNcIjtcbiRmYS12YXItbmV3c3BhcGVyLW86IFwiXFxmMWVhXCI7XG4kZmEtdmFyLW9wZW5pZDogXCJcXGYxOWJcIjtcbiRmYS12YXItb3V0ZGVudDogXCJcXGYwM2JcIjtcbiRmYS12YXItcGFnZWxpbmVzOiBcIlxcZjE4Y1wiO1xuJGZhLXZhci1wYWludC1icnVzaDogXCJcXGYxZmNcIjtcbiRmYS12YXItcGFwZXItcGxhbmU6IFwiXFxmMWQ4XCI7XG4kZmEtdmFyLXBhcGVyLXBsYW5lLW86IFwiXFxmMWQ5XCI7XG4kZmEtdmFyLXBhcGVyY2xpcDogXCJcXGYwYzZcIjtcbiRmYS12YXItcGFyYWdyYXBoOiBcIlxcZjFkZFwiO1xuJGZhLXZhci1wYXN0ZTogXCJcXGYwZWFcIjtcbiRmYS12YXItcGF1c2U6IFwiXFxmMDRjXCI7XG4kZmEtdmFyLXBhdzogXCJcXGYxYjBcIjtcbiRmYS12YXItcGF5cGFsOiBcIlxcZjFlZFwiO1xuJGZhLXZhci1wZW5jaWw6IFwiXFxmMDQwXCI7XG4kZmEtdmFyLXBlbmNpbC1zcXVhcmU6IFwiXFxmMTRiXCI7XG4kZmEtdmFyLXBlbmNpbC1zcXVhcmUtbzogXCJcXGYwNDRcIjtcbiRmYS12YXItcGhvbmU6IFwiXFxmMDk1XCI7XG4kZmEtdmFyLXBob25lLXNxdWFyZTogXCJcXGYwOThcIjtcbiRmYS12YXItcGhvdG86IFwiXFxmMDNlXCI7XG4kZmEtdmFyLXBpY3R1cmUtbzogXCJcXGYwM2VcIjtcbiRmYS12YXItcGllLWNoYXJ0OiBcIlxcZjIwMFwiO1xuJGZhLXZhci1waWVkLXBpcGVyOiBcIlxcZjFhN1wiO1xuJGZhLXZhci1waWVkLXBpcGVyLWFsdDogXCJcXGYxYThcIjtcbiRmYS12YXItcGludGVyZXN0OiBcIlxcZjBkMlwiO1xuJGZhLXZhci1waW50ZXJlc3QtcDogXCJcXGYyMzFcIjtcbiRmYS12YXItcGludGVyZXN0LXNxdWFyZTogXCJcXGYwZDNcIjtcbiRmYS12YXItcGxhbmU6IFwiXFxmMDcyXCI7XG4kZmEtdmFyLXBsYXk6IFwiXFxmMDRiXCI7XG4kZmEtdmFyLXBsYXktY2lyY2xlOiBcIlxcZjE0NFwiO1xuJGZhLXZhci1wbGF5LWNpcmNsZS1vOiBcIlxcZjAxZFwiO1xuJGZhLXZhci1wbHVnOiBcIlxcZjFlNlwiO1xuJGZhLXZhci1wbHVzOiBcIlxcZjA2N1wiO1xuJGZhLXZhci1wbHVzLWNpcmNsZTogXCJcXGYwNTVcIjtcbiRmYS12YXItcGx1cy1zcXVhcmU6IFwiXFxmMGZlXCI7XG4kZmEtdmFyLXBsdXMtc3F1YXJlLW86IFwiXFxmMTk2XCI7XG4kZmEtdmFyLXBvd2VyLW9mZjogXCJcXGYwMTFcIjtcbiRmYS12YXItcHJpbnQ6IFwiXFxmMDJmXCI7XG4kZmEtdmFyLXB1enpsZS1waWVjZTogXCJcXGYxMmVcIjtcbiRmYS12YXItcXE6IFwiXFxmMWQ2XCI7XG4kZmEtdmFyLXFyY29kZTogXCJcXGYwMjlcIjtcbiRmYS12YXItcXVlc3Rpb246IFwiXFxmMTI4XCI7XG4kZmEtdmFyLXF1ZXN0aW9uLWNpcmNsZTogXCJcXGYwNTlcIjtcbiRmYS12YXItcXVvdGUtbGVmdDogXCJcXGYxMGRcIjtcbiRmYS12YXItcXVvdGUtcmlnaHQ6IFwiXFxmMTBlXCI7XG4kZmEtdmFyLXJhOiBcIlxcZjFkMFwiO1xuJGZhLXZhci1yYW5kb206IFwiXFxmMDc0XCI7XG4kZmEtdmFyLXJlYmVsOiBcIlxcZjFkMFwiO1xuJGZhLXZhci1yZWN5Y2xlOiBcIlxcZjFiOFwiO1xuJGZhLXZhci1yZWRkaXQ6IFwiXFxmMWExXCI7XG4kZmEtdmFyLXJlZGRpdC1zcXVhcmU6IFwiXFxmMWEyXCI7XG4kZmEtdmFyLXJlZnJlc2g6IFwiXFxmMDIxXCI7XG4kZmEtdmFyLXJlbW92ZTogXCJcXGYwMGRcIjtcbiRmYS12YXItcmVucmVuOiBcIlxcZjE4YlwiO1xuJGZhLXZhci1yZW9yZGVyOiBcIlxcZjBjOVwiO1xuJGZhLXZhci1yZXBlYXQ6IFwiXFxmMDFlXCI7XG4kZmEtdmFyLXJlcGx5OiBcIlxcZjExMlwiO1xuJGZhLXZhci1yZXBseS1hbGw6IFwiXFxmMTIyXCI7XG4kZmEtdmFyLXJldHdlZXQ6IFwiXFxmMDc5XCI7XG4kZmEtdmFyLXJtYjogXCJcXGYxNTdcIjtcbiRmYS12YXItcm9hZDogXCJcXGYwMThcIjtcbiRmYS12YXItcm9ja2V0OiBcIlxcZjEzNVwiO1xuJGZhLXZhci1yb3RhdGUtbGVmdDogXCJcXGYwZTJcIjtcbiRmYS12YXItcm90YXRlLXJpZ2h0OiBcIlxcZjAxZVwiO1xuJGZhLXZhci1yb3VibGU6IFwiXFxmMTU4XCI7XG4kZmEtdmFyLXJzczogXCJcXGYwOWVcIjtcbiRmYS12YXItcnNzLXNxdWFyZTogXCJcXGYxNDNcIjtcbiRmYS12YXItcnViOiBcIlxcZjE1OFwiO1xuJGZhLXZhci1ydWJsZTogXCJcXGYxNThcIjtcbiRmYS12YXItcnVwZWU6IFwiXFxmMTU2XCI7XG4kZmEtdmFyLXNhdmU6IFwiXFxmMGM3XCI7XG4kZmEtdmFyLXNjaXNzb3JzOiBcIlxcZjBjNFwiO1xuJGZhLXZhci1zZWFyY2g6IFwiXFxmMDAyXCI7XG4kZmEtdmFyLXNlYXJjaC1taW51czogXCJcXGYwMTBcIjtcbiRmYS12YXItc2VhcmNoLXBsdXM6IFwiXFxmMDBlXCI7XG4kZmEtdmFyLXNlbGxzeTogXCJcXGYyMTNcIjtcbiRmYS12YXItc2VuZDogXCJcXGYxZDhcIjtcbiRmYS12YXItc2VuZC1vOiBcIlxcZjFkOVwiO1xuJGZhLXZhci1zZXJ2ZXI6IFwiXFxmMjMzXCI7XG4kZmEtdmFyLXNoYXJlOiBcIlxcZjA2NFwiO1xuJGZhLXZhci1zaGFyZS1hbHQ6IFwiXFxmMWUwXCI7XG4kZmEtdmFyLXNoYXJlLWFsdC1zcXVhcmU6IFwiXFxmMWUxXCI7XG4kZmEtdmFyLXNoYXJlLXNxdWFyZTogXCJcXGYxNGRcIjtcbiRmYS12YXItc2hhcmUtc3F1YXJlLW86IFwiXFxmMDQ1XCI7XG4kZmEtdmFyLXNoZWtlbDogXCJcXGYyMGJcIjtcbiRmYS12YXItc2hlcWVsOiBcIlxcZjIwYlwiO1xuJGZhLXZhci1zaGllbGQ6IFwiXFxmMTMyXCI7XG4kZmEtdmFyLXNoaXA6IFwiXFxmMjFhXCI7XG4kZmEtdmFyLXNoaXJ0c2luYnVsazogXCJcXGYyMTRcIjtcbiRmYS12YXItc2hvcHBpbmctY2FydDogXCJcXGYwN2FcIjtcbiRmYS12YXItc2lnbi1pbjogXCJcXGYwOTBcIjtcbiRmYS12YXItc2lnbi1vdXQ6IFwiXFxmMDhiXCI7XG4kZmEtdmFyLXNpZ25hbDogXCJcXGYwMTJcIjtcbiRmYS12YXItc2ltcGx5YnVpbHQ6IFwiXFxmMjE1XCI7XG4kZmEtdmFyLXNpdGVtYXA6IFwiXFxmMGU4XCI7XG4kZmEtdmFyLXNreWF0bGFzOiBcIlxcZjIxNlwiO1xuJGZhLXZhci1za3lwZTogXCJcXGYxN2VcIjtcbiRmYS12YXItc2xhY2s6IFwiXFxmMTk4XCI7XG4kZmEtdmFyLXNsaWRlcnM6IFwiXFxmMWRlXCI7XG4kZmEtdmFyLXNsaWRlc2hhcmU6IFwiXFxmMWU3XCI7XG4kZmEtdmFyLXNtaWxlLW86IFwiXFxmMTE4XCI7XG4kZmEtdmFyLXNvY2Nlci1iYWxsLW86IFwiXFxmMWUzXCI7XG4kZmEtdmFyLXNvcnQ6IFwiXFxmMGRjXCI7XG4kZmEtdmFyLXNvcnQtYWxwaGEtYXNjOiBcIlxcZjE1ZFwiO1xuJGZhLXZhci1zb3J0LWFscGhhLWRlc2M6IFwiXFxmMTVlXCI7XG4kZmEtdmFyLXNvcnQtYW1vdW50LWFzYzogXCJcXGYxNjBcIjtcbiRmYS12YXItc29ydC1hbW91bnQtZGVzYzogXCJcXGYxNjFcIjtcbiRmYS12YXItc29ydC1hc2M6IFwiXFxmMGRlXCI7XG4kZmEtdmFyLXNvcnQtZGVzYzogXCJcXGYwZGRcIjtcbiRmYS12YXItc29ydC1kb3duOiBcIlxcZjBkZFwiO1xuJGZhLXZhci1zb3J0LW51bWVyaWMtYXNjOiBcIlxcZjE2MlwiO1xuJGZhLXZhci1zb3J0LW51bWVyaWMtZGVzYzogXCJcXGYxNjNcIjtcbiRmYS12YXItc29ydC11cDogXCJcXGYwZGVcIjtcbiRmYS12YXItc291bmRjbG91ZDogXCJcXGYxYmVcIjtcbiRmYS12YXItc3BhY2Utc2h1dHRsZTogXCJcXGYxOTdcIjtcbiRmYS12YXItc3Bpbm5lcjogXCJcXGYxMTBcIjtcbiRmYS12YXItc3Bvb246IFwiXFxmMWIxXCI7XG4kZmEtdmFyLXNwb3RpZnk6IFwiXFxmMWJjXCI7XG4kZmEtdmFyLXNxdWFyZTogXCJcXGYwYzhcIjtcbiRmYS12YXItc3F1YXJlLW86IFwiXFxmMDk2XCI7XG4kZmEtdmFyLXN0YWNrLWV4Y2hhbmdlOiBcIlxcZjE4ZFwiO1xuJGZhLXZhci1zdGFjay1vdmVyZmxvdzogXCJcXGYxNmNcIjtcbiRmYS12YXItc3RhcjogXCJcXGYwMDVcIjtcbiRmYS12YXItc3Rhci1oYWxmOiBcIlxcZjA4OVwiO1xuJGZhLXZhci1zdGFyLWhhbGYtZW1wdHk6IFwiXFxmMTIzXCI7XG4kZmEtdmFyLXN0YXItaGFsZi1mdWxsOiBcIlxcZjEyM1wiO1xuJGZhLXZhci1zdGFyLWhhbGYtbzogXCJcXGYxMjNcIjtcbiRmYS12YXItc3Rhci1vOiBcIlxcZjAwNlwiO1xuJGZhLXZhci1zdGVhbTogXCJcXGYxYjZcIjtcbiRmYS12YXItc3RlYW0tc3F1YXJlOiBcIlxcZjFiN1wiO1xuJGZhLXZhci1zdGVwLWJhY2t3YXJkOiBcIlxcZjA0OFwiO1xuJGZhLXZhci1zdGVwLWZvcndhcmQ6IFwiXFxmMDUxXCI7XG4kZmEtdmFyLXN0ZXRob3Njb3BlOiBcIlxcZjBmMVwiO1xuJGZhLXZhci1zdG9wOiBcIlxcZjA0ZFwiO1xuJGZhLXZhci1zdHJlZXQtdmlldzogXCJcXGYyMWRcIjtcbiRmYS12YXItc3RyaWtldGhyb3VnaDogXCJcXGYwY2NcIjtcbiRmYS12YXItc3R1bWJsZXVwb246IFwiXFxmMWE0XCI7XG4kZmEtdmFyLXN0dW1ibGV1cG9uLWNpcmNsZTogXCJcXGYxYTNcIjtcbiRmYS12YXItc3Vic2NyaXB0OiBcIlxcZjEyY1wiO1xuJGZhLXZhci1zdWJ3YXk6IFwiXFxmMjM5XCI7XG4kZmEtdmFyLXN1aXRjYXNlOiBcIlxcZjBmMlwiO1xuJGZhLXZhci1zdW4tbzogXCJcXGYxODVcIjtcbiRmYS12YXItc3VwZXJzY3JpcHQ6IFwiXFxmMTJiXCI7XG4kZmEtdmFyLXN1cHBvcnQ6IFwiXFxmMWNkXCI7XG4kZmEtdmFyLXRhYmxlOiBcIlxcZjBjZVwiO1xuJGZhLXZhci10YWJsZXQ6IFwiXFxmMTBhXCI7XG4kZmEtdmFyLXRhY2hvbWV0ZXI6IFwiXFxmMGU0XCI7XG4kZmEtdmFyLXRhZzogXCJcXGYwMmJcIjtcbiRmYS12YXItdGFnczogXCJcXGYwMmNcIjtcbiRmYS12YXItdGFza3M6IFwiXFxmMGFlXCI7XG4kZmEtdmFyLXRheGk6IFwiXFxmMWJhXCI7XG4kZmEtdmFyLXRlbmNlbnQtd2VpYm86IFwiXFxmMWQ1XCI7XG4kZmEtdmFyLXRlcm1pbmFsOiBcIlxcZjEyMFwiO1xuJGZhLXZhci10ZXh0LWhlaWdodDogXCJcXGYwMzRcIjtcbiRmYS12YXItdGV4dC13aWR0aDogXCJcXGYwMzVcIjtcbiRmYS12YXItdGg6IFwiXFxmMDBhXCI7XG4kZmEtdmFyLXRoLWxhcmdlOiBcIlxcZjAwOVwiO1xuJGZhLXZhci10aC1saXN0OiBcIlxcZjAwYlwiO1xuJGZhLXZhci10aHVtYi10YWNrOiBcIlxcZjA4ZFwiO1xuJGZhLXZhci10aHVtYnMtZG93bjogXCJcXGYxNjVcIjtcbiRmYS12YXItdGh1bWJzLW8tZG93bjogXCJcXGYwODhcIjtcbiRmYS12YXItdGh1bWJzLW8tdXA6IFwiXFxmMDg3XCI7XG4kZmEtdmFyLXRodW1icy11cDogXCJcXGYxNjRcIjtcbiRmYS12YXItdGlja2V0OiBcIlxcZjE0NVwiO1xuJGZhLXZhci10aW1lczogXCJcXGYwMGRcIjtcbiRmYS12YXItdGltZXMtY2lyY2xlOiBcIlxcZjA1N1wiO1xuJGZhLXZhci10aW1lcy1jaXJjbGUtbzogXCJcXGYwNWNcIjtcbiRmYS12YXItdGludDogXCJcXGYwNDNcIjtcbiRmYS12YXItdG9nZ2xlLWRvd246IFwiXFxmMTUwXCI7XG4kZmEtdmFyLXRvZ2dsZS1sZWZ0OiBcIlxcZjE5MVwiO1xuJGZhLXZhci10b2dnbGUtb2ZmOiBcIlxcZjIwNFwiO1xuJGZhLXZhci10b2dnbGUtb246IFwiXFxmMjA1XCI7XG4kZmEtdmFyLXRvZ2dsZS1yaWdodDogXCJcXGYxNTJcIjtcbiRmYS12YXItdG9nZ2xlLXVwOiBcIlxcZjE1MVwiO1xuJGZhLXZhci10cmFpbjogXCJcXGYyMzhcIjtcbiRmYS12YXItdHJhbnNnZW5kZXI6IFwiXFxmMjI0XCI7XG4kZmEtdmFyLXRyYW5zZ2VuZGVyLWFsdDogXCJcXGYyMjVcIjtcbiRmYS12YXItdHJhc2g6IFwiXFxmMWY4XCI7XG4kZmEtdmFyLXRyYXNoLW86IFwiXFxmMDE0XCI7XG4kZmEtdmFyLXRyZWU6IFwiXFxmMWJiXCI7XG4kZmEtdmFyLXRyZWxsbzogXCJcXGYxODFcIjtcbiRmYS12YXItdHJvcGh5OiBcIlxcZjA5MVwiO1xuJGZhLXZhci10cnVjazogXCJcXGYwZDFcIjtcbiRmYS12YXItdHJ5OiBcIlxcZjE5NVwiO1xuJGZhLXZhci10dHk6IFwiXFxmMWU0XCI7XG4kZmEtdmFyLXR1bWJscjogXCJcXGYxNzNcIjtcbiRmYS12YXItdHVtYmxyLXNxdWFyZTogXCJcXGYxNzRcIjtcbiRmYS12YXItdHVya2lzaC1saXJhOiBcIlxcZjE5NVwiO1xuJGZhLXZhci10d2l0Y2g6IFwiXFxmMWU4XCI7XG4kZmEtdmFyLXR3aXR0ZXI6IFwiXFxmMDk5XCI7XG4kZmEtdmFyLXR3aXR0ZXItc3F1YXJlOiBcIlxcZjA4MVwiO1xuJGZhLXZhci11bWJyZWxsYTogXCJcXGYwZTlcIjtcbiRmYS12YXItdW5kZXJsaW5lOiBcIlxcZjBjZFwiO1xuJGZhLXZhci11bmRvOiBcIlxcZjBlMlwiO1xuJGZhLXZhci11bml2ZXJzaXR5OiBcIlxcZjE5Y1wiO1xuJGZhLXZhci11bmxpbms6IFwiXFxmMTI3XCI7XG4kZmEtdmFyLXVubG9jazogXCJcXGYwOWNcIjtcbiRmYS12YXItdW5sb2NrLWFsdDogXCJcXGYxM2VcIjtcbiRmYS12YXItdW5zb3J0ZWQ6IFwiXFxmMGRjXCI7XG4kZmEtdmFyLXVwbG9hZDogXCJcXGYwOTNcIjtcbiRmYS12YXItdXNkOiBcIlxcZjE1NVwiO1xuJGZhLXZhci11c2VyOiBcIlxcZjAwN1wiO1xuJGZhLXZhci11c2VyLW1kOiBcIlxcZjBmMFwiO1xuJGZhLXZhci11c2VyLXBsdXM6IFwiXFxmMjM0XCI7XG4kZmEtdmFyLXVzZXItc2VjcmV0OiBcIlxcZjIxYlwiO1xuJGZhLXZhci11c2VyLXRpbWVzOiBcIlxcZjIzNVwiO1xuJGZhLXZhci11c2VyczogXCJcXGYwYzBcIjtcbiRmYS12YXItdmVudXM6IFwiXFxmMjIxXCI7XG4kZmEtdmFyLXZlbnVzLWRvdWJsZTogXCJcXGYyMjZcIjtcbiRmYS12YXItdmVudXMtbWFyczogXCJcXGYyMjhcIjtcbiRmYS12YXItdmlhY29pbjogXCJcXGYyMzdcIjtcbiRmYS12YXItdmlkZW8tY2FtZXJhOiBcIlxcZjAzZFwiO1xuJGZhLXZhci12aW1lby1zcXVhcmU6IFwiXFxmMTk0XCI7XG4kZmEtdmFyLXZpbmU6IFwiXFxmMWNhXCI7XG4kZmEtdmFyLXZrOiBcIlxcZjE4OVwiO1xuJGZhLXZhci12b2x1bWUtZG93bjogXCJcXGYwMjdcIjtcbiRmYS12YXItdm9sdW1lLW9mZjogXCJcXGYwMjZcIjtcbiRmYS12YXItdm9sdW1lLXVwOiBcIlxcZjAyOFwiO1xuJGZhLXZhci13YXJuaW5nOiBcIlxcZjA3MVwiO1xuJGZhLXZhci13ZWNoYXQ6IFwiXFxmMWQ3XCI7XG4kZmEtdmFyLXdlaWJvOiBcIlxcZjE4YVwiO1xuJGZhLXZhci13ZWl4aW46IFwiXFxmMWQ3XCI7XG4kZmEtdmFyLXdoYXRzYXBwOiBcIlxcZjIzMlwiO1xuJGZhLXZhci13aGVlbGNoYWlyOiBcIlxcZjE5M1wiO1xuJGZhLXZhci13aWZpOiBcIlxcZjFlYlwiO1xuJGZhLXZhci13aW5kb3dzOiBcIlxcZjE3YVwiO1xuJGZhLXZhci13b246IFwiXFxmMTU5XCI7XG4kZmEtdmFyLXdvcmRwcmVzczogXCJcXGYxOWFcIjtcbiRmYS12YXItd3JlbmNoOiBcIlxcZjBhZFwiO1xuJGZhLXZhci14aW5nOiBcIlxcZjE2OFwiO1xuJGZhLXZhci14aW5nLXNxdWFyZTogXCJcXGYxNjlcIjtcbiRmYS12YXIteWFob286IFwiXFxmMTllXCI7XG4kZmEtdmFyLXllbHA6IFwiXFxmMWU5XCI7XG4kZmEtdmFyLXllbjogXCJcXGYxNTdcIjtcbiRmYS12YXIteW91dHViZTogXCJcXGYxNjdcIjtcbiRmYS12YXIteW91dHViZS1wbGF5OiBcIlxcZjE2YVwiO1xuJGZhLXZhci15b3V0dWJlLXNxdWFyZTogXCJcXGYxNjZcIjtcblxuIiwiLy8gQm9yZGVyZWQgJiBQdWxsZWRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLiN7JGZhLWNzcy1wcmVmaXh9LWJvcmRlciB7XG4gIHBhZGRpbmc6IC4yZW0gLjI1ZW0gLjE1ZW07XG4gIGJvcmRlcjogc29saWQgLjA4ZW0gJGZhLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogLjFlbTtcbn1cblxuLnB1bGwtcmlnaHQgeyBmbG9hdDogcmlnaHQ7IH1cbi5wdWxsLWxlZnQgeyBmbG9hdDogbGVmdDsgfVxuXG4uI3skZmEtY3NzLXByZWZpeH0ge1xuICAmLnB1bGwtbGVmdCB7IG1hcmdpbi1yaWdodDogLjNlbTsgfVxuICAmLnB1bGwtcmlnaHQgeyBtYXJnaW4tbGVmdDogLjNlbTsgfVxufVxuIiwiLy8gU3Bpbm5pbmcgSWNvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi4jeyRmYS1jc3MtcHJlZml4fS1zcGluIHtcbiAgLXdlYmtpdC1hbmltYXRpb246IGZhLXNwaW4gMnMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgIGFuaW1hdGlvbjogZmEtc3BpbiAycyBpbmZpbml0ZSBsaW5lYXI7XG59XG5cbi4jeyRmYS1jc3MtcHJlZml4fS1wdWxzZSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBmYS1zcGluIDFzIGluZmluaXRlIHN0ZXBzKDgpO1xuICAgICAgICAgIGFuaW1hdGlvbjogZmEtc3BpbiAxcyBpbmZpbml0ZSBzdGVwcyg4KTtcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGZhLXNwaW4ge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzU5ZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBmYS1zcGluIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpO1xuICB9XG59XG4iLCIvLyBSb3RhdGVkICYgRmxpcHBlZCBJY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uI3skZmEtY3NzLXByZWZpeH0tcm90YXRlLTkwICB7IEBpbmNsdWRlIGZhLWljb24tcm90YXRlKDkwZGVnLCAxKTsgIH1cbi4jeyRmYS1jc3MtcHJlZml4fS1yb3RhdGUtMTgwIHsgQGluY2x1ZGUgZmEtaWNvbi1yb3RhdGUoMTgwZGVnLCAyKTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJvdGF0ZS0yNzAgeyBAaW5jbHVkZSBmYS1pY29uLXJvdGF0ZSgyNzBkZWcsIDMpOyB9XG5cbi4jeyRmYS1jc3MtcHJlZml4fS1mbGlwLWhvcml6b250YWwgeyBAaW5jbHVkZSBmYS1pY29uLWZsaXAoLTEsIDEsIDApOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmxpcC12ZXJ0aWNhbCAgIHsgQGluY2x1ZGUgZmEtaWNvbi1mbGlwKDEsIC0xLCAyKTsgfVxuXG4vLyBIb29rIGZvciBJRTgtOVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG46cm9vdCAuI3skZmEtY3NzLXByZWZpeH0tcm90YXRlLTkwLFxuOnJvb3QgLiN7JGZhLWNzcy1wcmVmaXh9LXJvdGF0ZS0xODAsXG46cm9vdCAuI3skZmEtY3NzLXByZWZpeH0tcm90YXRlLTI3MCxcbjpyb290IC4jeyRmYS1jc3MtcHJlZml4fS1mbGlwLWhvcml6b250YWwsXG46cm9vdCAuI3skZmEtY3NzLXByZWZpeH0tZmxpcC12ZXJ0aWNhbCB7XG4gIGZpbHRlcjogbm9uZTtcbn1cbiIsIi8vIE1peGluc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuQG1peGluIGZhLWljb24oKSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgI3skZmEtZm9udC1zaXplLWJhc2V9LzEgRm9udEF3ZXNvbWU7IC8vIHNob3J0ZW5pbmcgZm9udCBkZWNsYXJhdGlvblxuICBmb250LXNpemU6IGluaGVyaXQ7IC8vIGNhbid0IGhhdmUgZm9udC1zaXplIGluaGVyaXQgb24gbGluZSBhYm92ZSwgc28gbmVlZCB0byBvdmVycmlkZVxuICB0ZXh0LXJlbmRlcmluZzogYXV0bzsgLy8gb3B0aW1pemVsZWdpYmlsaXR5IHRocm93cyB0aGluZ3Mgb2ZmICMxMDk0XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsgLy8gZW5zdXJlcyBubyBoYWxmLXBpeGVsIHJlbmRlcmluZyBpbiBmaXJlZm94XG5cbn1cblxuQG1peGluIGZhLWljb24tcm90YXRlKCRkZWdyZWVzLCAkcm90YXRpb24pIHtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0jeyRyb3RhdGlvbn0pO1xuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKCRkZWdyZWVzKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgkZGVncmVlcyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoJGRlZ3JlZXMpO1xufVxuXG5AbWl4aW4gZmEtaWNvbi1mbGlwKCRob3JpeiwgJHZlcnQsICRyb3RhdGlvbikge1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPSN7JHJvdGF0aW9ufSk7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgkaG9yaXosICR2ZXJ0KTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKCRob3JpeiwgJHZlcnQpO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoJGhvcml6LCAkdmVydCk7XG59XG4iLCIvLyBTdGFja2VkIEljb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi4jeyRmYS1jc3MtcHJlZml4fS1zdGFjayB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMmVtO1xuICBoZWlnaHQ6IDJlbTtcbiAgbGluZS1oZWlnaHQ6IDJlbTtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdGFjay0xeCwgLiN7JGZhLWNzcy1wcmVmaXh9LXN0YWNrLTJ4IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLiN7JGZhLWNzcy1wcmVmaXh9LXN0YWNrLTF4IHsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdGFjay0yeCB7IGZvbnQtc2l6ZTogMmVtOyB9XG4uI3skZmEtY3NzLXByZWZpeH0taW52ZXJzZSB7IGNvbG9yOiAkZmEtaW52ZXJzZTsgfVxuIiwiLyogRm9udCBBd2Vzb21lIHVzZXMgdGhlIFVuaWNvZGUgUHJpdmF0ZSBVc2UgQXJlYSAoUFVBKSB0byBlbnN1cmUgc2NyZWVuXG4gICByZWFkZXJzIGRvIG5vdCByZWFkIG9mZiByYW5kb20gY2hhcmFjdGVycyB0aGF0IHJlcHJlc2VudCBpY29ucyAqL1xuXG4uI3skZmEtY3NzLXByZWZpeH0tZ2xhc3M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1nbGFzczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW11c2ljOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbXVzaWM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zZWFyY2g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zZWFyY2g7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1lbnZlbG9wZS1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZW52ZWxvcGUtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWhlYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaGVhcnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdGFyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3RhcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXN0YXItbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXN0YXItbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXVzZXI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci11c2VyOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlsbTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZpbG07IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10aC1sYXJnZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRoLWxhcmdlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdGg6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10aDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRoLWxpc3Q6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10aC1saXN0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2hlY2s6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jaGVjazsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJlbW92ZTpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tY2xvc2U6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXRpbWVzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGltZXM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zZWFyY2gtcGx1czpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNlYXJjaC1wbHVzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2VhcmNoLW1pbnVzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2VhcmNoLW1pbnVzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcG93ZXItb2ZmOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcG93ZXItb2ZmOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2lnbmFsOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2lnbmFsOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZ2VhcjpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tY29nOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY29nOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHJhc2gtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRyYXNoLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1ob21lOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaG9tZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZpbGUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZpbGUtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNsb2NrLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jbG9jay1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcm9hZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJvYWQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1kb3dubG9hZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWRvd25sb2FkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3ctY2lyY2xlLW8tZG93bjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFycm93LWNpcmNsZS1vLWRvd247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hcnJvdy1jaXJjbGUtby11cDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFycm93LWNpcmNsZS1vLXVwOyB9XG4uI3skZmEtY3NzLXByZWZpeH0taW5ib3g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1pbmJveDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBsYXktY2lyY2xlLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wbGF5LWNpcmNsZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcm90YXRlLXJpZ2h0OmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1yZXBlYXQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1yZXBlYXQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1yZWZyZXNoOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcmVmcmVzaDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxpc3QtYWx0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbGlzdC1hbHQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1sb2NrOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbG9jazsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZsYWc6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1mbGFnOyB9XG4uI3skZmEtY3NzLXByZWZpeH0taGVhZHBob25lczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWhlYWRwaG9uZXM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS12b2x1bWUtb2ZmOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdm9sdW1lLW9mZjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXZvbHVtZS1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdm9sdW1lLWRvd247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS12b2x1bWUtdXA6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci12b2x1bWUtdXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1xcmNvZGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1xcmNvZGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1iYXJjb2RlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYmFyY29kZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRhZzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRhZzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRhZ3M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10YWdzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYm9vazpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJvb2s7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1ib29rbWFyazpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJvb2ttYXJrOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcHJpbnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wcmludDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhbWVyYTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhbWVyYTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZvbnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1mb250OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYm9sZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJvbGQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1pdGFsaWM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1pdGFsaWM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10ZXh0LWhlaWdodDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRleHQtaGVpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdGV4dC13aWR0aDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRleHQtd2lkdGg7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hbGlnbi1sZWZ0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYWxpZ24tbGVmdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFsaWduLWNlbnRlcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFsaWduLWNlbnRlcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFsaWduLXJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYWxpZ24tcmlnaHQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hbGlnbi1qdXN0aWZ5OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYWxpZ24tanVzdGlmeTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxpc3Q6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1saXN0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZGVkZW50OmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1vdXRkZW50OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItb3V0ZGVudDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWluZGVudDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWluZGVudDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXZpZGVvLWNhbWVyYTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXZpZGVvLWNhbWVyYTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBob3RvOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1pbWFnZTpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tcGljdHVyZS1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGljdHVyZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGVuY2lsOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGVuY2lsOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWFwLW1hcmtlcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1hcC1tYXJrZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hZGp1c3Q6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hZGp1c3Q7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10aW50OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGludDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWVkaXQ6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXBlbmNpbC1zcXVhcmUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXBlbmNpbC1zcXVhcmUtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNoYXJlLXNxdWFyZS1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2hhcmUtc3F1YXJlLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jaGVjay1zcXVhcmUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNoZWNrLXNxdWFyZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3dzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYXJyb3dzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3RlcC1iYWNrd2FyZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXN0ZXAtYmFja3dhcmQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mYXN0LWJhY2t3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmFzdC1iYWNrd2FyZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJhY2t3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYmFja3dhcmQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1wbGF5OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGxheTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBhdXNlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGF1c2U7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdG9wOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3RvcDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1mb3J3YXJkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmFzdC1mb3J3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmFzdC1mb3J3YXJkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3RlcC1mb3J3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3RlcC1mb3J3YXJkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZWplY3Q6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1lamVjdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoZXZyb24tbGVmdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNoZXZyb24tbGVmdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoZXZyb24tcmlnaHQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jaGV2cm9uLXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGx1cy1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wbHVzLWNpcmNsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW1pbnVzLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1pbnVzLWNpcmNsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRpbWVzLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRpbWVzLWNpcmNsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoZWNrLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNoZWNrLWNpcmNsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXF1ZXN0aW9uLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXF1ZXN0aW9uLWNpcmNsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWluZm8tY2lyY2xlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaW5mby1jaXJjbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jcm9zc2hhaXJzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY3Jvc3NoYWlyczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRpbWVzLWNpcmNsZS1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGltZXMtY2lyY2xlLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jaGVjay1jaXJjbGUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNoZWNrLWNpcmNsZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYmFuOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYmFuOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3ctbGVmdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFycm93LWxlZnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hcnJvdy1yaWdodDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFycm93LXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3ctdXA6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcnJvdy11cDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFycm93LWRvd246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcnJvdy1kb3duOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWFpbC1mb3J3YXJkOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1zaGFyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNoYXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZXhwYW5kOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZXhwYW5kOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY29tcHJlc3M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb21wcmVzczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBsdXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wbHVzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWludXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1taW51czsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFzdGVyaXNrOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYXN0ZXJpc2s7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1leGNsYW1hdGlvbi1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1leGNsYW1hdGlvbi1jaXJjbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1naWZ0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZ2lmdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxlYWY6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1sZWFmOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZpcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1leWU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1leWU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1leWUtc2xhc2g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1leWUtc2xhc2g7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS13YXJuaW5nOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1leGNsYW1hdGlvbi10cmlhbmdsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGxhbmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wbGFuZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhbGVuZGFyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2FsZW5kYXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1yYW5kb206YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1yYW5kb207IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jb21tZW50OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY29tbWVudDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW1hZ25ldDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1hZ25ldDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoZXZyb24tdXA6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jaGV2cm9uLXVwOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2hldnJvbi1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2hldnJvbi1kb3duOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcmV0d2VldDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJldHdlZXQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zaG9wcGluZy1jYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2hvcHBpbmctY2FydDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZvbGRlcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZvbGRlcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZvbGRlci1vcGVuOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZm9sZGVyLW9wZW47IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hcnJvd3MtdjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFycm93cy12OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3dzLWg6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcnJvd3MtaDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJhci1jaGFydC1vOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1iYXItY2hhcnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iYXItY2hhcnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10d2l0dGVyLXNxdWFyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXR3aXR0ZXItc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmFjZWJvb2stc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmFjZWJvb2stc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2FtZXJhLXJldHJvOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2FtZXJhLXJldHJvOyB9XG4uI3skZmEtY3NzLXByZWZpeH0ta2V5OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXIta2V5OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZ2VhcnM6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNvZ3M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb2dzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY29tbWVudHM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb21tZW50czsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRodW1icy1vLXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGh1bWJzLW8tdXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10aHVtYnMtby1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGh1bWJzLW8tZG93bjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXN0YXItaGFsZjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXN0YXItaGFsZjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWhlYXJ0LW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1oZWFydC1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2lnbi1vdXQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zaWduLW91dDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxpbmtlZGluLXNxdWFyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWxpbmtlZGluLXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRodW1iLXRhY2s6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10aHVtYi10YWNrOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZXh0ZXJuYWwtbGluazpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWV4dGVybmFsLWxpbms7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zaWduLWluOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2lnbi1pbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRyb3BoeTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRyb3BoeTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdpdGh1Yi1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1naXRodWItc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdXBsb2FkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdXBsb2FkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbGVtb24tbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWxlbW9uLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1waG9uZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXBob25lOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3F1YXJlLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zcXVhcmUtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJvb2ttYXJrLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1ib29rbWFyay1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGhvbmUtc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGhvbmUtc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHdpdHRlcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXR3aXR0ZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mYWNlYm9vay1mOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1mYWNlYm9vazpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZhY2Vib29rOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZ2l0aHViOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZ2l0aHViOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdW5sb2NrOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdW5sb2NrOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY3JlZGl0LWNhcmQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jcmVkaXQtY2FyZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJzczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJzczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWhkZC1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaGRkLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1idWxsaG9ybjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJ1bGxob3JuOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYmVsbDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJlbGw7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jZXJ0aWZpY2F0ZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNlcnRpZmljYXRlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0taGFuZC1vLXJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaGFuZC1vLXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0taGFuZC1vLWxlZnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1oYW5kLW8tbGVmdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWhhbmQtby11cDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWhhbmQtby11cDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWhhbmQtby1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaGFuZC1vLWRvd247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hcnJvdy1jaXJjbGUtbGVmdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFycm93LWNpcmNsZS1sZWZ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3ctY2lyY2xlLXJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYXJyb3ctY2lyY2xlLXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3ctY2lyY2xlLXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYXJyb3ctY2lyY2xlLXVwOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3ctY2lyY2xlLWRvd246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcnJvdy1jaXJjbGUtZG93bjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdsb2JlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZ2xvYmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS13cmVuY2g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci13cmVuY2g7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10YXNrczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRhc2tzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlsdGVyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmlsdGVyOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYnJpZWZjYXNlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYnJpZWZjYXNlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3dzLWFsdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFycm93cy1hbHQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1ncm91cDpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tdXNlcnM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci11c2VyczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoYWluOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1saW5rOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbGluazsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNsb3VkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2xvdWQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mbGFzazpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZsYXNrOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY3V0OmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1zY2lzc29yczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNjaXNzb3JzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY29weTpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZXMtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZpbGVzLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1wYXBlcmNsaXA6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wYXBlcmNsaXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zYXZlOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1mbG9wcHktbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZsb3BweS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbmF2aWNvbjpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tcmVvcmRlcjpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tYmFyczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJhcnM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1saXN0LXVsOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbGlzdC11bDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxpc3Qtb2w6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1saXN0LW9sOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3RyaWtldGhyb3VnaDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXN0cmlrZXRocm91Z2g7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS11bmRlcmxpbmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci11bmRlcmxpbmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10YWJsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRhYmxlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWFnaWM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tYWdpYzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRydWNrOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdHJ1Y2s7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1waW50ZXJlc3Q6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1waW50ZXJlc3Q7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1waW50ZXJlc3Qtc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGludGVyZXN0LXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdvb2dsZS1wbHVzLXNxdWFyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWdvb2dsZS1wbHVzLXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdvb2dsZS1wbHVzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZ29vZ2xlLXBsdXM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1tb25leTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1vbmV5OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2FyZXQtZG93bjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcmV0LWRvd247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jYXJldC11cDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcmV0LXVwOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2FyZXQtbGVmdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcmV0LWxlZnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jYXJldC1yaWdodDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcmV0LXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY29sdW1uczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNvbHVtbnM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS11bnNvcnRlZDpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tc29ydDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNvcnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zb3J0LWRvd246YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXNvcnQtZGVzYzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNvcnQtZGVzYzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNvcnQtdXA6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXNvcnQtYXNjOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc29ydC1hc2M7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1lbnZlbG9wZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWVudmVsb3BlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbGlua2VkaW46YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1saW5rZWRpbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJvdGF0ZS1sZWZ0OmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS11bmRvOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdW5kbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxlZ2FsOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1nYXZlbDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWdhdmVsOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZGFzaGJvYXJkOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS10YWNob21ldGVyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGFjaG9tZXRlcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNvbW1lbnQtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNvbW1lbnQtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNvbW1lbnRzLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb21tZW50cy1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmxhc2g6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWJvbHQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1ib2x0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2l0ZW1hcDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNpdGVtYXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS11bWJyZWxsYTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXVtYnJlbGxhOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGFzdGU6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNsaXBib2FyZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNsaXBib2FyZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxpZ2h0YnVsYi1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbGlnaHRidWxiLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1leGNoYW5nZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWV4Y2hhbmdlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2xvdWQtZG93bmxvYWQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jbG91ZC1kb3dubG9hZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNsb3VkLXVwbG9hZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNsb3VkLXVwbG9hZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXVzZXItbWQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci11c2VyLW1kOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3RldGhvc2NvcGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zdGV0aG9zY29wZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXN1aXRjYXNlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3VpdGNhc2U7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1iZWxsLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iZWxsLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jb2ZmZWU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb2ZmZWU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jdXRsZXJ5OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY3V0bGVyeTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZpbGUtdGV4dC1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmlsZS10ZXh0LW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1idWlsZGluZy1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYnVpbGRpbmctbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWhvc3BpdGFsLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1ob3NwaXRhbC1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYW1idWxhbmNlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYW1idWxhbmNlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWVka2l0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbWVka2l0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlnaHRlci1qZXQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1maWdodGVyLWpldDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJlZXI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iZWVyOyB9XG4uI3skZmEtY3NzLXByZWZpeH0taC1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1oLXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBsdXMtc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGx1cy1zcXVhcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hbmdsZS1kb3VibGUtbGVmdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFuZ2xlLWRvdWJsZS1sZWZ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYW5nbGUtZG91YmxlLXJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYW5nbGUtZG91YmxlLXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYW5nbGUtZG91YmxlLXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYW5nbGUtZG91YmxlLXVwOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYW5nbGUtZG91YmxlLWRvd246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hbmdsZS1kb3VibGUtZG93bjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFuZ2xlLWxlZnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hbmdsZS1sZWZ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYW5nbGUtcmlnaHQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hbmdsZS1yaWdodDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFuZ2xlLXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYW5nbGUtdXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1hbmdsZS1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYW5nbGUtZG93bjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWRlc2t0b3A6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1kZXNrdG9wOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbGFwdG9wOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbGFwdG9wOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdGFibGV0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGFibGV0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbW9iaWxlLXBob25lOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1tb2JpbGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tb2JpbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jaXJjbGUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNpcmNsZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcXVvdGUtbGVmdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXF1b3RlLWxlZnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1xdW90ZS1yaWdodDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXF1b3RlLXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3Bpbm5lcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNwaW5uZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jaXJjbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1tYWlsLXJlcGx5OmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1yZXBseTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJlcGx5OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZ2l0aHViLWFsdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWdpdGh1Yi1hbHQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mb2xkZXItbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZvbGRlci1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZm9sZGVyLW9wZW4tbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZvbGRlci1vcGVuLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zbWlsZS1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc21pbGUtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZyb3duLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1mcm93bi1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWVoLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tZWgtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdhbWVwYWQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1nYW1lcGFkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0ta2V5Ym9hcmQtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWtleWJvYXJkLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mbGFnLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1mbGFnLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mbGFnLWNoZWNrZXJlZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZsYWctY2hlY2tlcmVkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdGVybWluYWw6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10ZXJtaW5hbDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNvZGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb2RlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWFpbC1yZXBseS1hbGw6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXJlcGx5LWFsbDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJlcGx5LWFsbDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXN0YXItaGFsZi1lbXB0eTpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tc3Rhci1oYWxmLWZ1bGw6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXN0YXItaGFsZi1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3Rhci1oYWxmLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1sb2NhdGlvbi1hcnJvdzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWxvY2F0aW9uLWFycm93OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY3JvcDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNyb3A7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jb2RlLWZvcms6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb2RlLWZvcms7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS11bmxpbms6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoYWluLWJyb2tlbjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNoYWluLWJyb2tlbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXF1ZXN0aW9uOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcXVlc3Rpb247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1pbmZvOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaW5mbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWV4Y2xhbWF0aW9uOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZXhjbGFtYXRpb247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdXBlcnNjcmlwdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXN1cGVyc2NyaXB0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3Vic2NyaXB0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3Vic2NyaXB0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZXJhc2VyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZXJhc2VyOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcHV6emxlLXBpZWNlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcHV6emxlLXBpZWNlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWljcm9waG9uZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1pY3JvcGhvbmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1taWNyb3Bob25lLXNsYXNoOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbWljcm9waG9uZS1zbGFzaDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNoaWVsZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNoaWVsZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhbGVuZGFyLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jYWxlbmRhci1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlyZS1leHRpbmd1aXNoZXI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1maXJlLWV4dGluZ3Vpc2hlcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJvY2tldDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJvY2tldDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW1heGNkbjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1heGNkbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoZXZyb24tY2lyY2xlLWxlZnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jaGV2cm9uLWNpcmNsZS1sZWZ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2hldnJvbi1jaXJjbGUtcmlnaHQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jaGV2cm9uLWNpcmNsZS1yaWdodDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNoZXZyb24tY2lyY2xlLXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2hldnJvbi1jaXJjbGUtdXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jaGV2cm9uLWNpcmNsZS1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2hldnJvbi1jaXJjbGUtZG93bjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWh0bWw1OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaHRtbDU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jc3MzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY3NzMzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFuY2hvcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFuY2hvcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXVubG9jay1hbHQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci11bmxvY2stYWx0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYnVsbHNleWU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1idWxsc2V5ZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWVsbGlwc2lzLWg6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1lbGxpcHNpcy1oOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZWxsaXBzaXMtdjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWVsbGlwc2lzLXY7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1yc3Mtc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcnNzLXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBsYXktY2lyY2xlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGxheS1jaXJjbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10aWNrZXQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10aWNrZXQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1taW51cy1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1taW51cy1zcXVhcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1taW51cy1zcXVhcmUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1pbnVzLXNxdWFyZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbGV2ZWwtdXA6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1sZXZlbC11cDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxldmVsLWRvd246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1sZXZlbC1kb3duOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2hlY2stc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2hlY2stc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGVuY2lsLXNxdWFyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXBlbmNpbC1zcXVhcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1leHRlcm5hbC1saW5rLXNxdWFyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWV4dGVybmFsLWxpbmstc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2hhcmUtc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2hhcmUtc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY29tcGFzczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNvbXBhc3M7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10b2dnbGUtZG93bjpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tY2FyZXQtc3F1YXJlLW8tZG93bjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcmV0LXNxdWFyZS1vLWRvd247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10b2dnbGUtdXA6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhcmV0LXNxdWFyZS1vLXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2FyZXQtc3F1YXJlLW8tdXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10b2dnbGUtcmlnaHQ6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhcmV0LXNxdWFyZS1vLXJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2FyZXQtc3F1YXJlLW8tcmlnaHQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1ldXJvOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1ldXI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1ldXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1nYnA6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1nYnA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1kb2xsYXI6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXVzZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXVzZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJ1cGVlOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1pbnI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1pbnI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jbnk6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXJtYjpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0teWVuOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1qcHk6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1qcHk7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1ydWJsZTpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tcm91YmxlOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1ydWI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1ydWI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS13b246YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWtydzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWtydzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJpdGNvaW46YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWJ0YzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJ0YzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZpbGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1maWxlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZS10ZXh0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmlsZS10ZXh0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc29ydC1hbHBoYS1hc2M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zb3J0LWFscGhhLWFzYzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNvcnQtYWxwaGEtZGVzYzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNvcnQtYWxwaGEtZGVzYzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNvcnQtYW1vdW50LWFzYzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNvcnQtYW1vdW50LWFzYzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNvcnQtYW1vdW50LWRlc2M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zb3J0LWFtb3VudC1kZXNjOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc29ydC1udW1lcmljLWFzYzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNvcnQtbnVtZXJpYy1hc2M7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zb3J0LW51bWVyaWMtZGVzYzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNvcnQtbnVtZXJpYy1kZXNjOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdGh1bWJzLXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdGh1bWJzLXVwOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdGh1bWJzLWRvd246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10aHVtYnMtZG93bjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXlvdXR1YmUtc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXIteW91dHViZS1zcXVhcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS15b3V0dWJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXIteW91dHViZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXhpbmc6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci14aW5nOyB9XG4uI3skZmEtY3NzLXByZWZpeH0teGluZy1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci14aW5nLXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXlvdXR1YmUtcGxheTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXlvdXR1YmUtcGxheTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWRyb3Bib3g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1kcm9wYm94OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3RhY2stb3ZlcmZsb3c6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zdGFjay1vdmVyZmxvdzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWluc3RhZ3JhbTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWluc3RhZ3JhbTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZsaWNrcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZsaWNrcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFkbjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFkbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJpdGJ1Y2tldDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJpdGJ1Y2tldDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJpdGJ1Y2tldC1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iaXRidWNrZXQtc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHVtYmxyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdHVtYmxyOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHVtYmxyLXNxdWFyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXR1bWJsci1zcXVhcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1sb25nLWFycm93LWRvd246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1sb25nLWFycm93LWRvd247IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1sb25nLWFycm93LXVwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbG9uZy1hcnJvdy11cDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxvbmctYXJyb3ctbGVmdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWxvbmctYXJyb3ctbGVmdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWxvbmctYXJyb3ctcmlnaHQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1sb25nLWFycm93LXJpZ2h0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXBwbGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcHBsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXdpbmRvd3M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci13aW5kb3dzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYW5kcm9pZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFuZHJvaWQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1saW51eDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWxpbnV4OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZHJpYmJibGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1kcmliYmJsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNreXBlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2t5cGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mb3Vyc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZm91cnNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRyZWxsbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRyZWxsbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZlbWFsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZlbWFsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW1hbGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tYWxlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZ2l0dGlwOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1ncmF0aXBheTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWdyYXRpcGF5OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3VuLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zdW4tbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW1vb24tbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1vb24tbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFyY2hpdmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcmNoaXZlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYnVnOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYnVnOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdms6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci12azsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXdlaWJvOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItd2VpYm87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1yZW5yZW46YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1yZW5yZW47IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1wYWdlbGluZXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wYWdlbGluZXM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdGFjay1leGNoYW5nZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXN0YWNrLWV4Y2hhbmdlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYXJyb3ctY2lyY2xlLW8tcmlnaHQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcnJvdy1jaXJjbGUtby1yaWdodDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFycm93LWNpcmNsZS1vLWxlZnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcnJvdy1jaXJjbGUtby1sZWZ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdG9nZ2xlLWxlZnQ6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhcmV0LXNxdWFyZS1vLWxlZnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jYXJldC1zcXVhcmUtby1sZWZ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZG90LWNpcmNsZS1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZG90LWNpcmNsZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0td2hlZWxjaGFpcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXdoZWVsY2hhaXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS12aW1lby1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci12aW1lby1zcXVhcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10dXJraXNoLWxpcmE6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXRyeTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRyeTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBsdXMtc3F1YXJlLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wbHVzLXNxdWFyZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3BhY2Utc2h1dHRsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNwYWNlLXNodXR0bGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zbGFjazpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNsYWNrOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZW52ZWxvcGUtc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZW52ZWxvcGUtc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0td29yZHByZXNzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItd29yZHByZXNzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tb3BlbmlkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItb3BlbmlkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0taW5zdGl0dXRpb246YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWJhbms6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXVuaXZlcnNpdHk6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci11bml2ZXJzaXR5OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbW9ydGFyLWJvYXJkOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1ncmFkdWF0aW9uLWNhcDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWdyYWR1YXRpb24tY2FwOyB9XG4uI3skZmEtY3NzLXByZWZpeH0teWFob286YmVmb3JlIHsgY29udGVudDogJGZhLXZhci15YWhvbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdvb2dsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWdvb2dsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJlZGRpdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJlZGRpdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJlZGRpdC1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1yZWRkaXQtc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3R1bWJsZXVwb24tY2lyY2xlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3R1bWJsZXVwb24tY2lyY2xlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3R1bWJsZXVwb246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zdHVtYmxldXBvbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWRlbGljaW91czpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWRlbGljaW91czsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWRpZ2c6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1kaWdnOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGllZC1waXBlcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXBpZWQtcGlwZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1waWVkLXBpcGVyLWFsdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXBpZWQtcGlwZXItYWx0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZHJ1cGFsOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZHJ1cGFsOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tam9vbWxhOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItam9vbWxhOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbGFuZ3VhZ2U6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1sYW5ndWFnZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZheDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZheDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJ1aWxkaW5nOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYnVpbGRpbmc7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jaGlsZDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNoaWxkOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGF3OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGF3OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc3Bvb246YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zcG9vbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWN1YmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jdWJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY3ViZXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jdWJlczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJlaGFuY2U6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iZWhhbmNlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYmVoYW5jZS1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iZWhhbmNlLXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXN0ZWFtOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc3RlYW07IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdGVhbS1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zdGVhbS1zcXVhcmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1yZWN5Y2xlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcmVjeWNsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWF1dG9tb2JpbGU6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhYjpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tdGF4aTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRheGk7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10cmVlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdHJlZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNwb3RpZnk6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zcG90aWZ5OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZGV2aWFudGFydDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWRldmlhbnRhcnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zb3VuZGNsb3VkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc291bmRjbG91ZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWRhdGFiYXNlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZGF0YWJhc2U7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1maWxlLXBkZi1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmlsZS1wZGYtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZpbGUtd29yZC1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmlsZS13b3JkLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1maWxlLWV4Y2VsLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1maWxlLWV4Y2VsLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1maWxlLXBvd2VycG9pbnQtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZpbGUtcG93ZXJwb2ludC1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZS1waG90by1vOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1maWxlLXBpY3R1cmUtbzpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZS1pbWFnZS1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmlsZS1pbWFnZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZS16aXAtbzpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZS1hcmNoaXZlLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1maWxlLWFyY2hpdmUtbzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWZpbGUtc291bmQtbzpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZS1hdWRpby1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZmlsZS1hdWRpby1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZmlsZS1tb3ZpZS1vOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1maWxlLXZpZGVvLW86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1maWxlLXZpZGVvLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1maWxlLWNvZGUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZpbGUtY29kZS1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdmluZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXZpbmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jb2RlcGVuOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY29kZXBlbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWpzZmlkZGxlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItanNmaWRkbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1saWZlLWJvdXk6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWxpZmUtYnVveTpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tbGlmZS1zYXZlcjpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tc3VwcG9ydDpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tbGlmZS1yaW5nOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbGlmZS1yaW5nOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2lyY2xlLW8tbm90Y2g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jaXJjbGUtby1ub3RjaDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXJhOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1yZWJlbDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXJlYmVsOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZ2U6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWVtcGlyZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWVtcGlyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdpdC1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1naXQtc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tZ2l0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZ2l0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0taGFja2VyLW5ld3M6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1oYWNrZXItbmV3czsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRlbmNlbnQtd2VpYm86YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10ZW5jZW50LXdlaWJvOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcXE6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1xcTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXdlY2hhdDpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0td2VpeGluOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItd2VpeGluOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2VuZDpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tcGFwZXItcGxhbmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wYXBlci1wbGFuZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNlbmQtbzpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0tcGFwZXItcGxhbmUtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXBhcGVyLXBsYW5lLW87IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1oaXN0b3J5OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaGlzdG9yeTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdlbmRlcmxlc3M6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LWNpcmNsZS10aGluOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2lyY2xlLXRoaW47IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1oZWFkZXI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1oZWFkZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1wYXJhZ3JhcGg6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1wYXJhZ3JhcGg7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zbGlkZXJzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItc2xpZGVyczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNoYXJlLWFsdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNoYXJlLWFsdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNoYXJlLWFsdC1zcXVhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zaGFyZS1hbHQtc3F1YXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYm9tYjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJvbWI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zb2NjZXItYmFsbC1vOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1mdXRib2wtbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZ1dGJvbC1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHR5OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdHR5OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYmlub2N1bGFyczpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJpbm9jdWxhcnM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1wbHVnOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGx1ZzsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXNsaWRlc2hhcmU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zbGlkZXNoYXJlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHdpdGNoOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdHdpdGNoOyB9XG4uI3skZmEtY3NzLXByZWZpeH0teWVscDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXllbHA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1uZXdzcGFwZXItbzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW5ld3NwYXBlci1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0td2lmaTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXdpZmk7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jYWxjdWxhdG9yOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2FsY3VsYXRvcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBheXBhbDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXBheXBhbDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWdvb2dsZS13YWxsZXQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1nb29nbGUtd2FsbGV0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY2MtdmlzYTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNjLXZpc2E7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jYy1tYXN0ZXJjYXJkOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2MtbWFzdGVyY2FyZDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNjLWRpc2NvdmVyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2MtZGlzY292ZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1jYy1hbWV4OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2MtYW1leDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNjLXBheXBhbDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNjLXBheXBhbDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNjLXN0cmlwZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNjLXN0cmlwZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJlbGwtc2xhc2g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iZWxsLXNsYXNoOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYmVsbC1zbGFzaC1vOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYmVsbC1zbGFzaC1vOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHJhc2g6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10cmFzaDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNvcHlyaWdodDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNvcHlyaWdodDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWF0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYXQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1leWVkcm9wcGVyOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZXllZHJvcHBlcjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXBhaW50LWJydXNoOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGFpbnQtYnJ1c2g7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1iaXJ0aGRheS1jYWtlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItYmlydGhkYXktY2FrZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFyZWEtY2hhcnQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1hcmVhLWNoYXJ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGllLWNoYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItcGllLWNoYXJ0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbGluZS1jaGFydDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWxpbmUtY2hhcnQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1sYXN0Zm06YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1sYXN0Zm07IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1sYXN0Zm0tc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItbGFzdGZtLXNxdWFyZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRvZ2dsZS1vZmY6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci10b2dnbGUtb2ZmOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdG9nZ2xlLW9uOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdG9nZ2xlLW9uOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tYmljeWNsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWJpY3ljbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1idXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1idXM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1pb3hob3N0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaW94aG9zdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWFuZ2VsbGlzdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWFuZ2VsbGlzdDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNjOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItY2M7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zaGVrZWw6YmVmb3JlLFxuLiN7JGZhLWNzcy1wcmVmaXh9LXNoZXFlbDpiZWZvcmUsXG4uI3skZmEtY3NzLXByZWZpeH0taWxzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaWxzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWVhbnBhdGg6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tZWFucGF0aDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWJ1eXNlbGxhZHM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1idXlzZWxsYWRzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tY29ubmVjdGRldmVsb3A6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1jb25uZWN0ZGV2ZWxvcDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWRhc2hjdWJlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItZGFzaGN1YmU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mb3J1bWJlZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZvcnVtYmVlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbGVhbnB1YjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWxlYW5wdWI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zZWxsc3k6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zZWxsc3k7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zaGlydHNpbmJ1bGs6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zaGlydHNpbmJ1bGs7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zaW1wbHlidWlsdDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNpbXBseWJ1aWx0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2t5YXRsYXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1za3lhdGxhczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhcnQtcGx1czpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcnQtcGx1czsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWNhcnQtYXJyb3ctZG93bjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWNhcnQtYXJyb3ctZG93bjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWRpYW1vbmQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1kaWFtb25kOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tc2hpcDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXNoaXA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS11c2VyLXNlY3JldDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXVzZXItc2VjcmV0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbW90b3JjeWNsZTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1vdG9yY3ljbGU7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdHJlZXQtdmlldzpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXN0cmVldC12aWV3OyB9XG4uI3skZmEtY3NzLXByZWZpeH0taGVhcnRiZWF0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItaGVhcnRiZWF0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdmVudXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci12ZW51czsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW1hcnM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tYXJzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1lcmN1cnk7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS10cmFuc2dlbmRlcjpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLXRyYW5zZ2VuZGVyOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdHJhbnNnZW5kZXItYWx0OmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdHJhbnNnZW5kZXItYWx0OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tdmVudXMtZG91YmxlOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdmVudXMtZG91YmxlOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWFycy1kb3VibGU6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tYXJzLWRvdWJsZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXZlbnVzLW1hcnM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci12ZW51cy1tYXJzOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWFycy1zdHJva2U6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tYXJzLXN0cm9rZTsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LW1hcnMtc3Ryb2tlLXY6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tYXJzLXN0cm9rZS12OyB9XG4uI3skZmEtY3NzLXByZWZpeH0tbWFycy1zdHJva2UtaDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLW1hcnMtc3Ryb2tlLWg7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1uZXV0ZXI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1uZXV0ZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1mYWNlYm9vay1vZmZpY2lhbDpiZWZvcmUgeyBjb250ZW50OiAkZmEtdmFyLWZhY2Vib29rLW9mZmljaWFsOyB9XG4uI3skZmEtY3NzLXByZWZpeH0tcGludGVyZXN0LXA6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1waW50ZXJlc3QtcDsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXdoYXRzYXBwOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItd2hhdHNhcHA7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zZXJ2ZXI6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zZXJ2ZXI7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS11c2VyLXBsdXM6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci11c2VyLXBsdXM7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS11c2VyLXRpbWVzOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdXNlci10aW1lczsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LWhvdGVsOmJlZm9yZSxcbi4jeyRmYS1jc3MtcHJlZml4fS1iZWQ6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1iZWQ7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS12aWFjb2luOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdmlhY29pbjsgfVxuLiN7JGZhLWNzcy1wcmVmaXh9LXRyYWluOmJlZm9yZSB7IGNvbnRlbnQ6ICRmYS12YXItdHJhaW47IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1zdWJ3YXk6YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1zdWJ3YXk7IH1cbi4jeyRmYS1jc3MtcHJlZml4fS1tZWRpdW06YmVmb3JlIHsgY29udGVudDogJGZhLXZhci1tZWRpdW07IH1cbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==
*/
\ No newline at end of file
diff --git a/ui/src/dist/fontawesome/font/font/fontawesome-webfont.ttf
b/ui/src/dist/fontawesome/font/font/fontawesome-webfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..ed9372f8ea0fbaa04f42630a48887e4b38945345
GIT binary patch
literal 122092
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 +|+&Vdls@0SAya!5R?!
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
W2%>->3J9Wr?l-V&_Su?ry8j2p&Q&b{
literal 0
HcmV?d00001
diff --git a/ui/src/dist/gauge-flat.css b/ui/src/dist/gauge-flat.css
new file mode 100755
index 0000000..2aa09da
--- /dev/null
+++ b/ui/src/dist/gauge-flat.css
@@ -0,0 +1,52 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.ui-gauge-flat {
+ height: 15px;
+ width: 100px;
+ text-align: left;
+ overflow: hidden;
+ background: #E6E7E8;
+ border: 0 none;
+ border-radius: 0;
+}
+
+.ui-gauge-flat .ui-gauge-flat-value {
+ margin: -1px;
+ height: 100%;
+ border-radius: 0;
+}
+
+.ui-gauge-flat .red {
+ background: #D9182D;
+ border:1px solid #D9182D;
+}
+
+.ui-gauge-flat .blue {
+ background: #008ABF;
+ border:1px solid #008ABF;
+}
+
+.ui-gauge-flat .yellow {
+ background: #FDB813;
+ border:1px solid #FDB813;
+}
+
+.ui-gauge-flat .purple {
+ background: #7F1C7D;
+ border:1px solid #7F1C7D;
+}
\ No newline at end of file
diff --git a/ui/src/dist/images/theme-default/high.png
b/ui/src/dist/images/theme-default/high.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f5fcea79a4be9eb82d05df7ee8d981df6967bf0
GIT binary patch
literal 812
zcmV+{1JnG8P)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!zDYzuRCwB~
z)@x|ZaU93-|2ghQ=90@8#kSOpMPW#pMGceN+(T|PJP@LI;F2P87si9RKd@ykQ`YhT
zVJ;8IWw}JkEpy4`9O`iJ{_68DozB^gv-7Lhes%u8|L^;|{lC9?%1)O%QA%U9#sG{_
z-2qMT6K`=FmAHtP2uA9tVUz$}F#&UthHv<U*XpPNT3|TF=~*!j<6$g8`eB!9>-;=U
zXw+}u*DP&TS;)Z@EJr?;;PSt-3J=l)$IuNQunpTIEW>v^m$RtAZgkgxrfLa;;XzWd
zLrYbPeYj~2GYePcYXE6_ZnLSz6RRH-ZK%|;&Bh|^$9!C{jy>A=me_(>xPkF_N9Tj|
z;!G`3q;eNK2~?~$MVOAK7-_Ths$m|+B7l_&(4Tre=G79w(Y|b@eW8|TBkm&|)2x97
zX@&(z(kQBUAypfh>%>-CVGZx)X$d#uhfZf33t}VA)JE?`2$N9Y{9j4NG6LD=pTc$h
zHqfi%XR|qj_cTh^=EYNnp|6(hxI17A(o?7Go*phlXD9xWq583cWLS{)cFL3%LONOX
zDZN!&+WCcc7Nog;^s8=E&mhUF1FC(tOkXUTa*@M%PjM1cl5~3g_NNBFk)p(xsM1z-
zjRm=))SazUmZ*}Yy}squnGPs}c1%zJ8|)07+7ho4U4<UZNzjswKrek3)n29TqxcBR
zKSS#oz&c;8Q+g1e-2`cu%mK~DF03wb&d9R)CVh~Xv=t#YNKp63N!=@lFshF18(y-N
z`*M|q|7LSH3%kXBSZkjO2IC0USr)CMbDQyG4X{9;#8TXecKuqKo~UcrHgB=&5?sX#
zd__}qQU)Kb+J|eFiM8RO+WwJvrc;)q8`0_&`e4J0M}0iP9+bOF6wALvcGAjl4t=x?
qLzJC;x{zMk1*bMudM9G}BftP0OtN`NjudzR0000<MNUMnLSTXlM1j8m
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/icon-centos.png
b/ui/src/dist/images/theme-default/icon-centos.png
new file mode 100644
index 0000000000000000000000000000000000000000..5afb7b4b63462412d825f63542beb1f7e26b3d7f
GIT binary patch
literal 4734
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
M07*qoM6N<$f~4IfuK)l5
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/icon-debian.png
b/ui/src/dist/images/theme-default/icon-debian.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff49a39696fdfa5f232b0e79de04d90af6557111
GIT binary patch
literal 4239
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
D^V29c
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/icon-fedora.png
b/ui/src/dist/images/theme-default/icon-fedora.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b9dd06d1f766a3285cd0fb587c0be4114bfac47
GIT binary patch
literal 4449
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
S9$oyI0D9VncWN{pBmW0TFKp8Q
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/icon-gentoo.png
b/ui/src/dist/images/theme-default/icon-gentoo.png
new file mode 100644
index 0000000000000000000000000000000000000000..50d928fbfa30560fe873cf3de438a8f0c10a8f96
GIT binary patch
literal 15307
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
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/icon-opensuse.png
b/ui/src/dist/images/theme-default/icon-opensuse.png
new file mode 100644
index 0000000000000000000000000000000000000000..83fe4d5df0f59b52dd609b3bd16838f4d2570ab8
GIT binary patch
literal 3046
zcmc&$i8s{i8~@HQh9R;H+2W=}wp4SGHNs%*jK<hz5C+v)$1<3yWFNYOrZjd!4B4kN
z_OeFZ5HcYtdl9Z~{ibt%|HFOHdEU=?pYuMSb3V`eocDZE>}`>UU@|ZO01jDNm^yNi
z@;mtXxO=xDevk{iVJ4Q&{M<$6_f6)W1&9`|Vch!@zXN2Vd_Rhtlnyt;ggagL3n$@2
zuK*+xNrP}LD9i^>yrOYE)c^jvz6<~e`dFG8J4ZcOD~QdK=#}p`3e%S;Ndc#V%ghT$
zp(kOYHqsIbHl`V6$|_^dh?MK%3Wy^%WlY3rh0i5oHgAfP%>`|a_nhlHrIeClN;cg}
zykmHFk4@o&i<*6i{E8gydVh}9!aC22MebGv241g-ZBHQmTkvq*>sO3Maxs4<s}V5`
z*oAF@iE?Lv{{IL*&j$0zP+`3;Y#dIiP%0}elXinK0a9&5Y-kUT_#F;DU6<liG%20M
z*2GzKo;`8|W9G0zAyGa;7}t5ufYKTf)m2P_EXSS`tv;Mk%`C!iV?dSm+hAevNdU=n
z05ayOis!-b>Psou1rgq>;ukbIO?xX=oc%qFL_%{AAvB_;Rmi{!P?69BA@Q<gedeVw
zb+BR=?8Aq>C`Z&2(8WY=JI>sdS`S&TgNfg%Z_#nXYt}7N6quP2hsEBdjv<yb?79PS
zhMWA~w?Y!&6Y*gEqh3Z{sBiAymm<oiVT$qPUcdvWP(Z_l;dwO2j}xgr{3XWu)f#W1
z$r#L?k1RV`^>Qg(>MfWA)+P`<Uo>#8DFN_Q5IcNTexql*QE1<_e}!$qxrkfQS&Qc&
z)Q6F-&Tqnh3x#O##>0Z=oPFq{N$ij8p{^<8)&6|inzS25ih8LbN)3VLY7?if)Q6EK
zTo0v>k3Tj1I3@~(I1n{7)sA7rOvh$po(iCqX?#C#z&mZQbir|#cM@D`A@H^Ckq-vB
zPK}7LH%~?L4)fBzwc{k*tNYKixhKv~Om>C{>nN^S7kvQR7wPa#@9AkZ&ad0Ba?Py;
zd*d%e@#*n>N#<yqjtLqcwgzlrH<p>oFiB7~Q)6ukOW!Dc)QV3tR*`V4wx3Cs@7e3y
z7y?t|It6-oIQ;8D*-ORETWc-NFTZC~uZVUo?zKHfbX;@PkE*?QJG~jLYz|HUz7tI2
z46=UpFuX<>{G7^1na!U0E6W%%VUQ@WYD+ViUyQtnt9a=TTy1i3Cvg>}LyiK?)g%vt
z{Acr{mjy?5(u$Y+3d;(!g)wr!5Kk57Oda_PYkdGXOkhSZ*r~-TMmR`0PW&lfvU?ql
zh(d0|HhXXBuaqe2Y9`-kp>*|D$Z1-jzCFjLS4|(em^iPqn$xS@aRsC)jmgc@lG6$5
z`+&-YI)v*+T47%JAAT?w>3eXj=6PwB<mx=e=1m!t+c!vl#_lp)4D^_NpPflz0A4B<
z2?{GSu0Ix#No(zfU*g1=q{C)|*c&ufT^?$h`%b;@oqK;cpu$4c&97*1r{pHJe=~#8
za|laME6iRwa4)ob@bk1Ld_};W@!TTO+l`}ALyS3*b8tJ?Zx<^x;QV{ky>H6j_H|j#
z?M1Q;vGkU2r<|2}iSk6Uafcn{6s3h?P`?5y>k}b?UN<5JgU%|S=XS3V$8*g0B;;Bf
znHHxXs6O0>6NRUaO|~XEJsPt6sz$t%yTl-*zjOp%Q&rEO9y)Yv_1lksy3C!6mNPOU
zb$MlhY>^1Jn>)Y=be%^skPy1HfUnG5LI)~}bIHl_dILN7rKT;R$Y%+*Wt}A|5|=0n
z;7`C+ES>SUV~7h+QxI3>ZJv3b+pu0Aw!tK(Gp`8|gj?AA5){&LcGB~hQ53oIZK~5Q
zS056Lhv)r}KNx%_si4aI!%Gizsb2Ngg2mCbcJo^qCc>0itHo%0RG9T+xbGN`^Sd2=
ze)qDn=&CgG)%tgKfGxDI{A_KKIKaxYh!ts-X+4345Mn6jXelN?ArI=xqRabqM}T-s
z|B94Ba{A7{Eguy`2o?u39i?g82|!X_5E-7@fPasr&*3kND%8GfS5Jbo<tLAZXsZw3
zbwwDKE`#PV9e)SIT-5vow0b^g7q9#Sn(O|j&aK{KCJCd^*7>tIGk~CV-a65Q$0_h!
zYe+bdMipU_f)a54xWgWGY2mnvm<_x~Uqbg!b<di-dO{!IqddEJfirZgk0CU}UW(n}
z>*)_zz41~Eo+^!{-!t1U_lBlclrr^3WrCFson%eDB6GaehX*ZFwmdtjkpAZ2z)cc$
zSN0iN%|?U>+59H<@_ZBGlf*}(qxq<al7l($rvQR3Y+wqOpA?bfd`UPTGQ+Djh<sCJ
zzuo!WM2Xo&A1eQh{*x>u^isv0<xnch?q+MFj%S`GuUFg4(F!1M8pamlgV~FH?@bfE
zp{q*+9;#{!AvM$C4wt3T%D27ywfucHURkx7p~5`j`z#27k6PTbUnX#~V=Cv`5A-Cf
zLZaVWDOIbuY#(6#<sx7QB)N?5g-l%!B9sFM-u-9qe)WY%vknn>?Z2!qZzI!4FV-D%
z{N;&~%xAfNif;uF0xKZ5(WUgX-NO>0&`m2Tty<`am5hC4Vy>SwQIpB+Ld7hW=OVz$
zP5NyO%LlEu^rZp`ejgd#Sh`&kBCH8<%G;mc(p|nzN6ag`n-87iQ<Ph-dMD?2ymXH!
zo1yw*{Q;nrqvJ(xk<ZWakAGy+gm_{p96BS*!Z&JeJj1kvo<4de+eMU1M-{KH&-l13
zyrEJ_M}RTd`5&9b8+E4^rC*y(<>48#y~leyhSi;HW2JVSP4xxuSw|bkDW$c`*ckA>
z!Y<CD0$<!mE0<T=TRRrDx+Kn9!BZXfd-g=)gSsM=#77LWh#GdtdyQ4E#%p+JJYt{r
z*a7g=I$yL`iG>oyarCV*8xNUdbn)p+jw`%k%dO5D%10gdTo`$xShV_92UnbxM{)dP
z?4B;V5uxDi<?zifMa|#O)k}$6ZFJZ2!1yOreYhW^5P4Z?iyBT#bGx5aaprAU%bloO
zztEh^lZ68&=R~4uJ{z>I4&$2q*J$OAtcZf0Qa?}t;bBGi8O_tQkik!J{Q2hl8W*7Y
z9-DE_CJ%*iPm-n8hxNGsSiM^{;(m`)o<VYm+8mKX*3Asz6HDrS)Q^Q$ML+JZj(#kz
zQ83ruzf=}3GG5C!q7u@fO+>CXLoT99>Tf=;5dV4xVyhmiSWu9)k<mr`?A?e^Z9+KJ
z*Uko2F1%5D*#15}BDr9oeCkE7iiFa1-#xUkpq@D>wrR1L-qj>y{4R>pF?qLc{!YTf
zSZ3XM*URCvBa?}YQA!?{C~ch7do5p0GN5WXFGd`RwBh*&lw_*@%pBkiUVfYzP&cLE
zVAsGea3HB=)g&QEO~KOP@Z1ULo<Zcg$Iw|U9a`PeP+w`kDxx+q{&YInt^HVaC1;vB
zor9{EY!%%zYa?w{*{=!?0W@n1&%&~h3;H!0z9%S#lW5kKhwm(9_Ch1T`Z=qxV!V<$
zYm>A1=g@f<R5s$z?NY_Tj6bIFO7Xj+rR<TRzsIesF13whyQ(F~m1s%I_S`u^0#{sd
zFF#f8Io)js_WLWIx`^eZVspa`?mDz+-|BJD^Y`%rUuYZ{WI+4^2<rngns%qY{G_)|
zl8i+4F3Kf(ys}JfbED0EA+vJ*LQL8#gb@n{)VTWVeE-Vn8Mq79T>WljOT1hDTy^rb
k`wyDue`PEG?`HRnhNAAT>MrGXaXmR;X=ZC$Yl6G+KaKu$s{jB1
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/icon-ubuntu.png
b/ui/src/dist/images/theme-default/icon-ubuntu.png
new file mode 100644
index 0000000000000000000000000000000000000000..d92c00f357b6b0e1542413f6aaf0de8ef4b8d130
GIT binary patch
literal 4818
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
T?|XFr3GiA;OR-Yk^22`sn~zF<
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/icon-vm.png
b/ui/src/dist/images/theme-default/icon-vm.png
new file mode 100644
index 0000000000000000000000000000000000000000..50dac50c5a0ee59f4e79170434f53bb3b94390e3
GIT binary patch
literal 2976
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
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/logo-white.png
b/ui/src/dist/images/theme-default/logo-white.png
new file mode 100644
index 0000000000000000000000000000000000000000..0add8428122507bd2993aa01a939b9247294a0f9
GIT binary patch
literal 7438
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
M07*qoM6N<$f{<Y(^#A|>
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/logo.png
b/ui/src/dist/images/theme-default/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..5be8d514bacdcc0d080a5b2f12314aa7ee94a8b2
GIT binary patch
literal 17195
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
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/logo.svg
b/ui/src/dist/images/theme-default/logo.svg
new file mode 100644
index 0000000..a3e57e1
--- /dev/null
+++ b/ui/src/dist/images/theme-default/logo.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg
xmlns="http://www.w3.org/2000/svg" version="1.1"
width="387" height="366"
+ viewBox="0 0 387 366" overflow="visible"
enable-background="new 0 0 387 366" xml:space="preserve">
+<path fill="#D91F2F"
d="M303.868,82.71c25.172-8.604,27.898-42.319,7.13-55.331c-1.923-1.04-16.93-10.998-43.506-11.999
+
c-39.783,1.486-71.632,13.167-92.662,62.139c-0.25,2.109-0.508,6.054,1.977,3.206c0,0,0.284-0.329,0.443-0.515
+
c15.153-23.034,69.707-29.756,88.572-8.681c0.625,0.72,1.297,1.634,2.003,2.274C276.457,82.654,293.688,86.191,303.868,82.71"/>
+<path fill="#F19125"
d="M336.691,227.692c20.913,16.439,50.687,0.387,50.306-24.119c-0.174-2.18,0.018-20.188-13.601-43.033
+
c-22.892-32.571-50.019-52.939-102.551-43.944c-1.906,0.938-5.355,2.866-1.615,3.403c0,0,0.432,0.059,0.674,0.093
+
c27.571,0.183,62.889,42.3,55.469,69.596c-0.263,0.916-0.665,1.977-0.817,2.918C321.826,204.661,328.231,221.044,336.691,227.692"/>
+<path fill="#8CC643"
d="M228.105,329.358c-4.421,26.23,23.926,44.686,45.259,32.619c1.831-1.197,17.731-9.65,31.27-32.543
+
c17.636-35.689,22.531-69.258-10.515-111.072c-1.737-1.225-5.082-3.33-3.762,0.211c0,0,0.152,0.406,0.24,0.637
+
c13.04,24.293-7.028,75.463-34.545,82.018c-0.932,0.207-2.055,0.361-2.955,0.68C241.207,305.282,229.893,318.749,228.105,329.358"/>
+<path fill="#27AEE4"
d="M81.133,285.823c-25.04,8.973-27.272,42.725-6.314,55.43c1.939,1.01,17.088,10.746,43.677,11.357
+
c39.757-2.072,71.43-14.219,91.738-63.496c0.22-2.113,0.421-6.061-2.023-3.176c0,0-0.279,0.33-0.438,0.521
+
c-14.811,23.254-69.259,30.777-88.434,9.982c-0.637-0.711-1.321-1.615-2.038-2.246C108.544,285.476,91.262,282.192,81.133,285.823"
+ />
+<path fill="#06659E"
d="M48.671,141.301c-21.969-14.995-50.596,3.023-48.569,27.447c0.321,2.165,1.34,20.143,16.463,42.022
+
c25.03,30.957,53.465,49.455,105.273,36.947c1.839-1.063,5.151-3.219,1.382-3.502c0,0-0.432-0.031-0.678-0.047
+
c-27.52,1.672-65.589-37.975-60.023-65.709c0.202-0.933,0.531-2.018,0.62-2.968C65.053,163.281,57.561,147.365,48.671,141.301"/>
+<path fill="#BA1E70"
d="M164.882,38.837c6.497-25.793-20.29-46.448-42.516-36.122c-1.919,1.049-18.444,8.206-33.764,29.946
+
c-20.424,34.171-27.98,67.243,1.628,111.558c1.632,1.359,4.798,3.726,3.765,0.089c0,0-0.119-0.417-0.188-0.651
+
c-11.062-25.255,13.021-74.663,40.974-79.004c0.945-0.132,2.076-0.198,3-0.441C149.9,61.794,162.255,49.273,164.882,38.837"/>
+</svg>
diff --git a/ui/src/dist/images/theme-default/low.png
b/ui/src/dist/images/theme-default/low.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f891d648d7d72c558a942ab77befb1cdd368235
GIT binary patch
literal 813
zcmV+|1JeA7P)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!zez+vRCwB~
zmRU$tVHC&j+-%X%DAIN?+o)`y2U}iR9)g0RqJ;|TAtCCeg*HOyHCk<7p@<61z!rr>
zC~UBW7K%zKgCQylCmUL{z?|xL;(uWnX3S<h@bfU<`+aBm&UeoBm0c-!5=b}b4U=H5
zbU)}0ZO{mhp$e+u9kj;VC@q13Tvz~wFbuxKXLzrTx<Dq(fcbiM8qUItju<I`gVMJ7
zb+{<6KR~mhw5a?r4VJ)Wm<<~s5FJ&lkuh){hQcS<2gPyH@B?0pYfuS?V5A&csuccR
z=SD5egZ)a?C8eu4QJ!O@N@=qUq{9iA;yv_?^nz^){XVRRnhqN9qz;Op1P01rZnTk^
zFb`T}?4y&Mm{U98IShwoo)HUg4P?P_xa*`QuV5GaRCV?-BNJe(4*DoWoYdtq+=Kow
z*;V;jG*_X?=^U}NU68|z%}BmV`PqLS^uMHDMn;>F9Pp_vL^{!kwVhv(Z4va;KkX(v
z!JIt}D#2vsVP0rcfhyG`!y@^rADPlOQj8!dou%q+wm%{G4TIG94yS0OR=Tfr$kolZ
z);&>G)}-5;tUQ(W>#QHRs_7PW&;jJr!rh&u0c);L<m_@)ZK*4-EA?QdQg#zgCUF+0
zaMC*SEEuP2QRk{{pMx;0hUvWc27Ls|I%vS&FJfIln{S7%a0b434Kg6l)73qPu%K4W
za;r9pCvBQ1g}h&)ZobnlAl%YXM0`;*K3ns|=E!Y0pft8}cl??+Hq=IG+}fn9XY)H+
zZ-ui~>&?Mc@W>wcVm>5BXddJ%jmK03;dWAGXSfjd%F#w0dX3jX(&Dt~MH;(yc<ZD~
z72R9-20hdjtb@;y&H#&QqYgaM-iJg`Rc2Fih4dC(*jVvtkC!Tx@^}L;(I-(@l~n=b
rm5!+}SRUIzYS4hIkWQG=KLQK@;61`6RS)H800000NkvXXu0mjfY}$8n
literal 0
HcmV?d00001
diff --git a/ui/src/dist/images/theme-default/med.png
b/ui/src/dist/images/theme-default/med.png
new file mode 100644
index 0000000000000000000000000000000000000000..06106551316ec16a148c346941ddec92f9d16bc9
GIT binary patch
literal 873
zcmV-v1D5=WP)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!`$<GWRCwB?
zmT5@TVGxIR*Dg1-gDktK)CxPKp!-V}1r|oxMF$mSMF$ii6%o{jK17+_cVI*XW}sb=
zNJWWd2T@o`8A*3|Bpqvlxz#i96Bb)#+Z}jz*!{onJM+%We`cLIm##XRkv7l?#=vyx
zZqODQpaPyiKHP>6Q19=cR?Qgb3$q{<V&Nxzg-<#t3?g7Mr07{DoPigC7#Rr%rS0(R
za6w*w29IuOw@QFSm<Jmn88$$H@2#2|83gB`AAEtmu+L8z>fnvI0(o!<2FRiL3SoUy
zBQdaFp}Gji;Gr!{>64Ny2V(WyZc_@cOy|DM%~#l#!df^1E8vD5>{Q}Az#dov4`3!#
zariiGT&xiJlVUi4p-ing4h!KmOtss(v@i)~KrL*Mfl=rku)GBW4&^0-^{W(~o$wsu
zV1X?#BjK<bBIQL98)B5miH^XeBW!11l0vu}eyKV;n-TMPuo8U~yf7DLJN{3iAq_*8
z{9L%N-^RLBes-J7P|cz^B`+A61S1r-^NkLhks+$GXL`5>dO3oZc<C}3i8mu%t;*CE
zysE5FWSF$Io!<~;M%wE~k96x0jYLb=O1sU-cYTSFz8RvCa_LA_ug5+r;Scmw<2xLp
zkrL@H(v@bUP_28ks;pWqBUmZ+c}XqTk6fzhT6NIwv<JIxdXNUJxjvP%i&VAQE_t1&
z2g?+)TW~UnT%5v5>&#PNs9uXwm)iDOr~&Ig6Il2TeFSm>G+^tuvadjgZ&Q_?hHs4x
zvOu1PYhd+eLy4N@W*y>B8Z=K*S)ZkDzDqCU9i_tS^qKKdnkP1P?^^p-7;T;;Xx`XN
z8K`k<ld_D%?`gjk&N}Tk2Uo&l-+9s~{UJ-OrcQ$^U7>7F!qiMN<Y<MGUZ@W8&-k@A
zJx62LlDA$uTeo`;KcF4-PzRqT?FPG5niB49>5oLYsw`0x(ex(0uua9OGhV7tEG$)l
z{w1nWWnF{e3deYLXSW8@M;mZjQ`AyO{|Ybw4NBe};aPP+00000NkvXXu0mjfdFFsc
literal 0
HcmV?d00001
diff --git a/ui/src/dist/index.html b/ui/src/dist/index.html
new file mode 100755
index 0000000..d7279e1
--- /dev/null
+++ b/ui/src/dist/index.html
@@ -0,0 +1,187 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+
+ <link rel="stylesheet" href="css/menu-flat.css">
+ <link rel="stylesheet" href="css/button-flat.css">
+ <link rel="stylesheet" href="css/radio-flat.css">
+ <link rel="stylesheet" href="css/checkbox-flat.css">
+ <link rel="stylesheet" href="css/textbox-flat.css">
+
+ <link rel="stylesheet"
href="fontawesome/css/fontawesome.css">
+ <link rel="stylesheet"
href="libs/themes/base/bootstrap.custom.css">
+ <script src="libs/modernizr.js"></script>
+</head>
+
+<body>
+ <div class="topbar">
+ <nav class="navbar navbar-inverse">
+ <div class="container">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <a class="navbar-brand"
href="#">Kimchi</a>
+ </div>
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <ul class="nav navbar-nav navbar-right">
+ <li class="dropdown" id="peers"
class="hide-content">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><span class="topbar-text">Peer
Hosts</span><span class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li
id="search-peers"><span>$_("Searching")...</span></li>
+ <li id="no-peers"
class="hide-content">$_("No peers found.")</li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><i class="fa
fa-user"></i><span class="topbar-text empty-when-logged-off"
id="user-name">User</span><span
class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li class="critical"><a id="btn-logout"
href="javascript: void(0);"><i class="fa
fa-ban"></i><span>$_("Log
out")</span></a></li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false"><i class="fa
fa-question-circle"></i><span
class="topbar-text">$_("Help")</span><span
class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li><a id="btn-help" href="javascript:
void(0);">$_("Help")</a></li>
+ <li><a id="btn-about"
href="javascript:void(0);">$_("About")</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </nav>
+ <nav class="tab-area navbar navbar-default">
+ <div class="container">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle
collapsed" data-toggle="collapse" data-target="#nav-menu"
aria-expanded="false">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"><!-- Hamburguer button here
--></span>
+ </button>
+ </div>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse"
id="nav-menu">
+ <ul class="nav navbar-nav">
+ <li class="hostname"><span
class="host-location"></span></li>
+ <li class="active"><a href="#"
class="host">Host <span
class="sr-only">(current)</span></a></li>
+ <li class="active"><a href="#"
class="guests">Guests <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="templates">Templates <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="storage">Storage <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="networks">Networks <span
class="digit-container">18</span></a></li>
+ <li class="active"><a href="#"
class="administration">Administration</a></li>
+ </ul>
+ </div><!-- /.navbar-collapse -->
+ </div><!-- /.container-fluid -->
+ </nav>
+ </div>
+ <div class="content">
+ <div class="login-area">
+ <div class="err-area">
+ <div id="messUserPass" class="alert alert-danger"
role="alert">O usuário ou senha inseridos estão incorretos. Por favor, tente
novamente.</div>
+ <div id="messSession" class="alert alert-danger"
role="alert">Fim do limite do tempo da sessão, por favor se autentique
novamente.</div>
+ </div>
+ <form id="form-login" class="form-horizontal">
+ <div class="form-group">
+ <label for="username"
class="sr-only">Usuário</label>
+ <input type="text" class="form-control"
id="username" name="username" required="required"
placeholder="Usuário" autofocus="">
+ </div>
+ <div class="form-group">
+ <label for="password"
class="sr-only">Senha</label>
+ <input type="password" class="form-control"
id="password" name="password" required="required"
placeholder="Senha">
+ </div>
+ <div class="form-group">
+ <button type="submit" class="btn btn-login
col-md-12 col-lg-12">Log In</button>
+ </div>
+ <div class="form-group">
+ <select id="userLang" class="selectpicker col-md-12
col-lg-12 ">
+ <option value="en_US">English
(US)</option>
+ <option value="zh_CN">中文(简体)</option>
+ <option value="pt_BR">Português
(Brasil)</option>
+ <option value="de_DE">Deutsch
(Deutschland)</option>
+ <option value="es_ES">Español
(España)</option>
+ <option value="fr_FR">Français
(France)</option>
+ <option value="it_IT">Italiano
(Italia)</option>
+ <option value="ja_JP">日本語 (日本)</option>
+ <option value="ko_KR">한국어 (대한민국)</option>
+ <option value="ru_RU">Русский
(Россия)</option>
+ <option value="zh_TW">中文(繁體)</option>
+ </select>
+ </div>
+ </form>
+ <div class="handlebars"></div>
+ </div>
+ </div>
+ <script src="libs/jquery.js"></script>
+ <script src="libs/jquery-ui.js"></script>
+ <script src="libs/jquery-i18n.min.js"></script>
+ <script src="libs/vendor.js"></script>
+ <script src="libs/bootstrap.js"></script>
+ <script src="libs/bootstrap-select.min.js"></script>
+ <script src="js/main.js"></script>
+ <script src="js/menu-flat.js"></script>
+ <script type="text/javascript">
+
+ var getHostname = function() {
+ host = window.location.hostname;
+ return host;
+ };
+
+ var fixHostnameText = function() {
+ var host = getHostname();
+ host.lenght > 20 ? $('span.host-location').text(host).prop(
'title', host) : $('span.host-location').text(host);
+
+ };
+
+ $(document).ready(function() {
+ $('span.hostname').text(window.location.hostname + ':' +
window.location.port);
+
+ $('#nav-menu ul.navbar-nav li.hostname
.host-location').text(getHostname());
+
+ $('.selectpicker').selectpicker();
+ fixHostnameText();
+ });
+ </script>
+</body>
+
+</html>
diff --git a/ui/src/dist/js/main.js b/ui/src/dist/js/main.js
new file mode 100755
index 0000000..80d83e9
--- /dev/null
+++ b/ui/src/dist/js/main.js
@@ -0,0 +1 @@
+console.log('\'Allo \'Allo!');
diff --git a/ui/src/dist/js/widgets/samples/action_button.html
b/ui/src/dist/js/widgets/samples/action_button.html
new file mode 100644
index 0000000..60cd711
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/action_button.html
@@ -0,0 +1,185 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <link rel="stylesheet"
href="libs/themes/base/jquery-ui.css">
+ <link rel="stylesheet"
href="fontawesome/css/fontawesome.css">
+ <link rel="stylesheet"
href="libs/themes/base/bootstrap.custom.css">
+ <script src="libs/modernizr.js"></script>
+</head>
+
+<body>
+ <nav class="navbar navbar-inverse navbar-static-top">
+ <div class="container">
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">Action Button
(menu-flat.js)</a>
+ </div>
+ </div>
+ </nav>
+ <div class="container">
+ <h2>Bootstrap (static)</h2>
+ <div class="dropdown menu-flat"
id="wok-dropdown-menu-x">
+ <button class="btn btn-primary dropdown-toggle"
type="button" data-toggle="dropdown"><i
class="icon-edit-alt"></i>Actions<span
class="caret"></span></button>
+ <ul class="dropdown-menu">
+ <li><a id="wok-dropdown-menu-x_0"
class="add" href="#add"><i
class="icon-plus-circled-1"></i>Add</a></li>
+ <li><a id="wok-dropdown-menu-x_1"
class="enable" href="#enable_"><i
class="icon-play-circled2"></i>Enable</a></li>
+ <li><a id="wok-dropdown-menu-x_2"
class="edit" href="#edit_"><i
class="icon-pencil-2"></i>Edit</a></li>
+ <li class="critical"><a
id="wok-dropdown-menu-x_0" class="delete"
href="#delete_"><i
class="icon-minus-circled-1"></i>Delete</a></li>
+ </ul>
+ </div>
+ <h2>jQuery UI Widget (using Bootstrap classes)</h2>
+ <div class="btn-wrapper"></div>
+ <h2>How to use</h2>
+ <pre>
+ <code>
+ $(".btn-wrapper").menuFlat({
+ name: "wok-dropdown-menu-0", // not required
+ icon: "icon-edit-alt", //Set icon of the menu button.
+ label: 'Actions', //Set button text
+ content: [
+ { name: 'Add',
+ action: 'add',
+ icon: 'icon-plus-circled-1',
+ critical: false
+ },
+ { name: 'Enable',
+ action: 'enable',
+ icon: 'icon-play-circled2',
+ critical: false
+ },
+ { name: 'Edit',
+ action: 'edit',
+ icon: 'icon-pencil-2',
+ critical: false
+ },
+ { name: 'Delete',
+ action: 'delete',
+ icon: 'icon-minus-circled-1',
+ critical: true // set this to true if this action should be
highlighted
+ }
+ ]
+ });
+
+ // List actions
+
+ // You can set an event to a link based on its ID, css class or href
attribute
+
+ $("#wok-dropdown-menu-0_0").on("click",
function(event) {
+ event.preventDefault();
+ alert("Add");
+ });
+
+ $("#wok-dropdown-menu-0
a[href='#enable']").on("click", function(event) {
+ event.preventDefault();
+ alert("Enable");
+ });
+
+ $("#wok-dropdown-menu-0 .edit").on("click",
function(event) {
+ event.preventDefault();
+ alert("Edit");
+ });
+
+ </code>
+ </pre>
+ </div>
+ <script src="libs/jquery.js"></script>
+ <script src="libs/jquery-ui.js"></script>
+ <script src="libs/vendor.js"></script>
+ <script src="libs/bootstrap.js"></script>
+ <script src="libs/bootstrap-select.min.js"></script>
+ <script src="js/main.js"></script>
+ <script>
+ $(document).ready(function() {
+ $(".btn-wrapper").menuFlat({
+ name: "wok-dropdown-menu-0",
+ icon: "icon-edit-alt", //Set icon of the menu button.
+ label: 'Actions', //Set button text
+ content: [{
+ name: 'Add',
+ action: 'add',
+ icon: 'icon-plus-circled-1',
+ critical: false
+ }, {
+ name: 'Enable',
+ action: 'enable',
+ icon: 'icon-play-circled2',
+ critical: false
+ }, {
+ name: 'Edit',
+ action: 'edit',
+ icon: 'icon-pencil-2',
+ critical: false
+ }, {
+ name: 'Delete',
+ action: 'delete',
+ icon: 'icon-minus-circled-1',
+ critical: true
+ }]
+ });
+
+
+ $("#wok-dropdown-menu-0_0").on("click", function(event) {
+ event.preventDefault();
+ alert("Add");
+ });
+
+ $("#wok-dropdown-menu-0
a[href='#enable']").on("click", function(event) {
+ event.preventDefault();
+ alert("Enable");
+ });
+
+ $("#wok-dropdown-menu-0 .edit").on("click", function(event)
{
+ event.preventDefault();
+ alert("Edit");
+ });
+
+
+ });
+ </script>
+ <script src="js/menu-flat.js"></script>
+</body>
+
+</html>
diff --git a/ui/src/dist/js/widgets/samples/dialog.html
b/ui/src/dist/js/widgets/samples/dialog.html
new file mode 100644
index 0000000..2b62528
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/dialog.html
@@ -0,0 +1,75 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <link rel="stylesheet"
href="libs/themes/base/jquery-ui.css">
+ <link rel="stylesheet"
href="fontawesome/css/fontawesome.css">
+ <link rel="stylesheet"
href="libs/themes/base/bootstrap.custom.css">
+ <script src="libs/modernizr.js"></script>
+ <body>
+ <div class="dialog-demo">Teste</div>
+ <script src="libs/jquery.js"></script>
+ <script src="libs/jquery-ui.js"></script>
+ <script src="libs/vendor.js"></script>
+ <script src="libs/bootstrap.js"></script>
+
+ <script src="js/dialog-flat.js"></script>
+ <script>
+ $(document).ready(function() {
+ $(".dialog-demo").dialogFlat({
+ title: "Demo", //Title of the dialog.
+ confirmText: "Ok", //Text of the confirm button,
"Ok" is the default value.
+ cancelText: "Cancel", //Text of the cancel button.
+ width: "600", //Width of the dialog, "px" is the
default unit.
+ height: "500", //Height of the dialog, "px" is
the default unit.
+ confirmFunc: function() {
+ alert("success");//Function after confirm
+ }
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/ui/src/dist/js/widgets/samples/dialog_bootstrap.html
b/ui/src/dist/js/widgets/samples/dialog_bootstrap.html
new file mode 100644
index 0000000..c624a60
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/dialog_bootstrap.html
@@ -0,0 +1,101 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <link rel="stylesheet"
href="libs/themes/base/jquery-ui.css">
+ <link rel="stylesheet"
href="fontawesome/css/fontawesome.css">
+ <link rel="stylesheet"
href="libs/themes/base/bootstrap.custom.css">
+ <script src="libs/modernizr.js"></script>
+</head>
+
+<body>
+ <nav class="navbar navbar-inverse navbar-static-top">
+ <div class="container">
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">Dialog
(Bootstrap Modal)</a>
+ </div>
+ </div>
+ </nav>
+ <div class="container hosts">
+ <h2>Bootstrap (static)</h2>
+ <!-- Button trigger modal -->
+ <button type="button" class="btn btn-primary btn-lg"
data-toggle="modal" data-target="#myModal">
+ Launch demo modal
+ </button>
+ <!-- Modal -->
+ <div class="modal fade in" id="myModal"
tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close"
data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
+ <h4 class="modal-title"
id="myModalLabel">Modal title</h4>
+ </div>
+ <div class="modal-body">
+ <select id="userLang" class="col-md-12
col-lg-12 ">
+ <option data-icon="icon-list-add"
value="en_US">Add</option>
+ <option data-icon="icon-play-circled"
value="zh_CN">Enable</option>
+ <option data-icon="icon-pencil-1"
value="pt_BR">Edit</option>
+ <option data-icon="icon-minus-circled-1"
value="de_DE">Remove</option>
+ </select>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn
btn-default">Ok</button>
+ <button type="button" class="btn
btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script src="libs/jquery.js"></script>
+ <script src="libs/jquery-ui.js"></script>
+ <script src="libs/vendor.js"></script>
+ <script src="libs/bootstrap.js"></script>
+ <script src="libs/bootstrap-select.min.js"></script>
+ <script src="js/main.js"></script>
+ <script src="js/dialog-flat.js"></script>
+</body>
+
+</html>
diff --git a/ui/src/dist/js/widgets/samples/gauge-flat.html
b/ui/src/dist/js/widgets/samples/gauge-flat.html
new file mode 100644
index 0000000..92ce07a
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/gauge-flat.html
@@ -0,0 +1,53 @@
+<!--Sample code of gauge-->
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>Gauge Demo</title>
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../gauge-flat.js"></script>
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/gauge-flat.css">
+ </head>
+ <body>
+ <div class="gauge-demo"></div>
+ <script>
+ $(document).ready(function() {
+ console.log("test started1");
+ var gauged = $(".gauge-demo");
+ gauged.gaugeFlat({
+ value: 25,
+ color: "red"
+ });
+ var gaugeAdd = function() {
+ var gaugeValue = gauged.gaugeFlat("value");
+ gauged.gaugeFlat("value", gaugeValue + 1);
+ if (gaugeValue < 99) {
+ setTimeout(gaugeAdd, 300);
+ }
+ }
+ gaugeAdd();
+ });
+ </script>
+ </body>
+</html>
\ No newline at end of file
diff --git a/ui/src/dist/js/widgets/samples/grid.html
b/ui/src/dist/js/widgets/samples/grid.html
new file mode 100644
index 0000000..9b92d62
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/grid.html
@@ -0,0 +1,80 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Wok</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
+
+<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../css/theme-default.min.css">
+
+<script src="../../../libs/jquery-1.10.0.min.js"></script>
+<script src="../../../libs/jquery-ui.min.js"></script>
+<script src="../../../libs/jquery-ui-i18n.min.js"></script>
+<script src="../../../js/wok.min.js"></script>
+
+<style type="text/css">
+body {
+ background: none;
+}
+input {
+ float: right;
+}
+.name {
+ width: 30%;
+}
+.project {
+ width: 30%;
+}
+.role {
+ width: 39%;
+}
+</style>
+<script>
+function init(){
+ $('#ibmers').grid({enableSorting: true});
+ $('input').on('keyup', function(){
+ $('#ibmers').grid('filter', ($(this).val()));
+ });
+}
+</script>
+</head>
+<body onload="init()">
+<div style="height: 50px; padding-top: 10px; padding-right:
50px;"><input type='text' placeholder='Filter'
style='padding-left: 5px; height: 20px;'></div>
+<div id="ibmers">
+<div><span class="name">Name</span><span
class="project">Project</span><span
class="role">Role</span></div>
+<div>
+<div><span class="name"
val="tify">tify</span><span class="project"
val="kimchi">kimchi</span><span class="role"
val="designer">designer</span></div>
+<div><span class="name"
val="rick">rick</span><span class="project"
val="finance">finance</span><span class="role"
val="sponsor">sponsor</span></div>
+<div><span class="name"
val="icy">icy</span><span class="project" val="human
resource">human resource</span><span class="role"
val="administrator*">administrator</span></div>
+<div><span class="name"
val="paul">paul</span><span class="project"
val="tomcat">tomcat</span><span class="role" val="dev
lead">dev lead</span></div>
+<div><span class="name"
val="kapil">kapil</span><span class="project"
val="apache">apache</span><span class="role"
val="developer">developer</span></div>
+<div><span class="name"
val="adam">adam</span><span class="name"
val="mongodb">mongodb</span><span class="role"
val="dev lead">dev lead</span></div>
+<div><span class="name"
val="shikha">shikha</span><span class="project"
val="mysql">mysql</span><span class="role" val="dev
lead">dev lead</span></div>
+</div>
+</div>
+</body>
+</html>
diff --git a/ui/src/dist/js/widgets/samples/line.html
b/ui/src/dist/js/widgets/samples/line.html
new file mode 100644
index 0000000..cc0b738
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/line.html
@@ -0,0 +1,168 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Wok</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
+
+<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../css/theme-default.min.css">
+
+<script src="../../../libs/jquery-1.10.0.min.js"></script>
+<script src="../../../libs/jquery-ui.min.js"></script>
+<script src="../../../libs/jquery-ui-i18n.min.js"></script>
+<script src="../../../js/wok.min.js"></script>
+
+<style type="text/css">
+body {
+ background: none;
+}
+.cell {
+ display: inline-block;
+ width: 49%;
+}
+.monitor {
+ width: 391px;
+ margin: 15px auto;
+}
+.chart {
+ width: 390px;
+ height: 200px;
+ margin-top: 20px;
+}
+.legend {
+ height: 25px;
+ line-height: 25px;
+ padding-left: 8px;
+ margin: 5px 30px 5px 0;
+ border-left: 3px solid;
+ display: inline-block;
+}
+</style>
+<script>
+function init(){
+$('#chart1').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#d9182d"
+ }]
+});
+$('#chart2').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#008abf"
+ }]
+});
+$('#chart3').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#fdb813"
+ }, {
+ data: new Array(50),
+ color: "#00a6a0"
+ }]
+});
+$('#chart4').line({
+ minVal: 0,
+ maxVal: 500,
+ datasets: [{
+ data: new Array(50),
+ color: "#561289"
+ }, {
+ data: new Array(50),
+ color: "#238901"
+ }]
+});
+setInterval(function(){
+ $('#chart1').line('addData', [Math.round(Math.random()*500)]);
+}, 1000);
+setInterval(function(){
+ $('#chart2').line('addData', [Math.round(Math.random()*500)]);
+}, 1000);
+setInterval(function(){
+ $('#chart3').line('addData',
[Math.round(Math.random()*500),Math.round(Math.random()*500)]);
+}, 1000);
+setInterval(function(){
+ $('#chart4').line('addData',
[Math.round(Math.random()*500),Math.round(Math.random()*500)]);
+}, 1000);
+}
+</script>
+</head>
+<body onload="init()">
+<div>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Processor</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#d9182d;">Used: 41%</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 100%</div>
+ <div id="chart1" class='chart'></div>
+ </div>
+</span>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Memory</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#008abf;">Available: 49%</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 280GB</div>
+ <div id="chart2" class='chart'></div>
+ </div>
+</span>
+</div>
+<div>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Storage IO</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#fdb813">Write: 6KB/S</span>
+ <span class="legend" style="border-color:
#00a6a0">Read: 123KB/S</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 79.04KB/S</div>
+ <div id="chart3" class='chart'></div>
+ </div>
+</span>
+<span class='cell'>
+ <div class="monitor">
+ <div class="h1 grey">Network IO</div>
+ <div class="c1 dark-grey bold">
+ <span class="legend" style="border-color:
#561289">Received: 2KB/S</span>
+ <span class="legend" style="border-color:
#238901">Sent: 1KB/S</span>
+ </div>
+ <div class="c1 light-grey">Maximum: 33.35KB/S</div>
+ <div id="chart4" class='chart'></div>
+ </div>
+</span>
+</div>
+</body>
+</html>
diff --git a/ui/src/dist/js/widgets/samples/list.html
b/ui/src/dist/js/widgets/samples/list.html
new file mode 100644
index 0000000..850550c
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/list.html
@@ -0,0 +1,46 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>List Demo</title>
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../list-flat.js"></script>
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/list-flat.css">
+ <link rel="stylesheet"
href="../../../fontello/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ </head>
+ <body>
+ <div class="list-demo"></div>
+ <script>
+ $(document).ready(function() {
+ $(".list-demo").listFlat({
+ title: "Hello World" //Set title.
+ });
+ $(".list-demo").listFlat("addItem",
"Hello", "2015", "icon-user", "button1");
+ //Add one item of the list, parameters are: name, info, icon and
button-id
+ });
+ </script>
+ </body>
+</html>
diff --git a/ui/src/dist/js/widgets/samples/menu-button-radio-checkbox-text-select.html
b/ui/src/dist/js/widgets/samples/menu-button-radio-checkbox-text-select.html
new file mode 100644
index 0000000..4130a66
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/menu-button-radio-checkbox-text-select.html
@@ -0,0 +1,165 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!DOCTYPE html>
+<html class="no-js" lang="">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width,
initial-scale=1">
+ <title>Kimchi - Action Button Demo</title>
+ <link rel="apple-touch-icon" sizes="57x57"
href="../apple-touch-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60"
href="../apple-touch-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72"
href="../apple-touch-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76"
href="../apple-touch-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114"
href="../apple-touch-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120"
href="../apple-touch-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144"
href="../apple-touch-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152"
href="../apple-touch-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180"
href="../apple-touch-icon-180x180.png">
+ <link rel="icon" type="image/png"
href="../favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png"
href="../favicon-194x194.png" sizes="194x194">
+ <link rel="icon" type="image/png"
href="../favicon-96x96.png" sizes="96x96">
+ <link rel="icon" type="image/png"
href="../android-chrome-192x192.png" sizes="192x192">
+ <link rel="icon" type="image/png"
href="../favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="../manifest.json">
+ <meta name="apple-mobile-web-app-title" content="Kimchi">
+ <meta name="application-name" content="Kimchi">
+ <meta name="msapplication-TileColor" content="#4d4d4d">
+ <meta name="msapplication-TileImage"
content="../mstile-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+ <link rel="stylesheet"
href="libs/themes/base/jquery-ui.css">
+
+ <link rel="stylesheet" href="css/menu-flat.css">
+ <link rel="stylesheet" href="css/button-flat.css">
+ <link rel="stylesheet" href="css/radio-flat.css">
+ <link rel="stylesheet" href="css/checkbox-flat.css">
+ <link rel="stylesheet" href="css/textbox-flat.css">
+ <link rel="stylesheet" href="css/selectmenu-flat.css">
+ <script src="libs/modernizr.js"></script>
+
+ <link rel="stylesheet"
href="fontawesome/css/fontawesome.css">
+ <link rel="stylesheet"
href="libs/themes/base/bootstrap.custom.css">
+</head>
+
+<body>
+ <nav class="navbar navbar-inverse navbar-static-top">
+ <div class="container">
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">Action Button
(menu-flat.js)</a>
+ </div>
+ </div>
+ </nav>
+ <div class="container">
+ <div id="menu"></div>
+ <div style="height:50px">
+ <div id="select"></div>
+ </div>
+ <div class="radio-demo"></div>
+ <div class="checkbox-demo"></div>
+ <input class="text-demo">
+ <button class="button-demo">submit</button>
+ </div>
+ <script src="libs/jquery.js"></script>
+ <script src="libs/jquery-ui.js"></script>
+ <script src="libs/vendor.js"></script>
+ <script src="libs/bootstrap.js"></script>
+ <script src="libs/bootstrap-select.min.js"></script>
+
+ <script src="js/menu-flat.js"></script>
+ <script src="js/button-flat.js"></script>
+ <script src="js/radio-flat.js"></script>
+ <script src="js/checkbox-flat.js"></script>
+ <script src="js/textbox-flat.js"></script>
+ <script src="js/selectmenu-flat.js"></script>
+ <script src="js/main.js"></script>
+
+ <script>
+ $(document).ready(function() {
+ $("#menu").menuFlat({
+ name: "wok-dropdown-menu-0",
+ icon: "icon-edit-alt", //Set icon of the menu button.
+ label: 'Actions', //Set button text
+ content: [{
+ name: 'Add',
+ action: 'add',
+ icon: 'icon-plus-circled-1',
+ critical: false
+ }, {
+ name: 'Enable',
+ action: 'enable',
+ icon: 'icon-play-circled2',
+ critical: false
+ }, {
+ name: 'Edit',
+ action: 'edit',
+ icon: 'icon-pencil-2',
+ critical: false
+ }, {
+ name: 'Delete',
+ action: 'delete',
+ icon: 'icon-minus-circled-1',
+ critical: true
+ }]
+ });
+ $("wok-dropdown-menu-0-0").on("click", function() {
+ alert("First option selected");
+ });
+ $("wok-dropdown-menu-0-1").on("click", function() {
+ console.log("Second option selected");
+ });
+ $("#select").selectmenuFlat({
+ content: [1, 2, 3, 4, 5, 6], //Set content of the select menu
+ selected: 2 // set the selected option, starts from "1"
+ });
+ $("#select").selectmenuFlat("value", "4"); //Set
value.
+ var t = $("#select").selectmenuFlat("value"); //Get value
+ console.log(t);
+ $(".radio-demo").radioFlat({
+ id: "t", //Base id of the radio set.
+ name: "test", //name of the radio.
+ whichChecked: 2, //First selected position, starts from 1.
+ content: ["apple", "banana", "orange",
"cherry"] //set the content array.
+ });
+ $(".radio-demo").click(function() {
+ console.log($(".radio-demo").radioFlat("value")); //this
is how to get the value of selected radio value
+ });
+ $(".checkbox-demo").checkboxFlat({
+ id: "t", //Checkbox base id.
+ name: "test", //Checkbox name.
+ content: ["apple", "banana", "orange",
"cherry"], //Contents of the checkbox set.
+ checked: [1, 3] //Set the checked item, which starts with number 1.
+ });
+ $(".checkbox-demo").click(function() {
+ console.log($(".selector").checkboxFlat("value")); //Get
value of the checked checkbox.
+ });
+ $(".text-demo").textboxFlat({
+ hint: "hint"
+ });
+ $(".text-demo").css({
+ "height": "30px",
+ "width": "200px"
+ });
+ $(".button-demo").buttonFlat();
+ });
+ </script>
+</body>
+
+</html>
diff --git a/ui/src/dist/js/widgets/samples/message.html
b/ui/src/dist/js/widgets/samples/message.html
new file mode 100644
index 0000000..b8a2cf4
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/message.html
@@ -0,0 +1,49 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>Message Demo</title>
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../message-flat.js"></script>
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/message-flat.css">
+ <link rel="stylesheet"
href="../../../fontello/css/animation.css">
+ <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ </head>
+ <body>
+ <div class="message-demo"></div>
+ <script>
+ $(document).ready(function() {
+ $(".message-demo").messageFlat({
+ contentMain: "This is a test", //Content you are going to
add
+ contentConfirm: "Sure?", //Content that inform user
whether they want to continue.
+ //Default value is: "Are you sure you want
to go on?"
+ confirm: function() {
+ alert("comfirmed")
+ }
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/ui/src/dist/js/widgets/samples/messagebar-flat.html
b/ui/src/dist/js/widgets/samples/messagebar-flat.html
new file mode 100644
index 0000000..fd1417a
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/messagebar-flat.html
@@ -0,0 +1,49 @@
+<!--
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>Sample of messagebar</title>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+ <meta name="viewport" content="width=device-width,
initial-scale=1.0, user-scalable=yes" />
+ <link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+ <link rel="stylesheet"
href="../../../fontello/css/animation.css">
+ <link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+ <link rel="stylesheet"
href="../../../css/theme-default/messagebar-flat.css">
+ <script src="../../../libs/jquery-1.10.0.min.js"></script>
+ <script src="../../../libs/jquery-ui.min.js"></script>
+ <script src="../messagebar-flat.js"></script>
+ </head>
+ <body>
+ <div class="message"></div>
+ <script>
+ $(document).ready(function() {
+ $(".message").messagebarFlat({
+ content: "This is a test",
+ color: "red",
+ dismissTime: 1000
+ });
+ });
+ </script>
+ </body>
+
+</html>
diff --git a/ui/src/dist/js/widgets/samples/tabs.html
b/ui/src/dist/js/widgets/samples/tabs.html
new file mode 100644
index 0000000..a8c4b4d
--- /dev/null
+++ b/ui/src/dist/js/widgets/samples/tabs.html
@@ -0,0 +1,68 @@
+<!--
+ *
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Wok</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0,
user-scalable=yes" />
+
+<link rel="stylesheet"
href="../../../libs/themes/base/jquery-ui.min.css">
+<link rel="stylesheet"
href="../../../fontello/css/fontello.css">
+<link rel="stylesheet"
href="../../../fontello/css/animation.css">
+<link rel="stylesheet"
href="../../../css/theme-default.min.css">
+
+<script src="../../../libs/jquery-1.10.0.min.js"></script>
+<script src="../../../libs/jquery-ui.min.js"></script>
+<script src="../../../libs/jquery-ui-i18n.min.js"></script>
+<script src="../../../js/wok.min.js"></script>
+
+<style type="text/css">
+body {
+ background: none;
+}
+</style>
+<script>
+function init(){
+ $( "#tabs" ).tabs();
+}
+</script>
+</head>
+<body onload="init()">
+<div id="tabs">
+ <ul>
+ <li><a href="#tabs-1">Nunc tincidunt</a></li>
+ <li><a href="#tabs-2">Proin dolor</a></li>
+ <li><a href="#tabs-3">Aenean lacinia</a></li>
+ </ul>
+ <div id="tabs-1">
+ <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus.
Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper
ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor
ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam
sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel
pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc
tristique tempus lectus.</p>
+ </div>
+ <div id="tabs-2">
+ <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida
ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla,
massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor.
Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent
in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat
nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque
convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod
felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+ </div>
+ <div id="tabs-3">
+ <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti.
Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem
eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo
pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim,
pretium nec, feugiat nec, luctus a, lacus.</p>
+ <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at,
magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent
blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit,
magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non
libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor
ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo.
Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit
hendrerit.</p>
+ </div>
+</body>
+</html>
diff --git a/ui/src/dist/libs/bootstrap.js b/ui/src/dist/libs/bootstrap.js
new file mode 100644
index 0000000..c99fc77
--- /dev/null
+++ b/ui/src/dist/libs/bootstrap.js
@@ -0,0 +1,2345 @@
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.5
+ *
http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+
+ this.$target = $(this.options.target)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop,
this))
+
+ this.$element = $(element)
+ this.affixed = null
+ this.unpin = null
+ this.pinnedOffset = null
+
+ this.checkPosition()
+ }
+
+ Affix.VERSION = '3.3.5'
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0,
+ target: window
+ }
+
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ var targetHeight = this.$target.height()
+
+ if (offsetTop != null && this.affixed == 'top') return scrollTop <
offsetTop ? 'top' : false
+
+ if (this.affixed == 'bottom') {
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false :
'bottom'
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false :
'bottom'
+ }
+
+ var initializing = this.affixed == null
+ var colliderTop = initializing ? scrollTop : position.top
+ var colliderHeight = initializing ? targetHeight : height
+
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight
- offsetBottom)) return 'bottom'
+
+ return false
+ }
+
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var height = this.$element.height()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+ var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop =
offset.top(this.$element)
+ if (typeof offsetBottom == 'function') offsetBottom =
offset.bottom(this.$element)
+
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+ if (this.affixed != affix) {
+ if (this.unpin != null) this.$element.css('top', '')
+
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger(affixType.replace('affix', 'affixed') +
'.bs.affix')
+ }
+
+ if (affix == 'bottom') {
+ this.$element.offset({
+ top: scrollHeight - height - offsetBottom
+ })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.affix
+
+ $.fn.affix = Plugin
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
+
+ Plugin.call($spy, data)
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.5
+ *
http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // ALERT CLASS DEFINITION
+ // ======================
+
+ var dismiss = '[data-dismiss="alert"]'
+ var Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
+
+ Alert.VERSION = '3.3.5'
+
+ Alert.TRANSITION_DURATION = 150
+
+ Alert.prototype.close = function (e) {
+ var $this = $(this)
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //
strip for ie7
+ }
+
+ var $parent = $(selector)
+
+ if (e) e.preventDefault()
+
+ if (!$parent.length) {
+ $parent = $this.closest('.alert')
+ }
+
+ $parent.trigger(e = $.Event('close.bs.alert'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ // detach from parent, fire event then clean up data
+ $parent.detach().trigger('closed.bs.alert').remove()
+ }
+
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent
+ .one('bsTransitionEnd', removeElement)
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+ removeElement()
+ }
+
+
+ // ALERT PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.alert')
+
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.alert
+
+ $.fn.alert = Plugin
+ $.fn.alert.Constructor = Alert
+
+
+ // ALERT NO CONFLICT
+ // =================
+
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
+
+
+ // ALERT DATA-API
+ // ==============
+
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.5
+ *
http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // DROPDOWN CLASS DEFINITION
+ // =========================
+
+ var backdrop = '.dropdown-backdrop'
+ var toggle = '[data-toggle="dropdown"]'
+ var Dropdown = function (element) {
+ $(element).on('click.bs.dropdown', this.toggle)
+ }
+
+ Dropdown.VERSION = '3.3.5'
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#[A-Za-z]/.test(selector) &&
selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
+ }
+
+ function clearMenus(e) {
+ if (e && e.which === 3) return
+ $(backdrop).remove()
+ $(toggle).each(function () {
+ var $this = $(this)
+ var $parent = getParent($this)
+ var relatedTarget = { relatedTarget: this }
+
+ if (!$parent.hasClass('open')) return
+
+ if (e && e.type == 'click' &&
/input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target))
return
+
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this.attr('aria-expanded', 'false')
+ $parent.removeClass('open').trigger('hidden.bs.dropdown',
relatedTarget)
+ })
+ }
+
+ Dropdown.prototype.toggle = function (e) {
+ var $this = $(this)
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement &&
!$parent.closest('.navbar-nav').length) {
+ // if mobile we use a backdrop because click events don't delegate
+ $(document.createElement('div'))
+ .addClass('dropdown-backdrop')
+ .insertAfter($(this))
+ .on('click', clearMenus)
+ }
+
+ var relatedTarget = { relatedTarget: this }
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this
+ .trigger('focus')
+ .attr('aria-expanded', 'true')
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown', relatedTarget)
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName))
return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ if (!isActive && e.which != 27 || isActive && e.which == 27) {
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
+ return $this.trigger('click')
+ }
+
+ var desc = ' li:not(.disabled):visible a'
+ var $items = $parent.find('.dropdown-menu' + desc)
+
+ if (!$items.length) return
+
+ var index = $items.index(e.target)
+
+ if (e.which == 38 && index > 0) index-- // up
+ if (e.which == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index = 0
+
+ $items.eq(index).trigger('focus')
+ }
+
+
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = Plugin
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ // DROPDOWN NO CONFLICT
+ // ====================
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
+
+ $(document)
+ .on('click.bs.dropdown.data-api', clearMenus)
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) {
e.stopPropagation() })
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+ .on('keydown.bs.dropdown.data-api', '.dropdown-menu',
Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.5
+ *
http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Tooltip = function (element, options) {
+ this.type = null
+ this.options = null
+ this.enabled = null
+ this.timeout = null
+ this.hoverState = null
+ this.$element = null
+ this.inState = null
+
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.VERSION = '3.3.5'
+
+ Tooltip.TRANSITION_DURATION = 150
+
+ Tooltip.DEFAULTS = {
+ animation: true,
+ placement: 'top',
+ selector: false,
+ template: '<div class="tooltip" role="tooltip"><div
class="tooltip-arrow"></div><div
class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ container: false,
+ viewport: {
+ selector: 'body',
+ padding: 0
+ }
+ }
+
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+ this.$viewport = this.options.viewport &&
$($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) :
(this.options.viewport.selector || this.options.viewport))
+ this.inState = { click: false, hover: false, focus: false }
+
+ if (this.$element[0] instanceof document.constructor &&
!this.options.selector) {
+ throw new Error('`selector` option must be specified when initializing ' +
this.type + ' on the window.document object!')
+ }
+
+ var triggers = this.options.trigger.split(' ')
+
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
+
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector,
$.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ var eventIn = trigger == 'hover' ? 'mouseenter' :
'focusin'
+ var eventOut = trigger == 'hover' ? 'mouseleave' :
'focusout'
+
+ this.$element.on(eventIn + '.' + this.type, this.options.selector,
$.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector,
$.proxy(this.leave, this))
+ }
+ }
+
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector:
'' })) :
+ this.fixTitle()
+ }
+
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay,
+ hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
+
+ return options
+ }
+
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ if (obj instanceof $.Event) {
+ self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] =
true
+ }
+
+ if (self.tip().hasClass('in') || self.hoverState == 'in') {
+ self.hoverState = 'in'
+ return
+ }
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.isInStateTrue = function () {
+ for (var key in this.inState) {
+ if (this.inState[key]) return true
+ }
+
+ return false
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ if (obj instanceof $.Event) {
+ self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] =
false
+ }
+
+ if (self.isInStateTrue()) return
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.' + this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement,
this.$element[0])
+ if (e.isDefaultPrevented() || !inDom) return
+ var that = this
+
+ var $tip = this.tip()
+
+ var tipId = this.getUID(this.type)
+
+ this.setContent()
+ $tip.attr('id', tipId)
+ this.$element.attr('aria-describedby', tipId)
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') ||
'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+ .data('bs.' + this.type, this)
+
+ this.options.container ? $tip.appendTo(this.options.container) :
$tip.insertAfter(this.$element)
+ this.$element.trigger('inserted.bs.' + this.type)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var orgPlacement = placement
+ var viewportDim = this.getPosition(this.$viewport)
+
+ placement = placement == 'bottom' && pos.bottom + actualHeight
> viewportDim.bottom ? 'top' :
+ placement == 'top' && pos.top - actualHeight
< viewportDim.top ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth
> viewportDim.width ? 'left' :
+ placement == 'left' && pos.left - actualWidth
< viewportDim.left ? 'right' :
+ placement
+
+ $tip
+ .removeClass(orgPlacement)
+ .addClass(placement)
+ }
+
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth,
actualHeight)
+
+ this.applyPlacement(calculatedOffset, placement)
+
+ var complete = function () {
+ var prevHoverState = that.hoverState
+ that.$element.trigger('shown.bs.' + that.type)
+ that.hoverState = null
+
+ if (prevHoverState == 'out') that.leave(that)
+ }
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+ }
+ }
+
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top += marginTop
+ offset.left += marginLeft
+
+ // $.fn.offset doesn't round pixel values
+ // so we use setOffset directly with our own function B-0
+ $.offset.setOffset($tip[0], $.extend({
+ using: function (props) {
+ $tip.css({
+ top: Math.round(props.top),
+ left: Math.round(props.left)
+ })
+ }
+ }, offset), 0)
+
+ $tip.addClass('in')
+
+ // check to see if placing tip in new offset caused the tip to resize itself
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ offset.top = offset.top + height - actualHeight
+ }
+
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth,
actualHeight)
+
+ if (delta.left) offset.left += delta.left
+ else offset.top += delta.top
+
+ var isVertical = /top|bottom/.test(placement)
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth :
delta.top * 2 - height + actualHeight
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' :
'offsetHeight'
+
+ $tip.offset(offset)
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+ }
+
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+ this.arrow()
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) +
'%')
+ .css(isVertical ? 'top' : 'left', '')
+ }
+
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' :
'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ Tooltip.prototype.hide = function (callback) {
+ var that = this
+ var $tip = $(this.$tip)
+ var e = $.Event('hide.bs.' + this.type)
+
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ that.$element
+ .removeAttr('aria-describedby')
+ .trigger('hidden.bs.' + that.type)
+ callback && callback()
+ }
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ $.support.transition && $tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+
+ this.hoverState = null
+
+ return this
+ }
+
+ Tooltip.prototype.fixTitle = function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof $e.attr('data-original-title') !=
'string') {
+ $e.attr('data-original-title', $e.attr('title') ||
'').attr('title', '')
+ }
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function ($element) {
+ $element = $element || this.$element
+
+ var el = $element[0]
+ var isBody = el.tagName == 'BODY'
+
+ var elRect = el.getBoundingClientRect()
+ if (elRect.width == null) {
+ // width and height are missing in IE8, so compute them manually; see
https://github.com/twbs/bootstrap/issues/14093
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height:
elRect.bottom - elRect.top })
+ }
+ var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop ||
document.body.scrollTop : $element.scrollTop() }
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } :
null
+
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
+ }
+
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth,
actualHeight) {
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left
+ pos.width / 2 - actualWidth / 2 } :
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left
+ pos.width / 2 - actualWidth / 2 } :
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight
/ 2, left: pos.left - actualWidth } :
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight
/ 2, left: pos.left + pos.width }
+
+ }
+
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth,
actualHeight) {
+ var delta = { top: 0, left: 0 }
+ if (!this.$viewport) return delta
+
+ var viewportPadding = this.options.viewport && this.options.viewport.padding
|| 0
+ var viewportDimensions = this.getPosition(this.$viewport)
+
+ if (/right|left/.test(placement)) {
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll +
actualHeight
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
+ delta.top = viewportDimensions.top - topEdgeOffset
+ } else if (bottomEdgeOffset > viewportDimensions.top +
viewportDimensions.height) { // bottom overflow
+ delta.top = viewportDimensions.top + viewportDimensions.height -
bottomEdgeOffset
+ }
+ } else {
+ var leftEdgeOffset = pos.left - viewportPadding
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+ delta.left = viewportDimensions.left - leftEdgeOffset
+ } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+ delta.left = viewportDimensions.left + viewportDimensions.width -
rightEdgeOffset
+ }
+ }
+
+ return delta
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.getUID = function (prefix) {
+ do prefix += ~~(Math.random() * 1000000)
+ while (document.getElementById(prefix))
+ return prefix
+ }
+
+ Tooltip.prototype.tip = function () {
+ if (!this.$tip) {
+ this.$tip = $(this.options.template)
+ if (this.$tip.length != 1) {
+ throw new Error(this.type + ' `template` option must consist of exactly 1
top-level element!')
+ }
+ }
+ return this.$tip
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = this
+ if (e) {
+ self = $(e.currentTarget).data('bs.' + this.type)
+ if (!self) {
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+ $(e.currentTarget).data('bs.' + this.type, self)
+ }
+ }
+
+ if (e) {
+ self.inState.click = !self.inState.click
+ if (self.isInStateTrue()) self.enter(self)
+ else self.leave(self)
+ } else {
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+ }
+
+ Tooltip.prototype.destroy = function () {
+ var that = this
+ clearTimeout(this.timeout)
+ this.hide(function () {
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
+ if (that.$tip) {
+ that.$tip.detach()
+ }
+ that.$tip = null
+ that.$arrow = null
+ that.$viewport = null
+ })
+ }
+
+
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+
+ if (!data && /destroy|hide/.test(option)) return
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = Plugin
+ $.fn.tooltip.Constructor = Tooltip
+
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.5
+ *
http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // MODAL CLASS DEFINITION
+ // ======================
+
+ var Modal = function (element, options) {
+ this.options = options
+ this.$body = $(document.body)
+ this.$element = $(element)
+ this.$dialog = this.$element.find('.modal-dialog')
+ this.$backdrop = null
+ this.isShown = null
+ this.originalBodyPad = null
+ this.scrollbarWidth = 0
+ this.ignoreBackdropClick = false
+
+ if (this.options.remote) {
+ this.$element
+ .find('.modal-content')
+ .load(this.options.remote, $.proxy(function () {
+ this.$element.trigger('loaded.bs.modal')
+ }, this))
+ }
+ }
+
+ Modal.VERSION = '3.3.5'
+
+ Modal.TRANSITION_DURATION = 300
+ Modal.BACKDROP_TRANSITION_DURATION = 150
+
+ Modal.DEFAULTS = {
+ backdrop: true,
+ keyboard: true,
+ show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
+ }
+
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.checkScrollbar()
+ this.setScrollbar()
+ this.$body.addClass('modal-open')
+
+ this.escape()
+ this.resize()
+
+ this.$element.on('click.dismiss.bs.modal',
'[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+ })
+ })
+
+ this.backdrop(function () {
+ var transition = $.support.transition &&
that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(that.$body) // don't move modals dom position
+ }
+
+ that.$element
+ .show()
+ .scrollTop(0)
+
+ that.adjustDialog()
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element.addClass('in')
+
+ that.enforceFocus()
+
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+ transition ?
+ that.$dialog // wait for modal to slide in
+ .one('bsTransitionEnd', function () {
+ that.$element.trigger('focus').trigger(e)
+ })
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ that.$element.trigger('focus').trigger(e)
+ })
+ }
+
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
+
+ e = $.Event('hide.bs.modal')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+ this.resize()
+
+ $(document).off('focusin.bs.modal')
+
+ this.$element
+ .removeClass('in')
+ .off('click.dismiss.bs.modal')
+ .off('mouseup.dismiss.bs.modal')
+
+ this.$dialog.off('mousedown.dismiss.bs.modal')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$element
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ this.hideModal()
+ }
+
+ Modal.prototype.enforceFocus = function () {
+ $(document)
+ .off('focusin.bs.modal') // guard against infinite focus loop
+ .on('focusin.bs.modal', $.proxy(function (e) {
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length)
{
+ this.$element.trigger('focus')
+ }
+ }, this))
+ }
+
+ Modal.prototype.escape = function () {
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+ e.which == 27 && this.hide()
+ }, this))
+ } else if (!this.isShown) {
+ this.$element.off('keydown.dismiss.bs.modal')
+ }
+ }
+
+ Modal.prototype.resize = function () {
+ if (this.isShown) {
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+ } else {
+ $(window).off('resize.bs.modal')
+ }
+ }
+
+ Modal.prototype.hideModal = function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.$body.removeClass('modal-open')
+ that.resetAdjustments()
+ that.resetScrollbar()
+ that.$element.trigger('hidden.bs.modal')
+ })
+ }
+
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ Modal.prototype.backdrop = function (callback) {
+ var that = this
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $(document.createElement('div'))
+ .addClass('modal-backdrop ' + animate)
+ .appendTo(this.$body)
+
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+ if (this.ignoreBackdropClick) {
+ this.ignoreBackdropClick = false
+ return
+ }
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus()
+ : this.hide()
+ }, this))
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop
+ .one('bsTransitionEnd', callback)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ var callbackRemove = function () {
+ that.removeBackdrop()
+ callback && callback()
+ }
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$backdrop
+ .one('bsTransitionEnd', callbackRemove)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callbackRemove()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+ // these following methods are used to handle overflowing modals
+
+ Modal.prototype.handleUpdate = function () {
+ this.adjustDialog()
+ }
+
+ Modal.prototype.adjustDialog = function () {
+ var modalIsOverflowing = this.$element[0].scrollHeight >
document.documentElement.clientHeight
+
+ this.$element.css({
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ?
this.scrollbarWidth : '',
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ?
this.scrollbarWidth : ''
+ })
+ }
+
+ Modal.prototype.resetAdjustments = function () {
+ this.$element.css({
+ paddingLeft: '',
+ paddingRight: ''
+ })
+ }
+
+ Modal.prototype.checkScrollbar = function () {
+ var fullWindowWidth = window.innerWidth
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+ var documentElementRect = document.documentElement.getBoundingClientRect()
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+ }
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+ this.scrollbarWidth = this.measureScrollbar()
+ }
+
+ Modal.prototype.setScrollbar = function () {
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+ this.originalBodyPad = document.body.style.paddingRight || ''
+ if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad +
this.scrollbarWidth)
+ }
+
+ Modal.prototype.resetScrollbar = function () {
+ this.$body.css('padding-right', this.originalBodyPad)
+ }
+
+ Modal.prototype.measureScrollbar = function () { // thx walsh
+ var scrollDiv = document.createElement('div')
+ scrollDiv.className = 'modal-scrollbar-measure'
+ this.$body.append(scrollDiv)
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+ this.$body[0].removeChild(scrollDiv)
+ return scrollbarWidth
+ }
+
+
+ // MODAL PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option, _relatedTarget) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.modal')
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option ==
'object' && option)
+
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option](_relatedTarget)
+ else if (options.show) data.show(_relatedTarget)
+ })
+ }
+
+ var old = $.fn.modal
+
+ $.fn.modal = Plugin
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ // MODAL DATA-API
+ // ==============
+
+ $(document).on('click.bs.modal.data-api',
'[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ var href = $this.attr('href')
+ var $target = $($this.attr('data-target') || (href &&
href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({
remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+ if ($this.is('a')) e.preventDefault()
+
+ $target.one('show.bs.modal', function (showEvent) {
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal
will actually get shown
+ $target.one('hidden.bs.modal', function () {
+ $this.is(':visible') && $this.trigger('focus')
+ })
+ })
+ Plugin.call($target, option, this)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.5
+ *
http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CSS TRANSITION SUPPORT (Shoutout:
http://www.modernizr.com/)
+ // ============================================================
+
+ function transitionEnd() {
+ var el = document.createElement('bootstrap')
+
+ var transEndEventNames = {
+ WebkitTransition : 'webkitTransitionEnd',
+ MozTransition : 'transitionend',
+ OTransition : 'oTransitionEnd otransitionend',
+ transition : 'transitionend'
+ }
+
+ for (var name in transEndEventNames) {
+ if (el.style[name] !== undefined) {
+ return { end: transEndEventNames[name] }
+ }
+ }
+
+ return false // explicit for ie8 ( ._.)
+ }
+
+ //
http://blog.alexmaccaw.com/css-transitions
+ $.fn.emulateTransitionEnd = function (duration) {
+ var called = false
+ var $el = this
+ $(this).one('bsTransitionEnd', function () { called = true })
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+ setTimeout(callback, duration)
+ return this
+ }
+
+ $(function () {
+ $.support.transition = transitionEnd()
+
+ if (!$.support.transition) return
+
+ $.event.special.bsTransitionEnd = {
+ bindType: $.support.transition.end,
+ delegateType: $.support.transition.end,
+ handle: function (e) {
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+ }
+ }
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.5
+ *
http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ this.isLoading = false
+ }
+
+ Button.VERSION = '3.3.5'
+
+ Button.DEFAULTS = {
+ loadingText: 'loading...'
+ }
+
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ var $el = this.$element
+ var val = $el.is('input') ? 'val' : 'html'
+ var data = $el.data()
+
+ state += 'Text'
+
+ if (data.resetText == null) $el.data('resetText', $el[val]())
+
+ // push to event loop to allow forms to submit
+ setTimeout($.proxy(function () {
+ $el[val](data[state] == null ? this.options[state] : data[state])
+
+ if (state == 'loadingText') {
+ this.isLoading = true
+ $el.addClass(d).attr(d, d)
+ } else if (this.isLoading) {
+ this.isLoading = false
+ $el.removeClass(d).removeAttr(d)
+ }
+ }, this), 0)
+ }
+
+ Button.prototype.toggle = function () {
+ var changed = true
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+ if ($parent.length) {
+ var $input = this.$element.find('input')
+ if ($input.prop('type') == 'radio') {
+ if ($input.prop('checked')) changed = false
+ $parent.find('.active').removeClass('active')
+ this.$element.addClass('active')
+ } else if ($input.prop('type') == 'checkbox') {
+ if (($input.prop('checked')) !==
this.$element.hasClass('active')) changed = false
+ this.$element.toggleClass('active')
+ }
+ $input.prop('checked', this.$element.hasClass('active'))
+ if (changed) $input.trigger('change')
+ } else {
+ this.$element.attr('aria-pressed',
!this.$element.hasClass('active'))
+ this.$element.toggleClass('active')
+ }
+ }
+
+
+ // BUTTON PLUGIN DEFINITION
+ // ========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.button')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+ if (option == 'toggle') data.toggle()
+ else if (option) data.setState(option)
+ })
+ }
+
+ var old = $.fn.button
+
+ $.fn.button = Plugin
+ $.fn.button.Constructor = Button
+
+
+ // BUTTON NO CONFLICT
+ // ==================
+
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ // BUTTON DATA-API
+ // ===============
+
+ $(document)
+ .on('click.bs.button.data-api', '[data-toggle^="button"]',
function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ Plugin.call($btn, 'toggle')
+ if (!($(e.target).is('input[type="radio"]') ||
$(e.target).is('input[type="checkbox"]'))) e.preventDefault()
+ })
+ .on('focus.bs.button.data-api blur.bs.button.data-api',
'[data-toggle^="button"]', function (e) {
+ $(e.target).closest('.btn').toggleClass('focus',
/^focus(in)?$/.test(e.type))
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.5
+ *
http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+ Popover.VERSION = '3.3.5'
+
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover" role="tooltip"><div
class="arrow"></div><h3
class="popover-title"></h3><div
class="popover-content"></div></div>'
+ })
+
+
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+ Popover.prototype.constructor = Popover
+
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
+
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' :
'text'](title)
+ $tip.find('.popover-content').children().detach().end()[ // we use append for
html objects to maintain js events
+ this.options.html ? (typeof content == 'string' ? 'html' :
'append') : 'text'
+ ](content)
+
+ $tip.removeClass('fade top bottom left right in')
+
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+ // this manually by checking the contents.
+ if (!$tip.find('.popover-title').html())
$tip.find('.popover-title').hide()
+ }
+
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+ }
+
+
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+
+ if (!data && /destroy|hide/.test(option)) return
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.popover
+
+ $.fn.popover = Plugin
+ $.fn.popover.Constructor = Popover
+
+
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.5
+ *
http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CAROUSEL CLASS DEFINITION
+ // =========================
+
+ var Carousel = function (element, options) {
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.paused = null
+ this.sliding = null
+ this.interval = null
+ this.$active = null
+ this.$items = null
+
+ this.options.keyboard && this.$element.on('keydown.bs.carousel',
$.proxy(this.keydown, this))
+
+ this.options.pause == 'hover' && !('ontouchstart' in
document.documentElement) && this.$element
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+ }
+
+ Carousel.VERSION = '3.3.5'
+
+ Carousel.TRANSITION_DURATION = 600
+
+ Carousel.DEFAULTS = {
+ interval: 5000,
+ pause: 'hover',
+ wrap: true,
+ keyboard: true
+ }
+
+ Carousel.prototype.keydown = function (e) {
+ if (/input|textarea/i.test(e.target.tagName)) return
+ switch (e.which) {
+ case 37: this.prev(); break
+ case 39: this.next(); break
+ default: return
+ }
+
+ e.preventDefault()
+ }
+
+ Carousel.prototype.cycle = function (e) {
+ e || (this.paused = false)
+
+ this.interval && clearInterval(this.interval)
+
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this),
this.options.interval))
+
+ return this
+ }
+
+ Carousel.prototype.getItemIndex = function (item) {
+ this.$items = item.parent().children('.item')
+ return this.$items.index(item || this.$active)
+ }
+
+ Carousel.prototype.getItemForDirection = function (direction, active) {
+ var activeIndex = this.getItemIndex(active)
+ var willWrap = (direction == 'prev' && activeIndex === 0)
+ || (direction == 'next' && activeIndex ==
(this.$items.length - 1))
+ if (willWrap && !this.options.wrap) return active
+ var delta = direction == 'prev' ? -1 : 1
+ var itemIndex = (activeIndex + delta) % this.$items.length
+ return this.$items.eq(itemIndex)
+ }
+
+ Carousel.prototype.to = function (pos) {
+ var that = this
+ var activeIndex = this.getItemIndex(this.$active =
this.$element.find('.item.active'))
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function
() { that.to(pos) }) // yes, "slid"
+ if (activeIndex == pos) return this.pause().cycle()
+
+ return this.slide(pos > activeIndex ? 'next' : 'prev',
this.$items.eq(pos))
+ }
+
+ Carousel.prototype.pause = function (e) {
+ e || (this.paused = true)
+
+ if (this.$element.find('.next, .prev').length &&
$.support.transition) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
+ }
+
+ this.interval = clearInterval(this.interval)
+
+ return this
+ }
+
+ Carousel.prototype.next = function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ Carousel.prototype.prev = function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ Carousel.prototype.slide = function (type, next) {
+ var $active = this.$element.find('.item.active')
+ var $next = next || this.getItemForDirection(type, $active)
+ var isCycling = this.interval
+ var direction = type == 'next' ? 'left' : 'right'
+ var that = this
+
+ if ($next.hasClass('active')) return (this.sliding = false)
+
+ var relatedTarget = $next[0]
+ var slideEvent = $.Event('slide.bs.carousel', {
+ relatedTarget: relatedTarget,
+ direction: direction
+ })
+ this.$element.trigger(slideEvent)
+ if (slideEvent.isDefaultPrevented()) return
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+ $nextIndicator && $nextIndicator.addClass('active')
+ }
+
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget,
direction: direction }) // yes, "slid"
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ $active
+ .one('bsTransitionEnd', function () {
+ $next.removeClass([type, direction].join('
')).addClass('active')
+ $active.removeClass(['active', direction].join(' '))
+ that.sliding = false
+ setTimeout(function () {
+ that.$element.trigger(slidEvent)
+ }, 0)
+ })
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+ } else {
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger(slidEvent)
+ }
+
+ isCycling && this.cycle()
+
+ return this
+ }
+
+
+ // CAROUSEL PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.carousel')
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option ==
'object' && option)
+ var action = typeof option == 'string' ? option : options.slide
+
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+ if (typeof option == 'number') data.to(option)
+ else if (action) data[action]()
+ else if (options.interval) data.pause().cycle()
+ })
+ }
+
+ var old = $.fn.carousel
+
+ $.fn.carousel = Plugin
+ $.fn.carousel.Constructor = Carousel
+
+
+ // CAROUSEL NO CONFLICT
+ // ====================
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
+ }
+
+
+ // CAROUSEL DATA-API
+ // =================
+
+ var clickHandler = function (e) {
+ var href
+ var $this = $(this)
+ var $target = $($this.attr('data-target') || (href =
$this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //
strip for ie7
+ if (!$target.hasClass('carousel')) return
+ var options = $.extend({}, $target.data(), $this.data())
+ var slideIndex = $this.attr('data-slide-to')
+ if (slideIndex) options.interval = false
+
+ Plugin.call($target, options)
+
+ if (slideIndex) {
+ $target.data('bs.carousel').to(slideIndex)
+ }
+
+ e.preventDefault()
+ }
+
+ $(document)
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+ $(window).on('load', function () {
+ $('[data-ride="carousel"]').each(function () {
+ var $carousel = $(this)
+ Plugin.call($carousel, $carousel.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.5
+ *
http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ this.$body = $(document.body)
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target || '') + ' .nav li >
a'
+ this.offsets = []
+ this.targets = []
+ this.activeTarget = null
+ this.scrollHeight = 0
+
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.VERSION = '3.3.5'
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.getScrollHeight = function () {
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight,
document.documentElement.scrollHeight)
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var that = this
+ var offsetMethod = 'offset'
+ var offsetBase = 0
+
+ this.offsets = []
+ this.targets = []
+ this.scrollHeight = this.getScrollHeight()
+
+ if (!$.isWindow(this.$scrollElement[0])) {
+ offsetMethod = 'position'
+ offsetBase = this.$scrollElement.scrollTop()
+ }
+
+ this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(href)
+
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ that.offsets.push(this[0])
+ that.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.getScrollHeight()
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (this.scrollHeight != scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets[targets.length - 1]) &&
this.activate(i)
+ }
+
+ if (activeTarget && scrollTop < offsets[0]) {
+ this.activeTarget = null
+ return this.clear()
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+ && this.activate(targets[i])
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ this.clear()
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+ ScrollSpy.prototype.clear = function () {
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this,
options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = Plugin
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load.bs.scrollspy.data-api', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ Plugin.call($spy, $spy.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.5
+ *
http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // COLLAPSE PUBLIC CLASS DEFINITION
+ // ================================
+
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
+ this.$trigger = $('[data-toggle="collapse"][href="#' +
element.id + '"],' +
+
'[data-toggle="collapse"][data-target="#' + element.id +
'"]')
+ this.transitioning = null
+
+ if (this.options.parent) {
+ this.$parent = this.getParent()
+ } else {
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+ }
+
+ if (this.options.toggle) this.toggle()
+ }
+
+ Collapse.VERSION = '3.3.5'
+
+ Collapse.TRANSITION_DURATION = 350
+
+ Collapse.DEFAULTS = {
+ toggle: true
+ }
+
+ Collapse.prototype.dimension = function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ Collapse.prototype.show = function () {
+ if (this.transitioning || this.$element.hasClass('in')) return
+
+ var activesData
+ var actives = this.$parent &&
this.$parent.children('.panel').children('.in, .collapsing')
+
+ if (actives && actives.length) {
+ activesData = actives.data('bs.collapse')
+ if (activesData && activesData.transitioning) return
+ }
+
+ var startEvent = $.Event('show.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ if (actives && actives.length) {
+ Plugin.call(actives, 'hide')
+ activesData || actives.data('bs.collapse', null)
+ }
+
+ var dimension = this.dimension()
+
+ this.$element
+ .removeClass('collapse')
+ .addClass('collapsing')[dimension](0)
+ .attr('aria-expanded', true)
+
+ this.$trigger
+ .removeClass('collapsed')
+ .attr('aria-expanded', true)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse in')[dimension]('')
+ this.transitioning = 0
+ this.$element
+ .trigger('shown.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+ this.$element
+ .one('bsTransitionEnd', $.proxy(complete, this))
+
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+ }
+
+ Collapse.prototype.hide = function () {
+ if (this.transitioning || !this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('hide.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var dimension = this.dimension()
+
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+ this.$element
+ .addClass('collapsing')
+ .removeClass('collapse in')
+ .attr('aria-expanded', false)
+
+ this.$trigger
+ .addClass('collapsed')
+ .attr('aria-expanded', false)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.transitioning = 0
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse')
+ .trigger('hidden.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ this.$element
+ [dimension](0)
+ .one('bsTransitionEnd', $.proxy(complete, this))
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+ }
+
+ Collapse.prototype.toggle = function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
+ }
+
+ Collapse.prototype.getParent = function () {
+ return $(this.options.parent)
+ .find('[data-toggle="collapse"][data-parent="' +
this.options.parent + '"]')
+ .each($.proxy(function (i, element) {
+ var $element = $(element)
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+ }, this))
+ .end()
+ }
+
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+ var isOpen = $element.hasClass('in')
+
+ $element.attr('aria-expanded', isOpen)
+ $trigger
+ .toggleClass('collapsed', !isOpen)
+ .attr('aria-expanded', isOpen)
+ }
+
+ function getTargetFromTrigger($trigger) {
+ var href
+ var target = $trigger.attr('data-target')
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/,
'') // strip for ie7
+
+ return $(target)
+ }
+
+
+ // COLLAPSE PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.collapse')
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option ==
'object' && option)
+
+ if (!data && options.toggle && /show|hide/.test(option))
options.toggle = false
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = Plugin
+ $.fn.collapse.Constructor = Collapse
+
+
+ // COLLAPSE NO CONFLICT
+ // ====================
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
+ }
+
+
+ // COLLAPSE DATA-API
+ // =================
+
+ $(document).on('click.bs.collapse.data-api',
'[data-toggle="collapse"]', function (e) {
+ var $this = $(this)
+
+ if (!$this.attr('data-target')) e.preventDefault()
+
+ var $target = getTargetFromTrigger($this)
+ var data = $target.data('bs.collapse')
+ var option = data ? 'toggle' : $this.data()
+
+ Plugin.call($target, option)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.5
+ *
http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
+ // jscs:disable requireDollarBeforejQueryAssignment
+ this.element = $(element)
+ // jscs:enable requireDollarBeforejQueryAssignment
+ }
+
+ Tab.VERSION = '3.3.5'
+
+ Tab.TRANSITION_DURATION = 150
+
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //
strip for ie7
+ }
+
+ if ($this.parent('li').hasClass('active')) return
+
+ var $previous = $ul.find('.active:last a')
+ var hideEvent = $.Event('hide.bs.tab', {
+ relatedTarget: $this[0]
+ })
+ var showEvent = $.Event('show.bs.tab', {
+ relatedTarget: $previous[0]
+ })
+
+ $previous.trigger(hideEvent)
+ $this.trigger(showEvent)
+
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+ var $target = $(selector)
+
+ this.activate($this.closest('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $previous.trigger({
+ type: 'hidden.bs.tab',
+ relatedTarget: $this[0]
+ })
+ $this.trigger({
+ type: 'shown.bs.tab',
+ relatedTarget: $previous[0]
+ })
+ })
+ }
+
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && ($active.length && $active.hasClass('fade') ||
!!container.find('> .fade').length)
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', false)
+
+ element
+ .addClass('active')
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if (element.parent('.dropdown-menu').length) {
+ element
+ .closest('li.dropdown')
+ .addClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+ }
+
+ callback && callback()
+ }
+
+ $active.length && transition ?
+ $active
+ .one('bsTransitionEnd', next)
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+ next()
+
+ $active.removeClass('in')
+ }
+
+
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tab
+
+ $.fn.tab = Plugin
+ $.fn.tab.Constructor = Tab
+
+
+ // TAB NO CONFLICT
+ // ===============
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ // TAB DATA-API
+ // ============
+
+ var clickHandler = function (e) {
+ e.preventDefault()
+ Plugin.call($(this), 'show')
+ }
+
+ $(document)
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]',
clickHandler)
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]',
clickHandler)
+
+}(jQuery);
diff --git a/ui/src/dist/libs/jquery-ui.js b/ui/src/dist/libs/jquery-ui.js
new file mode 100644
index 0000000..31ee9cd
--- /dev/null
+++ b/ui/src/dist/libs/jquery-ui.js
@@ -0,0 +1,16617 @@
+/*! jQuery UI - v1.11.4 - 2015-03-11
+*
http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js,
button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js,
effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js,
effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js,
effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js,
menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js,
sortable.js, spinner.js, tabs.js, tooltip.js
+* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+
+ // AMD. Register as an anonymous module.
+ define([ "jquery" ], factory );
+ } else {
+
+ // Browser globals
+ factory( jQuery );
+ }
+}(function( $ ) {
+/*!
+ * jQuery UI Core 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/category/ui-core/
+ */
+
+
+// $.ui might exist from components with no dependencies, e.g., $.ui.position
+$.ui = $.ui || {};
+
+$.extend( $.ui, {
+ version: "1.11.4",
+
+ keyCode: {
+ BACKSPACE: 8,
+ COMMA: 188,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ LEFT: 37,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38
+ }
+});
+
+// plugins
+$.fn.extend({
+ scrollParent: function( includeHidden ) {
+ var position = this.css( "position" ),
+ excludeStaticParent = position === "absolute",
+ overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
+ scrollParent = this.parents().filter( function() {
+ var parent = $( this );
+ if ( excludeStaticParent && parent.css( "position" ) ===
"static" ) {
+ return false;
+ }
+ return overflowRegex.test( parent.css( "overflow" ) + parent.css(
"overflow-y" ) + parent.css( "overflow-x" ) );
+ }).eq( 0 );
+
+ return position === "fixed" || !scrollParent.length ? $( this[ 0
].ownerDocument || document ) : scrollParent;
+ },
+
+ uniqueId: (function() {
+ var uuid = 0;
+
+ return function() {
+ return this.each(function() {
+ if ( !this.id ) {
+ this.id = "ui-id-" + ( ++uuid );
+ }
+ });
+ };
+ })(),
+
+ removeUniqueId: function() {
+ return this.each(function() {
+ if ( /^ui-id-\d+$/.test( this.id ) ) {
+ $( this ).removeAttr( "id" );
+ }
+ });
+ }
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+ var map, mapName, img,
+ nodeName = element.nodeName.toLowerCase();
+ if ( "area" === nodeName ) {
+ map = element.parentNode;
+ mapName = map.name;
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+ return false;
+ }
+ img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
+ return !!img && visible( img );
+ }
+ return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
+ !element.disabled :
+ "a" === nodeName ?
+ element.href || isTabIndexNotNaN :
+ isTabIndexNotNaN) &&
+ // the element and all of its ancestors must be visible
+ visible( element );
+}
+
+function visible( element ) {
+ return $.expr.filters.visible( element ) &&
+ !$( element ).parents().addBack().filter(function() {
+ return $.css( this, "visibility" ) === "hidden";
+ }).length;
+}
+
+$.extend( $.expr[ ":" ], {
+ data: $.expr.createPseudo ?
+ $.expr.createPseudo(function( dataName ) {
+ return function( elem ) {
+ return !!$.data( elem, dataName );
+ };
+ }) :
+ // support: jQuery <1.8
+ function( elem, i, match ) {
+ return !!$.data( elem, match[ 3 ] );
+ },
+
+ focusable: function( element ) {
+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+ },
+
+ tabbable: function( element ) {
+ var tabIndex = $.attr( element, "tabindex" ),
+ isTabIndexNaN = isNaN( tabIndex );
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element,
!isTabIndexNaN );
+ }
+});
+
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+ $.each( [ "Width", "Height" ], function( i, name ) {
+ var side = name === "Width" ? [ "Left", "Right" ] : [
"Top", "Bottom" ],
+ type = name.toLowerCase(),
+ orig = {
+ innerWidth: $.fn.innerWidth,
+ innerHeight: $.fn.innerHeight,
+ outerWidth: $.fn.outerWidth,
+ outerHeight: $.fn.outerHeight
+ };
+
+ function reduce( elem, size, border, margin ) {
+ $.each( side, function() {
+ size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
+ if ( border ) {
+ size -= parseFloat( $.css( elem, "border" + this + "Width" ) )
|| 0;
+ }
+ if ( margin ) {
+ size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
+ }
+ });
+ return size;
+ }
+
+ $.fn[ "inner" + name ] = function( size ) {
+ if ( size === undefined ) {
+ return orig[ "inner" + name ].call( this );
+ }
+
+ return this.each(function() {
+ $( this ).css( type, reduce( this, size ) + "px" );
+ });
+ };
+
+ $.fn[ "outer" + name] = function( size, margin ) {
+ if ( typeof size !== "number" ) {
+ return orig[ "outer" + name ].call( this, size );
+ }
+
+ return this.each(function() {
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
+ });
+ };
+ });
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+ $.fn.addBack = function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ };
+}
+
+// support: jQuery 1.6.1, 1.6.2 (
http://bugs.jquery.com/ticket/9413)
+if ( $( "<a>" ).data( "a-b", "a" ).removeData(
"a-b" ).data( "a-b" ) ) {
+ $.fn.removeData = (function( removeData ) {
+ return function( key ) {
+ if ( arguments.length ) {
+ return removeData.call( this, $.camelCase( key ) );
+ } else {
+ return removeData.call( this );
+ }
+ };
+ })( $.fn.removeData );
+}
+
+// deprecated
+$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
+
+$.fn.extend({
+ focus: (function( orig ) {
+ return function( delay, fn ) {
+ return typeof delay === "number" ?
+ this.each(function() {
+ var elem = this;
+ setTimeout(function() {
+ $( elem ).focus();
+ if ( fn ) {
+ fn.call( elem );
+ }
+ }, delay );
+ }) :
+ orig.apply( this, arguments );
+ };
+ })( $.fn.focus ),
+
+ disableSelection: (function() {
+ var eventType = "onselectstart" in document.createElement( "div" )
?
+ "selectstart" :
+ "mousedown";
+
+ return function() {
+ return this.bind( eventType + ".ui-disableSelection", function( event ) {
+ event.preventDefault();
+ });
+ };
+ })(),
+
+ enableSelection: function() {
+ return this.unbind( ".ui-disableSelection" );
+ },
+
+ zIndex: function( zIndex ) {
+ if ( zIndex !== undefined ) {
+ return this.css( "zIndex", zIndex );
+ }
+
+ if ( this.length ) {
+ var elem = $( this[ 0 ] ), position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the
browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" ||
position === "fixed" ) {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index:
0;"></div></div>
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ }
+
+ return 0;
+ }
+});
+
+// $.ui.plugin is deprecated. Use $.widget() extensions instead.
+$.ui.plugin = {
+ add: function( module, option, set ) {
+ var i,
+ proto = $.ui[ module ].prototype;
+ for ( i in set ) {
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
+ }
+ },
+ call: function( instance, name, args, allowDisconnected ) {
+ var i,
+ set = instance.plugins[ name ];
+
+ if ( !set ) {
+ return;
+ }
+
+ if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
+ return;
+ }
+
+ for ( i = 0; i < set.length; i++ ) {
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
+ set[ i ][ 1 ].apply( instance.element, args );
+ }
+ }
+ }
+};
+
+
+/*!
+ * jQuery UI Widget 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/jQuery.widget/
+ */
+
+
+var widget_uuid = 0,
+ widget_slice = Array.prototype.slice;
+
+$.cleanData = (function( orig ) {
+ return function( elems ) {
+ var events, elem, i;
+ for ( i = 0; (elem = elems[i]) != null; i++ ) {
+ try {
+
+ // Only trigger remove when necessary to save time
+ events = $._data( elem, "events" );
+ if ( events && events.remove ) {
+ $( elem ).triggerHandler( "remove" );
+ }
+
+ //
http://bugs.jquery.com/ticket/8235
+ } catch ( e ) {}
+ }
+ orig( elems );
+ };
+})( $.cleanData );
+
+$.widget = function( name, base, prototype ) {
+ var fullName, existingConstructor, constructor, basePrototype,
+ // proxiedPrototype allows the provided prototype to remain unmodified
+ // so that it can be used as a mixin for multiple widgets (#8876)
+ proxiedPrototype = {},
+ namespace = name.split( "." )[ 0 ];
+
+ name = name.split( "." )[ 1 ];
+ fullName = namespace + "-" + name;
+
+ if ( !prototype ) {
+ prototype = base;
+ base = $.Widget;
+ }
+
+ // create selector for plugin
+ $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+ return !!$.data( elem, fullName );
+ };
+
+ $[ namespace ] = $[ namespace ] || {};
+ existingConstructor = $[ namespace ][ name ];
+ constructor = $[ namespace ][ name ] = function( options, element ) {
+ // allow instantiation without "new" keyword
+ if ( !this._createWidget ) {
+ return new constructor( options, element );
+ }
+
+ // allow instantiation without initializing for simple inheritance
+ // must use "new" keyword (the code above always passes args)
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+ };
+ // extend with the existing constructor to carry over any static properties
+ $.extend( constructor, existingConstructor, {
+ version: prototype.version,
+ // copy the object used to create the prototype in case we need to
+ // redefine the widget later
+ _proto: $.extend( {}, prototype ),
+ // track widgets that inherit from this widget in case this widget is
+ // redefined after a widget inherits from it
+ _childConstructors: []
+ });
+
+ basePrototype = new base();
+ // we need to make the options hash a property directly on the new instance
+ // otherwise we'll modify the options hash on the prototype that we're
+ // inheriting from
+ basePrototype.options = $.widget.extend( {}, basePrototype.options );
+ $.each( prototype, function( prop, value ) {
+ if ( !$.isFunction( value ) ) {
+ proxiedPrototype[ prop ] = value;
+ return;
+ }
+ proxiedPrototype[ prop ] = (function() {
+ var _super = function() {
+ return base.prototype[ prop ].apply( this, arguments );
+ },
+ _superApply = function( args ) {
+ return base.prototype[ prop ].apply( this, args );
+ };
+ return function() {
+ var __super = this._super,
+ __superApply = this._superApply,
+ returnValue;
+
+ this._super = _super;
+ this._superApply = _superApply;
+
+ returnValue = value.apply( this, arguments );
+
+ this._super = __super;
+ this._superApply = __superApply;
+
+ return returnValue;
+ };
+ })();
+ });
+ constructor.prototype = $.widget.extend( basePrototype, {
+ // TODO: remove support for widgetEventPrefix
+ // always use the name + a colon as the prefix, e.g., draggable:start
+ // don't prefix for widgets that aren't DOM-based
+ widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) :
name
+ }, proxiedPrototype, {
+ constructor: constructor,
+ namespace: namespace,
+ widgetName: name,
+ widgetFullName: fullName
+ });
+
+ // If this widget is being redefined then we need to find all widgets that
+ // are inheriting from it and redefine all of them so that they inherit from
+ // the new version of this widget. We're essentially trying to replace one
+ // level in the prototype chain.
+ if ( existingConstructor ) {
+ $.each( existingConstructor._childConstructors, function( i, child ) {
+ var childPrototype = child.prototype;
+
+ // redefine the child widget using the same prototype that was
+ // originally used, but inherit from the new version of the base
+ $.widget( childPrototype.namespace + "." + childPrototype.widgetName,
constructor, child._proto );
+ });
+ // remove the list of existing child constructors from the old constructor
+ // so the old child constructors can be garbage collected
+ delete existingConstructor._childConstructors;
+ } else {
+ base._childConstructors.push( constructor );
+ }
+
+ $.widget.bridge( name, constructor );
+
+ return constructor;
+};
+
+$.widget.extend = function( target ) {
+ var input = widget_slice.call( arguments, 1 ),
+ inputIndex = 0,
+ inputLength = input.length,
+ key,
+ value;
+ for ( ; inputIndex < inputLength; inputIndex++ ) {
+ for ( key in input[ inputIndex ] ) {
+ value = input[ inputIndex ][ key ];
+ if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+ // Clone objects
+ if ( $.isPlainObject( value ) ) {
+ target[ key ] = $.isPlainObject( target[ key ] ) ?
+ $.widget.extend( {}, target[ key ], value ) :
+ // Don't extend strings, arrays, etc. with objects
+ $.widget.extend( {}, value );
+ // Copy everything else by reference
+ } else {
+ target[ key ] = value;
+ }
+ }
+ }
+ }
+ return target;
+};
+
+$.widget.bridge = function( name, object ) {
+ var fullName = object.prototype.widgetFullName || name;
+ $.fn[ name ] = function( options ) {
+ var isMethodCall = typeof options === "string",
+ args = widget_slice.call( arguments, 1 ),
+ returnValue = this;
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var methodValue,
+ instance = $.data( this, fullName );
+ if ( options === "instance" ) {
+ returnValue = instance;
+ return false;
+ }
+ if ( !instance ) {
+ return $.error( "cannot call methods on " + name + " prior to
initialization; " +
+ "attempted to call method '" + options + "'" );
+ }
+ if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+ return $.error( "no such method '" + options + "' for "
+ name + " widget instance" );
+ }
+ methodValue = instance[ options ].apply( instance, args );
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue && methodValue.jquery ?
+ returnValue.pushStack( methodValue.get() ) :
+ methodValue;
+ return false;
+ }
+ });
+ } else {
+
+ // Allow multiple hashes to be passed on init
+ if ( args.length ) {
+ options = $.widget.extend.apply( null, [ options ].concat(args) );
+ }
+
+ this.each(function() {
+ var instance = $.data( this, fullName );
+ if ( instance ) {
+ instance.option( options || {} );
+ if ( instance._init ) {
+ instance._init();
+ }
+ } else {
+ $.data( this, fullName, new object( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+ widgetName: "widget",
+ widgetEventPrefix: "",
+ defaultElement: "<div>",
+ options: {
+ disabled: false,
+
+ // callbacks
+ create: null
+ },
+ _createWidget: function( options, element ) {
+ element = $( element || this.defaultElement || this )[ 0 ];
+ this.element = $( element );
+ this.uuid = widget_uuid++;
+ this.eventNamespace = "." + this.widgetName + this.uuid;
+
+ this.bindings = $();
+ this.hoverable = $();
+ this.focusable = $();
+
+ if ( element !== this ) {
+ $.data( element, this.widgetFullName, this );
+ this._on( true, this.element, {
+ remove: function( event ) {
+ if ( event.target === element ) {
+ this.destroy();
+ }
+ }
+ });
+ this.document = $( element.style ?
+ // element within the document
+ element.ownerDocument :
+ // element is window or document
+ element.document || element );
+ this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+ }
+
+ this.options = $.widget.extend( {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
+ this._create();
+ this._trigger( "create", null, this._getCreateEventData() );
+ this._init();
+ },
+ _getCreateOptions: $.noop,
+ _getCreateEventData: $.noop,
+ _create: $.noop,
+ _init: $.noop,
+
+ destroy: function() {
+ this._destroy();
+ // we can probably remove the unbind calls in 2.0
+ // all event bindings should go through this._on()
+ this.element
+ .unbind( this.eventNamespace )
+ .removeData( this.widgetFullName )
+ // support: jquery <1.6.3
+ //
http://bugs.jquery.com/ticket/9413
+ .removeData( $.camelCase( this.widgetFullName ) );
+ this.widget()
+ .unbind( this.eventNamespace )
+ .removeAttr( "aria-disabled" )
+ .removeClass(
+ this.widgetFullName + "-disabled " +
+ "ui-state-disabled" );
+
+ // clean up events and states
+ this.bindings.unbind( this.eventNamespace );
+ this.hoverable.removeClass( "ui-state-hover" );
+ this.focusable.removeClass( "ui-state-focus" );
+ },
+ _destroy: $.noop,
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key,
+ parts,
+ curOption,
+ i;
+
+ if ( arguments.length === 0 ) {
+ // don't return a reference to the internal hash
+ return $.widget.extend( {}, this.options );
+ }
+
+ if ( typeof key === "string" ) {
+ // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+ options = {};
+ parts = key.split( "." );
+ key = parts.shift();
+ if ( parts.length ) {
+ curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+ for ( i = 0; i < parts.length - 1; i++ ) {
+ curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+ curOption = curOption[ parts[ i ] ];
+ }
+ key = parts.pop();
+ if ( arguments.length === 1 ) {
+ return curOption[ key ] === undefined ? null : curOption[ key ];
+ }
+ curOption[ key ] = value;
+ } else {
+ if ( arguments.length === 1 ) {
+ return this.options[ key ] === undefined ? null : this.options[ key ];
+ }
+ options[ key ] = value;
+ }
+ }
+
+ this._setOptions( options );
+
+ return this;
+ },
+ _setOptions: function( options ) {
+ var key;
+
+ for ( key in options ) {
+ this._setOption( key, options[ key ] );
+ }
+
+ return this;
+ },
+ _setOption: function( key, value ) {
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this.widget()
+ .toggleClass( this.widgetFullName + "-disabled", !!value );
+
+ // If the widget is becoming disabled, then nothing is interactive
+ if ( value ) {
+ this.hoverable.removeClass( "ui-state-hover" );
+ this.focusable.removeClass( "ui-state-focus" );
+ }
+ }
+
+ return this;
+ },
+
+ enable: function() {
+ return this._setOptions({ disabled: false });
+ },
+ disable: function() {
+ return this._setOptions({ disabled: true });
+ },
+
+ _on: function( suppressDisabledCheck, element, handlers ) {
+ var delegateElement,
+ instance = this;
+
+ // no suppressDisabledCheck flag, shuffle arguments
+ if ( typeof suppressDisabledCheck !== "boolean" ) {
+ handlers = element;
+ element = suppressDisabledCheck;
+ suppressDisabledCheck = false;
+ }
+
+ // no element argument, shuffle and use this.element
+ if ( !handlers ) {
+ handlers = element;
+ element = this.element;
+ delegateElement = this.widget();
+ } else {
+ element = delegateElement = $( element );
+ this.bindings = this.bindings.add( element );
+ }
+
+ $.each( handlers, function( event, handler ) {
+ function handlerProxy() {
+ // allow widgets to customize the disabled handling
+ // - disabled as an array instead of boolean
+ // - disabled class as method for disabling individual parts
+ if ( !suppressDisabledCheck &&
+ ( instance.options.disabled === true ||
+ $( this ).hasClass( "ui-state-disabled" ) ) ) {
+ return;
+ }
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+
+ // copy the guid so direct unbinding works
+ if ( typeof handler !== "string" ) {
+ handlerProxy.guid = handler.guid =
+ handler.guid || handlerProxy.guid || $.guid++;
+ }
+
+ var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
+ eventName = match[1] + instance.eventNamespace,
+ selector = match[2];
+ if ( selector ) {
+ delegateElement.delegate( selector, eventName, handlerProxy );
+ } else {
+ element.bind( eventName, handlerProxy );
+ }
+ });
+ },
+
+ _off: function( element, eventName ) {
+ eventName = (eventName || "").split( " " ).join(
this.eventNamespace + " " ) +
+ this.eventNamespace;
+ element.unbind( eventName ).undelegate( eventName );
+
+ // Clear the stack to avoid memory leaks (#10056)
+ this.bindings = $( this.bindings.not( element ).get() );
+ this.focusable = $( this.focusable.not( element ).get() );
+ this.hoverable = $( this.hoverable.not( element ).get() );
+ },
+
+ _delay: function( handler, delay ) {
+ function handlerProxy() {
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+ var instance = this;
+ return setTimeout( handlerProxy, delay || 0 );
+ },
+
+ _hoverable: function( element ) {
+ this.hoverable = this.hoverable.add( element );
+ this._on( element, {
+ mouseenter: function( event ) {
+ $( event.currentTarget ).addClass( "ui-state-hover" );
+ },
+ mouseleave: function( event ) {
+ $( event.currentTarget ).removeClass( "ui-state-hover" );
+ }
+ });
+ },
+
+ _focusable: function( element ) {
+ this.focusable = this.focusable.add( element );
+ this._on( element, {
+ focusin: function( event ) {
+ $( event.currentTarget ).addClass( "ui-state-focus" );
+ },
+ focusout: function( event ) {
+ $( event.currentTarget ).removeClass( "ui-state-focus" );
+ }
+ });
+ },
+
+ _trigger: function( type, event, data ) {
+ var prop, orig,
+ callback = this.options[ type ];
+
+ data = data || {};
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ // the original event may come from any element
+ // so we need to reset the target on the new event
+ event.target = this.element[ 0 ];
+
+ // copy original event properties over to the new event
+ orig = event.originalEvent;
+ if ( orig ) {
+ for ( prop in orig ) {
+ if ( !( prop in event ) ) {
+ event[ prop ] = orig[ prop ];
+ }
+ }
+ }
+
+ this.element.trigger( event, data );
+ return !( $.isFunction( callback ) &&
+ callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method,
defaultEffect ) {
+ $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+ if ( typeof options === "string" ) {
+ options = { effect: options };
+ }
+ var hasOptions,
+ effectName = !options ?
+ method :
+ options === true || typeof options === "number" ?
+ defaultEffect :
+ options.effect || defaultEffect;
+ options = options || {};
+ if ( typeof options === "number" ) {
+ options = { duration: options };
+ }
+ hasOptions = !$.isEmptyObject( options );
+ options.complete = callback;
+ if ( options.delay ) {
+ element.delay( options.delay );
+ }
+ if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+ element[ method ]( options );
+ } else if ( effectName !== method && element[ effectName ] ) {
+ element[ effectName ]( options.duration, options.easing, callback );
+ } else {
+ element.queue(function( next ) {
+ $( this )[ method ]();
+ if ( callback ) {
+ callback.call( element[ 0 ] );
+ }
+ next();
+ });
+ }
+ };
+});
+
+var widget = $.widget;
+
+
+/*!
+ * jQuery UI Mouse 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/mouse/
+ */
+
+
+var mouseHandled = false;
+$( document ).mouseup( function() {
+ mouseHandled = false;
+});
+
+var mouse = $.widget("ui.mouse", {
+ version: "1.11.4",
+ options: {
+ cancel: "input,textarea,button,select,option",
+ distance: 1,
+ delay: 0
+ },
+ _mouseInit: function() {
+ var that = this;
+
+ this.element
+ .bind("mousedown." + this.widgetName, function(event) {
+ return that._mouseDown(event);
+ })
+ .bind("click." + this.widgetName, function(event) {
+ if (true === $.data(event.target, that.widgetName + ".preventClickEvent"))
{
+ $.removeData(event.target, that.widgetName + ".preventClickEvent");
+ event.stopImmediatePropagation();
+ return false;
+ }
+ });
+
+ this.started = false;
+ },
+
+ // TODO: make sure destroying one instance of mouse doesn't mess with
+ // other instances of mouse
+ _mouseDestroy: function() {
+ this.element.unbind("." + this.widgetName);
+ if ( this._mouseMoveDelegate ) {
+ this.document
+ .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
+ .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
+ }
+ },
+
+ _mouseDown: function(event) {
+ // don't let more than one widget handle mouseStart
+ if ( mouseHandled ) {
+ return;
+ }
+
+ this._mouseMoved = false;
+
+ // we may have missed mouseup (out of window)
+ (this._mouseStarted && this._mouseUp(event));
+
+ this._mouseDownEvent = event;
+
+ var that = this,
+ btnIsLeft = (event.which === 1),
+ // event.target.nodeName works around a bug in IE 8 with
+ // disabled inputs (#7620)
+ elIsCancel = (typeof this.options.cancel === "string" &&
event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+ return true;
+ }
+
+ this.mouseDelayMet = !this.options.delay;
+ if (!this.mouseDelayMet) {
+ this._mouseDelayTimer = setTimeout(function() {
+ that.mouseDelayMet = true;
+ }, this.options.delay);
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted = (this._mouseStart(event) !== false);
+ if (!this._mouseStarted) {
+ event.preventDefault();
+ return true;
+ }
+ }
+
+ // Click event may never have fired (Gecko & Opera)
+ if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
+ $.removeData(event.target, this.widgetName + ".preventClickEvent");
+ }
+
+ // these delegates are required to keep context
+ this._mouseMoveDelegate = function(event) {
+ return that._mouseMove(event);
+ };
+ this._mouseUpDelegate = function(event) {
+ return that._mouseUp(event);
+ };
+
+ this.document
+ .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+ .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+ event.preventDefault();
+
+ mouseHandled = true;
+ return true;
+ },
+
+ _mouseMove: function(event) {
+ // Only check for mouseups outside the document if you've moved inside the
document
+ // at least once. This prevents the firing of mouseup in the case of IE<9, which
will
+ // fire a mousemove event if content is placed under the cursor. See #7778
+ // Support: IE <9
+ if ( this._mouseMoved ) {
+ // IE mouseup check - mouseup happened when mouse was out of window
+ if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 )
&& !event.button) {
+ return this._mouseUp(event);
+
+ // Iframe mouseup check - mouseup occurred in another document
+ } else if ( !event.which ) {
+ return this._mouseUp( event );
+ }
+ }
+
+ if ( event.which || event.button ) {
+ this._mouseMoved = true;
+ }
+
+ if (this._mouseStarted) {
+ this._mouseDrag(event);
+ return event.preventDefault();
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted =
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+ }
+
+ return !this._mouseStarted;
+ },
+
+ _mouseUp: function(event) {
+ this.document
+ .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+ .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+ if (this._mouseStarted) {
+ this._mouseStarted = false;
+
+ if (event.target === this._mouseDownEvent.target) {
+ $.data(event.target, this.widgetName + ".preventClickEvent", true);
+ }
+
+ this._mouseStop(event);
+ }
+
+ mouseHandled = false;
+ return false;
+ },
+
+ _mouseDistanceMet: function(event) {
+ return (Math.max(
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
+ ) >= this.options.distance
+ );
+ },
+
+ _mouseDelayMet: function(/* event */) {
+ return this.mouseDelayMet;
+ },
+
+ // These are placeholder methods, to be overriden by extending plugin
+ _mouseStart: function(/* event */) {},
+ _mouseDrag: function(/* event */) {},
+ _mouseStop: function(/* event */) {},
+ _mouseCapture: function(/* event */) { return true; }
+});
+
+
+/*!
+ * jQuery UI Position 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/position/
+ */
+
+(function() {
+
+$.ui = $.ui || {};
+
+var cachedScrollbarWidth, supportsOffsetFractions,
+ max = Math.max,
+ abs = Math.abs,
+ round = Math.round,
+ rhorizontal = /left|center|right/,
+ rvertical = /top|center|bottom/,
+ roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+ rposition = /^\w+/,
+ rpercent = /%$/,
+ _position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+ return [
+ parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+ parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+ ];
+}
+
+function parseCss( element, property ) {
+ return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+function getDimensions( elem ) {
+ var raw = elem[0];
+ if ( raw.nodeType === 9 ) {
+ return {
+ width: elem.width(),
+ height: elem.height(),
+ offset: { top: 0, left: 0 }
+ };
+ }
+ if ( $.isWindow( raw ) ) {
+ return {
+ width: elem.width(),
+ height: elem.height(),
+ offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
+ };
+ }
+ if ( raw.preventDefault ) {
+ return {
+ width: 0,
+ height: 0,
+ offset: { top: raw.pageY, left: raw.pageX }
+ };
+ }
+ return {
+ width: elem.outerWidth(),
+ height: elem.outerHeight(),
+ offset: elem.offset()
+ };
+}
+
+$.position = {
+ scrollbarWidth: function() {
+ if ( cachedScrollbarWidth !== undefined ) {
+ return cachedScrollbarWidth;
+ }
+ var w1, w2,
+ div = $( "<div
style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div
style='height:100px;width:auto;'></div></div>" ),
+ innerDiv = div.children()[0];
+
+ $( "body" ).append( div );
+ w1 = innerDiv.offsetWidth;
+ div.css( "overflow", "scroll" );
+
+ w2 = innerDiv.offsetWidth;
+
+ if ( w1 === w2 ) {
+ w2 = div[0].clientWidth;
+ }
+
+ div.remove();
+
+ return (cachedScrollbarWidth = w1 - w2);
+ },
+ getScrollInfo: function( within ) {
+ var overflowX = within.isWindow || within.isDocument ? "" :
+ within.element.css( "overflow-x" ),
+ overflowY = within.isWindow || within.isDocument ? "" :
+ within.element.css( "overflow-y" ),
+ hasOverflowX = overflowX === "scroll" ||
+ ( overflowX === "auto" && within.width <
within.element[0].scrollWidth ),
+ hasOverflowY = overflowY === "scroll" ||
+ ( overflowY === "auto" && within.height <
within.element[0].scrollHeight );
+ return {
+ width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+ height: hasOverflowX ? $.position.scrollbarWidth() : 0
+ };
+ },
+ getWithinInfo: function( element ) {
+ var withinElement = $( element || window ),
+ isWindow = $.isWindow( withinElement[0] ),
+ isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
+ return {
+ element: withinElement,
+ isWindow: isWindow,
+ isDocument: isDocument,
+ offset: withinElement.offset() || { left: 0, top: 0 },
+ scrollLeft: withinElement.scrollLeft(),
+ scrollTop: withinElement.scrollTop(),
+
+ // support: jQuery 1.6.x
+ // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
+ width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
+ height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
+ };
+ }
+};
+
+$.fn.position = function( options ) {
+ if ( !options || !options.of ) {
+ return _position.apply( this, arguments );
+ }
+
+ // make a copy, we don't want to modify arguments
+ options = $.extend( {}, options );
+
+ var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
+ target = $( options.of ),
+ within = $.position.getWithinInfo( options.within ),
+ scrollInfo = $.position.getScrollInfo( within ),
+ collision = ( options.collision || "flip" ).split( " " ),
+ offsets = {};
+
+ dimensions = getDimensions( target );
+ if ( target[0].preventDefault ) {
+ // force left top to allow flipping
+ options.at = "left top";
+ }
+ targetWidth = dimensions.width;
+ targetHeight = dimensions.height;
+ targetOffset = dimensions.offset;
+ // clone to reuse original targetOffset later
+ basePosition = $.extend( {}, targetOffset );
+
+ // force my and at to have valid horizontal and vertical positions
+ // if a value is missing or invalid, it will be converted to center
+ $.each( [ "my", "at" ], function() {
+ var pos = ( options[ this ] || "" ).split( " " ),
+ horizontalOffset,
+ verticalOffset;
+
+ if ( pos.length === 1) {
+ pos = rhorizontal.test( pos[ 0 ] ) ?
+ pos.concat( [ "center" ] ) :
+ rvertical.test( pos[ 0 ] ) ?
+ [ "center" ].concat( pos ) :
+ [ "center", "center" ];
+ }
+ pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+ pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+ // calculate offsets
+ horizontalOffset = roffset.exec( pos[ 0 ] );
+ verticalOffset = roffset.exec( pos[ 1 ] );
+ offsets[ this ] = [
+ horizontalOffset ? horizontalOffset[ 0 ] : 0,
+ verticalOffset ? verticalOffset[ 0 ] : 0
+ ];
+
+ // reduce to just the positions without the offsets
+ options[ this ] = [
+ rposition.exec( pos[ 0 ] )[ 0 ],
+ rposition.exec( pos[ 1 ] )[ 0 ]
+ ];
+ });
+
+ // normalize collision option
+ if ( collision.length === 1 ) {
+ collision[ 1 ] = collision[ 0 ];
+ }
+
+ if ( options.at[ 0 ] === "right" ) {
+ basePosition.left += targetWidth;
+ } else if ( options.at[ 0 ] === "center" ) {
+ basePosition.left += targetWidth / 2;
+ }
+
+ if ( options.at[ 1 ] === "bottom" ) {
+ basePosition.top += targetHeight;
+ } else if ( options.at[ 1 ] === "center" ) {
+ basePosition.top += targetHeight / 2;
+ }
+
+ atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+ basePosition.left += atOffset[ 0 ];
+ basePosition.top += atOffset[ 1 ];
+
+ return this.each(function() {
+ var collisionPosition, using,
+ elem = $( this ),
+ elemWidth = elem.outerWidth(),
+ elemHeight = elem.outerHeight(),
+ marginLeft = parseCss( this, "marginLeft" ),
+ marginTop = parseCss( this, "marginTop" ),
+ collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
scrollInfo.width,
+ collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" )
+ scrollInfo.height,
+ position = $.extend( {}, basePosition ),
+ myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
+
+ if ( options.my[ 0 ] === "right" ) {
+ position.left -= elemWidth;
+ } else if ( options.my[ 0 ] === "center" ) {
+ position.left -= elemWidth / 2;
+ }
+
+ if ( options.my[ 1 ] === "bottom" ) {
+ position.top -= elemHeight;
+ } else if ( options.my[ 1 ] === "center" ) {
+ position.top -= elemHeight / 2;
+ }
+
+ position.left += myOffset[ 0 ];
+ position.top += myOffset[ 1 ];
+
+ // if the browser doesn't support fractions, then round for consistent results
+ if ( !supportsOffsetFractions ) {
+ position.left = round( position.left );
+ position.top = round( position.top );
+ }
+
+ collisionPosition = {
+ marginLeft: marginLeft,
+ marginTop: marginTop
+ };
+
+ $.each( [ "left", "top" ], function( i, dir ) {
+ if ( $.ui.position[ collision[ i ] ] ) {
+ $.ui.position[ collision[ i ] ][ dir ]( position, {
+ targetWidth: targetWidth,
+ targetHeight: targetHeight,
+ elemWidth: elemWidth,
+ elemHeight: elemHeight,
+ collisionPosition: collisionPosition,
+ collisionWidth: collisionWidth,
+ collisionHeight: collisionHeight,
+ offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
+ my: options.my,
+ at: options.at,
+ within: within,
+ elem: elem
+ });
+ }
+ });
+
+ if ( options.using ) {
+ // adds feedback as second argument to using callback, if present
+ using = function( props ) {
+ var left = targetOffset.left - position.left,
+ right = left + targetWidth - elemWidth,
+ top = targetOffset.top - position.top,
+ bottom = top + targetHeight - elemHeight,
+ feedback = {
+ target: {
+ element: target,
+ left: targetOffset.left,
+ top: targetOffset.top,
+ width: targetWidth,
+ height: targetHeight
+ },
+ element: {
+ element: elem,
+ left: position.left,
+ top: position.top,
+ width: elemWidth,
+ height: elemHeight
+ },
+ horizontal: right < 0 ? "left" : left > 0 ? "right" :
"center",
+ vertical: bottom < 0 ? "top" : top > 0 ? "bottom" :
"middle"
+ };
+ if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+ feedback.horizontal = "center";
+ }
+ if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight )
{
+ feedback.vertical = "middle";
+ }
+ if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+ feedback.important = "horizontal";
+ } else {
+ feedback.important = "vertical";
+ }
+ options.using.call( this, props, feedback );
+ };
+ }
+
+ elem.offset( $.extend( position, { using: using } ) );
+ });
+};
+
+$.ui.position = {
+ fit: {
+ left: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+ outerWidth = within.width,
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+ overLeft = withinOffset - collisionPosLeft,
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+ newOverRight;
+
+ // element is wider than within
+ if ( data.collisionWidth > outerWidth ) {
+ // element is initially over the left side of within
+ if ( overLeft > 0 && overRight <= 0 ) {
+ newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
withinOffset;
+ position.left += overLeft - newOverRight;
+ // element is initially over right side of within
+ } else if ( overRight > 0 && overLeft <= 0 ) {
+ position.left = withinOffset;
+ // element is initially over both left and right sides of within
+ } else {
+ if ( overLeft > overRight ) {
+ position.left = withinOffset + outerWidth - data.collisionWidth;
+ } else {
+ position.left = withinOffset;
+ }
+ }
+ // too far left -> align with left edge
+ } else if ( overLeft > 0 ) {
+ position.left += overLeft;
+ // too far right -> align with right edge
+ } else if ( overRight > 0 ) {
+ position.left -= overRight;
+ // adjust based on position and margin
+ } else {
+ position.left = max( position.left - collisionPosLeft, position.left );
+ }
+ },
+ top: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+ outerHeight = data.within.height,
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
+ overTop = withinOffset - collisionPosTop,
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+ newOverBottom;
+
+ // element is taller than within
+ if ( data.collisionHeight > outerHeight ) {
+ // element is initially over the top of within
+ if ( overTop > 0 && overBottom <= 0 ) {
+ newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
withinOffset;
+ position.top += overTop - newOverBottom;
+ // element is initially over bottom of within
+ } else if ( overBottom > 0 && overTop <= 0 ) {
+ position.top = withinOffset;
+ // element is initially over both top and bottom of within
+ } else {
+ if ( overTop > overBottom ) {
+ position.top = withinOffset + outerHeight - data.collisionHeight;
+ } else {
+ position.top = withinOffset;
+ }
+ }
+ // too far up -> align with top
+ } else if ( overTop > 0 ) {
+ position.top += overTop;
+ // too far down -> align with bottom edge
+ } else if ( overBottom > 0 ) {
+ position.top -= overBottom;
+ // adjust based on position and margin
+ } else {
+ position.top = max( position.top - collisionPosTop, position.top );
+ }
+ }
+ },
+ flip: {
+ left: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.offset.left + within.scrollLeft,
+ outerWidth = within.width,
+ offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+ overLeft = collisionPosLeft - offsetLeft,
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
+ myOffset = data.my[ 0 ] === "left" ?
+ -data.elemWidth :
+ data.my[ 0 ] === "right" ?
+ data.elemWidth :
+ 0,
+ atOffset = data.at[ 0 ] === "left" ?
+ data.targetWidth :
+ data.at[ 0 ] === "right" ?
+ -data.targetWidth :
+ 0,
+ offset = -2 * data.offset[ 0 ],
+ newOverRight,
+ newOverLeft;
+
+ if ( overLeft < 0 ) {
+ newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
outerWidth - withinOffset;
+ if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+ position.left += myOffset + atOffset + offset;
+ }
+ } else if ( overRight > 0 ) {
+ newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset
+ offset - offsetLeft;
+ if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+ position.left += myOffset + atOffset + offset;
+ }
+ }
+ },
+ top: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.offset.top + within.scrollTop,
+ outerHeight = within.height,
+ offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
+ overTop = collisionPosTop - offsetTop,
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+ top = data.my[ 1 ] === "top",
+ myOffset = top ?
+ -data.elemHeight :
+ data.my[ 1 ] === "bottom" ?
+ data.elemHeight :
+ 0,
+ atOffset = data.at[ 1 ] === "top" ?
+ data.targetHeight :
+ data.at[ 1 ] === "bottom" ?
+ -data.targetHeight :
+ 0,
+ offset = -2 * data.offset[ 1 ],
+ newOverTop,
+ newOverBottom;
+ if ( overTop < 0 ) {
+ newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
outerHeight - withinOffset;
+ if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
+ position.top += myOffset + atOffset + offset;
+ }
+ } else if ( overBottom > 0 ) {
+ newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
offset - offsetTop;
+ if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
+ position.top += myOffset + atOffset + offset;
+ }
+ }
+ }
+ },
+ flipfit: {
+ left: function() {
+ $.ui.position.flip.left.apply( this, arguments );
+ $.ui.position.fit.left.apply( this, arguments );
+ },
+ top: function() {
+ $.ui.position.flip.top.apply( this, arguments );
+ $.ui.position.fit.top.apply( this, arguments );
+ }
+ }
+};
+
+// fraction support test
+(function() {
+ var testElement, testElementParent, testElementStyle, offsetLeft, i,
+ body = document.getElementsByTagName( "body" )[ 0 ],
+ div = document.createElement( "div" );
+
+ //Create a "fake body" for testing based on method used in jQuery.support
+ testElement = document.createElement( body ? "div" : "body" );
+ testElementStyle = {
+ visibility: "hidden",
+ width: 0,
+ height: 0,
+ border: 0,
+ margin: 0,
+ background: "none"
+ };
+ if ( body ) {
+ $.extend( testElementStyle, {
+ position: "absolute",
+ left: "-1000px",
+ top: "-1000px"
+ });
+ }
+ for ( i in testElementStyle ) {
+ testElement.style[ i ] = testElementStyle[ i ];
+ }
+ testElement.appendChild( div );
+ testElementParent = body || document.documentElement;
+ testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+ div.style.cssText = "position: absolute; left: 10.7432222px;";
+
+ offsetLeft = $( div ).offset().left;
+ supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
+
+ testElement.innerHTML = "";
+ testElementParent.removeChild( testElement );
+})();
+
+})();
+
+var position = $.ui.position;
+
+
+/*!
+ * jQuery UI Accordion 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/accordion/
+ */
+
+
+var accordion = $.widget( "ui.accordion", {
+ version: "1.11.4",
+ options: {
+ active: 0,
+ animate: {},
+ collapsible: false,
+ event: "click",
+ header: "> li > :first-child,> :not(li):even",
+ heightStyle: "auto",
+ icons: {
+ activeHeader: "ui-icon-triangle-1-s",
+ header: "ui-icon-triangle-1-e"
+ },
+
+ // callbacks
+ activate: null,
+ beforeActivate: null
+ },
+
+ hideProps: {
+ borderTopWidth: "hide",
+ borderBottomWidth: "hide",
+ paddingTop: "hide",
+ paddingBottom: "hide",
+ height: "hide"
+ },
+
+ showProps: {
+ borderTopWidth: "show",
+ borderBottomWidth: "show",
+ paddingTop: "show",
+ paddingBottom: "show",
+ height: "show"
+ },
+
+ _create: function() {
+ var options = this.options;
+ this.prevShow = this.prevHide = $();
+ this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
+ // ARIA
+ .attr( "role", "tablist" );
+
+ // don't allow collapsible: false and active: false / null
+ if ( !options.collapsible && (options.active === false || options.active ==
null) ) {
+ options.active = 0;
+ }
+
+ this._processPanels();
+ // handle negative values
+ if ( options.active < 0 ) {
+ options.active += this.headers.length;
+ }
+ this._refresh();
+ },
+
+ _getCreateEventData: function() {
+ return {
+ header: this.active,
+ panel: !this.active.length ? $() : this.active.next()
+ };
+ },
+
+ _createIcons: function() {
+ var icons = this.options.icons;
+ if ( icons ) {
+ $( "<span>" )
+ .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
+ .prependTo( this.headers );
+ this.active.children( ".ui-accordion-header-icon" )
+ .removeClass( icons.header )
+ .addClass( icons.activeHeader );
+ this.headers.addClass( "ui-accordion-icons" );
+ }
+ },
+
+ _destroyIcons: function() {
+ this.headers
+ .removeClass( "ui-accordion-icons" )
+ .children( ".ui-accordion-header-icon" )
+ .remove();
+ },
+
+ _destroy: function() {
+ var contents;
+
+ // clean up main element
+ this.element
+ .removeClass( "ui-accordion ui-widget ui-helper-reset" )
+ .removeAttr( "role" );
+
+ // clean up headers
+ this.headers
+ .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default
" +
+ "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "aria-selected" )
+ .removeAttr( "aria-controls" )
+ .removeAttr( "tabIndex" )
+ .removeUniqueId();
+
+ this._destroyIcons();
+
+ // clean up content panels
+ contents = this.headers.next()
+ .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " +
+ "ui-accordion-content ui-accordion-content-active ui-state-disabled" )
+ .css( "display", "" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-hidden" )
+ .removeAttr( "aria-labelledby" )
+ .removeUniqueId();
+
+ if ( this.options.heightStyle !== "content" ) {
+ contents.css( "height", "" );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "active" ) {
+ // _activate() will handle invalid values and update this.options
+ this._activate( value );
+ return;
+ }
+
+ if ( key === "event" ) {
+ if ( this.options.event ) {
+ this._off( this.headers, this.options.event );
+ }
+ this._setupEvents( value );
+ }
+
+ this._super( key, value );
+
+ // setting collapsible: false while collapsed; open first panel
+ if ( key === "collapsible" && !value && this.options.active
=== false ) {
+ this._activate( 0 );
+ }
+
+ if ( key === "icons" ) {
+ this._destroyIcons();
+ if ( value ) {
+ this._createIcons();
+ }
+ }
+
+ // #5332 - opacity doesn't cascade to positioned elements in IE
+ // so we need to add the disabled class to the headers and panels
+ if ( key === "disabled" ) {
+ this.element
+ .toggleClass( "ui-state-disabled", !!value )
+ .attr( "aria-disabled", value );
+ this.headers.add( this.headers.next() )
+ .toggleClass( "ui-state-disabled", !!value );
+ }
+ },
+
+ _keydown: function( event ) {
+ if ( event.altKey || event.ctrlKey ) {
+ return;
+ }
+
+ var keyCode = $.ui.keyCode,
+ length = this.headers.length,
+ currentIndex = this.headers.index( event.target ),
+ toFocus = false;
+
+ switch ( event.keyCode ) {
+ case keyCode.RIGHT:
+ case keyCode.DOWN:
+ toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+ break;
+ case keyCode.LEFT:
+ case keyCode.UP:
+ toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+ break;
+ case keyCode.SPACE:
+ case keyCode.ENTER:
+ this._eventHandler( event );
+ break;
+ case keyCode.HOME:
+ toFocus = this.headers[ 0 ];
+ break;
+ case keyCode.END:
+ toFocus = this.headers[ length - 1 ];
+ break;
+ }
+
+ if ( toFocus ) {
+ $( event.target ).attr( "tabIndex", -1 );
+ $( toFocus ).attr( "tabIndex", 0 );
+ toFocus.focus();
+ event.preventDefault();
+ }
+ },
+
+ _panelKeyDown: function( event ) {
+ if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
+ $( event.currentTarget ).prev().focus();
+ }
+ },
+
+ refresh: function() {
+ var options = this.options;
+ this._processPanels();
+
+ // was collapsed or no panel
+ if ( ( options.active === false && options.collapsible === true ) ||
!this.headers.length ) {
+ options.active = false;
+ this.active = $();
+ // active false only when collapsible is true
+ } else if ( options.active === false ) {
+ this._activate( 0 );
+ // was active, but active panel is gone
+ } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[
0 ] ) ) {
+ // all remaining panel are disabled
+ if ( this.headers.length === this.headers.find(".ui-state-disabled").length
) {
+ options.active = false;
+ this.active = $();
+ // activate previous panel
+ } else {
+ this._activate( Math.max( 0, options.active - 1 ) );
+ }
+ // was active, active panel still exists
+ } else {
+ // make sure active index is correct
+ options.active = this.headers.index( this.active );
+ }
+
+ this._destroyIcons();
+
+ this._refresh();
+ },
+
+ _processPanels: function() {
+ var prevHeaders = this.headers,
+ prevPanels = this.panels;
+
+ this.headers = this.element.find( this.options.header )
+ .addClass( "ui-accordion-header ui-state-default ui-corner-all" );
+
+ this.panels = this.headers.next()
+ .addClass( "ui-accordion-content ui-helper-reset ui-widget-content
ui-corner-bottom" )
+ .filter( ":not(.ui-accordion-content-active)" )
+ .hide();
+
+ // Avoid memory leaks (#10056)
+ if ( prevPanels ) {
+ this._off( prevHeaders.not( this.headers ) );
+ this._off( prevPanels.not( this.panels ) );
+ }
+ },
+
+ _refresh: function() {
+ var maxHeight,
+ options = this.options,
+ heightStyle = options.heightStyle,
+ parent = this.element.parent();
+
+ this.active = this._findActive( options.active )
+ .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
+ .removeClass( "ui-corner-all" );
+ this.active.next()
+ .addClass( "ui-accordion-content-active" )
+ .show();
+
+ this.headers
+ .attr( "role", "tab" )
+ .each(function() {
+ var header = $( this ),
+ headerId = header.uniqueId().attr( "id" ),
+ panel = header.next(),
+ panelId = panel.uniqueId().attr( "id" );
+ header.attr( "aria-controls", panelId );
+ panel.attr( "aria-labelledby", headerId );
+ })
+ .next()
+ .attr( "role", "tabpanel" );
+
+ this.headers
+ .not( this.active )
+ .attr({
+ "aria-selected": "false",
+ "aria-expanded": "false",
+ tabIndex: -1
+ })
+ .next()
+ .attr({
+ "aria-hidden": "true"
+ })
+ .hide();
+
+ // make sure at least one header is in the tab order
+ if ( !this.active.length ) {
+ this.headers.eq( 0 ).attr( "tabIndex", 0 );
+ } else {
+ this.active.attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ })
+ .next()
+ .attr({
+ "aria-hidden": "false"
+ });
+ }
+
+ this._createIcons();
+
+ this._setupEvents( options.event );
+
+ if ( heightStyle === "fill" ) {
+ maxHeight = parent.height();
+ this.element.siblings( ":visible" ).each(function() {
+ var elem = $( this ),
+ position = elem.css( "position" );
+
+ if ( position === "absolute" || position === "fixed" ) {
+ return;
+ }
+ maxHeight -= elem.outerHeight( true );
+ });
+
+ this.headers.each(function() {
+ maxHeight -= $( this ).outerHeight( true );
+ });
+
+ this.headers.next()
+ .each(function() {
+ $( this ).height( Math.max( 0, maxHeight -
+ $( this ).innerHeight() + $( this ).height() ) );
+ })
+ .css( "overflow", "auto" );
+ } else if ( heightStyle === "auto" ) {
+ maxHeight = 0;
+ this.headers.next()
+ .each(function() {
+ maxHeight = Math.max( maxHeight, $( this ).css( "height", ""
).height() );
+ })
+ .height( maxHeight );
+ }
+ },
+
+ _activate: function( index ) {
+ var active = this._findActive( index )[ 0 ];
+
+ // trying to activate the already active panel
+ if ( active === this.active[ 0 ] ) {
+ return;
+ }
+
+ // trying to collapse, simulate a click on the currently active header
+ active = active || this.active[ 0 ];
+
+ this._eventHandler({
+ target: active,
+ currentTarget: active,
+ preventDefault: $.noop
+ });
+ },
+
+ _findActive: function( selector ) {
+ return typeof selector === "number" ? this.headers.eq( selector ) : $();
+ },
+
+ _setupEvents: function( event ) {
+ var events = {
+ keydown: "_keydown"
+ };
+ if ( event ) {
+ $.each( event.split( " " ), function( index, eventName ) {
+ events[ eventName ] = "_eventHandler";
+ });
+ }
+
+ this._off( this.headers.add( this.headers.next() ) );
+ this._on( this.headers, events );
+ this._on( this.headers.next(), { keydown: "_panelKeyDown" });
+ this._hoverable( this.headers );
+ this._focusable( this.headers );
+ },
+
+ _eventHandler: function( event ) {
+ var options = this.options,
+ active = this.active,
+ clicked = $( event.currentTarget ),
+ clickedIsActive = clicked[ 0 ] === active[ 0 ],
+ collapsing = clickedIsActive && options.collapsible,
+ toShow = collapsing ? $() : clicked.next(),
+ toHide = active.next(),
+ eventData = {
+ oldHeader: active,
+ oldPanel: toHide,
+ newHeader: collapsing ? $() : clicked,
+ newPanel: toShow
+ };
+
+ event.preventDefault();
+
+ if (
+ // click on active header, but not collapsible
+ ( clickedIsActive && !options.collapsible ) ||
+ // allow canceling activation
+ ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+ return;
+ }
+
+ options.active = collapsing ? false : this.headers.index( clicked );
+
+ // when the call to ._toggle() comes after the class changes
+ // it causes a very odd bug in IE 8 (see #6720)
+ this.active = clickedIsActive ? $() : clicked;
+ this._toggle( eventData );
+
+ // switch classes
+ // corner classes on the previously active header stay after the animation
+ active.removeClass( "ui-accordion-header-active ui-state-active" );
+ if ( options.icons ) {
+ active.children( ".ui-accordion-header-icon" )
+ .removeClass( options.icons.activeHeader )
+ .addClass( options.icons.header );
+ }
+
+ if ( !clickedIsActive ) {
+ clicked
+ .removeClass( "ui-corner-all" )
+ .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
+ if ( options.icons ) {
+ clicked.children( ".ui-accordion-header-icon" )
+ .removeClass( options.icons.header )
+ .addClass( options.icons.activeHeader );
+ }
+
+ clicked
+ .next()
+ .addClass( "ui-accordion-content-active" );
+ }
+ },
+
+ _toggle: function( data ) {
+ var toShow = data.newPanel,
+ toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
+
+ // handle activating a panel during the animation for another activation
+ this.prevShow.add( this.prevHide ).stop( true, true );
+ this.prevShow = toShow;
+ this.prevHide = toHide;
+
+ if ( this.options.animate ) {
+ this._animate( toShow, toHide, data );
+ } else {
+ toHide.hide();
+ toShow.show();
+ this._toggleComplete( data );
+ }
+
+ toHide.attr({
+ "aria-hidden": "true"
+ });
+ toHide.prev().attr({
+ "aria-selected": "false",
+ "aria-expanded": "false"
+ });
+ // if we're switching panels, remove the old header from the tab order
+ // if we're opening from collapsed state, remove the previous header from the tab
order
+ // if we're collapsing, then keep the collapsing header in the tab order
+ if ( toShow.length && toHide.length ) {
+ toHide.prev().attr({
+ "tabIndex": -1,
+ "aria-expanded": "false"
+ });
+ } else if ( toShow.length ) {
+ this.headers.filter(function() {
+ return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
+ })
+ .attr( "tabIndex", -1 );
+ }
+
+ toShow
+ .attr( "aria-hidden", "false" )
+ .prev()
+ .attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ },
+
+ _animate: function( toShow, toHide, data ) {
+ var total, easing, duration,
+ that = this,
+ adjust = 0,
+ boxSizing = toShow.css( "box-sizing" ),
+ down = toShow.length &&
+ ( !toHide.length || ( toShow.index() < toHide.index() ) ),
+ animate = this.options.animate || {},
+ options = down && animate.down || animate,
+ complete = function() {
+ that._toggleComplete( data );
+ };
+
+ if ( typeof options === "number" ) {
+ duration = options;
+ }
+ if ( typeof options === "string" ) {
+ easing = options;
+ }
+ // fall back from options to animation in case of partial down settings
+ easing = easing || options.easing || animate.easing;
+ duration = duration || options.duration || animate.duration;
+
+ if ( !toHide.length ) {
+ return toShow.animate( this.showProps, duration, easing, complete );
+ }
+ if ( !toShow.length ) {
+ return toHide.animate( this.hideProps, duration, easing, complete );
+ }
+
+ total = toShow.show().outerHeight();
+ toHide.animate( this.hideProps, {
+ duration: duration,
+ easing: easing,
+ step: function( now, fx ) {
+ fx.now = Math.round( now );
+ }
+ });
+ toShow
+ .hide()
+ .animate( this.showProps, {
+ duration: duration,
+ easing: easing,
+ complete: complete,
+ step: function( now, fx ) {
+ fx.now = Math.round( now );
+ if ( fx.prop !== "height" ) {
+ if ( boxSizing === "content-box" ) {
+ adjust += fx.now;
+ }
+ } else if ( that.options.heightStyle !== "content" ) {
+ fx.now = Math.round( total - toHide.outerHeight() - adjust );
+ adjust = 0;
+ }
+ }
+ });
+ },
+
+ _toggleComplete: function( data ) {
+ var toHide = data.oldPanel;
+
+ toHide
+ .removeClass( "ui-accordion-content-active" )
+ .prev()
+ .removeClass( "ui-corner-top" )
+ .addClass( "ui-corner-all" );
+
+ // Work around for rendering bug in IE (#5421)
+ if ( toHide.length ) {
+ toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
+ }
+ this._trigger( "activate", null, data );
+ }
+});
+
+
+/*!
+ * jQuery UI Menu 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/menu/
+ */
+
+
+var menu = $.widget( "ui.menu", {
+ version: "1.11.4",
+ defaultElement: "<ul>",
+ delay: 300,
+ options: {
+ icons: {
+ submenu: "ui-icon-carat-1-e"
+ },
+ items: "> *",
+ menus: "ul",
+ position: {
+ my: "left-1 top",
+ at: "right top"
+ },
+ role: "menu",
+
+ // callbacks
+ blur: null,
+ focus: null,
+ select: null
+ },
+
+ _create: function() {
+ this.activeMenu = this.element;
+
+ // Flag used to prevent firing of the click handler
+ // as the event bubbles up through nested menus
+ this.mouseHandled = false;
+ this.element
+ .uniqueId()
+ .addClass( "ui-menu ui-widget ui-widget-content" )
+ .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon"
).length )
+ .attr({
+ role: this.options.role,
+ tabIndex: 0
+ });
+
+ if ( this.options.disabled ) {
+ this.element
+ .addClass( "ui-state-disabled" )
+ .attr( "aria-disabled", "true" );
+ }
+
+ this._on({
+ // Prevent focus from sticking to links inside menu after clicking
+ // them (focus should always stay on UL during navigation).
+ "mousedown .ui-menu-item": function( event ) {
+ event.preventDefault();
+ },
+ "click .ui-menu-item": function( event ) {
+ var target = $( event.target );
+ if ( !this.mouseHandled && target.not( ".ui-state-disabled"
).length ) {
+ this.select( event );
+
+ // Only set the mouseHandled flag if the event will bubble, see #9469.
+ if ( !event.isPropagationStopped() ) {
+ this.mouseHandled = true;
+ }
+
+ // Open submenu on click
+ if ( target.has( ".ui-menu" ).length ) {
+ this.expand( event );
+ } else if ( !this.element.is( ":focus" ) && $( this.document[ 0
].activeElement ).closest( ".ui-menu" ).length ) {
+
+ // Redirect focus to the menu
+ this.element.trigger( "focus", [ true ] );
+
+ // If the active item is on the top level, let it stay active.
+ // Otherwise, blur the active item since it is no longer visible.
+ if ( this.active && this.active.parents( ".ui-menu" ).length ===
1 ) {
+ clearTimeout( this.timer );
+ }
+ }
+ }
+ },
+ "mouseenter .ui-menu-item": function( event ) {
+ // Ignore mouse events while typeahead is active, see #10458.
+ // Prevents focusing the wrong item when typeahead causes a scroll while the mouse
+ // is over an item in the menu
+ if ( this.previousFilter ) {
+ return;
+ }
+ var target = $( event.currentTarget );
+ // Remove ui-state-active class from siblings of the newly focused menu item
+ // to avoid a jump caused by adjacent elements both having a class with a border
+ target.siblings( ".ui-state-active" ).removeClass(
"ui-state-active" );
+ this.focus( event, target );
+ },
+ mouseleave: "collapseAll",
+ "mouseleave .ui-menu": "collapseAll",
+ focus: function( event, keepActiveItem ) {
+ // If there's already an active item, keep it active
+ // If not, activate the first item
+ var item = this.active || this.element.find( this.options.items ).eq( 0 );
+
+ if ( !keepActiveItem ) {
+ this.focus( event, item );
+ }
+ },
+ blur: function( event ) {
+ this._delay(function() {
+ if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
+ this.collapseAll( event );
+ }
+ });
+ },
+ keydown: "_keydown"
+ });
+
+ this.refresh();
+
+ // Clicks outside of a menu collapse any open menus
+ this._on( this.document, {
+ click: function( event ) {
+ if ( this._closeOnDocumentClick( event ) ) {
+ this.collapseAll( event );
+ }
+
+ // Reset the mouseHandled flag
+ this.mouseHandled = false;
+ }
+ });
+ },
+
+ _destroy: function() {
+ // Destroy (sub)menus
+ this.element
+ .removeAttr( "aria-activedescendant" )
+ .find( ".ui-menu" ).addBack()
+ .removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front"
)
+ .removeAttr( "role" )
+ .removeAttr( "tabIndex" )
+ .removeAttr( "aria-labelledby" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "aria-hidden" )
+ .removeAttr( "aria-disabled" )
+ .removeUniqueId()
+ .show();
+
+ // Destroy menu items
+ this.element.find( ".ui-menu-item" )
+ .removeClass( "ui-menu-item" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-disabled" )
+ .removeUniqueId()
+ .removeClass( "ui-state-hover" )
+ .removeAttr( "tabIndex" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-haspopup" )
+ .children().each( function() {
+ var elem = $( this );
+ if ( elem.data( "ui-menu-submenu-carat" ) ) {
+ elem.remove();
+ }
+ });
+
+ // Destroy menu dividers
+ this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider
ui-widget-content" );
+ },
+
+ _keydown: function( event ) {
+ var match, prev, character, skip,
+ preventDefault = true;
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.PAGE_UP:
+ this.previousPage( event );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ this.nextPage( event );
+ break;
+ case $.ui.keyCode.HOME:
+ this._move( "first", "first", event );
+ break;
+ case $.ui.keyCode.END:
+ this._move( "last", "last", event );
+ break;
+ case $.ui.keyCode.UP:
+ this.previous( event );
+ break;
+ case $.ui.keyCode.DOWN:
+ this.next( event );
+ break;
+ case $.ui.keyCode.LEFT:
+ this.collapse( event );
+ break;
+ case $.ui.keyCode.RIGHT:
+ if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+ this.expand( event );
+ }
+ break;
+ case $.ui.keyCode.ENTER:
+ case $.ui.keyCode.SPACE:
+ this._activate( event );
+ break;
+ case $.ui.keyCode.ESCAPE:
+ this.collapse( event );
+ break;
+ default:
+ preventDefault = false;
+ prev = this.previousFilter || "";
+ character = String.fromCharCode( event.keyCode );
+ skip = false;
+
+ clearTimeout( this.filterTimer );
+
+ if ( character === prev ) {
+ skip = true;
+ } else {
+ character = prev + character;
+ }
+
+ match = this._filterMenuItems( character );
+ match = skip && match.index( this.active.next() ) !== -1 ?
+ this.active.nextAll( ".ui-menu-item" ) :
+ match;
+
+ // If no matches on the current filter, reset to the last character pressed
+ // to move down the menu to the first item that starts with that character
+ if ( !match.length ) {
+ character = String.fromCharCode( event.keyCode );
+ match = this._filterMenuItems( character );
+ }
+
+ if ( match.length ) {
+ this.focus( event, match );
+ this.previousFilter = character;
+ this.filterTimer = this._delay(function() {
+ delete this.previousFilter;
+ }, 1000 );
+ } else {
+ delete this.previousFilter;
+ }
+ }
+
+ if ( preventDefault ) {
+ event.preventDefault();
+ }
+ },
+
+ _activate: function( event ) {
+ if ( !this.active.is( ".ui-state-disabled" ) ) {
+ if ( this.active.is( "[aria-haspopup='true']" ) ) {
+ this.expand( event );
+ } else {
+ this.select( event );
+ }
+ }
+ },
+
+ refresh: function() {
+ var menus, items,
+ that = this,
+ icon = this.options.icons.submenu,
+ submenus = this.element.find( this.options.menus );
+
+ this.element.toggleClass( "ui-menu-icons", !!this.element.find(
".ui-icon" ).length );
+
+ // Initialize nested menus
+ submenus.filter( ":not(.ui-menu)" )
+ .addClass( "ui-menu ui-widget ui-widget-content ui-front" )
+ .hide()
+ .attr({
+ role: this.options.role,
+ "aria-hidden": "true",
+ "aria-expanded": "false"
+ })
+ .each(function() {
+ var menu = $( this ),
+ item = menu.parent(),
+ submenuCarat = $( "<span>" )
+ .addClass( "ui-menu-icon ui-icon " + icon )
+ .data( "ui-menu-submenu-carat", true );
+
+ item
+ .attr( "aria-haspopup", "true" )
+ .prepend( submenuCarat );
+ menu.attr( "aria-labelledby", item.attr( "id" ) );
+ });
+
+ menus = submenus.add( this.element );
+ items = menus.find( this.options.items );
+
+ // Initialize menu-items containing spaces and/or dashes only as dividers
+ items.not( ".ui-menu-item" ).each(function() {
+ var item = $( this );
+ if ( that._isDivider( item ) ) {
+ item.addClass( "ui-widget-content ui-menu-divider" );
+ }
+ });
+
+ // Don't refresh list items that are already adapted
+ items.not( ".ui-menu-item, .ui-menu-divider" )
+ .addClass( "ui-menu-item" )
+ .uniqueId()
+ .attr({
+ tabIndex: -1,
+ role: this._itemRole()
+ });
+
+ // Add aria-disabled attribute to any disabled menu item
+ items.filter( ".ui-state-disabled" ).attr( "aria-disabled",
"true" );
+
+ // If the active item has been removed, blur the menu
+ if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
+ this.blur();
+ }
+ },
+
+ _itemRole: function() {
+ return {
+ menu: "menuitem",
+ listbox: "option"
+ }[ this.options.role ];
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "icons" ) {
+ this.element.find( ".ui-menu-icon" )
+ .removeClass( this.options.icons.submenu )
+ .addClass( value.submenu );
+ }
+ if ( key === "disabled" ) {
+ this.element
+ .toggleClass( "ui-state-disabled", !!value )
+ .attr( "aria-disabled", value );
+ }
+ this._super( key, value );
+ },
+
+ focus: function( event, item ) {
+ var nested, focused;
+ this.blur( event, event && event.type === "focus" );
+
+ this._scrollIntoView( item );
+
+ this.active = item.first();
+ focused = this.active.addClass( "ui-state-focus" ).removeClass(
"ui-state-active" );
+ // Only update aria-activedescendant if there's a role
+ // otherwise we assume focus is managed elsewhere
+ if ( this.options.role ) {
+ this.element.attr( "aria-activedescendant", focused.attr( "id" )
);
+ }
+
+ // Highlight active parent menu item, if any
+ this.active
+ .parent()
+ .closest( ".ui-menu-item" )
+ .addClass( "ui-state-active" );
+
+ if ( event && event.type === "keydown" ) {
+ this._close();
+ } else {
+ this.timer = this._delay(function() {
+ this._close();
+ }, this.delay );
+ }
+
+ nested = item.children( ".ui-menu" );
+ if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
+ this._startOpening(nested);
+ }
+ this.activeMenu = item.parent();
+
+ this._trigger( "focus", event, { item: item } );
+ },
+
+ _scrollIntoView: function( item ) {
+ var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+ if ( this._hasScroll() ) {
+ borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) ||
0;
+ paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
+ offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+ scroll = this.activeMenu.scrollTop();
+ elementHeight = this.activeMenu.height();
+ itemHeight = item.outerHeight();
+
+ if ( offset < 0 ) {
+ this.activeMenu.scrollTop( scroll + offset );
+ } else if ( offset + itemHeight > elementHeight ) {
+ this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+ }
+ }
+ },
+
+ blur: function( event, fromFocus ) {
+ if ( !fromFocus ) {
+ clearTimeout( this.timer );
+ }
+
+ if ( !this.active ) {
+ return;
+ }
+
+ this.active.removeClass( "ui-state-focus" );
+ this.active = null;
+
+ this._trigger( "blur", event, { item: this.active } );
+ },
+
+ _startOpening: function( submenu ) {
+ clearTimeout( this.timer );
+
+ // Don't open if already open fixes a Firefox bug that caused a .5 pixel
+ // shift in the submenu position when mousing over the carat icon
+ if ( submenu.attr( "aria-hidden" ) !== "true" ) {
+ return;
+ }
+
+ this.timer = this._delay(function() {
+ this._close();
+ this._open( submenu );
+ }, this.delay );
+ },
+
+ _open: function( submenu ) {
+ var position = $.extend({
+ of: this.active
+ }, this.options.position );
+
+ clearTimeout( this.timer );
+ this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" )
)
+ .hide()
+ .attr( "aria-hidden", "true" );
+
+ submenu
+ .show()
+ .removeAttr( "aria-hidden" )
+ .attr( "aria-expanded", "true" )
+ .position( position );
+ },
+
+ collapseAll: function( event, all ) {
+ clearTimeout( this.timer );
+ this.timer = this._delay(function() {
+ // If we were passed an event, look for the submenu that contains the event
+ var currentMenu = all ? this.element :
+ $( event && event.target ).closest( this.element.find( ".ui-menu" )
);
+
+ // If we found no valid submenu ancestor, use the main menu to close all sub menus
anyway
+ if ( !currentMenu.length ) {
+ currentMenu = this.element;
+ }
+
+ this._close( currentMenu );
+
+ this.blur( event );
+ this.activeMenu = currentMenu;
+ }, this.delay );
+ },
+
+ // With no arguments, closes the currently active menu - if nothing is active
+ // it closes all menus. If passed an argument, it will search for menus BELOW
+ _close: function( startMenu ) {
+ if ( !startMenu ) {
+ startMenu = this.active ? this.active.parent() : this.element;
+ }
+
+ startMenu
+ .find( ".ui-menu" )
+ .hide()
+ .attr( "aria-hidden", "true" )
+ .attr( "aria-expanded", "false" )
+ .end()
+ .find( ".ui-state-active" ).not( ".ui-state-focus" )
+ .removeClass( "ui-state-active" );
+ },
+
+ _closeOnDocumentClick: function( event ) {
+ return !$( event.target ).closest( ".ui-menu" ).length;
+ },
+
+ _isDivider: function( item ) {
+
+ // Match hyphen, em dash, en dash
+ return !/[^\-\u2014\u2013\s]/.test( item.text() );
+ },
+
+ collapse: function( event ) {
+ var newItem = this.active &&
+ this.active.parent().closest( ".ui-menu-item", this.element );
+ if ( newItem && newItem.length ) {
+ this._close();
+ this.focus( event, newItem );
+ }
+ },
+
+ expand: function( event ) {
+ var newItem = this.active &&
+ this.active
+ .children( ".ui-menu " )
+ .find( this.options.items )
+ .first();
+
+ if ( newItem && newItem.length ) {
+ this._open( newItem.parent() );
+
+ // Delay so Firefox will not hide activedescendant change in expanding submenu from
AT
+ this._delay(function() {
+ this.focus( event, newItem );
+ });
+ }
+ },
+
+ next: function( event ) {
+ this._move( "next", "first", event );
+ },
+
+ previous: function( event ) {
+ this._move( "prev", "last", event );
+ },
+
+ isFirstItem: function() {
+ return this.active && !this.active.prevAll( ".ui-menu-item"
).length;
+ },
+
+ isLastItem: function() {
+ return this.active && !this.active.nextAll( ".ui-menu-item"
).length;
+ },
+
+ _move: function( direction, filter, event ) {
+ var next;
+ if ( this.active ) {
+ if ( direction === "first" || direction === "last" ) {
+ next = this.active
+ [ direction === "first" ? "prevAll" : "nextAll" ](
".ui-menu-item" )
+ .eq( -1 );
+ } else {
+ next = this.active
+ [ direction + "All" ]( ".ui-menu-item" )
+ .eq( 0 );
+ }
+ }
+ if ( !next || !next.length || !this.active ) {
+ next = this.activeMenu.find( this.options.items )[ filter ]();
+ }
+
+ this.focus( event, next );
+ },
+
+ nextPage: function( event ) {
+ var item, base, height;
+
+ if ( !this.active ) {
+ this.next( event );
+ return;
+ }
+ if ( this.isLastItem() ) {
+ return;
+ }
+ if ( this._hasScroll() ) {
+ base = this.active.offset().top;
+ height = this.element.height();
+ this.active.nextAll( ".ui-menu-item" ).each(function() {
+ item = $( this );
+ return item.offset().top - base - height < 0;
+ });
+
+ this.focus( event, item );
+ } else {
+ this.focus( event, this.activeMenu.find( this.options.items )
+ [ !this.active ? "first" : "last" ]() );
+ }
+ },
+
+ previousPage: function( event ) {
+ var item, base, height;
+ if ( !this.active ) {
+ this.next( event );
+ return;
+ }
+ if ( this.isFirstItem() ) {
+ return;
+ }
+ if ( this._hasScroll() ) {
+ base = this.active.offset().top;
+ height = this.element.height();
+ this.active.prevAll( ".ui-menu-item" ).each(function() {
+ item = $( this );
+ return item.offset().top - base + height > 0;
+ });
+
+ this.focus( event, item );
+ } else {
+ this.focus( event, this.activeMenu.find( this.options.items ).first() );
+ }
+ },
+
+ _hasScroll: function() {
+ return this.element.outerHeight() < this.element.prop( "scrollHeight" );
+ },
+
+ select: function( event ) {
+ // TODO: It should never be possible to not have an active item at this
+ // point, but the tests don't trigger mouseenter before click.
+ this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
+ var ui = { item: this.active };
+ if ( !this.active.has( ".ui-menu" ).length ) {
+ this.collapseAll( event, true );
+ }
+ this._trigger( "select", event, ui );
+ },
+
+ _filterMenuItems: function(character) {
+ var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g,
"\\$&" ),
+ regex = new RegExp( "^" + escapedCharacter, "i" );
+
+ return this.activeMenu
+ .find( this.options.items )
+
+ // Only match on items, not dividers or other content (#10571)
+ .filter( ".ui-menu-item" )
+ .filter(function() {
+ return regex.test( $.trim( $( this ).text() ) );
+ });
+ }
+});
+
+
+/*!
+ * jQuery UI Autocomplete 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/autocomplete/
+ */
+
+
+$.widget( "ui.autocomplete", {
+ version: "1.11.4",
+ defaultElement: "<input>",
+ options: {
+ appendTo: null,
+ autoFocus: false,
+ delay: 300,
+ minLength: 1,
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ source: null,
+
+ // callbacks
+ change: null,
+ close: null,
+ focus: null,
+ open: null,
+ response: null,
+ search: null,
+ select: null
+ },
+
+ requestIndex: 0,
+ pending: 0,
+
+ _create: function() {
+ // Some browsers only repeat keydown events, not keypress events,
+ // so we use the suppressKeyPress flag to determine if we've already
+ // handled the keydown event. #7269
+ // Unfortunately the code for & in keypress is the same as the up arrow,
+ // so we use the suppressKeyPressRepeat flag to avoid handling keypress
+ // events when we know the keydown event was used to modify the
+ // search term. #7799
+ var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
+ nodeName = this.element[ 0 ].nodeName.toLowerCase(),
+ isTextarea = nodeName === "textarea",
+ isInput = nodeName === "input";
+
+ this.isMultiLine =
+ // Textareas are always multi-line
+ isTextarea ? true :
+ // Inputs are always single-line, even if inside a contentEditable element
+ // IE also treats inputs as contentEditable
+ isInput ? false :
+ // All other element types are determined by whether or not they're
contentEditable
+ this.element.prop( "isContentEditable" );
+
+ this.valueMethod = this.element[ isTextarea || isInput ? "val" :
"text" ];
+ this.isNewMenu = true;
+
+ this.element
+ .addClass( "ui-autocomplete-input" )
+ .attr( "autocomplete", "off" );
+
+ this._on( this.element, {
+ keydown: function( event ) {
+ if ( this.element.prop( "readOnly" ) ) {
+ suppressKeyPress = true;
+ suppressInput = true;
+ suppressKeyPressRepeat = true;
+ return;
+ }
+
+ suppressKeyPress = false;
+ suppressInput = false;
+ suppressKeyPressRepeat = false;
+ var keyCode = $.ui.keyCode;
+ switch ( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ suppressKeyPress = true;
+ this._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ suppressKeyPress = true;
+ this._move( "nextPage", event );
+ break;
+ case keyCode.UP:
+ suppressKeyPress = true;
+ this._keyEvent( "previous", event );
+ break;
+ case keyCode.DOWN:
+ suppressKeyPress = true;
+ this._keyEvent( "next", event );
+ break;
+ case keyCode.ENTER:
+ // when menu is open and has focus
+ if ( this.menu.active ) {
+ // #6055 - Opera still allows the keypress to occur
+ // which causes forms to submit
+ suppressKeyPress = true;
+ event.preventDefault();
+ this.menu.select( event );
+ }
+ break;
+ case keyCode.TAB:
+ if ( this.menu.active ) {
+ this.menu.select( event );
+ }
+ break;
+ case keyCode.ESCAPE:
+ if ( this.menu.element.is( ":visible" ) ) {
+ if ( !this.isMultiLine ) {
+ this._value( this.term );
+ }
+ this.close( event );
+ // Different browsers have different default behavior for escape
+ // Single press can mean undo or clear
+ // Double press in IE means clear the whole form
+ event.preventDefault();
+ }
+ break;
+ default:
+ suppressKeyPressRepeat = true;
+ // search timeout should be triggered before the input value is changed
+ this._searchTimeout( event );
+ break;
+ }
+ },
+ keypress: function( event ) {
+ if ( suppressKeyPress ) {
+ suppressKeyPress = false;
+ if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+ event.preventDefault();
+ }
+ return;
+ }
+ if ( suppressKeyPressRepeat ) {
+ return;
+ }
+
+ // replicate some key handlers to allow them to repeat in Firefox and Opera
+ var keyCode = $.ui.keyCode;
+ switch ( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ this._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ this._move( "nextPage", event );
+ break;
+ case keyCode.UP:
+ this._keyEvent( "previous", event );
+ break;
+ case keyCode.DOWN:
+ this._keyEvent( "next", event );
+ break;
+ }
+ },
+ input: function( event ) {
+ if ( suppressInput ) {
+ suppressInput = false;
+ event.preventDefault();
+ return;
+ }
+ this._searchTimeout( event );
+ },
+ focus: function() {
+ this.selectedItem = null;
+ this.previous = this._value();
+ },
+ blur: function( event ) {
+ if ( this.cancelBlur ) {
+ delete this.cancelBlur;
+ return;
+ }
+
+ clearTimeout( this.searching );
+ this.close( event );
+ this._change( event );
+ }
+ });
+
+ this._initSource();
+ this.menu = $( "<ul>" )
+ .addClass( "ui-autocomplete ui-front" )
+ .appendTo( this._appendTo() )
+ .menu({
+ // disable ARIA support, the live region takes care of that
+ role: null
+ })
+ .hide()
+ .menu( "instance" );
+
+ this._on( this.menu.element, {
+ mousedown: function( event ) {
+ // prevent moving focus out of the text field
+ event.preventDefault();
+
+ // IE doesn't prevent moving focus even with event.preventDefault()
+ // so we set a flag to know when we should ignore the blur event
+ this.cancelBlur = true;
+ this._delay(function() {
+ delete this.cancelBlur;
+ });
+
+ // clicking on the scrollbar causes focus to shift to the body
+ // but we can't detect a mouseup or a click immediately afterward
+ // so we have to track the next mousedown and close the menu if
+ // the user clicks somewhere outside of the autocomplete
+ var menuElement = this.menu.element[ 0 ];
+ if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+ this._delay(function() {
+ var that = this;
+ this.document.one( "mousedown", function( event ) {
+ if ( event.target !== that.element[ 0 ] &&
+ event.target !== menuElement &&
+ !$.contains( menuElement, event.target ) ) {
+ that.close();
+ }
+ });
+ });
+ }
+ },
+ menufocus: function( event, ui ) {
+ var label, item;
+ // support: Firefox
+ // Prevent accidental activation of menu items in Firefox (#7024 #9118)
+ if ( this.isNewMenu ) {
+ this.isNewMenu = false;
+ if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
+ this.menu.blur();
+
+ this.document.one( "mousemove", function() {
+ $( event.target ).trigger( event.originalEvent );
+ });
+
+ return;
+ }
+ }
+
+ item = ui.item.data( "ui-autocomplete-item" );
+ if ( false !== this._trigger( "focus", event, { item: item } ) ) {
+ // use value to match what will end up in the input, if it was a key event
+ if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
+ this._value( item.value );
+ }
+ }
+
+ // Announce the value in the liveRegion
+ label = ui.item.attr( "aria-label" ) || item.value;
+ if ( label && $.trim( label ).length ) {
+ this.liveRegion.children().hide();
+ $( "<div>" ).text( label ).appendTo( this.liveRegion );
+ }
+ },
+ menuselect: function( event, ui ) {
+ var item = ui.item.data( "ui-autocomplete-item" ),
+ previous = this.previous;
+
+ // only trigger when focus was lost (click on menu)
+ if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
+ this.element.focus();
+ this.previous = previous;
+ // #6109 - IE triggers two focus events and the second
+ // is asynchronous, so we need to reset the previous
+ // term synchronously and asynchronously :-(
+ this._delay(function() {
+ this.previous = previous;
+ this.selectedItem = item;
+ });
+ }
+
+ if ( false !== this._trigger( "select", event, { item: item } ) ) {
+ this._value( item.value );
+ }
+ // reset the term after the select event
+ // this allows custom select handling to work properly
+ this.term = this._value();
+
+ this.close( event );
+ this.selectedItem = item;
+ }
+ });
+
+ this.liveRegion = $( "<span>", {
+ role: "status",
+ "aria-live": "assertive",
+ "aria-relevant": "additions"
+ })
+ .addClass( "ui-helper-hidden-accessible" )
+ .appendTo( this.document[ 0 ].body );
+
+ // turning off autocomplete prevents the browser from remembering the
+ // value when navigating through history, so we re-enable autocomplete
+ // if the page is unloaded before the widget is destroyed. #7790
+ this._on( this.window, {
+ beforeunload: function() {
+ this.element.removeAttr( "autocomplete" );
+ }
+ });
+ },
+
+ _destroy: function() {
+ clearTimeout( this.searching );
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" );
+ this.menu.element.remove();
+ this.liveRegion.remove();
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+ if ( key === "source" ) {
+ this._initSource();
+ }
+ if ( key === "appendTo" ) {
+ this.menu.element.appendTo( this._appendTo() );
+ }
+ if ( key === "disabled" && value && this.xhr ) {
+ this.xhr.abort();
+ }
+ },
+
+ _appendTo: function() {
+ var element = this.options.appendTo;
+
+ if ( element ) {
+ element = element.jquery || element.nodeType ?
+ $( element ) :
+ this.document.find( element ).eq( 0 );
+ }
+
+ if ( !element || !element[ 0 ] ) {
+ element = this.element.closest( ".ui-front" );
+ }
+
+ if ( !element.length ) {
+ element = this.document[ 0 ].body;
+ }
+
+ return element;
+ },
+
+ _initSource: function() {
+ var array, url,
+ that = this;
+ if ( $.isArray( this.options.source ) ) {
+ array = this.options.source;
+ this.source = function( request, response ) {
+ response( $.ui.autocomplete.filter( array, request.term ) );
+ };
+ } else if ( typeof this.options.source === "string" ) {
+ url = this.options.source;
+ this.source = function( request, response ) {
+ if ( that.xhr ) {
+ that.xhr.abort();
+ }
+ that.xhr = $.ajax({
+ url: url,
+ data: request,
+ dataType: "json",
+ success: function( data ) {
+ response( data );
+ },
+ error: function() {
+ response([]);
+ }
+ });
+ };
+ } else {
+ this.source = this.options.source;
+ }
+ },
+
+ _searchTimeout: function( event ) {
+ clearTimeout( this.searching );
+ this.searching = this._delay(function() {
+
+ // Search if the value has changed, or if the user retypes the same value (see #7434)
+ var equalValues = this.term === this._value(),
+ menuVisible = this.menu.element.is( ":visible" ),
+ modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
+
+ if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) )
{
+ this.selectedItem = null;
+ this.search( null, event );
+ }
+ }, this.options.delay );
+ },
+
+ search: function( value, event ) {
+ value = value != null ? value : this._value();
+
+ // always save the actual value, not the one passed as an argument
+ this.term = this._value();
+
+ if ( value.length < this.options.minLength ) {
+ return this.close( event );
+ }
+
+ if ( this._trigger( "search", event ) === false ) {
+ return;
+ }
+
+ return this._search( value );
+ },
+
+ _search: function( value ) {
+ this.pending++;
+ this.element.addClass( "ui-autocomplete-loading" );
+ this.cancelSearch = false;
+
+ this.source( { term: value }, this._response() );
+ },
+
+ _response: function() {
+ var index = ++this.requestIndex;
+
+ return $.proxy(function( content ) {
+ if ( index === this.requestIndex ) {
+ this.__response( content );
+ }
+
+ this.pending--;
+ if ( !this.pending ) {
+ this.element.removeClass( "ui-autocomplete-loading" );
+ }
+ }, this );
+ },
+
+ __response: function( content ) {
+ if ( content ) {
+ content = this._normalize( content );
+ }
+ this._trigger( "response", null, { content: content } );
+ if ( !this.options.disabled && content && content.length &&
!this.cancelSearch ) {
+ this._suggest( content );
+ this._trigger( "open" );
+ } else {
+ // use ._close() instead of .close() so we don't cancel future searches
+ this._close();
+ }
+ },
+
+ close: function( event ) {
+ this.cancelSearch = true;
+ this._close( event );
+ },
+
+ _close: function( event ) {
+ if ( this.menu.element.is( ":visible" ) ) {
+ this.menu.element.hide();
+ this.menu.blur();
+ this.isNewMenu = true;
+ this._trigger( "close", event );
+ }
+ },
+
+ _change: function( event ) {
+ if ( this.previous !== this._value() ) {
+ this._trigger( "change", event, { item: this.selectedItem } );
+ }
+ },
+
+ _normalize: function( items ) {
+ // assume all items have the right format when the first item is complete
+ if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
+ return items;
+ }
+ return $.map( items, function( item ) {
+ if ( typeof item === "string" ) {
+ return {
+ label: item,
+ value: item
+ };
+ }
+ return $.extend( {}, item, {
+ label: item.label || item.value,
+ value: item.value || item.label
+ });
+ });
+ },
+
+ _suggest: function( items ) {
+ var ul = this.menu.element.empty();
+ this._renderMenu( ul, items );
+ this.isNewMenu = true;
+ this.menu.refresh();
+
+ // size and position menu
+ ul.show();
+ this._resizeMenu();
+ ul.position( $.extend({
+ of: this.element
+ }, this.options.position ) );
+
+ if ( this.options.autoFocus ) {
+ this.menu.next();
+ }
+ },
+
+ _resizeMenu: function() {
+ var ul = this.menu.element;
+ ul.outerWidth( Math.max(
+ // Firefox wraps long text (possibly a rounding bug)
+ // so we add 1px to avoid the wrapping (#7513)
+ ul.width( "" ).outerWidth() + 1,
+ this.element.outerWidth()
+ ) );
+ },
+
+ _renderMenu: function( ul, items ) {
+ var that = this;
+ $.each( items, function( index, item ) {
+ that._renderItemData( ul, item );
+ });
+ },
+
+ _renderItemData: function( ul, item ) {
+ return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
+ },
+
+ _renderItem: function( ul, item ) {
+ return $( "<li>" ).text( item.label ).appendTo( ul );
+ },
+
+ _move: function( direction, event ) {
+ if ( !this.menu.element.is( ":visible" ) ) {
+ this.search( null, event );
+ return;
+ }
+ if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
+ this.menu.isLastItem() && /^next/.test( direction ) ) {
+
+ if ( !this.isMultiLine ) {
+ this._value( this.term );
+ }
+
+ this.menu.blur();
+ return;
+ }
+ this.menu[ direction ]( event );
+ },
+
+ widget: function() {
+ return this.menu.element;
+ },
+
+ _value: function() {
+ return this.valueMethod.apply( this.element, arguments );
+ },
+
+ _keyEvent: function( keyEvent, event ) {
+ if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+ this._move( keyEvent, event );
+
+ // prevents moving cursor to beginning/end of the text field in some browsers
+ event.preventDefault();
+ }
+ }
+});
+
+$.extend( $.ui.autocomplete, {
+ escapeRegex: function( value ) {
+ return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
+ },
+ filter: function( array, term ) {
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
+ return $.grep( array, function( value ) {
+ return matcher.test( value.label || value.value || value );
+ });
+ }
+});
+
+// live region extension, adding a `messages` option
+// NOTE: This is an experimental API. We are still investigating
+// a full solution for string manipulation and internationalization.
+$.widget( "ui.autocomplete", $.ui.autocomplete, {
+ options: {
+ messages: {
+ noResults: "No search results.",
+ results: function( amount ) {
+ return amount + ( amount > 1 ? " results are" : " result is" )
+
+ " available, use up and down arrow keys to navigate.";
+ }
+ }
+ },
+
+ __response: function( content ) {
+ var message;
+ this._superApply( arguments );
+ if ( this.options.disabled || this.cancelSearch ) {
+ return;
+ }
+ if ( content && content.length ) {
+ message = this.options.messages.results( content.length );
+ } else {
+ message = this.options.messages.noResults;
+ }
+ this.liveRegion.children().hide();
+ $( "<div>" ).text( message ).appendTo( this.liveRegion );
+ }
+});
+
+var autocomplete = $.ui.autocomplete;
+
+
+/*!
+ * jQuery UI Button 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/button/
+ */
+
+
+var lastActive,
+ baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons
ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+ formResetHandler = function() {
+ var form = $( this );
+ setTimeout(function() {
+ form.find( ":ui-button" ).button( "refresh" );
+ }, 1 );
+ },
+ radioGroup = function( radio ) {
+ var name = radio.name,
+ form = radio.form,
+ radios = $( [] );
+ if ( name ) {
+ name = name.replace( /'/g, "\\'" );
+ if ( form ) {
+ radios = $( form ).find( "[name='" + name +
"'][type=radio]" );
+ } else {
+ radios = $( "[name='" + name + "'][type=radio]",
radio.ownerDocument )
+ .filter(function() {
+ return !this.form;
+ });
+ }
+ }
+ return radios;
+ };
+
+$.widget( "ui.button", {
+ version: "1.11.4",
+ defaultElement: "<button>",
+ options: {
+ disabled: null,
+ text: true,
+ label: null,
+ icons: {
+ primary: null,
+ secondary: null
+ }
+ },
+ _create: function() {
+ this.element.closest( "form" )
+ .unbind( "reset" + this.eventNamespace )
+ .bind( "reset" + this.eventNamespace, formResetHandler );
+
+ if ( typeof this.options.disabled !== "boolean" ) {
+ this.options.disabled = !!this.element.prop( "disabled" );
+ } else {
+ this.element.prop( "disabled", this.options.disabled );
+ }
+
+ this._determineButtonType();
+ this.hasTitle = !!this.buttonElement.attr( "title" );
+
+ var that = this,
+ options = this.options,
+ toggleButton = this.type === "checkbox" || this.type === "radio",
+ activeClass = !toggleButton ? "ui-state-active" : "";
+
+ if ( options.label === null ) {
+ options.label = (this.type === "input" ? this.buttonElement.val() :
this.buttonElement.html());
+ }
+
+ this._hoverable( this.buttonElement );
+
+ this.buttonElement
+ .addClass( baseClasses )
+ .attr( "role", "button" )
+ .bind( "mouseenter" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return;
+ }
+ if ( this === lastActive ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "mouseleave" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( activeClass );
+ })
+ .bind( "click" + this.eventNamespace, function( event ) {
+ if ( options.disabled ) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+ });
+
+ // Can't use _focusable() because the element that receives focus
+ // and the element that gets the ui-state-focus class are different
+ this._on({
+ focus: function() {
+ this.buttonElement.addClass( "ui-state-focus" );
+ },
+ blur: function() {
+ this.buttonElement.removeClass( "ui-state-focus" );
+ }
+ });
+
+ if ( toggleButton ) {
+ this.element.bind( "change" + this.eventNamespace, function() {
+ that.refresh();
+ });
+ }
+
+ if ( this.type === "checkbox" ) {
+ this.buttonElement.bind( "click" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ });
+ } else if ( this.type === "radio" ) {
+ this.buttonElement.bind( "click" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ that.buttonElement.attr( "aria-pressed", "true" );
+
+ var radio = that.element[ 0 ];
+ radioGroup( radio )
+ .not( radio )
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ });
+ } else {
+ this.buttonElement
+ .bind( "mousedown" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ lastActive = this;
+ that.document.one( "mouseup", function() {
+ lastActive = null;
+ });
+ })
+ .bind( "mouseup" + this.eventNamespace, function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).removeClass( "ui-state-active" );
+ })
+ .bind( "keydown" + this.eventNamespace, function(event) {
+ if ( options.disabled ) {
+ return false;
+ }
+ if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER )
{
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ // see #8559, we bind to blur here in case the button element loses
+ // focus between keydown and keyup, it would be left in an "active" state
+ .bind( "keyup" + this.eventNamespace + " blur" +
this.eventNamespace, function() {
+ $( this ).removeClass( "ui-state-active" );
+ });
+
+ if ( this.buttonElement.is("a") ) {
+ this.buttonElement.keyup(function(event) {
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
+ // TODO pass through original event correctly (just as 2nd argument doesn't
work)
+ $( this ).click();
+ }
+ });
+ }
+ }
+
+ this._setOption( "disabled", options.disabled );
+ this._resetButton();
+ },
+
+ _determineButtonType: function() {
+ var ancestor, labelSelector, checked;
+
+ if ( this.element.is("[type=checkbox]") ) {
+ this.type = "checkbox";
+ } else if ( this.element.is("[type=radio]") ) {
+ this.type = "radio";
+ } else if ( this.element.is("input") ) {
+ this.type = "input";
+ } else {
+ this.type = "button";
+ }
+
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ // we don't search against the document in case the element
+ // is disconnected from the DOM
+ ancestor = this.element.parents().last();
+ labelSelector = "label[for='" + this.element.attr("id") +
"']";
+ this.buttonElement = ancestor.find( labelSelector );
+ if ( !this.buttonElement.length ) {
+ ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+ this.buttonElement = ancestor.filter( labelSelector );
+ if ( !this.buttonElement.length ) {
+ this.buttonElement = ancestor.find( labelSelector );
+ }
+ }
+ this.element.addClass( "ui-helper-hidden-accessible" );
+
+ checked = this.element.is( ":checked" );
+ if ( checked ) {
+ this.buttonElement.addClass( "ui-state-active" );
+ }
+ this.buttonElement.prop( "aria-pressed", checked );
+ } else {
+ this.buttonElement = this.element;
+ }
+ },
+
+ widget: function() {
+ return this.buttonElement;
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-helper-hidden-accessible" );
+ this.buttonElement
+ .removeClass( baseClasses + " ui-state-active " + typeClasses )
+ .removeAttr( "role" )
+ .removeAttr( "aria-pressed" )
+ .html( this.buttonElement.find(".ui-button-text").html() );
+
+ if ( !this.hasTitle ) {
+ this.buttonElement.removeAttr( "title" );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+ if ( key === "disabled" ) {
+ this.widget().toggleClass( "ui-state-disabled", !!value );
+ this.element.prop( "disabled", !!value );
+ if ( value ) {
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ this.buttonElement.removeClass( "ui-state-focus" );
+ } else {
+ this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
+ }
+ }
+ return;
+ }
+ this._resetButton();
+ },
+
+ refresh: function() {
+ //See #8237 & #8828
+ var isDisabled = this.element.is( "input, button" ) ? this.element.is(
":disabled" ) : this.element.hasClass( "ui-button-disabled" );
+
+ if ( isDisabled !== this.options.disabled ) {
+ this._setOption( "disabled", isDisabled );
+ }
+ if ( this.type === "radio" ) {
+ radioGroup( this.element[0] ).each(function() {
+ if ( $( this ).is( ":checked" ) ) {
+ $( this ).button( "widget" )
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ $( this ).button( "widget" )
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ });
+ } else if ( this.type === "checkbox" ) {
+ if ( this.element.is( ":checked" ) ) {
+ this.buttonElement
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ this.buttonElement
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ }
+ },
+
+ _resetButton: function() {
+ if ( this.type === "input" ) {
+ if ( this.options.label ) {
+ this.element.val( this.options.label );
+ }
+ return;
+ }
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
+ buttonText = $( "<span></span>", this.document[0] )
+ .addClass( "ui-button-text" )
+ .html( this.options.label )
+ .appendTo( buttonElement.empty() )
+ .text(),
+ icons = this.options.icons,
+ multipleIcons = icons.primary && icons.secondary,
+ buttonClasses = [];
+
+ if ( icons.primary || icons.secondary ) {
+ if ( this.options.text ) {
+ buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s"
: ( icons.primary ? "-primary" : "-secondary" ) ) );
+ }
+
+ if ( icons.primary ) {
+ buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon
" + icons.primary + "'></span>" );
+ }
+
+ if ( icons.secondary ) {
+ buttonElement.append( "<span class='ui-button-icon-secondary ui-icon
" + icons.secondary + "'></span>" );
+ }
+
+ if ( !this.options.text ) {
+ buttonClasses.push( multipleIcons ? "ui-button-icons-only" :
"ui-button-icon-only" );
+
+ if ( !this.hasTitle ) {
+ buttonElement.attr( "title", $.trim( buttonText ) );
+ }
+ }
+ } else {
+ buttonClasses.push( "ui-button-text-only" );
+ }
+ buttonElement.addClass( buttonClasses.join( " " ) );
+ }
+});
+
+$.widget( "ui.buttonset", {
+ version: "1.11.4",
+ options: {
+ items: "button, input[type=button], input[type=submit], input[type=reset],
input[type=checkbox], input[type=radio], a, :data(ui-button)"
+ },
+
+ _create: function() {
+ this.element.addClass( "ui-buttonset" );
+ },
+
+ _init: function() {
+ this.refresh();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "disabled" ) {
+ this.buttons.button( "option", key, value );
+ }
+
+ this._super( key, value );
+ },
+
+ refresh: function() {
+ var rtl = this.element.css( "direction" ) === "rtl",
+ allButtons = this.element.find( this.options.items ),
+ existingButtons = allButtons.filter( ":ui-button" );
+
+ // Initialize new buttons
+ allButtons.not( ":ui-button" ).button();
+
+ // Refresh existing buttons
+ existingButtons.button( "refresh" );
+
+ this.buttons = allButtons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+ .filter( ":first" )
+ .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
+ .end()
+ .filter( ":last" )
+ .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
+ .end()
+ .end();
+ },
+
+ _destroy: function() {
+ this.element.removeClass( "ui-buttonset" );
+ this.buttons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-left ui-corner-right" )
+ .end()
+ .button( "destroy" );
+ }
+});
+
+var button = $.ui.button;
+
+
+/*!
+ * jQuery UI Datepicker 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/datepicker/
+ */
+
+
+$.extend($.ui, { datepicker: { version: "1.11.4" } });
+
+var datepicker_instActive;
+
+function datepicker_getZindex( elem ) {
+ var position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the
browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" || position
=== "fixed" ) {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index:
0;"></div></div>
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+
+ return 0;
+}
+/* Date picker manager.
+ Use the singleton instance of this class, $.datepicker, to interact with the date
picker.
+ Settings for (groups of) date pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+function Datepicker() {
+ this._curInst = null; // The current instance in use
+ this._keyEvent = false; // If the last event was a key event
+ this._disabledInputs = []; // List of date picker inputs that have been disabled
+ this._datepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker
division
+ this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker
class
+ this._appendClass = "ui-datepicker-append"; // The name of the append marker
class
+ this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger
marker class
+ this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker
class
+ this._disableClass = "ui-datepicker-disabled"; // The name of the disabled
covering marker class
+ this._unselectableClass = "ui-datepicker-unselectable"; // The name of the
unselectable cell marker class
+ this._currentClass = "ui-datepicker-current-day"; // The name of the current
day marker class
+ this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day
hover marker class
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[""] = { // Default regional settings
+ closeText: "Done", // Display text for close link
+ prevText: "Prev", // Display text for previous month link
+ nextText: "Next", // Display text for next month link
+ currentText: "Today", // Display text for current month link
+ monthNames:
["January","February","March","April","May","June",
+ "July","August","September","October","November","December"],
// Names of months for drop-down and formatting
+ monthNamesShort: ["Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"], // For formatting
+ dayNames: ["Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"], //
For formatting
+ dayNamesShort: ["Sun", "Mon", "Tue", "Wed",
"Thu", "Fri", "Sat"], // For formatting
+ dayNamesMin:
["Su","Mo","Tu","We","Th","Fr","Sa"],
// Column headings for days starting at Sunday
+ weekHeader: "Wk", // Column header for week of the year
+ dateFormat: "mm/dd/yy", // See format options on parseDate
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+ isRTL: false, // True if right-to-left language, false if left-to-right
+ showMonthAfterYear: false, // True if the year select precedes month, false for month
then year
+ yearSuffix: "" // Additional text to append to the year in the month headers
+ };
+ this._defaults = { // Global defaults for all the date picker instances
+ showOn: "focus", // "focus" for popup on focus,
+ // "button" for trigger button, or "both" for either
+ showAnim: "fadeIn", // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ defaultDate: null, // Used when field is blank: actual date,
+ // +/-number for offset from today, null for today
+ appendText: "", // Display text following the input box, e.g. showing the
format
+ buttonText: "...", // Text for trigger button
+ buttonImage: "", // URL for trigger button image
+ buttonImageOnly: false, // True if the image appears alone, false if it appears on a
button
+ hideIfNoPrevNext: false, // True to hide next/previous month links
+ // if not applicable, false to just disable them
+ navigationAsDateFormat: false, // True if date formatting applied to prev/today/next
links
+ gotoCurrent: false, // True if today link goes back to current selection instead
+ changeMonth: false, // True if month can be selected directly, false if only prev/next
+ changeYear: false, // True if year can be selected directly, false if only prev/next
+ yearRange: "c-10:c+10", // Range of years to display in drop-down,
+ // either relative to today's year (-nn:+nn), relative to currently displayed
year
+ // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+ showOtherMonths: false, // True to show dates in other months, false to leave blank
+ selectOtherMonths: false, // True to allow selection of dates in other months, false
for unselectable
+ showWeek: false, // True to show week of the year, false to not show it
+ calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+ // takes a Date and returns the number of the week for it
+ shortYearCutoff: "+10", // Short year values < this are in the current
century,
+ // > this are in the previous century,
+ // string value starting with "+" for current year + value
+ minDate: null, // The earliest selectable date, or null for no limit
+ maxDate: null, // The latest selectable date, or null for no limit
+ duration: "fast", // Duration of display/closure
+ beforeShowDay: null, // Function that takes a date and returns an array with
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or
"",
+ // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+ beforeShow: null, // Function that takes an input field and
+ // returns a set of custom settings for the date picker
+ onSelect: null, // Define a callback function when a date is selected
+ onChangeMonthYear: null, // Define a callback function when the month or year is
changed
+ onClose: null, // Define a callback function when the datepicker is closed
+ numberOfMonths: 1, // Number of months to show at a time
+ showCurrentAtPos: 0, // The position in multipe months at which to show the current
month (starting at 0)
+ stepMonths: 1, // Number of months to step back/forward
+ stepBigMonths: 12, // Number of months to step back/forward for the big links
+ altField: "", // Selector for an alternate field to store selected dates
into
+ altFormat: "", // The date format to use for the alternate field
+ constrainInput: true, // The input is constrained by the current date format
+ showButtonPanel: false, // True to show button panel, false to not show it
+ autoSize: false, // True to size the input for the date format, false to leave as is
+ disabled: false // The initial disabled state
+ };
+ $.extend(this._defaults, this.regional[""]);
+ this.regional.en = $.extend( true, {}, this.regional[ "" ]);
+ this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
+ this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId +
"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix
ui-corner-all'></div>"));
+}
+
+$.extend(Datepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a date picker. */
+ markerClassName: "hasDatepicker",
+
+ //Keep track of the maximum number of rows displayed (see #7043)
+ maxRows: 4,
+
+ // TODO rename to "widget" when switching to widget factory
+ _widgetDatepicker: function() {
+ return this.dpDiv;
+ },
+
+ /* Override the default settings for all instances of the date picker.
+ * @param settings object - the new settings to use as defaults (anonymous object)
+ * @return the manager object
+ */
+ setDefaults: function(settings) {
+ datepicker_extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the date picker to a jQuery selection.
+ * @param target element - the target input field or division or span
+ * @param settings object - the new settings to use for this date picker instance
(anonymous)
+ */
+ _attachDatepicker: function(target, settings) {
+ var nodeName, inline, inst;
+ nodeName = target.nodeName.toLowerCase();
+ inline = (nodeName === "div" || nodeName === "span");
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = "dp" + this.uuid;
+ }
+ inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {});
+ if (nodeName === "input") {
+ this._connectDatepicker(target, inst);
+ } else if (inline) {
+ this._inlineDatepicker(target, inst);
+ }
+ },
+
+ /* Create a new instance object. */
+ _newInst: function(target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape
jQuery meta chars
+ return {id: id, input: target, // associated target
+ selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+ drawMonth: 0, drawYear: 0, // month being drawn
+ inline: inline, // is datepicker inline or not
+ dpDiv: (!inline ? this.dpDiv : // presentation div
+ datepicker_bindHover($("<div class='" + this._inlineClass + "
ui-datepicker ui-widget ui-widget-content ui-helper-clearfix
ui-corner-all'></div>")))};
+ },
+
+ /* Attach the date picker to an input field. */
+ _connectDatepicker: function(target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName)) {
+ return;
+ }
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).keydown(this._doKeyDown).
+ keypress(this._doKeyPress).keyup(this._doKeyUp);
+ this._autoSize(inst);
+ $.data(target, "datepicker", inst);
+ //If disabled option is true, disable the datepicker once it has been attached to the
input (see ticket #5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function(input, inst) {
+ var showOn, buttonText, buttonImage,
+ appendText = this._get(inst, "appendText"),
+ isRTL = this._get(inst, "isRTL");
+
+ if (inst.append) {
+ inst.append.remove();
+ }
+ if (appendText) {
+ inst.append = $("<span class='" + this._appendClass +
"'>" + appendText + "</span>");
+ input[isRTL ? "before" : "after"](inst.append);
+ }
+
+ input.unbind("focus", this._showDatepicker);
+
+ if (inst.trigger) {
+ inst.trigger.remove();
+ }
+
+ showOn = this._get(inst, "showOn");
+ if (showOn === "focus" || showOn === "both") { // pop-up date
picker when in the marked field
+ input.focus(this._showDatepicker);
+ }
+ if (showOn === "button" || showOn === "both") { // pop-up date
picker when button clicked
+ buttonText = this._get(inst, "buttonText");
+ buttonImage = this._get(inst, "buttonImage");
+ inst.trigger = $(this._get(inst, "buttonImageOnly") ?
+ $("<img/>").addClass(this._triggerClass).
+ attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+ $("<button
type='button'></button>").addClass(this._triggerClass).
+ html(!buttonImage ? buttonText : $("<img/>").attr(
+ { src:buttonImage, alt:buttonText, title:buttonText })));
+ input[isRTL ? "before" : "after"](inst.trigger);
+ inst.trigger.click(function() {
+ if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0])
{
+ $.datepicker._hideDatepicker();
+ } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !==
input[0]) {
+ $.datepicker._hideDatepicker();
+ $.datepicker._showDatepicker(input[0]);
+ } else {
+ $.datepicker._showDatepicker(input[0]);
+ }
+ return false;
+ });
+ }
+ },
+
+ /* Apply the maximum length for the date format. */
+ _autoSize: function(inst) {
+ if (this._get(inst, "autoSize") && !inst.inline) {
+ var findMax, max, maxI, i,
+ date = new Date(2009, 12 - 1, 20), // Ensure double digits
+ dateFormat = this._get(inst, "dateFormat");
+
+ if (dateFormat.match(/[DM]/)) {
+ findMax = function(names) {
+ max = 0;
+ maxI = 0;
+ for (i = 0; i < names.length; i++) {
+ if (names[i].length > max) {
+ max = names[i].length;
+ maxI = i;
+ }
+ }
+ return maxI;
+ };
+ date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+ "monthNames" : "monthNamesShort"))));
+ date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+ "dayNames" : "dayNamesShort"))) + 20 - date.getDay());
+ }
+ inst.input.attr("size", this._formatDate(inst, date).length);
+ }
+ },
+
+ /* Attach an inline date picker to a div. */
+ _inlineDatepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName)) {
+ return;
+ }
+ divSpan.addClass(this.markerClassName).append(inst.dpDiv);
+ $.data(target, "datepicker", inst);
+ this._setDate(inst, this._getDefaultDate(inst), true);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ //If disabled option is true, disable the datepicker before showing it (see ticket
#5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
+ // Set display:block in place of inst.dpDiv.show() which won't work on disconnected
elements
+ //
http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has
zero height
+ inst.dpDiv.css( "display", "block" );
+ },
+
+ /* Pop-up the date picker in a "dialog" box.
+ * @param input element - ignored
+ * @param date string or Date - the initial date to display
+ * @param onSelect function - the function to call when a date is selected
+ * @param settings object - update the dialog date picker instance's settings
(anonymous object)
+ * @param pos int[2] - coordinates for the dialog's position within the screen or
+ * event - with x/y coordinates or
+ * leave empty for default (screen centre)
+ * @return the manager object
+ */
+ _dialogDatepicker: function(input, date, onSelect, settings, pos) {
+ var id, browserWidth, browserHeight, scrollX, scrollY,
+ inst = this._dialogInst; // internal instance
+
+ if (!inst) {
+ this.uuid += 1;
+ id = "dp" + this.uuid;
+ this._dialogInput = $("<input type='text' id='" + id +
+ "' style='position: absolute; top: -100px; width:
0px;'/>");
+ this._dialogInput.keydown(this._doKeyDown);
+ $("body").append(this._dialogInput);
+ inst = this._dialogInst = this._newInst(this._dialogInput, false);
+ inst.settings = {};
+ $.data(this._dialogInput[0], "datepicker", inst);
+ }
+ datepicker_extendRemove(inst.settings, settings || {});
+ date = (date && date.constructor === Date ? this._formatDate(inst, date) :
date);
+ this._dialogInput.val(date);
+
+ this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+ if (!this._pos) {
+ browserWidth = document.documentElement.clientWidth;
+ browserHeight = document.documentElement.clientHeight;
+ scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ this._pos = // should use actual width/height below
+ [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+ }
+
+ // move input on screen for focus, but hidden behind dialog
+ this._dialogInput.css("left", (this._pos[0] + 20) +
"px").css("top", this._pos[1] + "px");
+ inst.settings.onSelect = onSelect;
+ this._inDialog = true;
+ this.dpDiv.addClass(this._dialogClass);
+ this._showDatepicker(this._dialogInput[0]);
+ if ($.blockUI) {
+ $.blockUI(this.dpDiv);
+ }
+ $.data(this._dialogInput[0], "datepicker", inst);
+ return this;
+ },
+
+ /* Detach a datepicker from its control.
+ * @param target element - the target input field or division or span
+ */
+ _destroyDatepicker: function(target) {
+ var nodeName,
+ $target = $(target),
+ inst = $.data(target, "datepicker");
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+
+ nodeName = target.nodeName.toLowerCase();
+ $.removeData(target, "datepicker");
+ if (nodeName === "input") {
+ inst.append.remove();
+ inst.trigger.remove();
+ $target.removeClass(this.markerClassName).
+ unbind("focus", this._showDatepicker).
+ unbind("keydown", this._doKeyDown).
+ unbind("keypress", this._doKeyPress).
+ unbind("keyup", this._doKeyUp);
+ } else if (nodeName === "div" || nodeName === "span") {
+ $target.removeClass(this.markerClassName).empty();
+ }
+
+ if ( datepicker_instActive === inst ) {
+ datepicker_instActive = null;
+ }
+ },
+
+ /* Enable the date picker to a jQuery selection.
+ * @param target element - the target input field or division or span
+ */
+ _enableDatepicker: function(target) {
+ var nodeName, inline,
+ $target = $(target),
+ inst = $.data(target, "datepicker");
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+
+ nodeName = target.nodeName.toLowerCase();
+ if (nodeName === "input") {
+ target.disabled = false;
+ inst.trigger.filter("button").
+ each(function() { this.disabled = false; }).end().
+ filter("img").css({opacity: "1.0", cursor: ""});
+ } else if (nodeName === "div" || nodeName === "span") {
+ inline = $target.children("." + this._inlineClass);
+ inline.children().removeClass("ui-state-disabled");
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ prop("disabled", false);
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value === target ? null : value); }); // delete entry
+ },
+
+ /* Disable the date picker to a jQuery selection.
+ * @param target element - the target input field or division or span
+ */
+ _disableDatepicker: function(target) {
+ var nodeName, inline,
+ $target = $(target),
+ inst = $.data(target, "datepicker");
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+
+ nodeName = target.nodeName.toLowerCase();
+ if (nodeName === "input") {
+ target.disabled = true;
+ inst.trigger.filter("button").
+ each(function() { this.disabled = true; }).end().
+ filter("img").css({opacity: "0.5", cursor:
"default"});
+ } else if (nodeName === "div" || nodeName === "span") {
+ inline = $target.children("." + this._inlineClass);
+ inline.children().addClass("ui-state-disabled");
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ prop("disabled", true);
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value === target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = target;
+ },
+
+ /* Is the first field in a jQuery collection disabled as a datepicker?
+ * @param target element - the target input field or division or span
+ * @return boolean - true if disabled, false if enabled
+ */
+ _isDisabledDatepicker: function(target) {
+ if (!target) {
+ return false;
+ }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] === target) {
+ return true;
+ }
+ }
+ return false;
+ },
+
+ /* Retrieve the instance data for the target control.
+ * @param target element - the target input field or division or span
+ * @return object - the associated instance data
+ * @throws error if a jQuery problem getting data
+ */
+ _getInst: function(target) {
+ try {
+ return $.data(target, "datepicker");
+ }
+ catch (err) {
+ throw "Missing instance data for this datepicker";
+ }
+ },
+
+ /* Update or retrieve the settings for a date picker attached to an input field or
division.
+ * @param target element - the target input field or division or span
+ * @param name object - the new settings to update or
+ * string - the name of the setting to change or retrieve,
+ * when retrieving also "all" for all instance settings or
+ * "defaults" for all global defaults
+ * @param value any - the new value for the setting
+ * (omit if above is an object or to retrieve a value)
+ */
+ _optionDatepicker: function(target, name, value) {
+ var settings, date, minDate, maxDate,
+ inst = this._getInst(target);
+
+ if (arguments.length === 2 && typeof name === "string") {
+ return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
+ (inst ? (name === "all" ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+
+ settings = name || {};
+ if (typeof name === "string") {
+ settings = {};
+ settings[name] = value;
+ }
+
+ if (inst) {
+ if (this._curInst === inst) {
+ this._hideDatepicker();
+ }
+
+ date = this._getDateDatepicker(target, true);
+ minDate = this._getMinMaxDate(inst, "min");
+ maxDate = this._getMinMaxDate(inst, "max");
+ datepicker_extendRemove(inst.settings, settings);
+ // reformat the old minDate/maxDate values if dateFormat changes and a new
minDate/maxDate isn't provided
+ if (minDate !== null && settings.dateFormat !== undefined &&
settings.minDate === undefined) {
+ inst.settings.minDate = this._formatDate(inst, minDate);
+ }
+ if (maxDate !== null && settings.dateFormat !== undefined &&
settings.maxDate === undefined) {
+ inst.settings.maxDate = this._formatDate(inst, maxDate);
+ }
+ if ( "disabled" in settings ) {
+ if ( settings.disabled ) {
+ this._disableDatepicker(target);
+ } else {
+ this._enableDatepicker(target);
+ }
+ }
+ this._attachments($(target), inst);
+ this._autoSize(inst);
+ this._setDate(inst, date);
+ this._updateAlternate(inst);
+ this._updateDatepicker(inst);
+ }
+ },
+
+ // change method deprecated
+ _changeDatepicker: function(target, name, value) {
+ this._optionDatepicker(target, name, value);
+ },
+
+ /* Redraw the date picker attached to an input field or division.
+ * @param target element - the target input field or division or span
+ */
+ _refreshDatepicker: function(target) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._updateDatepicker(inst);
+ }
+ },
+
+ /* Set the dates for a jQuery selection.
+ * @param target element - the target input field or division or span
+ * @param date Date - the new date
+ */
+ _setDateDatepicker: function(target, date) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setDate(inst, date);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ }
+ },
+
+ /* Get the date(s) for the first entry in a jQuery selection.
+ * @param target element - the target input field or division or span
+ * @param noDefault boolean - true if no default date is to be used
+ * @return Date - the current date
+ */
+ _getDateDatepicker: function(target, noDefault) {
+ var inst = this._getInst(target);
+ if (inst && !inst.inline) {
+ this._setDateFromField(inst, noDefault);
+ }
+ return (inst ? this._getDate(inst) : null);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function(event) {
+ var onSelect, dateStr, sel,
+ inst = $.datepicker._getInst(event.target),
+ handled = true,
+ isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
+
+ inst._keyEvent = true;
+ if ($.datepicker._datepickerShowing) {
+ switch (event.keyCode) {
+ case 9: $.datepicker._hideDatepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
+ $.datepicker._currentClass + ")", inst.dpDiv);
+ if (sel[0]) {
+ $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear,
sel[0]);
+ }
+
+ onSelect = $.datepicker._get(inst, "onSelect");
+ if (onSelect) {
+ dateStr = $.datepicker._formatDate(inst);
+
+ // trigger custom callback
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+ } else {
+ $.datepicker._hideDatepicker();
+ }
+
+ return false; // don't submit the form
+ case 27: $.datepicker._hideDatepicker();
+ break; // hide on escape
+ case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, "stepBigMonths") :
+ -$.datepicker._get(inst, "stepMonths")), "M");
+ break; // previous month/year on page up/+ ctrl
+ case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, "stepBigMonths") :
+ +$.datepicker._get(inst, "stepMonths")), "M");
+ break; // next month/year on page down/+ ctrl
+ case 35: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._clearDate(event.target);
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // clear on ctrl or command +end
+ case 36: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._gotoToday(event.target);
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // current on ctrl or command +home
+ case 37: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ // -1 day on ctrl or command +left
+ if (event.originalEvent.altKey) {
+ $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, "stepBigMonths") :
+ -$.datepicker._get(inst, "stepMonths")), "M");
+ }
+ // next month/year on alt +left on Mac
+ break;
+ case 38: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, -7, "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // -1 week on ctrl or command +up
+ case 39: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ // +1 day on ctrl or command +right
+ if (event.originalEvent.altKey) {
+ $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, "stepBigMonths") :
+ +$.datepicker._get(inst, "stepMonths")), "M");
+ }
+ // next month/year on alt +right
+ break;
+ case 40: if (event.ctrlKey || event.metaKey) {
+ $.datepicker._adjustDate(event.target, +7, "D");
+ }
+ handled = event.ctrlKey || event.metaKey;
+ break; // +1 week on ctrl or command +down
+ default: handled = false;
+ }
+ } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker
on ctrl+home
+ $.datepicker._showDatepicker(this);
+ } else {
+ handled = false;
+ }
+
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Filter entered characters - based on date format. */
+ _doKeyPress: function(event) {
+ var chars, chr,
+ inst = $.datepicker._getInst(event.target);
+
+ if ($.datepicker._get(inst, "constrainInput")) {
+ chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
+ chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
+ return event.ctrlKey || event.metaKey || (chr < " " || !chars ||
chars.indexOf(chr) > -1);
+ }
+ },
+
+ /* Synchronise manual entry and field/alternate field. */
+ _doKeyUp: function(event) {
+ var date,
+ inst = $.datepicker._getInst(event.target);
+
+ if (inst.input.val() !== inst.lastVal) {
+ try {
+ date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
+ (inst.input ? inst.input.val() : null),
+ $.datepicker._getFormatConfig(inst));
+
+ if (date) { // only if valid
+ $.datepicker._setDateFromField(inst);
+ $.datepicker._updateAlternate(inst);
+ $.datepicker._updateDatepicker(inst);
+ }
+ }
+ catch (err) {
+ }
+ }
+ return true;
+ },
+
+ /* Pop-up the date picker for a given input field.
+ * If false returned from beforeShow event handler do not show.
+ * @param input element - the input field attached to the date picker or
+ * event - if triggered by focus
+ */
+ _showDatepicker: function(input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() !== "input") { // find from button/image
trigger
+ input = $("input", input.parentNode)[0];
+ }
+
+ if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) {
// already here
+ return;
+ }
+
+ var inst, beforeShow, beforeShowSettings, isFixed,
+ offset, showAnim, duration;
+
+ inst = $.datepicker._getInst(input);
+ if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
+ $.datepicker._curInst.dpDiv.stop(true, true);
+ if ( inst && $.datepicker._datepickerShowing ) {
+ $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
+ }
+ }
+
+ beforeShow = $.datepicker._get(inst, "beforeShow");
+ beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+ if(beforeShowSettings === false){
+ return;
+ }
+ datepicker_extendRemove(inst.settings, beforeShowSettings);
+
+ inst.lastVal = null;
+ $.datepicker._lastInput = input;
+ $.datepicker._setDateFromField(inst);
+
+ if ($.datepicker._inDialog) { // hide cursor
+ input.value = "";
+ }
+ if (!$.datepicker._pos) { // position below input
+ $.datepicker._pos = $.datepicker._findPos(input);
+ $.datepicker._pos[1] += input.offsetHeight; // add the height
+ }
+
+ isFixed = false;
+ $(input).parents().each(function() {
+ isFixed |= $(this).css("position") === "fixed";
+ return !isFixed;
+ });
+
+ offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+ $.datepicker._pos = null;
+ //to avoid flashes on Firefox
+ inst.dpDiv.empty();
+ // determine sizing offscreen
+ inst.dpDiv.css({position: "absolute", display: "block", top:
"-1000px"});
+ $.datepicker._updateDatepicker(inst);
+ // fix width for dynamic number of date pickers
+ // and adjust position before showing
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
+ inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+ "static" : (isFixed ? "fixed" : "absolute")), display:
"none",
+ left: offset.left + "px", top: offset.top + "px"});
+
+ if (!inst.inline) {
+ showAnim = $.datepicker._get(inst, "showAnim");
+ duration = $.datepicker._get(inst, "duration");
+ inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
+ $.datepicker._datepickerShowing = true;
+
+ if ( $.effects && $.effects.effect[ showAnim ] ) {
+ inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"),
duration);
+ } else {
+ inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
+ }
+
+ if ( $.datepicker._shouldFocusInput( inst ) ) {
+ inst.input.focus();
+ }
+
+ $.datepicker._curInst = inst;
+ }
+ },
+
+ /* Generate the date picker content. */
+ _updateDatepicker: function(inst) {
+ this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+ datepicker_instActive = inst; // for delegate hover events
+ inst.dpDiv.empty().append(this._generateHTML(inst));
+ this._attachHandlers(inst);
+
+ var origyearshtml,
+ numMonths = this._getNumberOfMonths(inst),
+ cols = numMonths[1],
+ width = 17,
+ activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
+
+ if ( activeCell.length > 0 ) {
+ datepicker_handleMouseover.apply( activeCell.get( 0 ) );
+ }
+
+ inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3
ui-datepicker-multi-4").width("");
+ if (cols > 1) {
+ inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width",
(width * cols) + "em");
+ }
+ inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" :
"remove") +
+ "Class"]("ui-datepicker-multi");
+ inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove")
+
+ "Class"]("ui-datepicker-rtl");
+
+ if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing
&& $.datepicker._shouldFocusInput( inst ) ) {
+ inst.input.focus();
+ }
+
+ // deffered render of the years select (to avoid flashes on Firefox)
+ if( inst.yearshtml ){
+ origyearshtml = inst.yearshtml;
+ setTimeout(function(){
+ //assure that inst.yearshtml didn't change.
+ if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+ inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
+ }
+ origyearshtml = inst.yearshtml = null;
+ }, 0);
+ }
+ },
+
+ // #6694 - don't focus the input if it's already focused
+ // this breaks the change event in IE
+ // Support: IE and jQuery <1.9
+ _shouldFocusInput: function( inst ) {
+ return inst.input && inst.input.is( ":visible" ) &&
!inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function(inst, offset, isFixed) {
+ var dpWidth = inst.dpDiv.outerWidth(),
+ dpHeight = inst.dpDiv.outerHeight(),
+ inputWidth = inst.input ? inst.input.outerWidth() : 0,
+ inputHeight = inst.input ? inst.input.outerHeight() : 0,
+ viewWidth = document.documentElement.clientWidth + (isFixed ? 0 :
$(document).scrollLeft()),
+ viewHeight = document.documentElement.clientHeight + (isFixed ? 0 :
$(document).scrollTop());
+
+ offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left === inst.input.offset().left) ?
$(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top === (inst.input.offset().top +
inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place
if so.
+ offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth &&
viewWidth > dpWidth) ?
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight &&
viewHeight > dpHeight) ?
+ Math.abs(dpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function(obj) {
+ var position,
+ inst = this._getInst(obj),
+ isRTL = this._get(inst, "isRTL");
+
+ while (obj && (obj.type === "hidden" || obj.nodeType !== 1 ||
$.expr.filters.hidden(obj))) {
+ obj = obj[isRTL ? "previousSibling" : "nextSibling"];
+ }
+
+ position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Hide the date picker from view.
+ * @param input element - the input field attached to the date picker
+ */
+ _hideDatepicker: function(input) {
+ var showAnim, duration, postProcess, onClose,
+ inst = this._curInst;
+
+ if (!inst || (input && inst !== $.data(input, "datepicker"))) {
+ return;
+ }
+
+ if (this._datepickerShowing) {
+ showAnim = this._get(inst, "showAnim");
+ duration = this._get(inst, "duration");
+ postProcess = function() {
+ $.datepicker._tidyDialog(inst);
+ };
+
+ // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+ if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
{
+ inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration,
postProcess);
+ } else {
+ inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
+ (showAnim === "fadeIn" ? "fadeOut" :
"hide"))]((showAnim ? duration : null), postProcess);
+ }
+
+ if (!showAnim) {
+ postProcess();
+ }
+ this._datepickerShowing = false;
+
+ onClose = this._get(inst, "onClose");
+ if (onClose) {
+ onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() :
""), inst]);
+ }
+
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: "absolute", left: "0", top:
"-100px" });
+ if ($.blockUI) {
+ $.unblockUI();
+ $("body").append(this.dpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function(inst) {
+ inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
+ },
+
+ /* Close date picker if clicked elsewhere. */
+ _checkExternalClick: function(event) {
+ if (!$.datepicker._curInst) {
+ return;
+ }
+
+ var $target = $(event.target),
+ inst = $.datepicker._getInst($target[0]);
+
+ if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
+ $target.parents("#" + $.datepicker._mainDivId).length === 0 &&
+ !$target.hasClass($.datepicker.markerClassName) &&
+ !$target.closest("." + $.datepicker._triggerClass).length &&
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog &&
$.blockUI) ) ) ||
+ ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !==
inst ) ) {
+ $.datepicker._hideDatepicker();
+ }
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustDate: function(id, offset, period) {
+ var target = $(id),
+ inst = this._getInst(target[0]);
+
+ if (this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ this._adjustInstDate(inst, offset +
+ (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), //
undo positioning
+ period);
+ this._updateDatepicker(inst);
+ },
+
+ /* Action for current link. */
+ _gotoToday: function(id) {
+ var date,
+ target = $(id),
+ inst = this._getInst(target[0]);
+
+ if (this._get(inst, "gotoCurrent") && inst.currentDay) {
+ inst.selectedDay = inst.currentDay;
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+ inst.drawYear = inst.selectedYear = inst.currentYear;
+ } else {
+ date = new Date();
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ }
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a new month/year. */
+ _selectMonthYear: function(id, select, period) {
+ var target = $(id),
+ inst = this._getInst(target[0]);
+
+ inst["selected" + (period === "M" ? "Month" :
"Year")] =
+ inst["draw" + (period === "M" ? "Month" :
"Year")] =
+ parseInt(select.options[select.selectedIndex].value,10);
+
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a day. */
+ _selectDay: function(id, month, year, td) {
+ var inst,
+ target = $(id);
+
+ if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0]))
{
+ return;
+ }
+
+ inst = this._getInst(target[0]);
+ inst.selectedDay = inst.currentDay = $("a", td).html();
+ inst.selectedMonth = inst.currentMonth = month;
+ inst.selectedYear = inst.currentYear = year;
+ this._selectDate(id, this._formatDate(inst,
+ inst.currentDay, inst.currentMonth, inst.currentYear));
+ },
+
+ /* Erase the input field and hide the date picker. */
+ _clearDate: function(id) {
+ var target = $(id);
+ this._selectDate(target, "");
+ },
+
+ /* Update the input field with the selected date. */
+ _selectDate: function(id, dateStr) {
+ var onSelect,
+ target = $(id),
+ inst = this._getInst(target[0]);
+
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input) {
+ inst.input.val(dateStr);
+ }
+ this._updateAlternate(inst);
+
+ onSelect = this._get(inst, "onSelect");
+ if (onSelect) {
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger
custom callback
+ } else if (inst.input) {
+ inst.input.trigger("change"); // fire the change event
+ }
+
+ if (inst.inline){
+ this._updateDatepicker(inst);
+ } else {
+ this._hideDatepicker();
+ this._lastInput = inst.input[0];
+ if (typeof(inst.input[0]) !== "object") {
+ inst.input.focus(); // restore focus
+ }
+ this._lastInput = null;
+ }
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst) {
+ var altFormat, date, dateStr,
+ altField = this._get(inst, "altField");
+
+ if (altField) { // update alternate field too
+ altFormat = this._get(inst, "altFormat") || this._get(inst,
"dateFormat");
+ date = this._getDate(inst);
+ dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+ $(altField).each(function() { $(this).val(dateStr); });
+ }
+ },
+
+ /* Set as beforeShowDay function to prevent selection of weekends.
+ * @param date Date - the date to customise
+ * @return [boolean, string] - is this date selectable?, what is its CSS class?
+ */
+ noWeekends: function(date) {
+ var day = date.getDay();
+ return [(day > 0 && day < 6), ""];
+ },
+
+ /* Set as calculateWeek to determine the week of the year based on the ISO 8601
definition.
+ * @param date Date - the date to get the week for
+ * @return number - the number of the week within the year that contains this date
+ */
+ iso8601Week: function(date) {
+ var time,
+ checkDate = new Date(date.getTime());
+
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+
+ time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+ },
+
+ /* Parse a string value into a date object.
+ * See formatDate below for the possible formats.
+ *
+ * @param format string - the expected format of the date
+ * @param value string - the date in the above format
+ * @param settings Object - attributes include:
+ * shortYearCutoff number - the cutoff year for determining the century (optional)
+ * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ * dayNames string[7] - names of the days from Sunday (optional)
+ * monthNamesShort string[12] - abbreviated names of the months (optional)
+ * monthNames string[12] - names of the months (optional)
+ * @return Date - the extracted date value or null if value is blank
+ */
+ parseDate: function (format, value, settings) {
+ if (format == null || value == null) {
+ throw "Invalid arguments";
+ }
+
+ value = (typeof value === "object" ? value.toString() : value +
"");
+ if (value === "") {
+ return null;
+ }
+
+ var iFormat, dim, extra,
+ iValue = 0,
+ shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) ||
this._defaults.shortYearCutoff,
+ shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ?
shortYearCutoffTemp :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
+ dayNamesShort = (settings ? settings.dayNamesShort : null) ||
this._defaults.dayNamesShort,
+ dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
+ monthNamesShort = (settings ? settings.monthNamesShort : null) ||
this._defaults.monthNamesShort,
+ monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
+ year = -1,
+ month = -1,
+ day = -1,
+ doy = -1,
+ literal = false,
+ date,
+ // Check whether a format character is doubled
+ lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1)
=== match);
+ if (matches) {
+ iFormat++;
+ }
+ return matches;
+ },
+ // Extract a number from the string value
+ getNumber = function(match) {
+ var isDoubled = lookAhead(match),
+ size = (match === "@" ? 14 : (match === "!" ? 20 :
+ (match === "y" && isDoubled ? 4 : (match === "o" ? 3 :
2)))),
+ minSize = (match === "y" ? size : 1),
+ digits = new RegExp("^\\d{" + minSize + "," + size +
"}"),
+ num = value.substring(iValue).match(digits);
+ if (!num) {
+ throw "Missing number at position " + iValue;
+ }
+ iValue += num[0].length;
+ return parseInt(num[0], 10);
+ },
+ // Extract a name from the string value and convert to an index
+ getName = function(match, shortNames, longNames) {
+ var index = -1,
+ names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+ return [ [k, v] ];
+ }).sort(function (a, b) {
+ return -(a[1].length - b[1].length);
+ });
+
+ $.each(names, function (i, pair) {
+ var name = pair[1];
+ if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
+ index = pair[0];
+ iValue += name.length;
+ return false;
+ }
+ });
+ if (index !== -1) {
+ return index + 1;
+ } else {
+ throw "Unknown name at position " + iValue;
+ }
+ },
+ // Confirm that a literal character matches the string value
+ checkLiteral = function() {
+ if (value.charAt(iValue) !== format.charAt(iFormat)) {
+ throw "Unexpected literal at position " + iValue;
+ }
+ iValue++;
+ };
+
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === "'" &&
!lookAhead("'")) {
+ literal = false;
+ } else {
+ checkLiteral();
+ }
+ } else {
+ switch (format.charAt(iFormat)) {
+ case "d":
+ day = getNumber("d");
+ break;
+ case "D":
+ getName("D", dayNamesShort, dayNames);
+ break;
+ case "o":
+ doy = getNumber("o");
+ break;
+ case "m":
+ month = getNumber("m");
+ break;
+ case "M":
+ month = getName("M", monthNamesShort, monthNames);
+ break;
+ case "y":
+ year = getNumber("y");
+ break;
+ case "@":
+ date = new Date(getNumber("@"));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "!":
+ date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "'":
+ if (lookAhead("'")){
+ checkLiteral();
+ } else {
+ literal = true;
+ }
+ break;
+ default:
+ checkLiteral();
+ }
+ }
+ }
+
+ if (iValue < value.length){
+ extra = value.substr(iValue);
+ if (!/^\s+/.test(extra)) {
+ throw "Extra/unparsed characters found in date: " + extra;
+ }
+ }
+
+ if (year === -1) {
+ year = new Date().getFullYear();
+ } else if (year < 100) {
+ year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+ (year <= shortYearCutoff ? 0 : -100);
+ }
+
+ if (doy > -1) {
+ month = 1;
+ day = doy;
+ do {
+ dim = this._getDaysInMonth(year, month - 1);
+ if (day <= dim) {
+ break;
+ }
+ month++;
+ day -= dim;
+ } while (true);
+ }
+
+ date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+ if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !==
day) {
+ throw "Invalid date"; // E.g. 31/02/00
+ }
+ return date;
+ },
+
+ /* Standard date formats. */
+ ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
+ COOKIE: "D, dd M yy",
+ ISO_8601: "yy-mm-dd",
+ RFC_822: "D, d M y",
+ RFC_850: "DD, dd-M-y",
+ RFC_1036: "D, d M y",
+ RFC_1123: "D, d M yy",
+ RFC_2822: "D, d M yy",
+ RSS: "D, d M y", // RFC 822
+ TICKS: "!",
+ TIMESTAMP: "@",
+ W3C: "yy-mm-dd", // ISO 8601
+
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+ /* Format a date object into a string value.
+ * The format can be combinations of the following:
+ * d - day of month (no leading zero)
+ * dd - day of month (two digit)
+ * o - day of year (no leading zeros)
+ * oo - day of year (three digit)
+ * D - day name short
+ * DD - day name long
+ * m - month of year (no leading zero)
+ * mm - month of year (two digit)
+ * M - month name short
+ * MM - month name long
+ * y - year (two digit)
+ * yy - year (four digit)
+ * @ - Unix timestamp (ms since 01/01/1970)
+ * ! - Windows ticks (100ns since 01/01/0001)
+ * "..." - literal text
+ * '' - single quote
+ *
+ * @param format string - the desired format of the date
+ * @param date Date - the date value to format
+ * @param settings Object - attributes include:
+ * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ * dayNames string[7] - names of the days from Sunday (optional)
+ * monthNamesShort string[12] - abbreviated names of the months (optional)
+ * monthNames string[12] - names of the months (optional)
+ * @return string - the date in the above format
+ */
+ formatDate: function (format, date, settings) {
+ if (!date) {
+ return "";
+ }
+
+ var iFormat,
+ dayNamesShort = (settings ? settings.dayNamesShort : null) ||
this._defaults.dayNamesShort,
+ dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
+ monthNamesShort = (settings ? settings.monthNamesShort : null) ||
this._defaults.monthNamesShort,
+ monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
+ // Check whether a format character is doubled
+ lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1)
=== match);
+ if (matches) {
+ iFormat++;
+ }
+ return matches;
+ },
+ // Format a number, with leading zero if necessary
+ formatNumber = function(match, value, len) {
+ var num = "" + value;
+ if (lookAhead(match)) {
+ while (num.length < len) {
+ num = "0" + num;
+ }
+ }
+ return num;
+ },
+ // Format a name, short or long as requested
+ formatName = function(match, value, shortNames, longNames) {
+ return (lookAhead(match) ? longNames[value] : shortNames[value]);
+ },
+ output = "",
+ literal = false;
+
+ if (date) {
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === "'" &&
!lookAhead("'")) {
+ literal = false;
+ } else {
+ output += format.charAt(iFormat);
+ }
+ } else {
+ switch (format.charAt(iFormat)) {
+ case "d":
+ output += formatNumber("d", date.getDate(), 2);
+ break;
+ case "D":
+ output += formatName("D", date.getDay(), dayNamesShort, dayNames);
+ break;
+ case "o":
+ output += formatNumber("o",
+ Math.round((new Date(date.getFullYear(), date.getMonth(),
date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000),
3);
+ break;
+ case "m":
+ output += formatNumber("m", date.getMonth() + 1, 2);
+ break;
+ case "M":
+ output += formatName("M", date.getMonth(), monthNamesShort,
monthNames);
+ break;
+ case "y":
+ output += (lookAhead("y") ? date.getFullYear() :
+ (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() %
100);
+ break;
+ case "@":
+ output += date.getTime();
+ break;
+ case "!":
+ output += date.getTime() * 10000 + this._ticksTo1970;
+ break;
+ case "'":
+ if (lookAhead("'")) {
+ output += "'";
+ } else {
+ literal = true;
+ }
+ break;
+ default:
+ output += format.charAt(iFormat);
+ }
+ }
+ }
+ }
+ return output;
+ },
+
+ /* Extract all possible characters from the date format. */
+ _possibleChars: function (format) {
+ var iFormat,
+ chars = "",
+ literal = false,
+ // Check whether a format character is doubled
+ lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1)
=== match);
+ if (matches) {
+ iFormat++;
+ }
+ return matches;
+ };
+
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === "'" &&
!lookAhead("'")) {
+ literal = false;
+ } else {
+ chars += format.charAt(iFormat);
+ }
+ } else {
+ switch (format.charAt(iFormat)) {
+ case "d": case "m": case "y": case "@":
+ chars += "0123456789";
+ break;
+ case "D": case "M":
+ return null; // Accept anything
+ case "'":
+ if (lookAhead("'")) {
+ chars += "'";
+ } else {
+ literal = true;
+ }
+ break;
+ default:
+ chars += format.charAt(iFormat);
+ }
+ }
+ }
+ return chars;
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function(inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing date and initialise date picker. */
+ _setDateFromField: function(inst, noDefault) {
+ if (inst.input.val() === inst.lastVal) {
+ return;
+ }
+
+ var dateFormat = this._get(inst, "dateFormat"),
+ dates = inst.lastVal = inst.input ? inst.input.val() : null,
+ defaultDate = this._getDefaultDate(inst),
+ date = defaultDate,
+ settings = this._getFormatConfig(inst);
+
+ try {
+ date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+ } catch (event) {
+ dates = (noDefault ? "" : dates);
+ }
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ inst.currentDay = (dates ? date.getDate() : 0);
+ inst.currentMonth = (dates ? date.getMonth() : 0);
+ inst.currentYear = (dates ? date.getFullYear() : 0);
+ this._adjustInstDate(inst);
+ },
+
+ /* Retrieve the default date shown on opening. */
+ _getDefaultDate: function(inst) {
+ return this._restrictMinMax(inst,
+ this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
+ },
+
+ /* A date may be specified as an exact value or a relative one. */
+ _determineDate: function(inst, date, defaultDate) {
+ var offsetNumeric = function(offset) {
+ var date = new Date();
+ date.setDate(date.getDate() + offset);
+ return date;
+ },
+ offsetString = function(offset) {
+ try {
+ return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
+ offset, $.datepicker._getFormatConfig(inst));
+ }
+ catch (e) {
+ // Ignore
+ }
+
+ var date = (offset.toLowerCase().match(/^c/) ?
+ $.datepicker._getDate(inst) : null) || new Date(),
+ year = date.getFullYear(),
+ month = date.getMonth(),
+ day = date.getDate(),
+ pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
+ matches = pattern.exec(offset);
+
+ while (matches) {
+ switch (matches[2] || "d") {
+ case "d" : case "D" :
+ day += parseInt(matches[1],10); break;
+ case "w" : case "W" :
+ day += parseInt(matches[1],10) * 7; break;
+ case "m" : case "M" :
+ month += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ case "y": case "Y" :
+ year += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ }
+ matches = pattern.exec(offset);
+ }
+ return new Date(year, month, day);
+ },
+ newDate = (date == null || date === "" ? defaultDate : (typeof date ===
"string" ? offsetString(date) :
+ (typeof date === "number" ? (isNaN(date) ? defaultDate :
offsetNumeric(date)) : new Date(date.getTime()))));
+
+ newDate = (newDate && newDate.toString() === "Invalid Date" ?
defaultDate : newDate);
+ if (newDate) {
+ newDate.setHours(0);
+ newDate.setMinutes(0);
+ newDate.setSeconds(0);
+ newDate.setMilliseconds(0);
+ }
+ return this._daylightSavingAdjust(newDate);
+ },
+
+ /* Handle switch to/from daylight saving.
+ * Hours may be non-zero on daylight saving cut-over:
+ * > 12 when midnight changeover, but then cannot generate
+ * midnight datetime, so jump to 1AM, otherwise reset.
+ * @param date (Date) the date to check
+ * @return (Date) the corrected date
+ */
+ _daylightSavingAdjust: function(date) {
+ if (!date) {
+ return null;
+ }
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+ return date;
+ },
+
+ /* Set the date(s) directly. */
+ _setDate: function(inst, date, noChange) {
+ var clear = !date,
+ origMonth = inst.selectedMonth,
+ origYear = inst.selectedYear,
+ newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+
+ inst.selectedDay = inst.currentDay = newDate.getDate();
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+ inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+ if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) &&
!noChange) {
+ this._notifyChange(inst);
+ }
+ this._adjustInstDate(inst);
+ if (inst.input) {
+ inst.input.val(clear ? "" : this._formatDate(inst));
+ }
+ },
+
+ /* Retrieve the date(s) directly. */
+ _getDate: function(inst) {
+ var startDate = (!inst.currentYear || (inst.input && inst.input.val() ===
"") ? null :
+ this._daylightSavingAdjust(new Date(
+ inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return startDate;
+ },
+
+ /* Attach the onxxx handlers. These are declared statically so
+ * they work with static code transformers like Caja.
+ */
+ _attachHandlers: function(inst) {
+ var stepMonths = this._get(inst, "stepMonths"),
+ id = "#" + inst.id.replace( /\\\\/g, "\\" );
+ inst.dpDiv.find("[data-handler]").map(function () {
+ var handler = {
+ prev: function () {
+ $.datepicker._adjustDate(id, -stepMonths, "M");
+ },
+ next: function () {
+ $.datepicker._adjustDate(id, +stepMonths, "M");
+ },
+ hide: function () {
+ $.datepicker._hideDatepicker();
+ },
+ today: function () {
+ $.datepicker._gotoToday(id);
+ },
+ selectDay: function () {
+ $.datepicker._selectDay(id, +this.getAttribute("data-month"),
+this.getAttribute("data-year"), this);
+ return false;
+ },
+ selectMonth: function () {
+ $.datepicker._selectMonthYear(id, this, "M");
+ return false;
+ },
+ selectYear: function () {
+ $.datepicker._selectMonthYear(id, this, "Y");
+ return false;
+ }
+ };
+ $(this).bind(this.getAttribute("data-event"),
handler[this.getAttribute("data-handler")]);
+ });
+ },
+
+ /* Generate the HTML for the current state of the date picker. */
+ _generateHTML: function(inst) {
+ var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
+ controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
+ monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
+ selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
+ cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
+ printDate, dRow, tbody, daySettings, otherMonth, unselectable,
+ tempDate = new Date(),
+ today = this._daylightSavingAdjust(
+ new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear
time
+ isRTL = this._get(inst, "isRTL"),
+ showButtonPanel = this._get(inst, "showButtonPanel"),
+ hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
+ navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
+ numMonths = this._getNumberOfMonths(inst),
+ showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
+ stepMonths = this._get(inst, "stepMonths"),
+ isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
+ currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+ new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
+ minDate = this._getMinMaxDate(inst, "min"),
+ maxDate = this._getMinMaxDate(inst, "max"),
+ drawMonth = inst.drawMonth - showCurrentAtPos,
+ drawYear = inst.drawYear;
+
+ if (drawMonth < 0) {
+ drawMonth += 12;
+ drawYear--;
+ }
+ if (maxDate) {
+ maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+ maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+ maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+ while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+ drawMonth--;
+ if (drawMonth < 0) {
+ drawMonth = 11;
+ drawYear--;
+ }
+ }
+ }
+ inst.drawMonth = drawMonth;
+ inst.drawYear = drawYear;
+
+ prevText = this._get(inst, "prevText");
+ prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+ this._getFormatConfig(inst)));
+
+ prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+ "<a class='ui-datepicker-prev ui-corner-all'
data-handler='prev' data-event='click'" +
+ " title='" + prevText + "'><span class='ui-icon
ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") +
"'>" + prevText + "</span></a>" :
+ (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev
ui-corner-all ui-state-disabled' title='"+ prevText +"'><span
class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" :
"w") + "'>" + prevText +
"</span></a>"));
+
+ nextText = this._get(inst, "nextText");
+ nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+ this._getFormatConfig(inst)));
+
+ next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+ "<a class='ui-datepicker-next ui-corner-all'
data-handler='next' data-event='click'" +
+ " title='" + nextText + "'><span class='ui-icon
ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") +
"'>" + nextText + "</span></a>" :
+ (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next
ui-corner-all ui-state-disabled' title='"+ nextText + "'><span
class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" :
"e") + "'>" + nextText +
"</span></a>"));
+
+ currentText = this._get(inst, "currentText");
+ gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ?
currentDate : today);
+ currentText = (!navigationAsDateFormat ? currentText :
+ this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+
+ controls = (!inst.inline ? "<button type='button'
class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all'
data-handler='hide' data-event='click'>" +
+ this._get(inst, "closeText") + "</button>" : "");
+
+ buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane
ui-widget-content'>" + (isRTL ? controls : "") +
+ (this._isInRange(inst, gotoDate) ? "<button type='button'
class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all'
data-handler='today' data-event='click'" +
+ ">" + currentText + "</button>" : "") + (isRTL
? "" : controls) + "</div>" : "";
+
+ firstDay = parseInt(this._get(inst, "firstDay"),10);
+ firstDay = (isNaN(firstDay) ? 0 : firstDay);
+
+ showWeek = this._get(inst, "showWeek");
+ dayNames = this._get(inst, "dayNames");
+ dayNamesMin = this._get(inst, "dayNamesMin");
+ monthNames = this._get(inst, "monthNames");
+ monthNamesShort = this._get(inst, "monthNamesShort");
+ beforeShowDay = this._get(inst, "beforeShowDay");
+ showOtherMonths = this._get(inst, "showOtherMonths");
+ selectOtherMonths = this._get(inst, "selectOtherMonths");
+ defaultDate = this._getDefaultDate(inst);
+ html = "";
+ dow;
+ for (row = 0; row < numMonths[0]; row++) {
+ group = "";
+ this.maxRows = 4;
+ for (col = 0; col < numMonths[1]; col++) {
+ selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth,
inst.selectedDay));
+ cornerClass = " ui-corner-all";
+ calender = "";
+ if (isMultiMonth) {
+ calender += "<div class='ui-datepicker-group";
+ if (numMonths[1] > 1) {
+ switch (col) {
+ case 0: calender += " ui-datepicker-group-first";
+ cornerClass = " ui-corner-" + (isRTL ? "right" :
"left"); break;
+ case numMonths[1]-1: calender += " ui-datepicker-group-last";
+ cornerClass = " ui-corner-" + (isRTL ? "left" :
"right"); break;
+ default: calender += " ui-datepicker-group-middle"; cornerClass =
""; break;
+ }
+ }
+ calender += "'>";
+ }
+ calender += "<div class='ui-datepicker-header ui-widget-header
ui-helper-clearfix" + cornerClass + "'>" +
+ (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) :
"") +
+ (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) :
"") +
+ this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+ row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+ "</div><table
class='ui-datepicker-calendar'><thead>" +
+ "<tr>";
+ thead = (showWeek ? "<th class='ui-datepicker-week-col'>" +
this._get(inst, "weekHeader") + "</th>" : "");
+ for (dow = 0; dow < 7; dow++) { // days of the week
+ day = (dow + firstDay) % 7;
+ thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5
? " class='ui-datepicker-week-end'" : "") + ">"
+
+ "<span title='" + dayNames[day] + "'>" +
dayNamesMin[day] + "</span></th>";
+ }
+ calender += thead + "</tr></thead><tbody>";
+ daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+ if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
+ inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+ }
+ leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+ curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to
generate
+ numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows :
curRows); //If multiple months, use the higher number of rows (see #7043)
+ this.maxRows = numRows;
+ printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+ for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+ calender += "<tr>";
+ tbody = (!showWeek ? "" : "<td
class='ui-datepicker-week-col'>" +
+ this._get(inst, "calculateWeek")(printDate) + "</td>");
+ for (dow = 0; dow < 7; dow++) { // create date picker days
+ daySettings = (beforeShowDay ?
+ beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true,
""]);
+ otherMonth = (printDate.getMonth() !== drawMonth);
+ unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+ (minDate && printDate < minDate) || (maxDate && printDate >
maxDate);
+ tbody += "<td class='" +
+ ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" :
"") + // highlight weekends
+ (otherMonth ? " ui-datepicker-other-month" : "") + //
highlight days from other months
+ ((printDate.getTime() === selectedDate.getTime() && drawMonth ===
inst.selectedMonth && inst._keyEvent) || // user pressed key
+ (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime()
=== selectedDate.getTime()) ?
+ // or defaultDate is current printedDate and defaultDate is selectedDate
+ " " + this._dayOverClass : "") + // highlight selected day
+ (unselectable ? " " + this._unselectableClass + "
ui-state-disabled": "") + // highlight unselectable days
+ (otherMonth && !showOtherMonths ? "" : " " +
daySettings[1] + // highlight custom dates
+ (printDate.getTime() === currentDate.getTime() ? " " +
this._currentClass : "") + // highlight selected day
+ (printDate.getTime() === today.getTime() ? " ui-datepicker-today" :
"")) + "'" + // highlight today (if different)
+ ((!otherMonth || showOtherMonths) && daySettings[2] ? "
title='" + daySettings[2].replace(/'/g, "'") +
"'" : "") + // cell title
+ (unselectable ? "" : " data-handler='selectDay'
data-event='click' data-month='" + printDate.getMonth() + "'
data-year='" + printDate.getFullYear() + "'") + ">" +
// actions
+ (otherMonth && !showOtherMonths ? " " : // display for
other months
+ (unselectable ? "<span class='ui-state-default'>" +
printDate.getDate() + "</span>" : "<a
class='ui-state-default" +
+ (printDate.getTime() === today.getTime() ? " ui-state-highlight" :
"") +
+ (printDate.getTime() === currentDate.getTime() ? " ui-state-active" :
"") + // highlight selected day
+ (otherMonth ? " ui-priority-secondary" : "") + // distinguish
dates from other months
+ "' href='#'>" + printDate.getDate() +
"</a>")) + "</td>"; // display selectable date
+ printDate.setDate(printDate.getDate() + 1);
+ printDate = this._daylightSavingAdjust(printDate);
+ }
+ calender += tbody + "</tr>";
+ }
+ drawMonth++;
+ if (drawMonth > 11) {
+ drawMonth = 0;
+ drawYear++;
+ }
+ calender += "</tbody></table>" + (isMultiMonth ?
"</div>" +
+ ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div
class='ui-datepicker-row-break'></div>" : "") :
"");
+ group += calender;
+ }
+ html += group;
+ }
+ html += buttonPanel;
+ inst._keyEvent = false;
+ return html;
+ },
+
+ /* Generate the month and year header. */
+ _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+ secondary, monthNames, monthNamesShort) {
+
+ var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
+ changeMonth = this._get(inst, "changeMonth"),
+ changeYear = this._get(inst, "changeYear"),
+ showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
+ html = "<div class='ui-datepicker-title'>",
+ monthHtml = "";
+
+ // month selection
+ if (secondary || !changeMonth) {
+ monthHtml += "<span class='ui-datepicker-month'>" +
monthNames[drawMonth] + "</span>";
+ } else {
+ inMinYear = (minDate && minDate.getFullYear() === drawYear);
+ inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
+ monthHtml += "<select class='ui-datepicker-month'
data-handler='selectMonth' data-event='change'>";
+ for ( month = 0; month < 12; month++) {
+ if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month
<= maxDate.getMonth())) {
+ monthHtml += "<option value='" + month + "'" +
+ (month === drawMonth ? " selected='selected'" : "") +
+ ">" + monthNamesShort[month] + "</option>";
+ }
+ }
+ monthHtml += "</select>";
+ }
+
+ if (!showMonthAfterYear) {
+ html += monthHtml + (secondary || !(changeMonth && changeYear) ?
" " : "");
+ }
+
+ // year selection
+ if ( !inst.yearshtml ) {
+ inst.yearshtml = "";
+ if (secondary || !changeYear) {
+ html += "<span class='ui-datepicker-year'>" + drawYear +
"</span>";
+ } else {
+ // determine range of years to display
+ years = this._get(inst, "yearRange").split(":");
+ thisYear = new Date().getFullYear();
+ determineYear = function(value) {
+ var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+ (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
+ parseInt(value, 10)));
+ return (isNaN(year) ? thisYear : year);
+ };
+ year = determineYear(years[0]);
+ endYear = Math.max(year, determineYear(years[1] || ""));
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+ inst.yearshtml += "<select class='ui-datepicker-year'
data-handler='selectYear' data-event='change'>";
+ for (; year <= endYear; year++) {
+ inst.yearshtml += "<option value='" + year + "'" +
+ (year === drawYear ? " selected='selected'" : "") +
+ ">" + year + "</option>";
+ }
+ inst.yearshtml += "</select>";
+
+ html += inst.yearshtml;
+ inst.yearshtml = null;
+ }
+ }
+
+ html += this._get(inst, "yearSuffix");
+ if (showMonthAfterYear) {
+ html += (secondary || !(changeMonth && changeYear) ? " " :
"") + monthHtml;
+ }
+ html += "</div>"; // Close datepicker_header
+ return html;
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustInstDate: function(inst, offset, period) {
+ var year = inst.drawYear + (period === "Y" ? offset : 0),
+ month = inst.drawMonth + (period === "M" ? offset : 0),
+ day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period ===
"D" ? offset : 0),
+ date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month,
day)));
+
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ if (period === "M" || period === "Y") {
+ this._notifyChange(inst);
+ }
+ },
+
+ /* Ensure a date is within any min/max bounds. */
+ _restrictMinMax: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, "min"),
+ maxDate = this._getMinMaxDate(inst, "max"),
+ newDate = (minDate && date < minDate ? minDate : date);
+ return (maxDate && newDate > maxDate ? maxDate : newDate);
+ },
+
+ /* Notify change of month/year. */
+ _notifyChange: function(inst) {
+ var onChange = this._get(inst, "onChangeMonthYear");
+ if (onChange) {
+ onChange.apply((inst.input ? inst.input[0] : null),
+ [inst.selectedYear, inst.selectedMonth + 1, inst]);
+ }
+ },
+
+ /* Determine the number of months to show. */
+ _getNumberOfMonths: function(inst) {
+ var numMonths = this._get(inst, "numberOfMonths");
+ return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1,
numMonths] : numMonths));
+ },
+
+ /* Determine the current maximum date - ensure no time components are set. */
+ _getMinMaxDate: function(inst, minMax) {
+ return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
+ },
+
+ /* Find the number of days in a given month. */
+ _getDaysInMonth: function(year, month) {
+ return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+ },
+
+ /* Find the day of the week of the first of a month. */
+ _getFirstDayOfMonth: function(year, month) {
+ return new Date(year, month, 1).getDay();
+ },
+
+ /* Determines if we should allow a "next/prev" month display change. */
+ _canAdjustMonth: function(inst, offset, curYear, curMonth) {
+ var numMonths = this._getNumberOfMonths(inst),
+ date = this._daylightSavingAdjust(new Date(curYear,
+ curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+
+ if (offset < 0) {
+ date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+ }
+ return this._isInRange(inst, date);
+ },
+
+ /* Is the given date in the accepted range? */
+ _isInRange: function(inst, date) {
+ var yearSplit, currentYear,
+ minDate = this._getMinMaxDate(inst, "min"),
+ maxDate = this._getMinMaxDate(inst, "max"),
+ minYear = null,
+ maxYear = null,
+ years = this._get(inst, "yearRange");
+ if (years){
+ yearSplit = years.split(":");
+ currentYear = new Date().getFullYear();
+ minYear = parseInt(yearSplit[0], 10);
+ maxYear = parseInt(yearSplit[1], 10);
+ if ( yearSplit[0].match(/[+\-].*/) ) {
+ minYear += currentYear;
+ }
+ if ( yearSplit[1].match(/[+\-].*/) ) {
+ maxYear += currentYear;
+ }
+ }
+
+ return ((!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime()) &&
+ (!minYear || date.getFullYear() >= minYear) &&
+ (!maxYear || date.getFullYear() <= maxYear));
+ },
+
+ /* Provide the configuration settings for formatting/parsing. */
+ _getFormatConfig: function(inst) {
+ var shortYearCutoff = this._get(inst, "shortYearCutoff");
+ shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ return {shortYearCutoff: shortYearCutoff,
+ dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst,
"dayNames"),
+ monthNamesShort: this._get(inst, "monthNamesShort"), monthNames:
this._get(inst, "monthNames")};
+ },
+
+ /* Format the given date for display. */
+ _formatDate: function(inst, day, month, year) {
+ if (!day) {
+ inst.currentDay = inst.selectedDay;
+ inst.currentMonth = inst.selectedMonth;
+ inst.currentYear = inst.selectedYear;
+ }
+ var date = (day ? (typeof day === "object" ? day :
+ this._daylightSavingAdjust(new Date(year, month, day))) :
+ this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth,
inst.currentDay)));
+ return this.formatDate(this._get(inst, "dateFormat"), date,
this._getFormatConfig(inst));
+ }
+});
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find
their way back to the active picker.
+ */
+function datepicker_bindHover(dpDiv) {
+ var selector = "button, .ui-datepicker-prev, .ui-datepicker-next,
.ui-datepicker-calendar td a";
+ return dpDiv.delegate(selector, "mouseout", function() {
+ $(this).removeClass("ui-state-hover");
+ if (this.className.indexOf("ui-datepicker-prev") !== -1) {
+ $(this).removeClass("ui-datepicker-prev-hover");
+ }
+ if (this.className.indexOf("ui-datepicker-next") !== -1) {
+ $(this).removeClass("ui-datepicker-next-hover");
+ }
+ })
+ .delegate( selector, "mouseover", datepicker_handleMouseover );
+}
+
+function datepicker_handleMouseover() {
+ if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline?
datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
+ $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
+ $(this).addClass("ui-state-hover");
+ if (this.className.indexOf("ui-datepicker-prev") !== -1) {
+ $(this).addClass("ui-datepicker-prev-hover");
+ }
+ if (this.className.indexOf("ui-datepicker-next") !== -1) {
+ $(this).addClass("ui-datepicker-next-hover");
+ }
+ }
+}
+
+/* jQuery extend now ignores nulls! */
+function datepicker_extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props) {
+ if (props[name] == null) {
+ target[name] = props[name];
+ }
+ }
+ return target;
+}
+
+/* Invoke the datepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new datepicker functionality
+ @return jQuery object */
+$.fn.datepicker = function(options){
+
+ /* Verify an empty collection wasn't passed - Fixes #6976 */
+ if ( !this.length ) {
+ return this;
+ }
+
+ /* Initialise the date picker. */
+ if (!$.datepicker.initialized) {
+ $(document).mousedown($.datepicker._checkExternalClick);
+ $.datepicker.initialized = true;
+ }
+
+ /* Append datepicker main container to body if not exist. */
+ if ($("#"+$.datepicker._mainDivId).length === 0) {
+ $("body").append($.datepicker.dpDiv);
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options === "string" && (options === "isDisabled"
|| options === "getDate" || options === "widget")) {
+ return $.datepicker["_" + options + "Datepicker"].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ }
+ if (options === "option" && arguments.length === 2 && typeof
arguments[1] === "string") {
+ return $.datepicker["_" + options + "Datepicker"].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ }
+ return this.each(function() {
+ typeof options === "string" ?
+ $.datepicker["_" + options + "Datepicker"].
+ apply($.datepicker, [this].concat(otherArgs)) :
+ $.datepicker._attachDatepicker(this, options);
+ });
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.11.4";
+
+var datepicker = $.datepicker;
+
+
+/*!
+ * jQuery UI Draggable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/draggable/
+ */
+
+
+$.widget("ui.draggable", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "drag",
+ options: {
+ addClasses: true,
+ appendTo: "parent",
+ axis: false,
+ connectToSortable: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ iframeFix: false,
+ opacity: false,
+ refreshPositions: false,
+ revert: false,
+ revertDuration: 500,
+ scope: "default",
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ snap: false,
+ snapMode: "both",
+ snapTolerance: 20,
+ stack: false,
+ zIndex: false,
+
+ // callbacks
+ drag: null,
+ start: null,
+ stop: null
+ },
+ _create: function() {
+
+ if ( this.options.helper === "original" ) {
+ this._setPositionRelative();
+ }
+ if (this.options.addClasses){
+ this.element.addClass("ui-draggable");
+ }
+ if (this.options.disabled){
+ this.element.addClass("ui-draggable-disabled");
+ }
+ this._setHandleClassName();
+
+ this._mouseInit();
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+ if ( key === "handle" ) {
+ this._removeHandleClassName();
+ this._setHandleClassName();
+ }
+ },
+
+ _destroy: function() {
+ if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
+ this.destroyOnClear = true;
+ return;
+ }
+ this.element.removeClass( "ui-draggable ui-draggable-dragging
ui-draggable-disabled" );
+ this._removeHandleClassName();
+ this._mouseDestroy();
+ },
+
+ _mouseCapture: function(event) {
+ var o = this.options;
+
+ this._blurActiveElement( event );
+
+ // among others, prevent a drag on a resizable-handle
+ if (this.helper || o.disabled ||
$(event.target).closest(".ui-resizable-handle").length > 0) {
+ return false;
+ }
+
+ //Quit if we're not on a valid handle
+ this.handle = this._getHandle(event);
+ if (!this.handle) {
+ return false;
+ }
+
+ this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
+
+ return true;
+
+ },
+
+ _blockFrames: function( selector ) {
+ this.iframeBlocks = this.document.find( selector ).map(function() {
+ var iframe = $( this );
+
+ return $( "<div>" )
+ .css( "position", "absolute" )
+ .appendTo( iframe.parent() )
+ .outerWidth( iframe.outerWidth() )
+ .outerHeight( iframe.outerHeight() )
+ .offset( iframe.offset() )[ 0 ];
+ });
+ },
+
+ _unblockFrames: function() {
+ if ( this.iframeBlocks ) {
+ this.iframeBlocks.remove();
+ delete this.iframeBlocks;
+ }
+ },
+
+ _blurActiveElement: function( event ) {
+ var document = this.document[ 0 ];
+
+ // Only need to blur if the event occurred on the draggable itself, see #10527
+ if ( !this.handleElement.is( event.target ) ) {
+ return;
+ }
+
+ // support: IE9
+ // IE9 throws an "Unspecified error" accessing document.activeElement from an
<iframe>
+ try {
+
+ // Support: IE9, IE10
+ // If the <body> is blurred, IE will switch windows, see #9520
+ if ( document.activeElement && document.activeElement.nodeName.toLowerCase()
!== "body" ) {
+
+ // Blur any element that currently has focus, see #4261
+ $( document.activeElement ).blur();
+ }
+ } catch ( error ) {}
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options;
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ this.helper.addClass("ui-draggable-dragging");
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ //If ddmanager is used for droppables, set the global draggable
+ if ($.ui.ddmanager) {
+ $.ui.ddmanager.current = this;
+ }
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Store the helper's css position
+ this.cssPosition = this.helper.css( "position" );
+ this.scrollParent = this.helper.scrollParent( true );
+ this.offsetParent = this.helper.offsetParent();
+ this.hasFixedAncestor = this.helper.parents().filter(function() {
+ return $( this ).css( "position" ) === "fixed";
+ }).length > 0;
+
+ //The element's absolute position on the page minus margins
+ this.positionAbs = this.element.offset();
+ this._refreshOffsets( event );
+
+ //Generate the original position
+ this.originalPosition = this.position = this._generatePosition( event, false );
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Set a containment if given in the options
+ this._setContainment();
+
+ //Trigger event + callbacks
+ if (this._trigger("start", event) === false) {
+ this._clear();
+ return false;
+ }
+
+ //Recache the helper size
+ this._cacheHelperProportions();
+
+ //Prepare the droppable offsets
+ if ($.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ // Reset helper's right/bottom css if they're set and set explicit width/height
instead
+ // as this prevents resizing of elements with right/bottom set (see #7772)
+ this._normalizeRightBottom();
+
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to
be visible before getting its correct position
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has started
(see #5003)
+ if ( $.ui.ddmanager ) {
+ $.ui.ddmanager.dragStart(this, event);
+ }
+
+ return true;
+ },
+
+ _refreshOffsets: function( event ) {
+ this.offset = {
+ top: this.positionAbs.top - this.margins.top,
+ left: this.positionAbs.left - this.margins.left,
+ scroll: false,
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset()
+ };
+
+ this.offset.click = {
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ };
+ },
+
+ _mouseDrag: function(event, noPropagation) {
+ // reset any necessary cached properties (see #5009)
+ if ( this.hasFixedAncestor ) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ //Compute the helpers position
+ this.position = this._generatePosition( event, true );
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Call plugins and callbacks and use the resulting position if something is returned
+ if (!noPropagation) {
+ var ui = this._uiHash();
+ if (this._trigger("drag", event, ui) === false) {
+ this._mouseUp({});
+ return false;
+ }
+ this.position = ui.position;
+ }
+
+ this.helper[ 0 ].style.left = this.position.left + "px";
+ this.helper[ 0 ].style.top = this.position.top + "px";
+
+ if ($.ui.ddmanager) {
+ $.ui.ddmanager.drag(this, event);
+ }
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ //If we are using droppables, inform the manager about the drop
+ var that = this,
+ dropped = false;
+ if ($.ui.ddmanager && !this.options.dropBehaviour) {
+ dropped = $.ui.ddmanager.drop(this, event);
+ }
+
+ //if a drop comes from outside (a sortable)
+ if (this.dropped) {
+ dropped = this.dropped;
+ this.dropped = false;
+ }
+
+ if ((this.options.revert === "invalid" && !dropped) ||
(this.options.revert === "valid" && dropped) || this.options.revert ===
true || ($.isFunction(this.options.revert) &&
this.options.revert.call(this.element, dropped))) {
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration,
10), function() {
+ if (that._trigger("stop", event) !== false) {
+ that._clear();
+ }
+ });
+ } else {
+ if (this._trigger("stop", event) !== false) {
+ this._clear();
+ }
+ }
+
+ return false;
+ },
+
+ _mouseUp: function( event ) {
+ this._unblockFrames();
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has stopped
(see #5003)
+ if ( $.ui.ddmanager ) {
+ $.ui.ddmanager.dragStop(this, event);
+ }
+
+ // Only need to focus if the event occurred on the draggable itself, see #10527
+ if ( this.handleElement.is( event.target ) ) {
+ // The interaction is over; whether or not the click resulted in a drag, focus the
element
+ this.element.focus();
+ }
+
+ return $.ui.mouse.prototype._mouseUp.call(this, event);
+ },
+
+ cancel: function() {
+
+ if (this.helper.is(".ui-draggable-dragging")) {
+ this._mouseUp({});
+ } else {
+ this._clear();
+ }
+
+ return this;
+
+ },
+
+ _getHandle: function(event) {
+ return this.options.handle ?
+ !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
+ true;
+ },
+
+ _setHandleClassName: function() {
+ this.handleElement = this.options.handle ?
+ this.element.find( this.options.handle ) : this.element;
+ this.handleElement.addClass( "ui-draggable-handle" );
+ },
+
+ _removeHandleClassName: function() {
+ this.handleElement.removeClass( "ui-draggable-handle" );
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options,
+ helperIsFunction = $.isFunction( o.helper ),
+ helper = helperIsFunction ?
+ $( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
+ ( o.helper === "clone" ?
+ this.element.clone().removeAttr( "id" ) :
+ this.element );
+
+ if (!helper.parents("body").length) {
+ helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode :
o.appendTo));
+ }
+
+ //
http://bugs.jqueryui.com/ticket/9446
+ // a helper function can return the original element
+ // which wouldn't have been set to relative in _create
+ if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
+ this._setPositionRelative();
+ }
+
+ if (helper[0] !== this.element[0] &&
!(/(fixed|absolute)/).test(helper.css("position"))) {
+ helper.css("position", "absolute");
+ }
+
+ return helper;
+
+ },
+
+ _setPositionRelative: function() {
+ if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
+ this.element[ 0 ].style.position = "relative";
+ }
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj === "string") {
+ obj = obj.split(" ");
+ }
+ if ($.isArray(obj)) {
+ obj = { left: +obj[0], top: +obj[1] || 0 };
+ }
+ if ("left" in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ("right" in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right +
this.margins.left;
+ }
+ if ("top" in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ("bottom" in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom +
this.margins.top;
+ }
+ },
+
+ _isRootNode: function( element ) {
+ return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
+ },
+
+ _getParentOffset: function() {
+
+ //Get the offsetParent and cache its position
+ var po = this.offsetParent.offset(),
+ document = this.document[ 0 ];
+
+ // This is a special case where we need to modify a offset calculated on start, since
the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based
on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent
isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent,
and never recalculated upon drag
+ if (this.cssPosition === "absolute" && this.scrollParent[0] !==
document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
+ po = { top: 0, left: 0 };
+ }
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) ||
0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+ if ( this.cssPosition !== "relative" ) {
+ return { top: 0, left: 0 };
+ }
+
+ var p = this.element.position(),
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+ return {
+ top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + (
!scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
+ left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + (
!scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
+ };
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.element.css("marginLeft"), 10) || 0),
+ top: (parseInt(this.element.css("marginTop"), 10) || 0),
+ right: (parseInt(this.element.css("marginRight"), 10) || 0),
+ bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var isUserScrollable, c, ce,
+ o = this.options,
+ document = this.document[ 0 ];
+
+ this.relativeContainer = null;
+
+ if ( !o.containment ) {
+ this.containment = null;
+ return;
+ }
+
+ if ( o.containment === "window" ) {
+ this.containment = [
+ $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+ $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+ $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width -
this.margins.left,
+ $( window ).scrollTop() + ( $( window ).height() ||
document.body.parentNode.scrollHeight ) - this.helperProportions.height -
this.margins.top
+ ];
+ return;
+ }
+
+ if ( o.containment === "document") {
+ this.containment = [
+ 0,
+ 0,
+ $( document ).width() - this.helperProportions.width - this.margins.left,
+ ( $( document ).height() || document.body.parentNode.scrollHeight ) -
this.helperProportions.height - this.margins.top
+ ];
+ return;
+ }
+
+ if ( o.containment.constructor === Array ) {
+ this.containment = o.containment;
+ return;
+ }
+
+ if ( o.containment === "parent" ) {
+ o.containment = this.helper[ 0 ].parentNode;
+ }
+
+ c = $( o.containment );
+ ce = c[ 0 ];
+
+ if ( !ce ) {
+ return;
+ }
+
+ isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
+
+ this.containment = [
+ ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css(
"paddingLeft" ), 10 ) || 0 ),
+ ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css(
"paddingTop" ), 10 ) || 0 ),
+ ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
+ ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
+ ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
+ this.helperProportions.width -
+ this.margins.left -
+ this.margins.right,
+ ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight )
-
+ ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
+ ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
+ this.helperProportions.height -
+ this.margins.top -
+ this.margins.bottom
+ ];
+ this.relativeContainer = c;
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if (!pos) {
+ pos = this.position;
+ }
+
+ var mod = d === "absolute" ? 1 : -1,
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+ return {
+ top: (
+ pos.top + // The absolute mouse position
+ this.offset.relative.top * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.top * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : (
scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
+ ),
+ left: (
+ pos.left + // The absolute mouse position
+ this.offset.relative.left * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.left * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : (
scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function( event, constrainPosition ) {
+
+ var containment, co, top, left,
+ o = this.options,
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
+ pageX = event.pageX,
+ pageY = event.pageY;
+
+ // Cache the scroll
+ if ( !scrollIsRootNode || !this.offset.scroll ) {
+ this.offset.scroll = {
+ top: this.scrollParent.scrollTop(),
+ left: this.scrollParent.scrollLeft()
+ };
+ }
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ // If we are not dragging yet, we won't check for options
+ if ( constrainPosition ) {
+ if ( this.containment ) {
+ if ( this.relativeContainer ){
+ co = this.relativeContainer.offset();
+ containment = [
+ this.containment[ 0 ] + co.left,
+ this.containment[ 1 ] + co.top,
+ this.containment[ 2 ] + co.left,
+ this.containment[ 3 ] + co.top
+ ];
+ } else {
+ containment = this.containment;
+ }
+
+ if (event.pageX - this.offset.click.left < containment[0]) {
+ pageX = containment[0] + this.offset.click.left;
+ }
+ if (event.pageY - this.offset.click.top < containment[1]) {
+ pageY = containment[1] + this.offset.click.top;
+ }
+ if (event.pageX - this.offset.click.left > containment[2]) {
+ pageX = containment[2] + this.offset.click.left;
+ }
+ if (event.pageY - this.offset.click.top > containment[3]) {
+ pageY = containment[3] + this.offset.click.top;
+ }
+ }
+
+ if (o.grid) {
+ //Check for grid elements set to 0 to prevent divide by 0 error causing invalid
argument errors in IE (see ticket #6950)
+ top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) /
o.grid[1]) * o.grid[1] : this.originalPageY;
+ pageY = containment ? ((top - this.offset.click.top >= containment[1] || top -
this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >=
containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) /
o.grid[0]) * o.grid[0] : this.originalPageX;
+ pageX = containment ? ((left - this.offset.click.left >= containment[0] || left -
this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >=
containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ if ( o.axis === "y" ) {
+ pageX = this.originalPageX;
+ }
+
+ if ( o.axis === "x" ) {
+ pageY = this.originalPageY;
+ }
+ }
+
+ return {
+ top: (
+ pageY - // The absolute mouse position
+ this.offset.click.top - // Click offset (relative to the element)
+ this.offset.relative.top - // Only for relative positioned nodes: Relative
offset from element to offset parent
+ this.offset.parent.top + // The offsetParent's offset without borders
(offset + border)
+ ( this.cssPosition === "fixed" ? -this.offset.scroll.top : (
scrollIsRootNode ? 0 : this.offset.scroll.top ) )
+ ),
+ left: (
+ pageX - // The absolute mouse position
+ this.offset.click.left - // Click offset (relative to the element)
+ this.offset.relative.left - // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.left + // The offsetParent's offset without borders
(offset + border)
+ ( this.cssPosition === "fixed" ? -this.offset.scroll.left : (
scrollIsRootNode ? 0 : this.offset.scroll.left ) )
+ )
+ };
+
+ },
+
+ _clear: function() {
+ this.helper.removeClass("ui-draggable-dragging");
+ if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
+ this.helper.remove();
+ }
+ this.helper = null;
+ this.cancelHelperRemoval = false;
+ if ( this.destroyOnClear ) {
+ this.destroy();
+ }
+ },
+
+ _normalizeRightBottom: function() {
+ if ( this.options.axis !== "y" && this.helper.css( "right"
) !== "auto" ) {
+ this.helper.width( this.helper.width() );
+ this.helper.css( "right", "auto" );
+ }
+ if ( this.options.axis !== "x" && this.helper.css( "bottom"
) !== "auto" ) {
+ this.helper.height( this.helper.height() );
+ this.helper.css( "bottom", "auto" );
+ }
+ },
+
+ // From now on bulk stuff - mainly helpers
+
+ _trigger: function( type, event, ui ) {
+ ui = ui || this._uiHash();
+ $.ui.plugin.call( this, type, [ event, ui, this ], true );
+
+ // Absolute position and offset (see #6884 ) have to be recalculated after plugins
+ if ( /^(drag|start|stop)/.test( type ) ) {
+ this.positionAbs = this._convertPositionTo( "absolute" );
+ ui.offset = this.positionAbs;
+ }
+ return $.Widget.prototype._trigger.call( this, type, event, ui );
+ },
+
+ plugins: {},
+
+ _uiHash: function() {
+ return {
+ helper: this.helper,
+ position: this.position,
+ originalPosition: this.originalPosition,
+ offset: this.positionAbs
+ };
+ }
+
+});
+
+$.ui.plugin.add( "draggable", "connectToSortable", {
+ start: function( event, ui, draggable ) {
+ var uiSortable = $.extend( {}, ui, {
+ item: draggable.element
+ });
+
+ draggable.sortables = [];
+ $( draggable.options.connectToSortable ).each(function() {
+ var sortable = $( this ).sortable( "instance" );
+
+ if ( sortable && !sortable.options.disabled ) {
+ draggable.sortables.push( sortable );
+
+ // refreshPositions is called at drag start to refresh the containerCache
+ // which is used in drag. This ensures it's initialized and synchronized
+ // with any changes that might have happened on the page since initialization.
+ sortable.refreshPositions();
+ sortable._trigger("activate", event, uiSortable);
+ }
+ });
+ },
+ stop: function( event, ui, draggable ) {
+ var uiSortable = $.extend( {}, ui, {
+ item: draggable.element
+ });
+
+ draggable.cancelHelperRemoval = false;
+
+ $.each( draggable.sortables, function() {
+ var sortable = this;
+
+ if ( sortable.isOver ) {
+ sortable.isOver = 0;
+
+ // Allow this sortable to handle removing the helper
+ draggable.cancelHelperRemoval = true;
+ sortable.cancelHelperRemoval = false;
+
+ // Use _storedCSS To restore properties in the sortable,
+ // as this also handles revert (#9675) since the draggable
+ // may have modified them in unexpected ways (#8809)
+ sortable._storedCSS = {
+ position: sortable.placeholder.css( "position" ),
+ top: sortable.placeholder.css( "top" ),
+ left: sortable.placeholder.css( "left" )
+ };
+
+ sortable._mouseStop(event);
+
+ // Once drag has ended, the sortable should return to using
+ // its original helper, not the shared helper from draggable
+ sortable.options.helper = sortable.options._helper;
+ } else {
+ // Prevent this Sortable from removing the helper.
+ // However, don't set the draggable to remove the helper
+ // either as another connected Sortable may yet handle the removal.
+ sortable.cancelHelperRemoval = true;
+
+ sortable._trigger( "deactivate", event, uiSortable );
+ }
+ });
+ },
+ drag: function( event, ui, draggable ) {
+ $.each( draggable.sortables, function() {
+ var innermostIntersecting = false,
+ sortable = this;
+
+ // Copy over variables that sortable's _intersectsWith uses
+ sortable.positionAbs = draggable.positionAbs;
+ sortable.helperProportions = draggable.helperProportions;
+ sortable.offset.click = draggable.offset.click;
+
+ if ( sortable._intersectsWith( sortable.containerCache ) ) {
+ innermostIntersecting = true;
+
+ $.each( draggable.sortables, function() {
+ // Copy over variables that sortable's _intersectsWith uses
+ this.positionAbs = draggable.positionAbs;
+ this.helperProportions = draggable.helperProportions;
+ this.offset.click = draggable.offset.click;
+
+ if ( this !== sortable &&
+ this._intersectsWith( this.containerCache ) &&
+ $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
+ innermostIntersecting = false;
+ }
+
+ return innermostIntersecting;
+ });
+ }
+
+ if ( innermostIntersecting ) {
+ // If it intersects, we use a little isOver variable and set it once,
+ // so that the move-in stuff gets fired only once.
+ if ( !sortable.isOver ) {
+ sortable.isOver = 1;
+
+ // Store draggable's parent in case we need to reappend to it later.
+ draggable._parent = ui.helper.parent();
+
+ sortable.currentItem = ui.helper
+ .appendTo( sortable.element )
+ .data( "ui-sortable-item", true );
+
+ // Store helper option to later restore it
+ sortable.options._helper = sortable.options.helper;
+
+ sortable.options.helper = function() {
+ return ui.helper[ 0 ];
+ };
+
+ // Fire the start events of the sortable with our passed browser event,
+ // and our own helper (so it doesn't create a new one)
+ event.target = sortable.currentItem[ 0 ];
+ sortable._mouseCapture( event, true );
+ sortable._mouseStart( event, true, true );
+
+ // Because the browser event is way off the new appended portlet,
+ // modify necessary variables to reflect the changes
+ sortable.offset.click.top = draggable.offset.click.top;
+ sortable.offset.click.left = draggable.offset.click.left;
+ sortable.offset.parent.left -= draggable.offset.parent.left -
+ sortable.offset.parent.left;
+ sortable.offset.parent.top -= draggable.offset.parent.top -
+ sortable.offset.parent.top;
+
+ draggable._trigger( "toSortable", event );
+
+ // Inform draggable that the helper is in a valid drop zone,
+ // used solely in the revert option to handle "valid/invalid".
+ draggable.dropped = sortable.element;
+
+ // Need to refreshPositions of all sortables in the case that
+ // adding to one sortable changes the location of the other sortables (#9675)
+ $.each( draggable.sortables, function() {
+ this.refreshPositions();
+ });
+
+ // hack so receive/update callbacks work (mostly)
+ draggable.currentItem = draggable.element;
+ sortable.fromOutside = draggable;
+ }
+
+ if ( sortable.currentItem ) {
+ sortable._mouseDrag( event );
+ // Copy the sortable's position because the draggable's can potentially
reflect
+ // a relative position, while sortable is always absolute, which the dragged
+ // element has now become. (#8809)
+ ui.position = sortable.position;
+ }
+ } else {
+ // If it doesn't intersect with the sortable, and it intersected before,
+ // we fake the drag stop of the sortable, but make sure it doesn't remove
+ // the helper by using cancelHelperRemoval.
+ if ( sortable.isOver ) {
+
+ sortable.isOver = 0;
+ sortable.cancelHelperRemoval = true;
+
+ // Calling sortable's mouseStop would trigger a revert,
+ // so revert must be temporarily false until after mouseStop is called.
+ sortable.options._revert = sortable.options.revert;
+ sortable.options.revert = false;
+
+ sortable._trigger( "out", event, sortable._uiHash( sortable ) );
+ sortable._mouseStop( event, true );
+
+ // restore sortable behaviors that were modfied
+ // when the draggable entered the sortable area (#9481)
+ sortable.options.revert = sortable.options._revert;
+ sortable.options.helper = sortable.options._helper;
+
+ if ( sortable.placeholder ) {
+ sortable.placeholder.remove();
+ }
+
+ // Restore and recalculate the draggable's offset considering the sortable
+ // may have modified them in unexpected ways. (#8809, #10669)
+ ui.helper.appendTo( draggable._parent );
+ draggable._refreshOffsets( event );
+ ui.position = draggable._generatePosition( event, true );
+
+ draggable._trigger( "fromSortable", event );
+
+ // Inform draggable that the helper is no longer in a valid drop zone
+ draggable.dropped = false;
+
+ // Need to refreshPositions of all sortables just in case removing
+ // from one sortable changes the location of other sortables (#9675)
+ $.each( draggable.sortables, function() {
+ this.refreshPositions();
+ });
+ }
+ }
+ });
+ }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+ start: function( event, ui, instance ) {
+ var t = $( "body" ),
+ o = instance.options;
+
+ if (t.css("cursor")) {
+ o._cursor = t.css("cursor");
+ }
+ t.css("cursor", o.cursor);
+ },
+ stop: function( event, ui, instance ) {
+ var o = instance.options;
+ if (o._cursor) {
+ $("body").css("cursor", o._cursor);
+ }
+ }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+ start: function( event, ui, instance ) {
+ var t = $( ui.helper ),
+ o = instance.options;
+ if (t.css("opacity")) {
+ o._opacity = t.css("opacity");
+ }
+ t.css("opacity", o.opacity);
+ },
+ stop: function( event, ui, instance ) {
+ var o = instance.options;
+ if (o._opacity) {
+ $(ui.helper).css("opacity", o._opacity);
+ }
+ }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+ start: function( event, ui, i ) {
+ if ( !i.scrollParentNotHidden ) {
+ i.scrollParentNotHidden = i.helper.scrollParent( false );
+ }
+
+ if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
+ i.overflowOffset = i.scrollParentNotHidden.offset();
+ }
+ },
+ drag: function( event, ui, i ) {
+
+ var o = i.options,
+ scrolled = false,
+ scrollParent = i.scrollParentNotHidden[ 0 ],
+ document = i.document[ 0 ];
+
+ if ( scrollParent !== document && scrollParent.tagName !== "HTML" )
{
+ if ( !o.axis || o.axis !== "x" ) {
+ if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
o.scrollSensitivity ) {
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
+ } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
+ }
+ }
+
+ if ( !o.axis || o.axis !== "y" ) {
+ if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
o.scrollSensitivity ) {
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
+ } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
+ }
+ }
+
+ } else {
+
+ if (!o.axis || o.axis !== "x") {
+ if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ } else if ($(window).height() - (event.pageY - $(document).scrollTop()) <
o.scrollSensitivity) {
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+ }
+ }
+
+ if (!o.axis || o.axis !== "y") {
+ if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) <
o.scrollSensitivity) {
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+ }
+ }
+
+ }
+
+ if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(i, event);
+ }
+
+ }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+ start: function( event, ui, i ) {
+
+ var o = i.options;
+
+ i.snapElements = [];
+
+ $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) :
o.snap).each(function() {
+ var $t = $(this),
+ $o = $t.offset();
+ if (this !== i.element[0]) {
+ i.snapElements.push({
+ item: this,
+ width: $t.outerWidth(), height: $t.outerHeight(),
+ top: $o.top, left: $o.left
+ });
+ }
+ });
+
+ },
+ drag: function( event, ui, inst ) {
+
+ var ts, bs, ls, rs, l, r, t, b, i, first,
+ o = inst.options,
+ d = o.snapTolerance,
+ x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+ for (i = inst.snapElements.length - 1; i >= 0; i--){
+
+ l = inst.snapElements[i].left - inst.margins.left;
+ r = l + inst.snapElements[i].width;
+ t = inst.snapElements[i].top - inst.margins.top;
+ b = t + inst.snapElements[i].height;
+
+ if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains(
inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
+ if (inst.snapElements[i].snapping) {
+ (inst.options.snap.release && inst.options.snap.release.call(inst.element,
event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ }
+ inst.snapElements[i].snapping = false;
+ continue;
+ }
+
+ if (o.snapMode !== "inner") {
+ ts = Math.abs(t - y2) <= d;
+ bs = Math.abs(b - y1) <= d;
+ ls = Math.abs(l - x2) <= d;
+ rs = Math.abs(r - x1) <= d;
+ if (ts) {
+ ui.position.top = inst._convertPositionTo("relative", { top: t -
inst.helperProportions.height, left: 0 }).top;
+ }
+ if (bs) {
+ ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0
}).top;
+ }
+ if (ls) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l -
inst.helperProportions.width }).left;
+ }
+ if (rs) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r
}).left;
+ }
+ }
+
+ first = (ts || bs || ls || rs);
+
+ if (o.snapMode !== "outer") {
+ ts = Math.abs(t - y1) <= d;
+ bs = Math.abs(b - y2) <= d;
+ ls = Math.abs(l - x1) <= d;
+ rs = Math.abs(r - x2) <= d;
+ if (ts) {
+ ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0
}).top;
+ }
+ if (bs) {
+ ui.position.top = inst._convertPositionTo("relative", { top: b -
inst.helperProportions.height, left: 0 }).top;
+ }
+ if (ls) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l
}).left;
+ }
+ if (rs) {
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r -
inst.helperProportions.width }).left;
+ }
+ }
+
+ if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event,
$.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ }
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+ }
+
+ }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+ start: function( event, ui, instance ) {
+ var min,
+ o = instance.options,
+ group = $.makeArray($(o.stack)).sort(function(a, b) {
+ return (parseInt($(a).css("zIndex"), 10) || 0) -
(parseInt($(b).css("zIndex"), 10) || 0);
+ });
+
+ if (!group.length) { return; }
+
+ min = parseInt($(group[0]).css("zIndex"), 10) || 0;
+ $(group).each(function(i) {
+ $(this).css("zIndex", min + i);
+ });
+ this.css("zIndex", (min + group.length));
+ }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+ start: function( event, ui, instance ) {
+ var t = $( ui.helper ),
+ o = instance.options;
+
+ if (t.css("zIndex")) {
+ o._zIndex = t.css("zIndex");
+ }
+ t.css("zIndex", o.zIndex);
+ },
+ stop: function( event, ui, instance ) {
+ var o = instance.options;
+
+ if (o._zIndex) {
+ $(ui.helper).css("zIndex", o._zIndex);
+ }
+ }
+});
+
+var draggable = $.ui.draggable;
+
+
+/*!
+ * jQuery UI Resizable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/resizable/
+ */
+
+
+$.widget("ui.resizable", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "resize",
+ options: {
+ alsoResize: false,
+ animate: false,
+ animateDuration: "slow",
+ animateEasing: "swing",
+ aspectRatio: false,
+ autoHide: false,
+ containment: false,
+ ghost: false,
+ grid: false,
+ handles: "e,s,se",
+ helper: false,
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 10,
+ minWidth: 10,
+ // See #7960
+ zIndex: 90,
+
+ // callbacks
+ resize: null,
+ start: null,
+ stop: null
+ },
+
+ _num: function( value ) {
+ return parseInt( value, 10 ) || 0;
+ },
+
+ _isNumber: function( value ) {
+ return !isNaN( parseInt( value, 10 ) );
+ },
+
+ _hasScroll: function( el, a ) {
+
+ if ( $( el ).css( "overflow" ) === "hidden") {
+ return false;
+ }
+
+ var scroll = ( a && a === "left" ) ? "scrollLeft" :
"scrollTop",
+ has = false;
+
+ if ( el[ scroll ] > 0 ) {
+ return true;
+ }
+
+ // TODO: determine which cases actually cause this to happen
+ // if the element doesn't have the scroll set, see if it's possible to
+ // set the scroll
+ el[ scroll ] = 1;
+ has = ( el[ scroll ] > 0 );
+ el[ scroll ] = 0;
+ return has;
+ },
+
+ _create: function() {
+
+ var n, i, handle, axis, hname,
+ that = this,
+ o = this.options;
+ this.element.addClass("ui-resizable");
+
+ $.extend(this, {
+ _aspectRatio: !!(o.aspectRatio),
+ aspectRatio: o.aspectRatio,
+ originalElement: this.element,
+ _proportionallyResizeElements: [],
+ _helper: o.helper || o.ghost || o.animate ? o.helper ||
"ui-resizable-helper" : null
+ });
+
+ // Wrap the element if it cannot hold child nodes
+ if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
+
+ this.element.wrap(
+ $("<div class='ui-wrapper' style='overflow:
hidden;'></div>").css({
+ position: this.element.css("position"),
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight(),
+ top: this.element.css("top"),
+ left: this.element.css("left")
+ })
+ );
+
+ this.element = this.element.parent().data(
+ "ui-resizable", this.element.resizable( "instance" )
+ );
+
+ this.elementIsWrapper = true;
+
+ this.element.css({
+ marginLeft: this.originalElement.css("marginLeft"),
+ marginTop: this.originalElement.css("marginTop"),
+ marginRight: this.originalElement.css("marginRight"),
+ marginBottom: this.originalElement.css("marginBottom")
+ });
+ this.originalElement.css({
+ marginLeft: 0,
+ marginTop: 0,
+ marginRight: 0,
+ marginBottom: 0
+ });
+ // support: Safari
+ // Prevent Safari textarea resize
+ this.originalResizeStyle = this.originalElement.css("resize");
+ this.originalElement.css("resize", "none");
+
+ this._proportionallyResizeElements.push( this.originalElement.css({
+ position: "static",
+ zoom: 1,
+ display: "block"
+ }) );
+
+ // support: IE9
+ // avoid IE jump (hard set the margin)
+ this.originalElement.css({ margin: this.originalElement.css("margin") });
+
+ this._proportionallyResize();
+ }
+
+ this.handles = o.handles ||
+ ( !$(".ui-resizable-handle", this.element).length ?
+ "e,s,se" : {
+ n: ".ui-resizable-n",
+ e: ".ui-resizable-e",
+ s: ".ui-resizable-s",
+ w: ".ui-resizable-w",
+ se: ".ui-resizable-se",
+ sw: ".ui-resizable-sw",
+ ne: ".ui-resizable-ne",
+ nw: ".ui-resizable-nw"
+ } );
+
+ this._handles = $();
+ if ( this.handles.constructor === String ) {
+
+ if ( this.handles === "all") {
+ this.handles = "n,e,s,w,se,sw,ne,nw";
+ }
+
+ n = this.handles.split(",");
+ this.handles = {};
+
+ for (i = 0; i < n.length; i++) {
+
+ handle = $.trim(n[i]);
+ hname = "ui-resizable-" + handle;
+ axis = $("<div class='ui-resizable-handle " + hname +
"'></div>");
+
+ axis.css({ zIndex: o.zIndex });
+
+ // TODO : What's going on here?
+ if ("se" === handle) {
+ axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
+ }
+
+ this.handles[handle] = ".ui-resizable-" + handle;
+ this.element.append(axis);
+ }
+
+ }
+
+ this._renderAxis = function(target) {
+
+ var i, axis, padPos, padWrapper;
+
+ target = target || this.element;
+
+ for (i in this.handles) {
+
+ if (this.handles[i].constructor === String) {
+ this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
+ } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
+ this.handles[ i ] = $( this.handles[ i ] );
+ this._on( this.handles[ i ], { "mousedown": that._mouseDown });
+ }
+
+ if (this.elementIsWrapper &&
this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
+
+ axis = $(this.handles[i], this.element);
+
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+ padPos = [ "padding",
+ /ne|nw|n/.test(i) ? "Top" :
+ /se|sw|s/.test(i) ? "Bottom" :
+ /^e$/.test(i) ? "Right" : "Left" ].join("");
+
+ target.css(padPos, padWrapper);
+
+ this._proportionallyResize();
+ }
+
+ this._handles = this._handles.add( this.handles[ i ] );
+ }
+ };
+
+ // TODO: make renderAxis a prototype function
+ this._renderAxis(this.element);
+
+ this._handles = this._handles.add( this.element.find( ".ui-resizable-handle"
) );
+ this._handles.disableSelection();
+
+ this._handles.mouseover(function() {
+ if (!that.resizing) {
+ if (this.className) {
+ axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+ }
+ that.axis = axis && axis[1] ? axis[1] : "se";
+ }
+ });
+
+ if (o.autoHide) {
+ this._handles.hide();
+ $(this.element)
+ .addClass("ui-resizable-autohide")
+ .mouseenter(function() {
+ if (o.disabled) {
+ return;
+ }
+ $(this).removeClass("ui-resizable-autohide");
+ that._handles.show();
+ })
+ .mouseleave(function() {
+ if (o.disabled) {
+ return;
+ }
+ if (!that.resizing) {
+ $(this).addClass("ui-resizable-autohide");
+ that._handles.hide();
+ }
+ });
+ }
+
+ this._mouseInit();
+ },
+
+ _destroy: function() {
+
+ this._mouseDestroy();
+
+ var wrapper,
+ _destroy = function(exp) {
+ $(exp)
+ .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+ .removeData("resizable")
+ .removeData("ui-resizable")
+ .unbind(".resizable")
+ .find(".ui-resizable-handle")
+ .remove();
+ };
+
+ // TODO: Unwrap at same DOM position
+ if (this.elementIsWrapper) {
+ _destroy(this.element);
+ wrapper = this.element;
+ this.originalElement.css({
+ position: wrapper.css("position"),
+ width: wrapper.outerWidth(),
+ height: wrapper.outerHeight(),
+ top: wrapper.css("top"),
+ left: wrapper.css("left")
+ }).insertAfter( wrapper );
+ wrapper.remove();
+ }
+
+ this.originalElement.css("resize", this.originalResizeStyle);
+ _destroy(this.originalElement);
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+ var i, handle,
+ capture = false;
+
+ for (i in this.handles) {
+ handle = $(this.handles[i])[0];
+ if (handle === event.target || $.contains(handle, event.target)) {
+ capture = true;
+ }
+ }
+
+ return !this.options.disabled && capture;
+ },
+
+ _mouseStart: function(event) {
+
+ var curleft, curtop, cursor,
+ o = this.options,
+ el = this.element;
+
+ this.resizing = true;
+
+ this._renderProxy();
+
+ curleft = this._num(this.helper.css("left"));
+ curtop = this._num(this.helper.css("top"));
+
+ if (o.containment) {
+ curleft += $(o.containment).scrollLeft() || 0;
+ curtop += $(o.containment).scrollTop() || 0;
+ }
+
+ this.offset = this.helper.offset();
+ this.position = { left: curleft, top: curtop };
+
+ this.size = this._helper ? {
+ width: this.helper.width(),
+ height: this.helper.height()
+ } : {
+ width: el.width(),
+ height: el.height()
+ };
+
+ this.originalSize = this._helper ? {
+ width: el.outerWidth(),
+ height: el.outerHeight()
+ } : {
+ width: el.width(),
+ height: el.height()
+ };
+
+ this.sizeDiff = {
+ width: el.outerWidth() - el.width(),
+ height: el.outerHeight() - el.height()
+ };
+
+ this.originalPosition = { left: curleft, top: curtop };
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+ this.aspectRatio = (typeof o.aspectRatio === "number") ?
+ o.aspectRatio :
+ ((this.originalSize.width / this.originalSize.height) || 1);
+
+ cursor = $(".ui-resizable-" + this.axis).css("cursor");
+ $("body").css("cursor", cursor === "auto" ? this.axis +
"-resize" : cursor);
+
+ el.addClass("ui-resizable-resizing");
+ this._propagate("start", event);
+ return true;
+ },
+
+ _mouseDrag: function(event) {
+
+ var data, props,
+ smp = this.originalMousePosition,
+ a = this.axis,
+ dx = (event.pageX - smp.left) || 0,
+ dy = (event.pageY - smp.top) || 0,
+ trigger = this._change[a];
+
+ this._updatePrevProperties();
+
+ if (!trigger) {
+ return false;
+ }
+
+ data = trigger.apply(this, [ event, dx, dy ]);
+
+ this._updateVirtualBoundaries(event.shiftKey);
+ if (this._aspectRatio || event.shiftKey) {
+ data = this._updateRatio(data, event);
+ }
+
+ data = this._respectSize(data, event);
+
+ this._updateCache(data);
+
+ this._propagate("resize", event);
+
+ props = this._applyChanges();
+
+ if ( !this._helper && this._proportionallyResizeElements.length ) {
+ this._proportionallyResize();
+ }
+
+ if ( !$.isEmptyObject( props ) ) {
+ this._updatePrevProperties();
+ this._trigger( "resize", event, this.ui() );
+ this._applyChanges();
+ }
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ this.resizing = false;
+ var pr, ista, soffseth, soffsetw, s, left, top,
+ o = this.options, that = this;
+
+ if (this._helper) {
+
+ pr = this._proportionallyResizeElements;
+ ista = pr.length && (/textarea/i).test(pr[0].nodeName);
+ soffseth = ista && this._hasScroll(pr[0], "left") ? 0 :
that.sizeDiff.height;
+ soffsetw = ista ? 0 : that.sizeDiff.width;
+
+ s = {
+ width: (that.helper.width() - soffsetw),
+ height: (that.helper.height() - soffseth)
+ };
+ left = (parseInt(that.element.css("left"), 10) +
+ (that.position.left - that.originalPosition.left)) || null;
+ top = (parseInt(that.element.css("top"), 10) +
+ (that.position.top - that.originalPosition.top)) || null;
+
+ if (!o.animate) {
+ this.element.css($.extend(s, { top: top, left: left }));
+ }
+
+ that.helper.height(that.size.height);
+ that.helper.width(that.size.width);
+
+ if (this._helper && !o.animate) {
+ this._proportionallyResize();
+ }
+ }
+
+ $("body").css("cursor", "auto");
+
+ this.element.removeClass("ui-resizable-resizing");
+
+ this._propagate("stop", event);
+
+ if (this._helper) {
+ this.helper.remove();
+ }
+
+ return false;
+
+ },
+
+ _updatePrevProperties: function() {
+ this.prevPosition = {
+ top: this.position.top,
+ left: this.position.left
+ };
+ this.prevSize = {
+ width: this.size.width,
+ height: this.size.height
+ };
+ },
+
+ _applyChanges: function() {
+ var props = {};
+
+ if ( this.position.top !== this.prevPosition.top ) {
+ props.top = this.position.top + "px";
+ }
+ if ( this.position.left !== this.prevPosition.left ) {
+ props.left = this.position.left + "px";
+ }
+ if ( this.size.width !== this.prevSize.width ) {
+ props.width = this.size.width + "px";
+ }
+ if ( this.size.height !== this.prevSize.height ) {
+ props.height = this.size.height + "px";
+ }
+
+ this.helper.css( props );
+
+ return props;
+ },
+
+ _updateVirtualBoundaries: function(forceAspectRatio) {
+ var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
+ o = this.options;
+
+ b = {
+ minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
+ maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+ minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
+ maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
+ };
+
+ if (this._aspectRatio || forceAspectRatio) {
+ pMinWidth = b.minHeight * this.aspectRatio;
+ pMinHeight = b.minWidth / this.aspectRatio;
+ pMaxWidth = b.maxHeight * this.aspectRatio;
+ pMaxHeight = b.maxWidth / this.aspectRatio;
+
+ if (pMinWidth > b.minWidth) {
+ b.minWidth = pMinWidth;
+ }
+ if (pMinHeight > b.minHeight) {
+ b.minHeight = pMinHeight;
+ }
+ if (pMaxWidth < b.maxWidth) {
+ b.maxWidth = pMaxWidth;
+ }
+ if (pMaxHeight < b.maxHeight) {
+ b.maxHeight = pMaxHeight;
+ }
+ }
+ this._vBoundaries = b;
+ },
+
+ _updateCache: function(data) {
+ this.offset = this.helper.offset();
+ if (this._isNumber(data.left)) {
+ this.position.left = data.left;
+ }
+ if (this._isNumber(data.top)) {
+ this.position.top = data.top;
+ }
+ if (this._isNumber(data.height)) {
+ this.size.height = data.height;
+ }
+ if (this._isNumber(data.width)) {
+ this.size.width = data.width;
+ }
+ },
+
+ _updateRatio: function( data ) {
+
+ var cpos = this.position,
+ csize = this.size,
+ a = this.axis;
+
+ if (this._isNumber(data.height)) {
+ data.width = (data.height * this.aspectRatio);
+ } else if (this._isNumber(data.width)) {
+ data.height = (data.width / this.aspectRatio);
+ }
+
+ if (a === "sw") {
+ data.left = cpos.left + (csize.width - data.width);
+ data.top = null;
+ }
+ if (a === "nw") {
+ data.top = cpos.top + (csize.height - data.height);
+ data.left = cpos.left + (csize.width - data.width);
+ }
+
+ return data;
+ },
+
+ _respectSize: function( data ) {
+
+ var o = this._vBoundaries,
+ a = this.axis,
+ ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth <
data.width),
+ ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight
< data.height),
+ isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth >
data.width),
+ isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight
> data.height),
+ dw = this.originalPosition.left + this.originalSize.width,
+ dh = this.position.top + this.size.height,
+ cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+ if (isminw) {
+ data.width = o.minWidth;
+ }
+ if (isminh) {
+ data.height = o.minHeight;
+ }
+ if (ismaxw) {
+ data.width = o.maxWidth;
+ }
+ if (ismaxh) {
+ data.height = o.maxHeight;
+ }
+
+ if (isminw && cw) {
+ data.left = dw - o.minWidth;
+ }
+ if (ismaxw && cw) {
+ data.left = dw - o.maxWidth;
+ }
+ if (isminh && ch) {
+ data.top = dh - o.minHeight;
+ }
+ if (ismaxh && ch) {
+ data.top = dh - o.maxHeight;
+ }
+
+ // Fixing jump error on top/left - bug #2330
+ if (!data.width && !data.height && !data.left && data.top) {
+ data.top = null;
+ } else if (!data.width && !data.height && !data.top &&
data.left) {
+ data.left = null;
+ }
+
+ return data;
+ },
+
+ _getPaddingPlusBorderDimensions: function( element ) {
+ var i = 0,
+ widths = [],
+ borders = [
+ element.css( "borderTopWidth" ),
+ element.css( "borderRightWidth" ),
+ element.css( "borderBottomWidth" ),
+ element.css( "borderLeftWidth" )
+ ],
+ paddings = [
+ element.css( "paddingTop" ),
+ element.css( "paddingRight" ),
+ element.css( "paddingBottom" ),
+ element.css( "paddingLeft" )
+ ];
+
+ for ( ; i < 4; i++ ) {
+ widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
+ widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
+ }
+
+ return {
+ height: widths[ 0 ] + widths[ 2 ],
+ width: widths[ 1 ] + widths[ 3 ]
+ };
+ },
+
+ _proportionallyResize: function() {
+
+ if (!this._proportionallyResizeElements.length) {
+ return;
+ }
+
+ var prel,
+ i = 0,
+ element = this.helper || this.element;
+
+ for ( ; i < this._proportionallyResizeElements.length; i++) {
+
+ prel = this._proportionallyResizeElements[i];
+
+ // TODO: Seems like a bug to cache this.outerDimensions
+ // considering that we are in a loop.
+ if (!this.outerDimensions) {
+ this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
+ }
+
+ prel.css({
+ height: (element.height() - this.outerDimensions.height) || 0,
+ width: (element.width() - this.outerDimensions.width) || 0
+ });
+
+ }
+
+ },
+
+ _renderProxy: function() {
+
+ var el = this.element, o = this.options;
+ this.elementOffset = el.offset();
+
+ if (this._helper) {
+
+ this.helper = this.helper || $("<div
style='overflow:hidden;'></div>");
+
+ this.helper.addClass(this._helper).css({
+ width: this.element.outerWidth() - 1,
+ height: this.element.outerHeight() - 1,
+ position: "absolute",
+ left: this.elementOffset.left + "px",
+ top: this.elementOffset.top + "px",
+ zIndex: ++o.zIndex //TODO: Don't modify option
+ });
+
+ this.helper
+ .appendTo("body")
+ .disableSelection();
+
+ } else {
+ this.helper = this.element;
+ }
+
+ },
+
+ _change: {
+ e: function(event, dx) {
+ return { width: this.originalSize.width + dx };
+ },
+ w: function(event, dx) {
+ var cs = this.originalSize, sp = this.originalPosition;
+ return { left: sp.left + dx, width: cs.width - dx };
+ },
+ n: function(event, dx, dy) {
+ var cs = this.originalSize, sp = this.originalPosition;
+ return { top: sp.top + dy, height: cs.height - dy };
+ },
+ s: function(event, dx, dy) {
+ return { height: this.originalSize.height + dy };
+ },
+ se: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments),
+ this._change.e.apply(this, [ event, dx, dy ]));
+ },
+ sw: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments),
+ this._change.w.apply(this, [ event, dx, dy ]));
+ },
+ ne: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments),
+ this._change.e.apply(this, [ event, dx, dy ]));
+ },
+ nw: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments),
+ this._change.w.apply(this, [ event, dx, dy ]));
+ }
+ },
+
+ _propagate: function(n, event) {
+ $.ui.plugin.call(this, n, [ event, this.ui() ]);
+ (n !== "resize" && this._trigger(n, event, this.ui()));
+ },
+
+ plugins: {},
+
+ ui: function() {
+ return {
+ originalElement: this.originalElement,
+ element: this.element,
+ helper: this.helper,
+ position: this.position,
+ size: this.size,
+ originalSize: this.originalSize,
+ originalPosition: this.originalPosition
+ };
+ }
+
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "animate", {
+
+ stop: function( event ) {
+ var that = $(this).resizable( "instance" ),
+ o = that.options,
+ pr = that._proportionallyResizeElements,
+ ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && that._hasScroll(pr[0], "left") ? 0 :
that.sizeDiff.height,
+ soffsetw = ista ? 0 : that.sizeDiff.width,
+ style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth)
},
+ left = (parseInt(that.element.css("left"), 10) +
+ (that.position.left - that.originalPosition.left)) || null,
+ top = (parseInt(that.element.css("top"), 10) +
+ (that.position.top - that.originalPosition.top)) || null;
+
+ that.element.animate(
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
+ duration: o.animateDuration,
+ easing: o.animateEasing,
+ step: function() {
+
+ var data = {
+ width: parseInt(that.element.css("width"), 10),
+ height: parseInt(that.element.css("height"), 10),
+ top: parseInt(that.element.css("top"), 10),
+ left: parseInt(that.element.css("left"), 10)
+ };
+
+ if (pr && pr.length) {
+ $(pr[0]).css({ width: data.width, height: data.height });
+ }
+
+ // propagating resize, and updating values for each animation step
+ that._updateCache(data);
+ that._propagate("resize", event);
+
+ }
+ }
+ );
+ }
+
+});
+
+$.ui.plugin.add( "resizable", "containment", {
+
+ start: function() {
+ var element, p, co, ch, cw, width, height,
+ that = $( this ).resizable( "instance" ),
+ o = that.options,
+ el = that.element,
+ oc = o.containment,
+ ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0
) : oc;
+
+ if ( !ce ) {
+ return;
+ }
+
+ that.containerElement = $( ce );
+
+ if ( /document/.test( oc ) || oc === document ) {
+ that.containerOffset = {
+ left: 0,
+ top: 0
+ };
+ that.containerPosition = {
+ left: 0,
+ top: 0
+ };
+
+ that.parentData = {
+ element: $( document ),
+ left: 0,
+ top: 0,
+ width: $( document ).width(),
+ height: $( document ).height() || document.body.parentNode.scrollHeight
+ };
+ } else {
+ element = $( ce );
+ p = [];
+ $([ "Top", "Right", "Left", "Bottom"
]).each(function( i, name ) {
+ p[ i ] = that._num( element.css( "padding" + name ) );
+ });
+
+ that.containerOffset = element.offset();
+ that.containerPosition = element.position();
+ that.containerSize = {
+ height: ( element.innerHeight() - p[ 3 ] ),
+ width: ( element.innerWidth() - p[ 1 ] )
+ };
+
+ co = that.containerOffset;
+ ch = that.containerSize.height;
+ cw = that.containerSize.width;
+ width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
+ height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
+
+ that.parentData = {
+ element: ce,
+ left: co.left,
+ top: co.top,
+ width: width,
+ height: height
+ };
+ }
+ },
+
+ resize: function( event ) {
+ var woset, hoset, isParent, isOffsetRelative,
+ that = $( this ).resizable( "instance" ),
+ o = that.options,
+ co = that.containerOffset,
+ cp = that.position,
+ pRatio = that._aspectRatio || event.shiftKey,
+ cop = {
+ top: 0,
+ left: 0
+ },
+ ce = that.containerElement,
+ continueResize = true;
+
+ if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" )
) ) {
+ cop = co;
+ }
+
+ if ( cp.left < ( that._helper ? co.left : 0 ) ) {
+ that.size.width = that.size.width +
+ ( that._helper ?
+ ( that.position.left - co.left ) :
+ ( that.position.left - cop.left ) );
+
+ if ( pRatio ) {
+ that.size.height = that.size.width / that.aspectRatio;
+ continueResize = false;
+ }
+ that.position.left = o.helper ? co.left : 0;
+ }
+
+ if ( cp.top < ( that._helper ? co.top : 0 ) ) {
+ that.size.height = that.size.height +
+ ( that._helper ?
+ ( that.position.top - co.top ) :
+ that.position.top );
+
+ if ( pRatio ) {
+ that.size.width = that.size.height * that.aspectRatio;
+ continueResize = false;
+ }
+ that.position.top = that._helper ? co.top : 0;
+ }
+
+ isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
+ isOffsetRelative = /relative|absolute/.test( that.containerElement.css(
"position" ) );
+
+ if ( isParent && isOffsetRelative ) {
+ that.offset.left = that.parentData.left + that.position.left;
+ that.offset.top = that.parentData.top + that.position.top;
+ } else {
+ that.offset.left = that.element.offset().left;
+ that.offset.top = that.element.offset().top;
+ }
+
+ woset = Math.abs( that.sizeDiff.width +
+ (that._helper ?
+ that.offset.left - cop.left :
+ (that.offset.left - co.left)) );
+
+ hoset = Math.abs( that.sizeDiff.height +
+ (that._helper ?
+ that.offset.top - cop.top :
+ (that.offset.top - co.top)) );
+
+ if ( woset + that.size.width >= that.parentData.width ) {
+ that.size.width = that.parentData.width - woset;
+ if ( pRatio ) {
+ that.size.height = that.size.width / that.aspectRatio;
+ continueResize = false;
+ }
+ }
+
+ if ( hoset + that.size.height >= that.parentData.height ) {
+ that.size.height = that.parentData.height - hoset;
+ if ( pRatio ) {
+ that.size.width = that.size.height * that.aspectRatio;
+ continueResize = false;
+ }
+ }
+
+ if ( !continueResize ) {
+ that.position.left = that.prevPosition.left;
+ that.position.top = that.prevPosition.top;
+ that.size.width = that.prevSize.width;
+ that.size.height = that.prevSize.height;
+ }
+ },
+
+ stop: function() {
+ var that = $( this ).resizable( "instance" ),
+ o = that.options,
+ co = that.containerOffset,
+ cop = that.containerPosition,
+ ce = that.containerElement,
+ helper = $( that.helper ),
+ ho = helper.offset(),
+ w = helper.outerWidth() - that.sizeDiff.width,
+ h = helper.outerHeight() - that.sizeDiff.height;
+
+ if ( that._helper && !o.animate && ( /relative/ ).test( ce.css(
"position" ) ) ) {
+ $( this ).css({
+ left: ho.left - cop.left - co.left,
+ width: w,
+ height: h
+ });
+ }
+
+ if ( that._helper && !o.animate && ( /static/ ).test( ce.css(
"position" ) ) ) {
+ $( this ).css({
+ left: ho.left - cop.left - co.left,
+ width: w,
+ height: h
+ });
+ }
+ }
+});
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+ start: function() {
+ var that = $(this).resizable( "instance" ),
+ o = that.options;
+
+ $(o.alsoResize).each(function() {
+ var el = $(this);
+ el.data("ui-resizable-alsoresize", {
+ width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+ left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"),
10)
+ });
+ });
+ },
+
+ resize: function(event, ui) {
+ var that = $(this).resizable( "instance" ),
+ o = that.options,
+ os = that.originalSize,
+ op = that.originalPosition,
+ delta = {
+ height: (that.size.height - os.height) || 0,
+ width: (that.size.width - os.width) || 0,
+ top: (that.position.top - op.top) || 0,
+ left: (that.position.left - op.left) || 0
+ };
+
+ $(o.alsoResize).each(function() {
+ var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style =
{},
+ css = el.parents(ui.originalElement[0]).length ?
+ [ "width", "height" ] :
+ [ "width", "height", "top", "left" ];
+
+ $.each(css, function(i, prop) {
+ var sum = (start[prop] || 0) + (delta[prop] || 0);
+ if (sum && sum >= 0) {
+ style[prop] = sum || null;
+ }
+ });
+
+ el.css(style);
+ });
+ },
+
+ stop: function() {
+ $(this).removeData("resizable-alsoresize");
+ }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+ start: function() {
+
+ var that = $(this).resizable( "instance" ), o = that.options, cs =
that.size;
+
+ that.ghost = that.originalElement.clone();
+ that.ghost
+ .css({
+ opacity: 0.25,
+ display: "block",
+ position: "relative",
+ height: cs.height,
+ width: cs.width,
+ margin: 0,
+ left: 0,
+ top: 0
+ })
+ .addClass("ui-resizable-ghost")
+ .addClass(typeof o.ghost === "string" ? o.ghost : "");
+
+ that.ghost.appendTo(that.helper);
+
+ },
+
+ resize: function() {
+ var that = $(this).resizable( "instance" );
+ if (that.ghost) {
+ that.ghost.css({
+ position: "relative",
+ height: that.size.height,
+ width: that.size.width
+ });
+ }
+ },
+
+ stop: function() {
+ var that = $(this).resizable( "instance" );
+ if (that.ghost && that.helper) {
+ that.helper.get(0).removeChild(that.ghost.get(0));
+ }
+ }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+ resize: function() {
+ var outerDimensions,
+ that = $(this).resizable( "instance" ),
+ o = that.options,
+ cs = that.size,
+ os = that.originalSize,
+ op = that.originalPosition,
+ a = that.axis,
+ grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
+ gridX = (grid[0] || 1),
+ gridY = (grid[1] || 1),
+ ox = Math.round((cs.width - os.width) / gridX) * gridX,
+ oy = Math.round((cs.height - os.height) / gridY) * gridY,
+ newWidth = os.width + ox,
+ newHeight = os.height + oy,
+ isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
+ isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
+ isMinWidth = o.minWidth && (o.minWidth > newWidth),
+ isMinHeight = o.minHeight && (o.minHeight > newHeight);
+
+ o.grid = grid;
+
+ if (isMinWidth) {
+ newWidth += gridX;
+ }
+ if (isMinHeight) {
+ newHeight += gridY;
+ }
+ if (isMaxWidth) {
+ newWidth -= gridX;
+ }
+ if (isMaxHeight) {
+ newHeight -= gridY;
+ }
+
+ if (/^(se|s|e)$/.test(a)) {
+ that.size.width = newWidth;
+ that.size.height = newHeight;
+ } else if (/^(ne)$/.test(a)) {
+ that.size.width = newWidth;
+ that.size.height = newHeight;
+ that.position.top = op.top - oy;
+ } else if (/^(sw)$/.test(a)) {
+ that.size.width = newWidth;
+ that.size.height = newHeight;
+ that.position.left = op.left - ox;
+ } else {
+ if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
+ outerDimensions = that._getPaddingPlusBorderDimensions( this );
+ }
+
+ if ( newHeight - gridY > 0 ) {
+ that.size.height = newHeight;
+ that.position.top = op.top - oy;
+ } else {
+ newHeight = gridY - outerDimensions.height;
+ that.size.height = newHeight;
+ that.position.top = op.top + os.height - newHeight;
+ }
+ if ( newWidth - gridX > 0 ) {
+ that.size.width = newWidth;
+ that.position.left = op.left - ox;
+ } else {
+ newWidth = gridX - outerDimensions.width;
+ that.size.width = newWidth;
+ that.position.left = op.left + os.width - newWidth;
+ }
+ }
+ }
+
+});
+
+var resizable = $.ui.resizable;
+
+
+/*!
+ * jQuery UI Dialog 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/dialog/
+ */
+
+
+var dialog = $.widget( "ui.dialog", {
+ version: "1.11.4",
+ options: {
+ appendTo: "body",
+ autoOpen: true,
+ buttons: [],
+ closeOnEscape: true,
+ closeText: "Close",
+ dialogClass: "",
+ draggable: true,
+ hide: null,
+ height: "auto",
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 150,
+ minWidth: 150,
+ modal: false,
+ position: {
+ my: "center",
+ at: "center",
+ of: window,
+ collision: "fit",
+ // Ensure the titlebar is always visible
+ using: function( pos ) {
+ var topOffset = $( this ).css( pos ).offset().top;
+ if ( topOffset < 0 ) {
+ $( this ).css( "top", pos.top - topOffset );
+ }
+ }
+ },
+ resizable: true,
+ show: null,
+ title: null,
+ width: 300,
+
+ // callbacks
+ beforeClose: null,
+ close: null,
+ drag: null,
+ dragStart: null,
+ dragStop: null,
+ focus: null,
+ open: null,
+ resize: null,
+ resizeStart: null,
+ resizeStop: null
+ },
+
+ sizeRelatedOptions: {
+ buttons: true,
+ height: true,
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true,
+ width: true
+ },
+
+ resizableRelatedOptions: {
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true
+ },
+
+ _create: function() {
+ this.originalCss = {
+ display: this.element[ 0 ].style.display,
+ width: this.element[ 0 ].style.width,
+ minHeight: this.element[ 0 ].style.minHeight,
+ maxHeight: this.element[ 0 ].style.maxHeight,
+ height: this.element[ 0 ].style.height
+ };
+ this.originalPosition = {
+ parent: this.element.parent(),
+ index: this.element.parent().children().index( this.element )
+ };
+ this.originalTitle = this.element.attr( "title" );
+ this.options.title = this.options.title || this.originalTitle;
+
+ this._createWrapper();
+
+ this.element
+ .show()
+ .removeAttr( "title" )
+ .addClass( "ui-dialog-content ui-widget-content" )
+ .appendTo( this.uiDialog );
+
+ this._createTitlebar();
+ this._createButtonPane();
+
+ if ( this.options.draggable && $.fn.draggable ) {
+ this._makeDraggable();
+ }
+ if ( this.options.resizable && $.fn.resizable ) {
+ this._makeResizable();
+ }
+
+ this._isOpen = false;
+
+ this._trackFocus();
+ },
+
+ _init: function() {
+ if ( this.options.autoOpen ) {
+ this.open();
+ }
+ },
+
+ _appendTo: function() {
+ var element = this.options.appendTo;
+ if ( element && (element.jquery || element.nodeType) ) {
+ return $( element );
+ }
+ return this.document.find( element || "body" ).eq( 0 );
+ },
+
+ _destroy: function() {
+ var next,
+ originalPosition = this.originalPosition;
+
+ this._untrackInstance();
+ this._destroyOverlay();
+
+ this.element
+ .removeUniqueId()
+ .removeClass( "ui-dialog-content ui-widget-content" )
+ .css( this.originalCss )
+ // Without detaching first, the following becomes really slow
+ .detach();
+
+ this.uiDialog.stop( true, true ).remove();
+
+ if ( this.originalTitle ) {
+ this.element.attr( "title", this.originalTitle );
+ }
+
+ next = originalPosition.parent.children().eq( originalPosition.index );
+ // Don't try to place the dialog next to itself (#8613)
+ if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
+ next.before( this.element );
+ } else {
+ originalPosition.parent.append( this.element );
+ }
+ },
+
+ widget: function() {
+ return this.uiDialog;
+ },
+
+ disable: $.noop,
+ enable: $.noop,
+
+ close: function( event ) {
+ var activeElement,
+ that = this;
+
+ if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
+ return;
+ }
+
+ this._isOpen = false;
+ this._focusedElement = null;
+ this._destroyOverlay();
+ this._untrackInstance();
+
+ if ( !this.opener.filter( ":focusable" ).focus().length ) {
+
+ // support: IE9
+ // IE9 throws an "Unspecified error" accessing document.activeElement from
an <iframe>
+ try {
+ activeElement = this.document[ 0 ].activeElement;
+
+ // Support: IE9, IE10
+ // If the <body> is blurred, IE will switch windows, see #4520
+ if ( activeElement && activeElement.nodeName.toLowerCase() !==
"body" ) {
+
+ // Hiding a focused element doesn't trigger blur in WebKit
+ // so in case we have nothing to focus on, explicitly blur the active element
+ //
https://bugs.webkit.org/show_bug.cgi?id=47182
+ $( activeElement ).blur();
+ }
+ } catch ( error ) {}
+ }
+
+ this._hide( this.uiDialog, this.options.hide, function() {
+ that._trigger( "close", event );
+ });
+ },
+
+ isOpen: function() {
+ return this._isOpen;
+ },
+
+ moveToTop: function() {
+ this._moveToTop();
+ },
+
+ _moveToTop: function( event, silent ) {
+ var moved = false,
+ zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
+ return +$( this ).css( "z-index" );
+ }).get(),
+ zIndexMax = Math.max.apply( null, zIndices );
+
+ if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
+ this.uiDialog.css( "z-index", zIndexMax + 1 );
+ moved = true;
+ }
+
+ if ( moved && !silent ) {
+ this._trigger( "focus", event );
+ }
+ return moved;
+ },
+
+ open: function() {
+ var that = this;
+ if ( this._isOpen ) {
+ if ( this._moveToTop() ) {
+ this._focusTabbable();
+ }
+ return;
+ }
+
+ this._isOpen = true;
+ this.opener = $( this.document[ 0 ].activeElement );
+
+ this._size();
+ this._position();
+ this._createOverlay();
+ this._moveToTop( null, true );
+
+ // Ensure the overlay is moved to the top with the dialog, but only when
+ // opening. The overlay shouldn't move after the dialog is open so that
+ // modeless dialogs opened after the modal dialog stack properly.
+ if ( this.overlay ) {
+ this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1
);
+ }
+
+ this._show( this.uiDialog, this.options.show, function() {
+ that._focusTabbable();
+ that._trigger( "focus" );
+ });
+
+ // Track the dialog immediately upon openening in case a focus event
+ // somehow occurs outside of the dialog before an element inside the
+ // dialog is focused (#10152)
+ this._makeFocusTarget();
+
+ this._trigger( "open" );
+ },
+
+ _focusTabbable: function() {
+ // Set focus to the first match:
+ // 1. An element that was focused previously
+ // 2. First element inside the dialog matching [autofocus]
+ // 3. Tabbable element inside the content element
+ // 4. Tabbable element inside the buttonpane
+ // 5. The close button
+ // 6. The dialog itself
+ var hasFocus = this._focusedElement;
+ if ( !hasFocus ) {
+ hasFocus = this.element.find( "[autofocus]" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.element.find( ":tabbable" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
+ }
+ if ( !hasFocus.length ) {
+ hasFocus = this.uiDialog;
+ }
+ hasFocus.eq( 0 ).focus();
+ },
+
+ _keepFocus: function( event ) {
+ function checkFocus() {
+ var activeElement = this.document[0].activeElement,
+ isActive = this.uiDialog[0] === activeElement ||
+ $.contains( this.uiDialog[0], activeElement );
+ if ( !isActive ) {
+ this._focusTabbable();
+ }
+ }
+ event.preventDefault();
+ checkFocus.call( this );
+ // support: IE
+ // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
+ // so we check again later
+ this._delay( checkFocus );
+ },
+
+ _createWrapper: function() {
+ this.uiDialog = $("<div>")
+ .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "
+
+ this.options.dialogClass )
+ .hide()
+ .attr({
+ // Setting tabIndex makes the div focusable
+ tabIndex: -1,
+ role: "dialog"
+ })
+ .appendTo( this._appendTo() );
+
+ this._on( this.uiDialog, {
+ keydown: function( event ) {
+ if ( this.options.closeOnEscape && !event.isDefaultPrevented() &&
event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE ) {
+ event.preventDefault();
+ this.close( event );
+ return;
+ }
+
+ // prevent tabbing out of dialogs
+ if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
+ return;
+ }
+ var tabbables = this.uiDialog.find( ":tabbable" ),
+ first = tabbables.filter( ":first" ),
+ last = tabbables.filter( ":last" );
+
+ if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) &&
!event.shiftKey ) {
+ this._delay(function() {
+ first.focus();
+ });
+ event.preventDefault();
+ } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] )
&& event.shiftKey ) {
+ this._delay(function() {
+ last.focus();
+ });
+ event.preventDefault();
+ }
+ },
+ mousedown: function( event ) {
+ if ( this._moveToTop( event ) ) {
+ this._focusTabbable();
+ }
+ }
+ });
+
+ // We assume that any existing aria-describedby attribute means
+ // that the dialog content is marked up properly
+ // otherwise we brute force the content as the description
+ if ( !this.element.find( "[aria-describedby]" ).length ) {
+ this.uiDialog.attr({
+ "aria-describedby": this.element.uniqueId().attr( "id" )
+ });
+ }
+ },
+
+ _createTitlebar: function() {
+ var uiDialogTitle;
+
+ this.uiDialogTitlebar = $( "<div>" )
+ .addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all
ui-helper-clearfix" )
+ .prependTo( this.uiDialog );
+ this._on( this.uiDialogTitlebar, {
+ mousedown: function( event ) {
+ // Don't prevent click on close button (#8838)
+ // Focusing a dialog that is partially scrolled out of view
+ // causes the browser to scroll it into view, preventing the click event
+ if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
+ // Dialog isn't getting focus when dragging (#8063)
+ this.uiDialog.focus();
+ }
+ }
+ });
+
+ // support: IE
+ // Use type="button" to prevent enter keypresses in textboxes from closing
the
+ // dialog in IE (#9312)
+ this.uiDialogTitlebarClose = $( "<button
type='button'></button>" )
+ .button({
+ label: this.options.closeText,
+ icons: {
+ primary: "ui-icon-closethick"
+ },
+ text: false
+ })
+ .addClass( "ui-dialog-titlebar-close" )
+ .appendTo( this.uiDialogTitlebar );
+ this._on( this.uiDialogTitlebarClose, {
+ click: function( event ) {
+ event.preventDefault();
+ this.close( event );
+ }
+ });
+
+ uiDialogTitle = $( "<span>" )
+ .uniqueId()
+ .addClass( "ui-dialog-title" )
+ .prependTo( this.uiDialogTitlebar );
+ this._title( uiDialogTitle );
+
+ this.uiDialog.attr({
+ "aria-labelledby": uiDialogTitle.attr( "id" )
+ });
+ },
+
+ _title: function( title ) {
+ if ( !this.options.title ) {
+ title.html( " " );
+ }
+ title.text( this.options.title );
+ },
+
+ _createButtonPane: function() {
+ this.uiDialogButtonPane = $( "<div>" )
+ .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
+
+ this.uiButtonSet = $( "<div>" )
+ .addClass( "ui-dialog-buttonset" )
+ .appendTo( this.uiDialogButtonPane );
+
+ this._createButtons();
+ },
+
+ _createButtons: function() {
+ var that = this,
+ buttons = this.options.buttons;
+
+ // if we already have a button pane, remove it
+ this.uiDialogButtonPane.remove();
+ this.uiButtonSet.empty();
+
+ if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) )
{
+ this.uiDialog.removeClass( "ui-dialog-buttons" );
+ return;
+ }
+
+ $.each( buttons, function( name, props ) {
+ var click, buttonOptions;
+ props = $.isFunction( props ) ?
+ { click: props, text: name } :
+ props;
+ // Default to a non-submitting button
+ props = $.extend( { type: "button" }, props );
+ // Change the context for the click callback to be the main element
+ click = props.click;
+ props.click = function() {
+ click.apply( that.element[ 0 ], arguments );
+ };
+ buttonOptions = {
+ icons: props.icons,
+ text: props.showText
+ };
+ delete props.icons;
+ delete props.showText;
+ $( "<button></button>", props )
+ .button( buttonOptions )
+ .appendTo( that.uiButtonSet );
+ });
+ this.uiDialog.addClass( "ui-dialog-buttons" );
+ this.uiDialogButtonPane.appendTo( this.uiDialog );
+ },
+
+ _makeDraggable: function() {
+ var that = this,
+ options = this.options;
+
+ function filteredUi( ui ) {
+ return {
+ position: ui.position,
+ offset: ui.offset
+ };
+ }
+
+ this.uiDialog.draggable({
+ cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
+ handle: ".ui-dialog-titlebar",
+ containment: "document",
+ start: function( event, ui ) {
+ $( this ).addClass( "ui-dialog-dragging" );
+ that._blockFrames();
+ that._trigger( "dragStart", event, filteredUi( ui ) );
+ },
+ drag: function( event, ui ) {
+ that._trigger( "drag", event, filteredUi( ui ) );
+ },
+ stop: function( event, ui ) {
+ var left = ui.offset.left - that.document.scrollLeft(),
+ top = ui.offset.top - that.document.scrollTop();
+
+ options.position = {
+ my: "left top",
+ at: "left" + (left >= 0 ? "+" : "") + left + "
" +
+ "top" + (top >= 0 ? "+" : "") + top,
+ of: that.window
+ };
+ $( this ).removeClass( "ui-dialog-dragging" );
+ that._unblockFrames();
+ that._trigger( "dragStop", event, filteredUi( ui ) );
+ }
+ });
+ },
+
+ _makeResizable: function() {
+ var that = this,
+ options = this.options,
+ handles = options.resizable,
+ // .ui-resizable has position: relative defined in the stylesheet
+ // but dialogs have to use absolute or fixed positioning
+ position = this.uiDialog.css("position"),
+ resizeHandles = typeof handles === "string" ?
+ handles :
+ "n,e,s,w,se,sw,ne,nw";
+
+ function filteredUi( ui ) {
+ return {
+ originalPosition: ui.originalPosition,
+ originalSize: ui.originalSize,
+ position: ui.position,
+ size: ui.size
+ };
+ }
+
+ this.uiDialog.resizable({
+ cancel: ".ui-dialog-content",
+ containment: "document",
+ alsoResize: this.element,
+ maxWidth: options.maxWidth,
+ maxHeight: options.maxHeight,
+ minWidth: options.minWidth,
+ minHeight: this._minHeight(),
+ handles: resizeHandles,
+ start: function( event, ui ) {
+ $( this ).addClass( "ui-dialog-resizing" );
+ that._blockFrames();
+ that._trigger( "resizeStart", event, filteredUi( ui ) );
+ },
+ resize: function( event, ui ) {
+ that._trigger( "resize", event, filteredUi( ui ) );
+ },
+ stop: function( event, ui ) {
+ var offset = that.uiDialog.offset(),
+ left = offset.left - that.document.scrollLeft(),
+ top = offset.top - that.document.scrollTop();
+
+ options.height = that.uiDialog.height();
+ options.width = that.uiDialog.width();
+ options.position = {
+ my: "left top",
+ at: "left" + (left >= 0 ? "+" : "") + left + "
" +
+ "top" + (top >= 0 ? "+" : "") + top,
+ of: that.window
+ };
+ $( this ).removeClass( "ui-dialog-resizing" );
+ that._unblockFrames();
+ that._trigger( "resizeStop", event, filteredUi( ui ) );
+ }
+ })
+ .css( "position", position );
+ },
+
+ _trackFocus: function() {
+ this._on( this.widget(), {
+ focusin: function( event ) {
+ this._makeFocusTarget();
+ this._focusedElement = $( event.target );
+ }
+ });
+ },
+
+ _makeFocusTarget: function() {
+ this._untrackInstance();
+ this._trackingInstances().unshift( this );
+ },
+
+ _untrackInstance: function() {
+ var instances = this._trackingInstances(),
+ exists = $.inArray( this, instances );
+ if ( exists !== -1 ) {
+ instances.splice( exists, 1 );
+ }
+ },
+
+ _trackingInstances: function() {
+ var instances = this.document.data( "ui-dialog-instances" );
+ if ( !instances ) {
+ instances = [];
+ this.document.data( "ui-dialog-instances", instances );
+ }
+ return instances;
+ },
+
+ _minHeight: function() {
+ var options = this.options;
+
+ return options.height === "auto" ?
+ options.minHeight :
+ Math.min( options.minHeight, options.height );
+ },
+
+ _position: function() {
+ // Need to show the dialog to get the actual offset in the position plugin
+ var isVisible = this.uiDialog.is( ":visible" );
+ if ( !isVisible ) {
+ this.uiDialog.show();
+ }
+ this.uiDialog.position( this.options.position );
+ if ( !isVisible ) {
+ this.uiDialog.hide();
+ }
+ },
+
+ _setOptions: function( options ) {
+ var that = this,
+ resize = false,
+ resizableOptions = {};
+
+ $.each( options, function( key, value ) {
+ that._setOption( key, value );
+
+ if ( key in that.sizeRelatedOptions ) {
+ resize = true;
+ }
+ if ( key in that.resizableRelatedOptions ) {
+ resizableOptions[ key ] = value;
+ }
+ });
+
+ if ( resize ) {
+ this._size();
+ this._position();
+ }
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+ this.uiDialog.resizable( "option", resizableOptions );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var isDraggable, isResizable,
+ uiDialog = this.uiDialog;
+
+ if ( key === "dialogClass" ) {
+ uiDialog
+ .removeClass( this.options.dialogClass )
+ .addClass( value );
+ }
+
+ if ( key === "disabled" ) {
+ return;
+ }
+
+ this._super( key, value );
+
+ if ( key === "appendTo" ) {
+ this.uiDialog.appendTo( this._appendTo() );
+ }
+
+ if ( key === "buttons" ) {
+ this._createButtons();
+ }
+
+ if ( key === "closeText" ) {
+ this.uiDialogTitlebarClose.button({
+ // Ensure that we always pass a string
+ label: "" + value
+ });
+ }
+
+ if ( key === "draggable" ) {
+ isDraggable = uiDialog.is( ":data(ui-draggable)" );
+ if ( isDraggable && !value ) {
+ uiDialog.draggable( "destroy" );
+ }
+
+ if ( !isDraggable && value ) {
+ this._makeDraggable();
+ }
+ }
+
+ if ( key === "position" ) {
+ this._position();
+ }
+
+ if ( key === "resizable" ) {
+ // currently resizable, becoming non-resizable
+ isResizable = uiDialog.is( ":data(ui-resizable)" );
+ if ( isResizable && !value ) {
+ uiDialog.resizable( "destroy" );
+ }
+
+ // currently resizable, changing handles
+ if ( isResizable && typeof value === "string" ) {
+ uiDialog.resizable( "option", "handles", value );
+ }
+
+ // currently non-resizable, becoming resizable
+ if ( !isResizable && value !== false ) {
+ this._makeResizable();
+ }
+ }
+
+ if ( key === "title" ) {
+ this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
+ }
+ },
+
+ _size: function() {
+ // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+ // divs will both have width and height set, so we need to reset them
+ var nonContentHeight, minContentHeight, maxContentHeight,
+ options = this.options;
+
+ // Reset content sizing
+ this.element.show().css({
+ width: "auto",
+ minHeight: 0,
+ maxHeight: "none",
+ height: 0
+ });
+
+ if ( options.minWidth > options.width ) {
+ options.width = options.minWidth;
+ }
+
+ // reset wrapper sizing
+ // determine the height of all the non-content elements
+ nonContentHeight = this.uiDialog.css({
+ height: "auto",
+ width: options.width
+ })
+ .outerHeight();
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+ maxContentHeight = typeof options.maxHeight === "number" ?
+ Math.max( 0, options.maxHeight - nonContentHeight ) :
+ "none";
+
+ if ( options.height === "auto" ) {
+ this.element.css({
+ minHeight: minContentHeight,
+ maxHeight: maxContentHeight,
+ height: "auto"
+ });
+ } else {
+ this.element.height( Math.max( 0, options.height - nonContentHeight ) );
+ }
+
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+ this.uiDialog.resizable( "option", "minHeight", this._minHeight()
);
+ }
+ },
+
+ _blockFrames: function() {
+ this.iframeBlocks = this.document.find( "iframe" ).map(function() {
+ var iframe = $( this );
+
+ return $( "<div>" )
+ .css({
+ position: "absolute",
+ width: iframe.outerWidth(),
+ height: iframe.outerHeight()
+ })
+ .appendTo( iframe.parent() )
+ .offset( iframe.offset() )[0];
+ });
+ },
+
+ _unblockFrames: function() {
+ if ( this.iframeBlocks ) {
+ this.iframeBlocks.remove();
+ delete this.iframeBlocks;
+ }
+ },
+
+ _allowInteraction: function( event ) {
+ if ( $( event.target ).closest( ".ui-dialog" ).length ) {
+ return true;
+ }
+
+ // TODO: Remove hack when datepicker implements
+ // the .ui-front logic (#8989)
+ return !!$( event.target ).closest( ".ui-datepicker" ).length;
+ },
+
+ _createOverlay: function() {
+ if ( !this.options.modal ) {
+ return;
+ }
+
+ // We use a delay in case the overlay is created from an
+ // event that we're going to be cancelling (#2804)
+ var isOpening = true;
+ this._delay(function() {
+ isOpening = false;
+ });
+
+ if ( !this.document.data( "ui-dialog-overlays" ) ) {
+
+ // Prevent use of anchors and inputs
+ // Using _on() for an event handler shared across many instances is
+ // safe because the dialogs stack and must be closed in reverse order
+ this._on( this.document, {
+ focusin: function( event ) {
+ if ( isOpening ) {
+ return;
+ }
+
+ if ( !this._allowInteraction( event ) ) {
+ event.preventDefault();
+ this._trackingInstances()[ 0 ]._focusTabbable();
+ }
+ }
+ });
+ }
+
+ this.overlay = $( "<div>" )
+ .addClass( "ui-widget-overlay ui-front" )
+ .appendTo( this._appendTo() );
+ this._on( this.overlay, {
+ mousedown: "_keepFocus"
+ });
+ this.document.data( "ui-dialog-overlays",
+ (this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
+ },
+
+ _destroyOverlay: function() {
+ if ( !this.options.modal ) {
+ return;
+ }
+
+ if ( this.overlay ) {
+ var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
+
+ if ( !overlays ) {
+ this.document
+ .unbind( "focusin" )
+ .removeData( "ui-dialog-overlays" );
+ } else {
+ this.document.data( "ui-dialog-overlays", overlays );
+ }
+
+ this.overlay.remove();
+ this.overlay = null;
+ }
+ }
+});
+
+
+/*!
+ * jQuery UI Droppable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/droppable/
+ */
+
+
+$.widget( "ui.droppable", {
+ version: "1.11.4",
+ widgetEventPrefix: "drop",
+ options: {
+ accept: "*",
+ activeClass: false,
+ addClasses: true,
+ greedy: false,
+ hoverClass: false,
+ scope: "default",
+ tolerance: "intersect",
+
+ // callbacks
+ activate: null,
+ deactivate: null,
+ drop: null,
+ out: null,
+ over: null
+ },
+ _create: function() {
+
+ var proportions,
+ o = this.options,
+ accept = o.accept;
+
+ this.isover = false;
+ this.isout = true;
+
+ this.accept = $.isFunction( accept ) ? accept : function( d ) {
+ return d.is( accept );
+ };
+
+ this.proportions = function( /* valueToWrite */ ) {
+ if ( arguments.length ) {
+ // Store the droppable's proportions
+ proportions = arguments[ 0 ];
+ } else {
+ // Retrieve or derive the droppable's proportions
+ return proportions ?
+ proportions :
+ proportions = {
+ width: this.element[ 0 ].offsetWidth,
+ height: this.element[ 0 ].offsetHeight
+ };
+ }
+ };
+
+ this._addToManager( o.scope );
+
+ o.addClasses && this.element.addClass( "ui-droppable" );
+
+ },
+
+ _addToManager: function( scope ) {
+ // Add the reference and positions to the manager
+ $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
+ $.ui.ddmanager.droppables[ scope ].push( this );
+ },
+
+ _splice: function( drop ) {
+ var i = 0;
+ for ( ; i < drop.length; i++ ) {
+ if ( drop[ i ] === this ) {
+ drop.splice( i, 1 );
+ }
+ }
+ },
+
+ _destroy: function() {
+ var drop = $.ui.ddmanager.droppables[ this.options.scope ];
+
+ this._splice( drop );
+
+ this.element.removeClass( "ui-droppable ui-droppable-disabled" );
+ },
+
+ _setOption: function( key, value ) {
+
+ if ( key === "accept" ) {
+ this.accept = $.isFunction( value ) ? value : function( d ) {
+ return d.is( value );
+ };
+ } else if ( key === "scope" ) {
+ var drop = $.ui.ddmanager.droppables[ this.options.scope ];
+
+ this._splice( drop );
+ this._addToManager( value );
+ }
+
+ this._super( key, value );
+ },
+
+ _activate: function( event ) {
+ var draggable = $.ui.ddmanager.current;
+ if ( this.options.activeClass ) {
+ this.element.addClass( this.options.activeClass );
+ }
+ if ( draggable ){
+ this._trigger( "activate", event, this.ui( draggable ) );
+ }
+ },
+
+ _deactivate: function( event ) {
+ var draggable = $.ui.ddmanager.current;
+ if ( this.options.activeClass ) {
+ this.element.removeClass( this.options.activeClass );
+ }
+ if ( draggable ){
+ this._trigger( "deactivate", event, this.ui( draggable ) );
+ }
+ },
+
+ _over: function( event ) {
+
+ var draggable = $.ui.ddmanager.current;
+
+ // Bail if draggable and droppable are same element
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] ===
this.element[ 0 ] ) {
+ return;
+ }
+
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element
) ) ) {
+ if ( this.options.hoverClass ) {
+ this.element.addClass( this.options.hoverClass );
+ }
+ this._trigger( "over", event, this.ui( draggable ) );
+ }
+
+ },
+
+ _out: function( event ) {
+
+ var draggable = $.ui.ddmanager.current;
+
+ // Bail if draggable and droppable are same element
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] ===
this.element[ 0 ] ) {
+ return;
+ }
+
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element
) ) ) {
+ if ( this.options.hoverClass ) {
+ this.element.removeClass( this.options.hoverClass );
+ }
+ this._trigger( "out", event, this.ui( draggable ) );
+ }
+
+ },
+
+ _drop: function( event, custom ) {
+
+ var draggable = custom || $.ui.ddmanager.current,
+ childrenIntersection = false;
+
+ // Bail if draggable and droppable are same element
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] ===
this.element[ 0 ] ) {
+ return false;
+ }
+
+ this.element.find( ":data(ui-droppable)" ).not(
".ui-draggable-dragging" ).each(function() {
+ var inst = $( this ).droppable( "instance" );
+ if (
+ inst.options.greedy &&
+ !inst.options.disabled &&
+ inst.options.scope === draggable.options.scope &&
+ inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) )
&&
+ $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ),
inst.options.tolerance, event )
+ ) { childrenIntersection = true; return false; }
+ });
+ if ( childrenIntersection ) {
+ return false;
+ }
+
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element
) ) ) {
+ if ( this.options.activeClass ) {
+ this.element.removeClass( this.options.activeClass );
+ }
+ if ( this.options.hoverClass ) {
+ this.element.removeClass( this.options.hoverClass );
+ }
+ this._trigger( "drop", event, this.ui( draggable ) );
+ return this.element;
+ }
+
+ return false;
+
+ },
+
+ ui: function( c ) {
+ return {
+ draggable: ( c.currentItem || c.element ),
+ helper: c.helper,
+ position: c.position,
+ offset: c.positionAbs
+ };
+ }
+
+});
+
+$.ui.intersect = (function() {
+ function isOverAxis( x, reference, size ) {
+ return ( x >= reference ) && ( x < ( reference + size ) );
+ }
+
+ return function( draggable, droppable, toleranceMode, event ) {
+
+ if ( !droppable.offset ) {
+ return false;
+ }
+
+ var x1 = ( draggable.positionAbs || draggable.position.absolute ).left +
draggable.margins.left,
+ y1 = ( draggable.positionAbs || draggable.position.absolute ).top +
draggable.margins.top,
+ x2 = x1 + draggable.helperProportions.width,
+ y2 = y1 + draggable.helperProportions.height,
+ l = droppable.offset.left,
+ t = droppable.offset.top,
+ r = l + droppable.proportions().width,
+ b = t + droppable.proportions().height;
+
+ switch ( toleranceMode ) {
+ case "fit":
+ return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b
);
+ case "intersect":
+ return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right
Half
+ x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
+ t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
+ y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
+ case "pointer":
+ return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
isOverAxis( event.pageX, l, droppable.proportions().width );
+ case "touch":
+ return (
+ ( y1 >= t && y1 <= b ) || // Top edge touching
+ ( y2 >= t && y2 <= b ) || // Bottom edge touching
+ ( y1 < t && y2 > b ) // Surrounded vertically
+ ) && (
+ ( x1 >= l && x1 <= r ) || // Left edge touching
+ ( x2 >= l && x2 <= r ) || // Right edge touching
+ ( x1 < l && x2 > r ) // Surrounded horizontally
+ );
+ default:
+ return false;
+ }
+ };
+})();
+
+/*
+ This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+ current: null,
+ droppables: { "default": [] },
+ prepareOffsets: function( t, event ) {
+
+ var i, j,
+ m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
+ type = event ? event.type : null, // workaround for #2317
+ list = ( t.currentItem || t.element ).find( ":data(ui-droppable)"
).addBack();
+
+ droppablesLoop: for ( i = 0; i < m.length; i++ ) {
+
+ // No disabled and non-accepted
+ if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0
], ( t.currentItem || t.element ) ) ) ) {
+ continue;
+ }
+
+ // Filter out elements in the current dragged item
+ for ( j = 0; j < list.length; j++ ) {
+ if ( list[ j ] === m[ i ].element[ 0 ] ) {
+ m[ i ].proportions().height = 0;
+ continue droppablesLoop;
+ }
+ }
+
+ m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
+ if ( !m[ i ].visible ) {
+ continue;
+ }
+
+ // Activate the droppable if used directly from draggables
+ if ( type === "mousedown" ) {
+ m[ i ]._activate.call( m[ i ], event );
+ }
+
+ m[ i ].offset = m[ i ].element.offset();
+ m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0
].offsetHeight });
+
+ }
+
+ },
+ drop: function( draggable, event ) {
+
+ var dropped = false;
+ // Create a copy of the droppables in case the list changes during the drop (#9116)
+ $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(),
function() {
+
+ if ( !this.options ) {
+ return;
+ }
+ if ( !this.options.disabled && this.visible && $.ui.intersect(
draggable, this, this.options.tolerance, event ) ) {
+ dropped = this._drop.call( this, event ) || dropped;
+ }
+
+ if ( !this.options.disabled && this.visible && this.accept.call(
this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
+ this.isout = true;
+ this.isover = false;
+ this._deactivate.call( this, event );
+ }
+
+ });
+ return dropped;
+
+ },
+ dragStart: function( draggable, event ) {
+ // Listen for scrolling so that if the dragging causes scrolling the position of the
droppables can be recalculated (see #5003)
+ draggable.element.parentsUntil( "body" ).bind( "scroll.droppable",
function() {
+ if ( !draggable.options.refreshPositions ) {
+ $.ui.ddmanager.prepareOffsets( draggable, event );
+ }
+ });
+ },
+ drag: function( draggable, event ) {
+
+ // If you have a highly dynamic page, you might try this option. It renders positions
every time you move the mouse.
+ if ( draggable.options.refreshPositions ) {
+ $.ui.ddmanager.prepareOffsets( draggable, event );
+ }
+
+ // Run through all droppables and check their positions based on specific tolerance
options
+ $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
+
+ if ( this.options.disabled || this.greedyChild || !this.visible ) {
+ return;
+ }
+
+ var parentInstance, scope, parent,
+ intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
+ c = !intersects && this.isover ? "isout" : ( intersects &&
!this.isover ? "isover" : null );
+ if ( !c ) {
+ return;
+ }
+
+ if ( this.options.greedy ) {
+ // find droppable parents with same scope
+ scope = this.options.scope;
+ parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
+ return $( this ).droppable( "instance" ).options.scope === scope;
+ });
+
+ if ( parent.length ) {
+ parentInstance = $( parent[ 0 ] ).droppable( "instance" );
+ parentInstance.greedyChild = ( c === "isover" );
+ }
+ }
+
+ // we just moved into a greedy child
+ if ( parentInstance && c === "isover" ) {
+ parentInstance.isover = false;
+ parentInstance.isout = true;
+ parentInstance._out.call( parentInstance, event );
+ }
+
+ this[ c ] = true;
+ this[c === "isout" ? "isover" : "isout"] = false;
+ this[c === "isover" ? "_over" : "_out"].call( this,
event );
+
+ // we just moved out of a greedy child
+ if ( parentInstance && c === "isout" ) {
+ parentInstance.isout = false;
+ parentInstance.isover = true;
+ parentInstance._over.call( parentInstance, event );
+ }
+ });
+
+ },
+ dragStop: function( draggable, event ) {
+ draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable"
);
+ // Call prepareOffsets one final time since IE does not fire return scroll events when
overflow was caused by drag (see #5003)
+ if ( !draggable.options.refreshPositions ) {
+ $.ui.ddmanager.prepareOffsets( draggable, event );
+ }
+ }
+};
+
+var droppable = $.ui.droppable;
+
+
+/*!
+ * jQuery UI Effects 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/category/effects-core/
+ */
+
+
+var dataSpace = "ui-effects-",
+
+ // Create a local jQuery because jQuery Color relies on it and the
+ // global may not exist with AMD and a custom build (#10199)
+ jQuery = $;
+
+$.effects = {
+ effect: {}
+};
+
+/*!
+ * jQuery Color Animations v2.1.2
+ *
https://github.com/jquery/jquery-color
+ *
+ * Copyright 2014 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ * Date: Wed Jan 16 08:47:09 2013 -0600
+ */
+(function( jQuery, undefined ) {
+
+ var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor
borderTopColor color columnRuleColor outlineColor textDecorationColor
textEmphasisColor",
+
+ // plusequals test for += 100 -= 100
+ rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
+ // a set of RE's that can match strings and generate color tuples.
+ stringParsers = [ {
+ re:
/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+ parse: function( execResult ) {
+ return [
+ execResult[ 1 ],
+ execResult[ 2 ],
+ execResult[ 3 ],
+ execResult[ 4 ]
+ ];
+ }
+ }, {
+ re:
/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+ parse: function( execResult ) {
+ return [
+ execResult[ 1 ] * 2.55,
+ execResult[ 2 ] * 2.55,
+ execResult[ 3 ] * 2.55,
+ execResult[ 4 ]
+ ];
+ }
+ }, {
+ // this regex ignores A-F because it's compared against an already lowercased
string
+ re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
+ parse: function( execResult ) {
+ return [
+ parseInt( execResult[ 1 ], 16 ),
+ parseInt( execResult[ 2 ], 16 ),
+ parseInt( execResult[ 3 ], 16 )
+ ];
+ }
+ }, {
+ // this regex ignores A-F because it's compared against an already lowercased
string
+ re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
+ parse: function( execResult ) {
+ return [
+ parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
+ parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
+ parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
+ ];
+ }
+ }, {
+ re:
/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+ space: "hsla",
+ parse: function( execResult ) {
+ return [
+ execResult[ 1 ],
+ execResult[ 2 ] / 100,
+ execResult[ 3 ] / 100,
+ execResult[ 4 ]
+ ];
+ }
+ } ],
+
+ // jQuery.Color( )
+ color = jQuery.Color = function( color, green, blue, alpha ) {
+ return new jQuery.Color.fn.parse( color, green, blue, alpha );
+ },
+ spaces = {
+ rgba: {
+ props: {
+ red: {
+ idx: 0,
+ type: "byte"
+ },
+ green: {
+ idx: 1,
+ type: "byte"
+ },
+ blue: {
+ idx: 2,
+ type: "byte"
+ }
+ }
+ },
+
+ hsla: {
+ props: {
+ hue: {
+ idx: 0,
+ type: "degrees"
+ },
+ saturation: {
+ idx: 1,
+ type: "percent"
+ },
+ lightness: {
+ idx: 2,
+ type: "percent"
+ }
+ }
+ }
+ },
+ propTypes = {
+ "byte": {
+ floor: true,
+ max: 255
+ },
+ "percent": {
+ max: 1
+ },
+ "degrees": {
+ mod: 360,
+ floor: true
+ }
+ },
+ support = color.support = {},
+
+ // element for support tests
+ supportElem = jQuery( "<p>" )[ 0 ],
+
+ // colors = jQuery.Color.names
+ colors,
+
+ // local aliases of functions called often
+ each = jQuery.each;
+
+// determine rgba support immediately
+supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
+support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
+
+// define cache name and alpha properties
+// for rgba and hsla spaces
+each( spaces, function( spaceName, space ) {
+ space.cache = "_" + spaceName;
+ space.props.alpha = {
+ idx: 3,
+ type: "percent",
+ def: 1
+ };
+});
+
+function clamp( value, prop, allowEmpty ) {
+ var type = propTypes[ prop.type ] || {};
+
+ if ( value == null ) {
+ return (allowEmpty || !prop.def) ? null : prop.def;
+ }
+
+ // ~~ is an short way of doing floor for positive numbers
+ value = type.floor ? ~~value : parseFloat( value );
+
+ // IE will pass in empty strings as value for alpha,
+ // which will hit this case
+ if ( isNaN( value ) ) {
+ return prop.def;
+ }
+
+ if ( type.mod ) {
+ // we add mod before modding to make sure that negatives values
+ // get converted properly: -10 -> 350
+ return (value + type.mod) % type.mod;
+ }
+
+ // for now all property types without mod have min and max
+ return 0 > value ? 0 : type.max < value ? type.max : value;
+}
+
+function stringParse( string ) {
+ var inst = color(),
+ rgba = inst._rgba = [];
+
+ string = string.toLowerCase();
+
+ each( stringParsers, function( i, parser ) {
+ var parsed,
+ match = parser.re.exec( string ),
+ values = match && parser.parse( match ),
+ spaceName = parser.space || "rgba";
+
+ if ( values ) {
+ parsed = inst[ spaceName ]( values );
+
+ // if this was an rgba parse the assignment might happen twice
+ // oh well....
+ inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
+ rgba = inst._rgba = parsed._rgba;
+
+ // exit each( stringParsers ) here because we matched
+ return false;
+ }
+ });
+
+ // Found a stringParser that handled it
+ if ( rgba.length ) {
+
+ // if this came from a parsed string, force "transparent" when alpha is 0
+ // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
+ if ( rgba.join() === "0,0,0,0" ) {
+ jQuery.extend( rgba, colors.transparent );
+ }
+ return inst;
+ }
+
+ // named colors
+ return colors[ string ];
+}
+
+color.fn = jQuery.extend( color.prototype, {
+ parse: function( red, green, blue, alpha ) {
+ if ( red === undefined ) {
+ this._rgba = [ null, null, null, null ];
+ return this;
+ }
+ if ( red.jquery || red.nodeType ) {
+ red = jQuery( red ).css( green );
+ green = undefined;
+ }
+
+ var inst = this,
+ type = jQuery.type( red ),
+ rgba = this._rgba = [];
+
+ // more than 1 argument specified - assume ( red, green, blue, alpha )
+ if ( green !== undefined ) {
+ red = [ red, green, blue, alpha ];
+ type = "array";
+ }
+
+ if ( type === "string" ) {
+ return this.parse( stringParse( red ) || colors._default );
+ }
+
+ if ( type === "array" ) {
+ each( spaces.rgba.props, function( key, prop ) {
+ rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
+ });
+ return this;
+ }
+
+ if ( type === "object" ) {
+ if ( red instanceof color ) {
+ each( spaces, function( spaceName, space ) {
+ if ( red[ space.cache ] ) {
+ inst[ space.cache ] = red[ space.cache ].slice();
+ }
+ });
+ } else {
+ each( spaces, function( spaceName, space ) {
+ var cache = space.cache;
+ each( space.props, function( key, prop ) {
+
+ // if the cache doesn't exist, and we know how to convert
+ if ( !inst[ cache ] && space.to ) {
+
+ // if the value was null, we don't need to copy it
+ // if the key was alpha, we don't need to copy it either
+ if ( key === "alpha" || red[ key ] == null ) {
+ return;
+ }
+ inst[ cache ] = space.to( inst._rgba );
+ }
+
+ // this is the only case where we allow nulls for ALL properties.
+ // call clamp with alwaysAllowEmpty
+ inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
+ });
+
+ // everything defined but alpha?
+ if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) )
< 0 ) {
+ // use the default of 1
+ inst[ cache ][ 3 ] = 1;
+ if ( space.from ) {
+ inst._rgba = space.from( inst[ cache ] );
+ }
+ }
+ });
+ }
+ return this;
+ }
+ },
+ is: function( compare ) {
+ var is = color( compare ),
+ same = true,
+ inst = this;
+
+ each( spaces, function( _, space ) {
+ var localCache,
+ isCache = is[ space.cache ];
+ if (isCache) {
+ localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) ||
[];
+ each( space.props, function( _, prop ) {
+ if ( isCache[ prop.idx ] != null ) {
+ same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
+ return same;
+ }
+ });
+ }
+ return same;
+ });
+ return same;
+ },
+ _space: function() {
+ var used = [],
+ inst = this;
+ each( spaces, function( spaceName, space ) {
+ if ( inst[ space.cache ] ) {
+ used.push( spaceName );
+ }
+ });
+ return used.pop();
+ },
+ transition: function( other, distance ) {
+ var end = color( other ),
+ spaceName = end._space(),
+ space = spaces[ spaceName ],
+ startColor = this.alpha() === 0 ? color( "transparent" ) : this,
+ start = startColor[ space.cache ] || space.to( startColor._rgba ),
+ result = start.slice();
+
+ end = end[ space.cache ];
+ each( space.props, function( key, prop ) {
+ var index = prop.idx,
+ startValue = start[ index ],
+ endValue = end[ index ],
+ type = propTypes[ prop.type ] || {};
+
+ // if null, don't override start value
+ if ( endValue === null ) {
+ return;
+ }
+ // if null - use end
+ if ( startValue === null ) {
+ result[ index ] = endValue;
+ } else {
+ if ( type.mod ) {
+ if ( endValue - startValue > type.mod / 2 ) {
+ startValue += type.mod;
+ } else if ( startValue - endValue > type.mod / 2 ) {
+ startValue -= type.mod;
+ }
+ }
+ result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
+ }
+ });
+ return this[ spaceName ]( result );
+ },
+ blend: function( opaque ) {
+ // if we are already opaque - return ourself
+ if ( this._rgba[ 3 ] === 1 ) {
+ return this;
+ }
+
+ var rgb = this._rgba.slice(),
+ a = rgb.pop(),
+ blend = color( opaque )._rgba;
+
+ return color( jQuery.map( rgb, function( v, i ) {
+ return ( 1 - a ) * blend[ i ] + a * v;
+ }));
+ },
+ toRgbaString: function() {
+ var prefix = "rgba(",
+ rgba = jQuery.map( this._rgba, function( v, i ) {
+ return v == null ? ( i > 2 ? 1 : 0 ) : v;
+ });
+
+ if ( rgba[ 3 ] === 1 ) {
+ rgba.pop();
+ prefix = "rgb(";
+ }
+
+ return prefix + rgba.join() + ")";
+ },
+ toHslaString: function() {
+ var prefix = "hsla(",
+ hsla = jQuery.map( this.hsla(), function( v, i ) {
+ if ( v == null ) {
+ v = i > 2 ? 1 : 0;
+ }
+
+ // catch 1 and 2
+ if ( i && i < 3 ) {
+ v = Math.round( v * 100 ) + "%";
+ }
+ return v;
+ });
+
+ if ( hsla[ 3 ] === 1 ) {
+ hsla.pop();
+ prefix = "hsl(";
+ }
+ return prefix + hsla.join() + ")";
+ },
+ toHexString: function( includeAlpha ) {
+ var rgba = this._rgba.slice(),
+ alpha = rgba.pop();
+
+ if ( includeAlpha ) {
+ rgba.push( ~~( alpha * 255 ) );
+ }
+
+ return "#" + jQuery.map( rgba, function( v ) {
+
+ // default to 0 when nulls exist
+ v = ( v || 0 ).toString( 16 );
+ return v.length === 1 ? "0" + v : v;
+ }).join("");
+ },
+ toString: function() {
+ return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
+ }
+});
+color.fn.parse.prototype = color.fn;
+
+// hsla conversions adapted from:
+//
https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk...
+
+function hue2rgb( p, q, h ) {
+ h = ( h + 1 ) % 1;
+ if ( h * 6 < 1 ) {
+ return p + ( q - p ) * h * 6;
+ }
+ if ( h * 2 < 1) {
+ return q;
+ }
+ if ( h * 3 < 2 ) {
+ return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
+ }
+ return p;
+}
+
+spaces.hsla.to = function( rgba ) {
+ if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
+ return [ null, null, null, rgba[ 3 ] ];
+ }
+ var r = rgba[ 0 ] / 255,
+ g = rgba[ 1 ] / 255,
+ b = rgba[ 2 ] / 255,
+ a = rgba[ 3 ],
+ max = Math.max( r, g, b ),
+ min = Math.min( r, g, b ),
+ diff = max - min,
+ add = max + min,
+ l = add * 0.5,
+ h, s;
+
+ if ( min === max ) {
+ h = 0;
+ } else if ( r === max ) {
+ h = ( 60 * ( g - b ) / diff ) + 360;
+ } else if ( g === max ) {
+ h = ( 60 * ( b - r ) / diff ) + 120;
+ } else {
+ h = ( 60 * ( r - g ) / diff ) + 240;
+ }
+
+ // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
+ // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
+ if ( diff === 0 ) {
+ s = 0;
+ } else if ( l <= 0.5 ) {
+ s = diff / add;
+ } else {
+ s = diff / ( 2 - add );
+ }
+ return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
+};
+
+spaces.hsla.from = function( hsla ) {
+ if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
+ return [ null, null, null, hsla[ 3 ] ];
+ }
+ var h = hsla[ 0 ] / 360,
+ s = hsla[ 1 ],
+ l = hsla[ 2 ],
+ a = hsla[ 3 ],
+ q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
+ p = 2 * l - q;
+
+ return [
+ Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
+ Math.round( hue2rgb( p, q, h ) * 255 ),
+ Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
+ a
+ ];
+};
+
+each( spaces, function( spaceName, space ) {
+ var props = space.props,
+ cache = space.cache,
+ to = space.to,
+ from = space.from;
+
+ // makes rgba() and hsla()
+ color.fn[ spaceName ] = function( value ) {
+
+ // generate a cache for this space if it doesn't exist
+ if ( to && !this[ cache ] ) {
+ this[ cache ] = to( this._rgba );
+ }
+ if ( value === undefined ) {
+ return this[ cache ].slice();
+ }
+
+ var ret,
+ type = jQuery.type( value ),
+ arr = ( type === "array" || type === "object" ) ? value :
arguments,
+ local = this[ cache ].slice();
+
+ each( props, function( key, prop ) {
+ var val = arr[ type === "object" ? key : prop.idx ];
+ if ( val == null ) {
+ val = local[ prop.idx ];
+ }
+ local[ prop.idx ] = clamp( val, prop );
+ });
+
+ if ( from ) {
+ ret = color( from( local ) );
+ ret[ cache ] = local;
+ return ret;
+ } else {
+ return color( local );
+ }
+ };
+
+ // makes red() green() blue() alpha() hue() saturation() lightness()
+ each( props, function( key, prop ) {
+ // alpha is included in more than one space
+ if ( color.fn[ key ] ) {
+ return;
+ }
+ color.fn[ key ] = function( value ) {
+ var vtype = jQuery.type( value ),
+ fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba"
) : spaceName ),
+ local = this[ fn ](),
+ cur = local[ prop.idx ],
+ match;
+
+ if ( vtype === "undefined" ) {
+ return cur;
+ }
+
+ if ( vtype === "function" ) {
+ value = value.call( this, cur );
+ vtype = jQuery.type( value );
+ }
+ if ( value == null && prop.empty ) {
+ return this;
+ }
+ if ( vtype === "string" ) {
+ match = rplusequals.exec( value );
+ if ( match ) {
+ value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
+ }
+ }
+ local[ prop.idx ] = value;
+ return this[ fn ]( local );
+ };
+ });
+});
+
+// add cssHook and .fx.step function for each named hook.
+// accept a space separated string of properties
+color.hook = function( hook ) {
+ var hooks = hook.split( " " );
+ each( hooks, function( i, hook ) {
+ jQuery.cssHooks[ hook ] = {
+ set: function( elem, value ) {
+ var parsed, curElem,
+ backgroundColor = "";
+
+ if ( value !== "transparent" && ( jQuery.type( value ) !==
"string" || ( parsed = stringParse( value ) ) ) ) {
+ value = color( parsed || value );
+ if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
+ curElem = hook === "backgroundColor" ? elem.parentNode : elem;
+ while (
+ (backgroundColor === "" || backgroundColor === "transparent")
&&
+ curElem && curElem.style
+ ) {
+ try {
+ backgroundColor = jQuery.css( curElem, "backgroundColor" );
+ curElem = curElem.parentNode;
+ } catch ( e ) {
+ }
+ }
+
+ value = value.blend( backgroundColor && backgroundColor !==
"transparent" ?
+ backgroundColor :
+ "_default" );
+ }
+
+ value = value.toRgbaString();
+ }
+ try {
+ elem.style[ hook ] = value;
+ } catch ( e ) {
+ // wrapped to prevent IE from throwing errors on "invalid" values like
'auto' or 'inherit'
+ }
+ }
+ };
+ jQuery.fx.step[ hook ] = function( fx ) {
+ if ( !fx.colorInit ) {
+ fx.start = color( fx.elem, hook );
+ fx.end = color( fx.end );
+ fx.colorInit = true;
+ }
+ jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
+ };
+ });
+
+};
+
+color.hook( stepHooks );
+
+jQuery.cssHooks.borderColor = {
+ expand: function( value ) {
+ var expanded = {};
+
+ each( [ "Top", "Right", "Bottom", "Left" ],
function( i, part ) {
+ expanded[ "border" + part + "Color" ] = value;
+ });
+ return expanded;
+ }
+};
+
+// Basic color names only.
+// Usage of any of the other color names requires adding yourself or including
+// jquery.color.svg-names.js.
+colors = jQuery.Color.names = {
+ // 4.1. Basic color keywords
+ aqua: "#00ffff",
+ black: "#000000",
+ blue: "#0000ff",
+ fuchsia: "#ff00ff",
+ gray: "#808080",
+ green: "#008000",
+ lime: "#00ff00",
+ maroon: "#800000",
+ navy: "#000080",
+ olive: "#808000",
+ purple: "#800080",
+ red: "#ff0000",
+ silver: "#c0c0c0",
+ teal: "#008080",
+ white: "#ffffff",
+ yellow: "#ffff00",
+
+ // 4.2.3. "transparent" color keyword
+ transparent: [ null, null, null, 0 ],
+
+ _default: "#ffffff"
+};
+
+})( jQuery );
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+(function() {
+
+var classAnimationActions = [ "add", "remove", "toggle" ],
+ shorthandStyles = {
+ border: 1,
+ borderBottom: 1,
+ borderColor: 1,
+ borderLeft: 1,
+ borderRight: 1,
+ borderTop: 1,
+ borderWidth: 1,
+ margin: 1,
+ padding: 1
+ };
+
+$.each([ "borderLeftStyle", "borderRightStyle",
"borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
+ $.fx.step[ prop ] = function( fx ) {
+ if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 &&
!fx.setAttr ) {
+ jQuery.style( fx.elem, prop, fx.end );
+ fx.setAttr = true;
+ }
+ };
+});
+
+function getElementStyles( elem ) {
+ var key, len,
+ style = elem.ownerDocument.defaultView ?
+ elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
+ elem.currentStyle,
+ styles = {};
+
+ if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ]
) {
+ len = style.length;
+ while ( len-- ) {
+ key = style[ len ];
+ if ( typeof style[ key ] === "string" ) {
+ styles[ $.camelCase( key ) ] = style[ key ];
+ }
+ }
+ // support: Opera, IE <9
+ } else {
+ for ( key in style ) {
+ if ( typeof style[ key ] === "string" ) {
+ styles[ key ] = style[ key ];
+ }
+ }
+ }
+
+ return styles;
+}
+
+function styleDifference( oldStyle, newStyle ) {
+ var diff = {},
+ name, value;
+
+ for ( name in newStyle ) {
+ value = newStyle[ name ];
+ if ( oldStyle[ name ] !== value ) {
+ if ( !shorthandStyles[ name ] ) {
+ if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
+ diff[ name ] = value;
+ }
+ }
+ }
+ }
+
+ return diff;
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+ $.fn.addBack = function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ };
+}
+
+$.effects.animateClass = function( value, duration, easing, callback ) {
+ var o = $.speed( duration, easing, callback );
+
+ return this.queue( function() {
+ var animated = $( this ),
+ baseClass = animated.attr( "class" ) || "",
+ applyClassChange,
+ allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
+
+ // map the animated objects to store the original styles.
+ allAnimations = allAnimations.map(function() {
+ var el = $( this );
+ return {
+ el: el,
+ start: getElementStyles( this )
+ };
+ });
+
+ // apply class change
+ applyClassChange = function() {
+ $.each( classAnimationActions, function(i, action) {
+ if ( value[ action ] ) {
+ animated[ action + "Class" ]( value[ action ] );
+ }
+ });
+ };
+ applyClassChange();
+
+ // map all animated objects again - calculate new styles and diff
+ allAnimations = allAnimations.map(function() {
+ this.end = getElementStyles( this.el[ 0 ] );
+ this.diff = styleDifference( this.start, this.end );
+ return this;
+ });
+
+ // apply original class
+ animated.attr( "class", baseClass );
+
+ // map all animated objects again - this time collecting a promise
+ allAnimations = allAnimations.map(function() {
+ var styleInfo = this,
+ dfd = $.Deferred(),
+ opts = $.extend({}, o, {
+ queue: false,
+ complete: function() {
+ dfd.resolve( styleInfo );
+ }
+ });
+
+ this.el.animate( this.diff, opts );
+ return dfd.promise();
+ });
+
+ // once all animations have completed:
+ $.when.apply( $, allAnimations.get() ).done(function() {
+
+ // set the final class
+ applyClassChange();
+
+ // for each animated element,
+ // clear all css properties that were animated
+ $.each( arguments, function() {
+ var el = this.el;
+ $.each( this.diff, function(key) {
+ el.css( key, "" );
+ });
+ });
+
+ // this is guarnteed to be there if you use jQuery.speed()
+ // it also handles dequeuing the next anim...
+ o.complete.call( animated[ 0 ] );
+ });
+ });
+};
+
+$.fn.extend({
+ addClass: (function( orig ) {
+ return function( classNames, speed, easing, callback ) {
+ return speed ?
+ $.effects.animateClass.call( this,
+ { add: classNames }, speed, easing, callback ) :
+ orig.apply( this, arguments );
+ };
+ })( $.fn.addClass ),
+
+ removeClass: (function( orig ) {
+ return function( classNames, speed, easing, callback ) {
+ return arguments.length > 1 ?
+ $.effects.animateClass.call( this,
+ { remove: classNames }, speed, easing, callback ) :
+ orig.apply( this, arguments );
+ };
+ })( $.fn.removeClass ),
+
+ toggleClass: (function( orig ) {
+ return function( classNames, force, speed, easing, callback ) {
+ if ( typeof force === "boolean" || force === undefined ) {
+ if ( !speed ) {
+ // without speed parameter
+ return orig.apply( this, arguments );
+ } else {
+ return $.effects.animateClass.call( this,
+ (force ? { add: classNames } : { remove: classNames }),
+ speed, easing, callback );
+ }
+ } else {
+ // without force parameter
+ return $.effects.animateClass.call( this,
+ { toggle: classNames }, force, speed, easing );
+ }
+ };
+ })( $.fn.toggleClass ),
+
+ switchClass: function( remove, add, speed, easing, callback) {
+ return $.effects.animateClass.call( this, {
+ add: add,
+ remove: remove
+ }, speed, easing, callback );
+ }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+(function() {
+
+$.extend( $.effects, {
+ version: "1.11.4",
+
+ // Saves a set of properties in a data storage
+ save: function( element, set ) {
+ for ( var i = 0; i < set.length; i++ ) {
+ if ( set[ i ] !== null ) {
+ element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
+ }
+ }
+ },
+
+ // Restores a set of previously saved properties from a data storage
+ restore: function( element, set ) {
+ var val, i;
+ for ( i = 0; i < set.length; i++ ) {
+ if ( set[ i ] !== null ) {
+ val = element.data( dataSpace + set[ i ] );
+ // support: jQuery 1.6.2
+ //
http://bugs.jquery.com/ticket/9917
+ // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
+ // We can't differentiate between "" and 0 here, so we just assume
+ // empty string since it's likely to be a more common value...
+ if ( val === undefined ) {
+ val = "";
+ }
+ element.css( set[ i ], val );
+ }
+ }
+ },
+
+ setMode: function( el, mode ) {
+ if (mode === "toggle") {
+ mode = el.is( ":hidden" ) ? "show" : "hide";
+ }
+ return mode;
+ },
+
+ // Translates a [top,left] array into a baseline value
+ // this should be a little more flexible in the future to handle a string & hash
+ getBaseline: function( origin, original ) {
+ var y, x;
+ switch ( origin[ 0 ] ) {
+ case "top": y = 0; break;
+ case "middle": y = 0.5; break;
+ case "bottom": y = 1; break;
+ default: y = origin[ 0 ] / original.height;
+ }
+ switch ( origin[ 1 ] ) {
+ case "left": x = 0; break;
+ case "center": x = 0.5; break;
+ case "right": x = 1; break;
+ default: x = origin[ 1 ] / original.width;
+ }
+ return {
+ x: x,
+ y: y
+ };
+ },
+
+ // Wraps the element around a wrapper that copies position properties
+ createWrapper: function( element ) {
+
+ // if the element is already wrapped, return it
+ if ( element.parent().is( ".ui-effects-wrapper" )) {
+ return element.parent();
+ }
+
+ // wrap the element
+ var props = {
+ width: element.outerWidth(true),
+ height: element.outerHeight(true),
+ "float": element.css( "float" )
+ },
+ wrapper = $( "<div></div>" )
+ .addClass( "ui-effects-wrapper" )
+ .css({
+ fontSize: "100%",
+ background: "transparent",
+ border: "none",
+ margin: 0,
+ padding: 0
+ }),
+ // Store the size in case width/height are defined in % - Fixes #5245
+ size = {
+ width: element.width(),
+ height: element.height()
+ },
+ active = document.activeElement;
+
+ // support: Firefox
+ // Firefox incorrectly exposes anonymous content
+ //
https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+ try {
+ active.id;
+ } catch ( e ) {
+ active = document.body;
+ }
+
+ element.wrap( wrapper );
+
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+
+ wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems
to actually lose the reference to the wrapped element
+
+ // transfer positioning properties to the wrapper
+ if ( element.css( "position" ) === "static" ) {
+ wrapper.css({ position: "relative" });
+ element.css({ position: "relative" });
+ } else {
+ $.extend( props, {
+ position: element.css( "position" ),
+ zIndex: element.css( "z-index" )
+ });
+ $.each([ "top", "left", "bottom", "right" ],
function(i, pos) {
+ props[ pos ] = element.css( pos );
+ if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
+ props[ pos ] = "auto";
+ }
+ });
+ element.css({
+ position: "relative",
+ top: 0,
+ left: 0,
+ right: "auto",
+ bottom: "auto"
+ });
+ }
+ element.css(size);
+
+ return wrapper.css( props ).show();
+ },
+
+ removeWrapper: function( element ) {
+ var active = document.activeElement;
+
+ if ( element.parent().is( ".ui-effects-wrapper" ) ) {
+ element.parent().replaceWith( element );
+
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+ }
+
+ return element;
+ },
+
+ setTransition: function( element, list, factor, value ) {
+ value = value || {};
+ $.each( list, function( i, x ) {
+ var unit = element.cssUnit( x );
+ if ( unit[ 0 ] > 0 ) {
+ value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
+ }
+ });
+ return value;
+ }
+});
+
+// return an effect options object for the given parameters:
+function _normalizeArguments( effect, options, speed, callback ) {
+
+ // allow passing all options as the first parameter
+ if ( $.isPlainObject( effect ) ) {
+ options = effect;
+ effect = effect.effect;
+ }
+
+ // convert to an object
+ effect = { effect: effect };
+
+ // catch (effect, null, ...)
+ if ( options == null ) {
+ options = {};
+ }
+
+ // catch (effect, callback)
+ if ( $.isFunction( options ) ) {
+ callback = options;
+ speed = null;
+ options = {};
+ }
+
+ // catch (effect, speed, ?)
+ if ( typeof options === "number" || $.fx.speeds[ options ] ) {
+ callback = speed;
+ speed = options;
+ options = {};
+ }
+
+ // catch (effect, options, callback)
+ if ( $.isFunction( speed ) ) {
+ callback = speed;
+ speed = null;
+ }
+
+ // add options to effect
+ if ( options ) {
+ $.extend( effect, options );
+ }
+
+ speed = speed || options.duration;
+ effect.duration = $.fx.off ? 0 :
+ typeof speed === "number" ? speed :
+ speed in $.fx.speeds ? $.fx.speeds[ speed ] :
+ $.fx.speeds._default;
+
+ effect.complete = callback || options.complete;
+
+ return effect;
+}
+
+function standardAnimationOption( option ) {
+ // Valid standard speeds (nothing, number, named speed)
+ if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
+ return true;
+ }
+
+ // Invalid strings - treat as "normal" speed
+ if ( typeof option === "string" && !$.effects.effect[ option ] ) {
+ return true;
+ }
+
+ // Complete callback
+ if ( $.isFunction( option ) ) {
+ return true;
+ }
+
+ // Options hash (but not naming an effect)
+ if ( typeof option === "object" && !option.effect ) {
+ return true;
+ }
+
+ // Didn't match any standard API
+ return false;
+}
+
+$.fn.extend({
+ effect: function( /* effect, options, speed, callback */ ) {
+ var args = _normalizeArguments.apply( this, arguments ),
+ mode = args.mode,
+ queue = args.queue,
+ effectMethod = $.effects.effect[ args.effect ];
+
+ if ( $.fx.off || !effectMethod ) {
+ // delegate to the original method (e.g., .show()) if possible
+ if ( mode ) {
+ return this[ mode ]( args.duration, args.complete );
+ } else {
+ return this.each( function() {
+ if ( args.complete ) {
+ args.complete.call( this );
+ }
+ });
+ }
+ }
+
+ function run( next ) {
+ var elem = $( this ),
+ complete = args.complete,
+ mode = args.mode;
+
+ function done() {
+ if ( $.isFunction( complete ) ) {
+ complete.call( elem[0] );
+ }
+ if ( $.isFunction( next ) ) {
+ next();
+ }
+ }
+
+ // If the element already has the correct final state, delegate to
+ // the core methods so the internal tracking of "olddisplay" works.
+ if ( elem.is( ":hidden" ) ? mode === "hide" : mode ===
"show" ) {
+ elem[ mode ]();
+ done();
+ } else {
+ effectMethod.call( elem[0], args, done );
+ }
+ }
+
+ return queue === false ? this.each( run ) : this.queue( queue || "fx", run
);
+ },
+
+ show: (function( orig ) {
+ return function( option ) {
+ if ( standardAnimationOption( option ) ) {
+ return orig.apply( this, arguments );
+ } else {
+ var args = _normalizeArguments.apply( this, arguments );
+ args.mode = "show";
+ return this.effect.call( this, args );
+ }
+ };
+ })( $.fn.show ),
+
+ hide: (function( orig ) {
+ return function( option ) {
+ if ( standardAnimationOption( option ) ) {
+ return orig.apply( this, arguments );
+ } else {
+ var args = _normalizeArguments.apply( this, arguments );
+ args.mode = "hide";
+ return this.effect.call( this, args );
+ }
+ };
+ })( $.fn.hide ),
+
+ toggle: (function( orig ) {
+ return function( option ) {
+ if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
+ return orig.apply( this, arguments );
+ } else {
+ var args = _normalizeArguments.apply( this, arguments );
+ args.mode = "toggle";
+ return this.effect.call( this, args );
+ }
+ };
+ })( $.fn.toggle ),
+
+ // helper functions
+ cssUnit: function(key) {
+ var style = this.css( key ),
+ val = [];
+
+ $.each( [ "em", "px", "%", "pt" ], function( i,
unit ) {
+ if ( style.indexOf( unit ) > 0 ) {
+ val = [ parseFloat( style ), unit ];
+ }
+ });
+ return val;
+ }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+(function() {
+
+// based on easing equations from Robert Penner (
http://www.robertpenner.com/easing)
+
+var baseEasings = {};
+
+$.each( [ "Quad", "Cubic", "Quart", "Quint",
"Expo" ], function( i, name ) {
+ baseEasings[ name ] = function( p ) {
+ return Math.pow( p, i + 2 );
+ };
+});
+
+$.extend( baseEasings, {
+ Sine: function( p ) {
+ return 1 - Math.cos( p * Math.PI / 2 );
+ },
+ Circ: function( p ) {
+ return 1 - Math.sqrt( 1 - p * p );
+ },
+ Elastic: function( p ) {
+ return p === 0 || p === 1 ? p :
+ -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
+ },
+ Back: function( p ) {
+ return p * p * ( 3 * p - 2 );
+ },
+ Bounce: function( p ) {
+ var pow2,
+ bounce = 4;
+
+ while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+ return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2
);
+ }
+});
+
+$.each( baseEasings, function( name, easeIn ) {
+ $.easing[ "easeIn" + name ] = easeIn;
+ $.easing[ "easeOut" + name ] = function( p ) {
+ return 1 - easeIn( 1 - p );
+ };
+ $.easing[ "easeInOut" + name ] = function( p ) {
+ return p < 0.5 ?
+ easeIn( p * 2 ) / 2 :
+ 1 - easeIn( p * -2 + 2 ) / 2;
+ };
+});
+
+})();
+
+var effect = $.effects;
+
+
+/*!
+ * jQuery UI Effects Blind 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/blind-effect/
+ */
+
+
+var effectBlind = $.effects.effect.blind = function( o, done ) {
+ // Create element
+ var el = $( this ),
+ rvertical = /up|down|vertical/,
+ rpositivemotion = /up|left|vertical|horizontal/,
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ direction = o.direction || "up",
+ vertical = rvertical.test( direction ),
+ ref = vertical ? "height" : "width",
+ ref2 = vertical ? "top" : "left",
+ motion = rpositivemotion.test( direction ),
+ animation = {},
+ show = mode === "show",
+ wrapper, distance, margin;
+
+ // if already wrapped, the wrapper's properties are my property. #6245
+ if ( el.parent().is( ".ui-effects-wrapper" ) ) {
+ $.effects.save( el.parent(), props );
+ } else {
+ $.effects.save( el, props );
+ }
+ el.show();
+ wrapper = $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+
+ distance = wrapper[ ref ]();
+ margin = parseFloat( wrapper.css( ref2 ) ) || 0;
+
+ animation[ ref ] = show ? distance : 0;
+ if ( !motion ) {
+ el
+ .css( vertical ? "bottom" : "right", 0 )
+ .css( vertical ? "top" : "left", "auto" )
+ .css({ position: "absolute" });
+
+ animation[ ref2 ] = show ? margin : distance + margin;
+ }
+
+ // start at 0 if we are showing
+ if ( show ) {
+ wrapper.css( ref, 0 );
+ if ( !motion ) {
+ wrapper.css( ref2, margin + distance );
+ }
+ }
+
+ // Animate
+ wrapper.animate( animation, {
+ duration: o.duration,
+ easing: o.easing,
+ queue: false,
+ complete: function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Bounce 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/bounce-effect/
+ */
+
+
+var effectBounce = $.effects.effect.bounce = function( o, done ) {
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+
+ // defaults:
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ hide = mode === "hide",
+ show = mode === "show",
+ direction = o.direction || "up",
+ distance = o.distance,
+ times = o.times || 5,
+
+ // number of internal animations
+ anims = times * 2 + ( show || hide ? 1 : 0 ),
+ speed = o.duration / anims,
+ easing = o.easing,
+
+ // utility:
+ ref = ( direction === "up" || direction === "down" ) ?
"top" : "left",
+ motion = ( direction === "up" || direction === "left" ),
+ i,
+ upAnim,
+ downAnim,
+
+ // we will need to re-assemble the queue to stack our animations in place
+ queue = el.queue(),
+ queuelen = queue.length;
+
+ // Avoid touching opacity to prevent clearType and PNG issues in IE
+ if ( show || hide ) {
+ props.push( "opacity" );
+ }
+
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el ); // Create Wrapper
+
+ // default distance for the BIGGEST bounce is the outer Distance / 3
+ if ( !distance ) {
+ distance = el[ ref === "top" ? "outerHeight" :
"outerWidth" ]() / 3;
+ }
+
+ if ( show ) {
+ downAnim = { opacity: 1 };
+ downAnim[ ref ] = 0;
+
+ // if we are showing, force opacity 0 and set the initial position
+ // then do the "first" animation
+ el.css( "opacity", 0 )
+ .css( ref, motion ? -distance * 2 : distance * 2 )
+ .animate( downAnim, speed, easing );
+ }
+
+ // start at the smallest distance if we are hiding
+ if ( hide ) {
+ distance = distance / Math.pow( 2, times - 1 );
+ }
+
+ downAnim = {};
+ downAnim[ ref ] = 0;
+ // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
+ for ( i = 0; i < times; i++ ) {
+ upAnim = {};
+ upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+ el.animate( upAnim, speed, easing )
+ .animate( downAnim, speed, easing );
+
+ distance = hide ? distance * 2 : distance / 2;
+ }
+
+ // Last Bounce when Hiding
+ if ( hide ) {
+ upAnim = { opacity: 0 };
+ upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+ el.animate( upAnim, speed, easing );
+ }
+
+ el.queue(function() {
+ if ( hide ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ });
+
+ // inject all the animations we just queued to be first in line (after
"inprogress")
+ if ( queuelen > 1) {
+ queue.splice.apply( queue,
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+ }
+ el.dequeue();
+
+};
+
+
+/*!
+ * jQuery UI Effects Clip 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/clip-effect/
+ */
+
+
+var effectClip = $.effects.effect.clip = function( o, done ) {
+ // Create element
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+ direction = o.direction || "vertical",
+ vert = direction === "vertical",
+ size = vert ? "height" : "width",
+ position = vert ? "top" : "left",
+ animation = {},
+ wrapper, animate, distance;
+
+ // Save & Show
+ $.effects.save( el, props );
+ el.show();
+
+ // Create Wrapper
+ wrapper = $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+ animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
+ distance = animate[ size ]();
+
+ // Shift
+ if ( show ) {
+ animate.css( size, 0 );
+ animate.css( position, distance / 2 );
+ }
+
+ // Create Animation Object:
+ animation[ size ] = show ? distance : 0;
+ animation[ position ] = show ? 0 : distance / 2;
+
+ // Animate
+ animate.animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( !show ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+
+};
+
+
+/*!
+ * jQuery UI Effects Drop 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/drop-effect/
+ */
+
+
+var effectDrop = $.effects.effect.drop = function( o, done ) {
+
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "opacity", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+ direction = o.direction || "left",
+ ref = ( direction === "up" || direction === "down" ) ?
"top" : "left",
+ motion = ( direction === "up" || direction === "left" ) ?
"pos" : "neg",
+ animation = {
+ opacity: show ? 1 : 0
+ },
+ distance;
+
+ // Adjust
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el );
+
+ distance = o.distance || el[ ref === "top" ? "outerHeight" :
"outerWidth" ]( true ) / 2;
+
+ if ( show ) {
+ el
+ .css( "opacity", 0 )
+ .css( ref, motion === "pos" ? -distance : distance );
+ }
+
+ // Animation
+ animation[ ref ] = ( show ?
+ ( motion === "pos" ? "+=" : "-=" ) :
+ ( motion === "pos" ? "-=" : "+=" ) ) +
+ distance;
+
+ // Animate
+ el.animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Explode 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/explode-effect/
+ */
+
+
+var effectExplode = $.effects.effect.explode = function( o, done ) {
+
+ var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
+ cells = rows,
+ el = $( this ),
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+
+ // show and then visibility:hidden the element before calculating offset
+ offset = el.show().css( "visibility", "hidden" ).offset(),
+
+ // width and height of a piece
+ width = Math.ceil( el.outerWidth() / cells ),
+ height = Math.ceil( el.outerHeight() / rows ),
+ pieces = [],
+
+ // loop
+ i, j, left, top, mx, my;
+
+ // children animate complete:
+ function childComplete() {
+ pieces.push( this );
+ if ( pieces.length === rows * cells ) {
+ animComplete();
+ }
+ }
+
+ // clone the element for each row and cell.
+ for ( i = 0; i < rows ; i++ ) { // ===>
+ top = offset.top + i * height;
+ my = i - ( rows - 1 ) / 2 ;
+
+ for ( j = 0; j < cells ; j++ ) { // |||
+ left = offset.left + j * width;
+ mx = j - ( cells - 1 ) / 2 ;
+
+ // Create a clone of the now hidden main element that will be absolute positioned
+ // within a wrapper div off the -left and -top equal to size of our pieces
+ el
+ .clone()
+ .appendTo( "body" )
+ .wrap( "<div></div>" )
+ .css({
+ position: "absolute",
+ visibility: "visible",
+ left: -j * width,
+ top: -i * height
+ })
+
+ // select the wrapper - make it overflow: hidden and absolute positioned based on
+ // where the original was located +left and +top equal to the size of pieces
+ .parent()
+ .addClass( "ui-effects-explode" )
+ .css({
+ position: "absolute",
+ overflow: "hidden",
+ width: width,
+ height: height,
+ left: left + ( show ? mx * width : 0 ),
+ top: top + ( show ? my * height : 0 ),
+ opacity: show ? 0 : 1
+ }).animate({
+ left: left + ( show ? 0 : mx * width ),
+ top: top + ( show ? 0 : my * height ),
+ opacity: show ? 1 : 0
+ }, o.duration || 500, o.easing, childComplete );
+ }
+ }
+
+ function animComplete() {
+ el.css({
+ visibility: "visible"
+ });
+ $( pieces ).remove();
+ if ( !show ) {
+ el.hide();
+ }
+ done();
+ }
+};
+
+
+/*!
+ * jQuery UI Effects Fade 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/fade-effect/
+ */
+
+
+var effectFade = $.effects.effect.fade = function( o, done ) {
+ var el = $( this ),
+ mode = $.effects.setMode( el, o.mode || "toggle" );
+
+ el.animate({
+ opacity: mode
+ }, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: done
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Fold 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/fold-effect/
+ */
+
+
+var effectFold = $.effects.effect.fold = function( o, done ) {
+
+ // Create element
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "hide" ),
+ show = mode === "show",
+ hide = mode === "hide",
+ size = o.size || 15,
+ percent = /([0-9]+)%/.exec( size ),
+ horizFirst = !!o.horizFirst,
+ widthFirst = show !== horizFirst,
+ ref = widthFirst ? [ "width", "height" ] : [ "height",
"width" ],
+ duration = o.duration / 2,
+ wrapper, distance,
+ animation1 = {},
+ animation2 = {};
+
+ $.effects.save( el, props );
+ el.show();
+
+ // Create Wrapper
+ wrapper = $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+ distance = widthFirst ?
+ [ wrapper.width(), wrapper.height() ] :
+ [ wrapper.height(), wrapper.width() ];
+
+ if ( percent ) {
+ size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
+ }
+ if ( show ) {
+ wrapper.css( horizFirst ? {
+ height: 0,
+ width: size
+ } : {
+ height: size,
+ width: 0
+ });
+ }
+
+ // Animation
+ animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
+ animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
+
+ // Animate
+ wrapper
+ .animate( animation1, duration, o.easing )
+ .animate( animation2, duration, o.easing, function() {
+ if ( hide ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ });
+
+};
+
+
+/*!
+ * jQuery UI Effects Highlight 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/highlight-effect/
+ */
+
+
+var effectHighlight = $.effects.effect.highlight = function( o, done ) {
+ var elem = $( this ),
+ props = [ "backgroundImage", "backgroundColor", "opacity"
],
+ mode = $.effects.setMode( elem, o.mode || "show" ),
+ animation = {
+ backgroundColor: elem.css( "backgroundColor" )
+ };
+
+ if (mode === "hide") {
+ animation.opacity = 0;
+ }
+
+ $.effects.save( elem, props );
+
+ elem
+ .show()
+ .css({
+ backgroundImage: "none",
+ backgroundColor: o.color || "#ffff99"
+ })
+ .animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( mode === "hide" ) {
+ elem.hide();
+ }
+ $.effects.restore( elem, props );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Size 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/size-effect/
+ */
+
+
+var effectSize = $.effects.effect.size = function( o, done ) {
+
+ // Create element
+ var original, baseline, factor,
+ el = $( this ),
+ props0 = [ "position", "top", "bottom", "left",
"right", "width", "height", "overflow",
"opacity" ],
+
+ // Always restore
+ props1 = [ "position", "top", "bottom", "left",
"right", "overflow", "opacity" ],
+
+ // Copy for children
+ props2 = [ "width", "height", "overflow" ],
+ cProps = [ "fontSize" ],
+ vProps = [ "borderTopWidth", "borderBottomWidth",
"paddingTop", "paddingBottom" ],
+ hProps = [ "borderLeftWidth", "borderRightWidth",
"paddingLeft", "paddingRight" ],
+
+ // Set options
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ restore = o.restore || mode !== "effect",
+ scale = o.scale || "both",
+ origin = o.origin || [ "middle", "center" ],
+ position = el.css( "position" ),
+ props = restore ? props0 : props1,
+ zero = {
+ height: 0,
+ width: 0,
+ outerHeight: 0,
+ outerWidth: 0
+ };
+
+ if ( mode === "show" ) {
+ el.show();
+ }
+ original = {
+ height: el.height(),
+ width: el.width(),
+ outerHeight: el.outerHeight(),
+ outerWidth: el.outerWidth()
+ };
+
+ if ( o.mode === "toggle" && mode === "show" ) {
+ el.from = o.to || zero;
+ el.to = o.from || original;
+ } else {
+ el.from = o.from || ( mode === "show" ? zero : original );
+ el.to = o.to || ( mode === "hide" ? zero : original );
+ }
+
+ // Set scaling factor
+ factor = {
+ from: {
+ y: el.from.height / original.height,
+ x: el.from.width / original.width
+ },
+ to: {
+ y: el.to.height / original.height,
+ x: el.to.width / original.width
+ }
+ };
+
+ // Scale the css box
+ if ( scale === "box" || scale === "both" ) {
+
+ // Vertical props scaling
+ if ( factor.from.y !== factor.to.y ) {
+ props = props.concat( vProps );
+ el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
+ el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
+ }
+
+ // Horizontal props scaling
+ if ( factor.from.x !== factor.to.x ) {
+ props = props.concat( hProps );
+ el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
+ el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
+ }
+ }
+
+ // Scale the content
+ if ( scale === "content" || scale === "both" ) {
+
+ // Vertical props scaling
+ if ( factor.from.y !== factor.to.y ) {
+ props = props.concat( cProps ).concat( props2 );
+ el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
+ el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
+ }
+ }
+
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el );
+ el.css( "overflow", "hidden" ).css( el.from );
+
+ // Adjust
+ if (origin) { // Calculate baseline shifts
+ baseline = $.effects.getBaseline( origin, original );
+ el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
+ el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
+ el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
+ el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
+ }
+ el.css( el.from ); // set top & left
+
+ // Animate
+ if ( scale === "content" || scale === "both" ) { // Scale the
children
+
+ // Add margins/font-size
+ vProps = vProps.concat([ "marginTop", "marginBottom"
]).concat(cProps);
+ hProps = hProps.concat([ "marginLeft", "marginRight" ]);
+ props2 = props0.concat(vProps).concat(hProps);
+
+ el.find( "*[width]" ).each( function() {
+ var child = $( this ),
+ c_original = {
+ height: child.height(),
+ width: child.width(),
+ outerHeight: child.outerHeight(),
+ outerWidth: child.outerWidth()
+ };
+ if (restore) {
+ $.effects.save(child, props2);
+ }
+
+ child.from = {
+ height: c_original.height * factor.from.y,
+ width: c_original.width * factor.from.x,
+ outerHeight: c_original.outerHeight * factor.from.y,
+ outerWidth: c_original.outerWidth * factor.from.x
+ };
+ child.to = {
+ height: c_original.height * factor.to.y,
+ width: c_original.width * factor.to.x,
+ outerHeight: c_original.height * factor.to.y,
+ outerWidth: c_original.width * factor.to.x
+ };
+
+ // Vertical props scaling
+ if ( factor.from.y !== factor.to.y ) {
+ child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
+ child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
+ }
+
+ // Horizontal props scaling
+ if ( factor.from.x !== factor.to.x ) {
+ child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
+ child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
+ }
+
+ // Animate children
+ child.css( child.from );
+ child.animate( child.to, o.duration, o.easing, function() {
+
+ // Restore children
+ if ( restore ) {
+ $.effects.restore( child, props2 );
+ }
+ });
+ });
+ }
+
+ // Animate
+ el.animate( el.to, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( el.to.opacity === 0 ) {
+ el.css( "opacity", el.from.opacity );
+ }
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ if ( !restore ) {
+
+ // we need to calculate our new positioning based on the scaling
+ if ( position === "static" ) {
+ el.css({
+ position: "relative",
+ top: el.to.top,
+ left: el.to.left
+ });
+ } else {
+ $.each([ "top", "left" ], function( idx, pos ) {
+ el.css( pos, function( _, str ) {
+ var val = parseInt( str, 10 ),
+ toRef = idx ? el.to.left : el.to.top;
+
+ // if original was "auto", recalculate the new value from wrapper
+ if ( str === "auto" ) {
+ return toRef + "px";
+ }
+
+ return val + toRef + "px";
+ });
+ });
+ }
+ }
+
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+
+};
+
+
+/*!
+ * jQuery UI Effects Scale 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/scale-effect/
+ */
+
+
+var effectScale = $.effects.effect.scale = function( o, done ) {
+
+ // Create element
+ var el = $( this ),
+ options = $.extend( true, {}, o ),
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ percent = parseInt( o.percent, 10 ) ||
+ ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
+ direction = o.direction || "both",
+ origin = o.origin,
+ original = {
+ height: el.height(),
+ width: el.width(),
+ outerHeight: el.outerHeight(),
+ outerWidth: el.outerWidth()
+ },
+ factor = {
+ y: direction !== "horizontal" ? (percent / 100) : 1,
+ x: direction !== "vertical" ? (percent / 100) : 1
+ };
+
+ // We are going to pass this effect to the size effect:
+ options.effect = "size";
+ options.queue = false;
+ options.complete = done;
+
+ // Set default origin and restore for show/hide
+ if ( mode !== "effect" ) {
+ options.origin = origin || [ "middle", "center" ];
+ options.restore = true;
+ }
+
+ options.from = o.from || ( mode === "show" ? {
+ height: 0,
+ width: 0,
+ outerHeight: 0,
+ outerWidth: 0
+ } : original );
+ options.to = {
+ height: original.height * factor.y,
+ width: original.width * factor.x,
+ outerHeight: original.outerHeight * factor.y,
+ outerWidth: original.outerWidth * factor.x
+ };
+
+ // Fade option to support puff
+ if ( options.fade ) {
+ if ( mode === "show" ) {
+ options.from.opacity = 0;
+ options.to.opacity = 1;
+ }
+ if ( mode === "hide" ) {
+ options.from.opacity = 1;
+ options.to.opacity = 0;
+ }
+ }
+
+ // Animate
+ el.effect( options );
+
+};
+
+
+/*!
+ * jQuery UI Effects Puff 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/puff-effect/
+ */
+
+
+var effectPuff = $.effects.effect.puff = function( o, done ) {
+ var elem = $( this ),
+ mode = $.effects.setMode( elem, o.mode || "hide" ),
+ hide = mode === "hide",
+ percent = parseInt( o.percent, 10 ) || 150,
+ factor = percent / 100,
+ original = {
+ height: elem.height(),
+ width: elem.width(),
+ outerHeight: elem.outerHeight(),
+ outerWidth: elem.outerWidth()
+ };
+
+ $.extend( o, {
+ effect: "scale",
+ queue: false,
+ fade: true,
+ mode: mode,
+ complete: done,
+ percent: hide ? percent : 100,
+ from: hide ?
+ original :
+ {
+ height: original.height * factor,
+ width: original.width * factor,
+ outerHeight: original.outerHeight * factor,
+ outerWidth: original.outerWidth * factor
+ }
+ });
+
+ elem.effect( o );
+};
+
+
+/*!
+ * jQuery UI Effects Pulsate 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/pulsate-effect/
+ */
+
+
+var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
+ var elem = $( this ),
+ mode = $.effects.setMode( elem, o.mode || "show" ),
+ show = mode === "show",
+ hide = mode === "hide",
+ showhide = ( show || mode === "hide" ),
+
+ // showing or hiding leaves of the "last" animation
+ anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
+ duration = o.duration / anims,
+ animateTo = 0,
+ queue = elem.queue(),
+ queuelen = queue.length,
+ i;
+
+ if ( show || !elem.is(":visible")) {
+ elem.css( "opacity", 0 ).show();
+ animateTo = 1;
+ }
+
+ // anims - 1 opacity "toggles"
+ for ( i = 1; i < anims; i++ ) {
+ elem.animate({
+ opacity: animateTo
+ }, duration, o.easing );
+ animateTo = 1 - animateTo;
+ }
+
+ elem.animate({
+ opacity: animateTo
+ }, duration, o.easing);
+
+ elem.queue(function() {
+ if ( hide ) {
+ elem.hide();
+ }
+ done();
+ });
+
+ // We just queued up "anims" animations, we need to put them next in the
queue
+ if ( queuelen > 1 ) {
+ queue.splice.apply( queue,
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+ }
+ elem.dequeue();
+};
+
+
+/*!
+ * jQuery UI Effects Shake 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/shake-effect/
+ */
+
+
+var effectShake = $.effects.effect.shake = function( o, done ) {
+
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "height", "width" ],
+ mode = $.effects.setMode( el, o.mode || "effect" ),
+ direction = o.direction || "left",
+ distance = o.distance || 20,
+ times = o.times || 3,
+ anims = times * 2 + 1,
+ speed = Math.round( o.duration / anims ),
+ ref = (direction === "up" || direction === "down") ?
"top" : "left",
+ positiveMotion = (direction === "up" || direction === "left"),
+ animation = {},
+ animation1 = {},
+ animation2 = {},
+ i,
+
+ // we will need to re-assemble the queue to stack our animations in place
+ queue = el.queue(),
+ queuelen = queue.length;
+
+ $.effects.save( el, props );
+ el.show();
+ $.effects.createWrapper( el );
+
+ // Animation
+ animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
+ animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance *
2;
+ animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance *
2;
+
+ // Animate
+ el.animate( animation, speed, o.easing );
+
+ // Shakes
+ for ( i = 1; i < times; i++ ) {
+ el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
+ }
+ el
+ .animate( animation1, speed, o.easing )
+ .animate( animation, speed / 2, o.easing )
+ .queue(function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ });
+
+ // inject all the animations we just queued to be first in line (after
"inprogress")
+ if ( queuelen > 1) {
+ queue.splice.apply( queue,
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+ }
+ el.dequeue();
+
+};
+
+
+/*!
+ * jQuery UI Effects Slide 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/slide-effect/
+ */
+
+
+var effectSlide = $.effects.effect.slide = function( o, done ) {
+
+ // Create element
+ var el = $( this ),
+ props = [ "position", "top", "bottom", "left",
"right", "width", "height" ],
+ mode = $.effects.setMode( el, o.mode || "show" ),
+ show = mode === "show",
+ direction = o.direction || "left",
+ ref = (direction === "up" || direction === "down") ?
"top" : "left",
+ positiveMotion = (direction === "up" || direction === "left"),
+ distance,
+ animation = {};
+
+ // Adjust
+ $.effects.save( el, props );
+ el.show();
+ distance = o.distance || el[ ref === "top" ? "outerHeight" :
"outerWidth" ]( true );
+
+ $.effects.createWrapper( el ).css({
+ overflow: "hidden"
+ });
+
+ if ( show ) {
+ el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance)
: distance );
+ }
+
+ // Animation
+ animation[ ref ] = ( show ?
+ ( positiveMotion ? "+=" : "-=") :
+ ( positiveMotion ? "-=" : "+=")) +
+ distance;
+
+ // Animate
+ el.animate( animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.easing,
+ complete: function() {
+ if ( mode === "hide" ) {
+ el.hide();
+ }
+ $.effects.restore( el, props );
+ $.effects.removeWrapper( el );
+ done();
+ }
+ });
+};
+
+
+/*!
+ * jQuery UI Effects Transfer 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/transfer-effect/
+ */
+
+
+var effectTransfer = $.effects.effect.transfer = function( o, done ) {
+ var elem = $( this ),
+ target = $( o.to ),
+ targetFixed = target.css( "position" ) === "fixed",
+ body = $("body"),
+ fixTop = targetFixed ? body.scrollTop() : 0,
+ fixLeft = targetFixed ? body.scrollLeft() : 0,
+ endPosition = target.offset(),
+ animation = {
+ top: endPosition.top - fixTop,
+ left: endPosition.left - fixLeft,
+ height: target.innerHeight(),
+ width: target.innerWidth()
+ },
+ startPosition = elem.offset(),
+ transfer = $( "<div class='ui-effects-transfer'></div>"
)
+ .appendTo( document.body )
+ .addClass( o.className )
+ .css({
+ top: startPosition.top - fixTop,
+ left: startPosition.left - fixLeft,
+ height: elem.innerHeight(),
+ width: elem.innerWidth(),
+ position: targetFixed ? "fixed" : "absolute"
+ })
+ .animate( animation, o.duration, o.easing, function() {
+ transfer.remove();
+ done();
+ });
+};
+
+
+/*!
+ * jQuery UI Progressbar 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/progressbar/
+ */
+
+
+var progressbar = $.widget( "ui.progressbar", {
+ version: "1.11.4",
+ options: {
+ max: 100,
+ value: 0,
+
+ change: null,
+ complete: null
+ },
+
+ min: 0,
+
+ _create: function() {
+ // Constrain initial value
+ this.oldValue = this.options.value = this._constrainedValue();
+
+ this.element
+ .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .attr({
+ // Only set static values, aria-valuenow and aria-valuemax are
+ // set inside _refreshValue()
+ role: "progressbar",
+ "aria-valuemin": this.min
+ });
+
+ this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header
ui-corner-left'></div>" )
+ .appendTo( this.element );
+
+ this._refreshValue();
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+
+ this.valueDiv.remove();
+ },
+
+ value: function( newValue ) {
+ if ( newValue === undefined ) {
+ return this.options.value;
+ }
+
+ this.options.value = this._constrainedValue( newValue );
+ this._refreshValue();
+ },
+
+ _constrainedValue: function( newValue ) {
+ if ( newValue === undefined ) {
+ newValue = this.options.value;
+ }
+
+ this.indeterminate = newValue === false;
+
+ // sanitize value
+ if ( typeof newValue !== "number" ) {
+ newValue = 0;
+ }
+
+ return this.indeterminate ? false :
+ Math.min( this.options.max, Math.max( this.min, newValue ) );
+ },
+
+ _setOptions: function( options ) {
+ // Ensure "value" option is set after other values (like max)
+ var value = options.value;
+ delete options.value;
+
+ this._super( options );
+
+ this.options.value = this._constrainedValue( value );
+ this._refreshValue();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "max" ) {
+ // Don't allow a max less than min
+ value = Math.max( this.min, value );
+ }
+ if ( key === "disabled" ) {
+ this.element
+ .toggleClass( "ui-state-disabled", !!value )
+ .attr( "aria-disabled", value );
+ }
+ this._super( key, value );
+ },
+
+ _percentage: function() {
+ return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / (
this.options.max - this.min );
+ },
+
+ _refreshValue: function() {
+ var value = this.options.value,
+ percentage = this._percentage();
+
+ this.valueDiv
+ .toggle( this.indeterminate || value > this.min )
+ .toggleClass( "ui-corner-right", value === this.options.max )
+ .width( percentage.toFixed(0) + "%" );
+
+ this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate
);
+
+ if ( this.indeterminate ) {
+ this.element.removeAttr( "aria-valuenow" );
+ if ( !this.overlayDiv ) {
+ this.overlayDiv = $( "<div
class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
+ }
+ } else {
+ this.element.attr({
+ "aria-valuemax": this.options.max,
+ "aria-valuenow": value
+ });
+ if ( this.overlayDiv ) {
+ this.overlayDiv.remove();
+ this.overlayDiv = null;
+ }
+ }
+
+ if ( this.oldValue !== value ) {
+ this.oldValue = value;
+ this._trigger( "change" );
+ }
+ if ( value === this.options.max ) {
+ this._trigger( "complete" );
+ }
+ }
+});
+
+
+/*!
+ * jQuery UI Selectable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/selectable/
+ */
+
+
+var selectable = $.widget("ui.selectable", $.ui.mouse, {
+ version: "1.11.4",
+ options: {
+ appendTo: "body",
+ autoRefresh: true,
+ distance: 0,
+ filter: "*",
+ tolerance: "touch",
+
+ // callbacks
+ selected: null,
+ selecting: null,
+ start: null,
+ stop: null,
+ unselected: null,
+ unselecting: null
+ },
+ _create: function() {
+ var selectees,
+ that = this;
+
+ this.element.addClass("ui-selectable");
+
+ this.dragged = false;
+
+ // cache selectee children based on filter
+ this.refresh = function() {
+ selectees = $(that.options.filter, that.element[0]);
+ selectees.addClass("ui-selectee");
+ selectees.each(function() {
+ var $this = $(this),
+ pos = $this.offset();
+ $.data(this, "selectable-item", {
+ element: this,
+ $element: $this,
+ left: pos.left,
+ top: pos.top,
+ right: pos.left + $this.outerWidth(),
+ bottom: pos.top + $this.outerHeight(),
+ startselected: false,
+ selected: $this.hasClass("ui-selected"),
+ selecting: $this.hasClass("ui-selecting"),
+ unselecting: $this.hasClass("ui-unselecting")
+ });
+ });
+ };
+ this.refresh();
+
+ this.selectees = selectees.addClass("ui-selectee");
+
+ this._mouseInit();
+
+ this.helper = $("<div
class='ui-selectable-helper'></div>");
+ },
+
+ _destroy: function() {
+ this.selectees
+ .removeClass("ui-selectee")
+ .removeData("selectable-item");
+ this.element
+ .removeClass("ui-selectable ui-selectable-disabled");
+ this._mouseDestroy();
+ },
+
+ _mouseStart: function(event) {
+ var that = this,
+ options = this.options;
+
+ this.opos = [ event.pageX, event.pageY ];
+
+ if (this.options.disabled) {
+ return;
+ }
+
+ this.selectees = $(options.filter, this.element[0]);
+
+ this._trigger("start", event);
+
+ $(options.appendTo).append(this.helper);
+ // position helper (lasso)
+ this.helper.css({
+ "left": event.pageX,
+ "top": event.pageY,
+ "width": 0,
+ "height": 0
+ });
+
+ if (options.autoRefresh) {
+ this.refresh();
+ }
+
+ this.selectees.filter(".ui-selected").each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.startselected = true;
+ if (!event.metaKey && !event.ctrlKey) {
+ selectee.$element.removeClass("ui-selected");
+ selectee.selected = false;
+ selectee.$element.addClass("ui-unselecting");
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ });
+
+ $(event.target).parents().addBack().each(function() {
+ var doSelect,
+ selectee = $.data(this, "selectable-item");
+ if (selectee) {
+ doSelect = (!event.metaKey && !event.ctrlKey) ||
!selectee.$element.hasClass("ui-selected");
+ selectee.$element
+ .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+ .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+ selectee.unselecting = !doSelect;
+ selectee.selecting = doSelect;
+ selectee.selected = doSelect;
+ // selectable (UN)SELECTING callback
+ if (doSelect) {
+ that._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ } else {
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ return false;
+ }
+ });
+
+ },
+
+ _mouseDrag: function(event) {
+
+ this.dragged = true;
+
+ if (this.options.disabled) {
+ return;
+ }
+
+ var tmp,
+ that = this,
+ options = this.options,
+ x1 = this.opos[0],
+ y1 = this.opos[1],
+ x2 = event.pageX,
+ y2 = event.pageY;
+
+ if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
+ if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
+ this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
+
+ this.selectees.each(function() {
+ var selectee = $.data(this, "selectable-item"),
+ hit = false;
+
+ //prevent helper from being selected if appendTo: selectable
+ if (!selectee || selectee.element === that.element[0]) {
+ return;
+ }
+
+ if (options.tolerance === "touch") {
+ hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 ||
selectee.bottom < y1) );
+ } else if (options.tolerance === "fit") {
+ hit = (selectee.left > x1 && selectee.right < x2 &&
selectee.top > y1 && selectee.bottom < y2);
+ }
+
+ if (hit) {
+ // SELECT
+ if (selectee.selected) {
+ selectee.$element.removeClass("ui-selected");
+ selectee.selected = false;
+ }
+ if (selectee.unselecting) {
+ selectee.$element.removeClass("ui-unselecting");
+ selectee.unselecting = false;
+ }
+ if (!selectee.selecting) {
+ selectee.$element.addClass("ui-selecting");
+ selectee.selecting = true;
+ // selectable SELECTING callback
+ that._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ }
+ } else {
+ // UNSELECT
+ if (selectee.selecting) {
+ if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
+ selectee.$element.removeClass("ui-selecting");
+ selectee.selecting = false;
+ selectee.$element.addClass("ui-selected");
+ selectee.selected = true;
+ } else {
+ selectee.$element.removeClass("ui-selecting");
+ selectee.selecting = false;
+ if (selectee.startselected) {
+ selectee.$element.addClass("ui-unselecting");
+ selectee.unselecting = true;
+ }
+ // selectable UNSELECTING callback
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ if (selectee.selected) {
+ if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
+ selectee.$element.removeClass("ui-selected");
+ selectee.selected = false;
+
+ selectee.$element.addClass("ui-unselecting");
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ that._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ }
+ });
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+ var that = this;
+
+ this.dragged = false;
+
+ $(".ui-unselecting", this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass("ui-unselecting");
+ selectee.unselecting = false;
+ selectee.startselected = false;
+ that._trigger("unselected", event, {
+ unselected: selectee.element
+ });
+ });
+ $(".ui-selecting", this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
+ selectee.selecting = false;
+ selectee.selected = true;
+ selectee.startselected = true;
+ that._trigger("selected", event, {
+ selected: selectee.element
+ });
+ });
+ this._trigger("stop", event);
+
+ this.helper.remove();
+
+ return false;
+ }
+
+});
+
+
+/*!
+ * jQuery UI Selectmenu 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/selectmenu
+ */
+
+
+var selectmenu = $.widget( "ui.selectmenu", {
+ version: "1.11.4",
+ defaultElement: "<select>",
+ options: {
+ appendTo: null,
+ disabled: null,
+ icons: {
+ button: "ui-icon-triangle-1-s"
+ },
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ width: null,
+
+ // callbacks
+ change: null,
+ close: null,
+ focus: null,
+ open: null,
+ select: null
+ },
+
+ _create: function() {
+ var selectmenuId = this.element.uniqueId().attr( "id" );
+ this.ids = {
+ element: selectmenuId,
+ button: selectmenuId + "-button",
+ menu: selectmenuId + "-menu"
+ };
+
+ this._drawButton();
+ this._drawMenu();
+
+ if ( this.options.disabled ) {
+ this.disable();
+ }
+ },
+
+ _drawButton: function() {
+ var that = this;
+
+ // Associate existing label with the new button
+ this.label = $( "label[for='" + this.ids.element + "']"
).attr( "for", this.ids.button );
+ this._on( this.label, {
+ click: function( event ) {
+ this.button.focus();
+ event.preventDefault();
+ }
+ });
+
+ // Hide original select element
+ this.element.hide();
+
+ // Create button
+ this.button = $( "<span>", {
+ "class": "ui-selectmenu-button ui-widget ui-state-default
ui-corner-all",
+ tabindex: this.options.disabled ? -1 : 0,
+ id: this.ids.button,
+ role: "combobox",
+ "aria-expanded": "false",
+ "aria-autocomplete": "list",
+ "aria-owns": this.ids.menu,
+ "aria-haspopup": "true"
+ })
+ .insertAfter( this.element );
+
+ $( "<span>", {
+ "class": "ui-icon " + this.options.icons.button
+ })
+ .prependTo( this.button );
+
+ this.buttonText = $( "<span>", {
+ "class": "ui-selectmenu-text"
+ })
+ .appendTo( this.button );
+
+ this._setText( this.buttonText, this.element.find( "option:selected" ).text()
);
+ this._resizeButton();
+
+ this._on( this.button, this._buttonEvents );
+ this.button.one( "focusin", function() {
+
+ // Delay rendering the menu items until the button receives focus.
+ // The menu may have already been rendered via a programmatic open.
+ if ( !that.menuItems ) {
+ that._refreshMenu();
+ }
+ });
+ this._hoverable( this.button );
+ this._focusable( this.button );
+ },
+
+ _drawMenu: function() {
+ var that = this;
+
+ // Create menu
+ this.menu = $( "<ul>", {
+ "aria-hidden": "true",
+ "aria-labelledby": this.ids.button,
+ id: this.ids.menu
+ });
+
+ // Wrap menu
+ this.menuWrap = $( "<div>", {
+ "class": "ui-selectmenu-menu ui-front"
+ })
+ .append( this.menu )
+ .appendTo( this._appendTo() );
+
+ // Initialize menu widget
+ this.menuInstance = this.menu
+ .menu({
+ role: "listbox",
+ select: function( event, ui ) {
+ event.preventDefault();
+
+ // support: IE8
+ // If the item was selected via a click, the text selection
+ // will be destroyed in IE
+ that._setSelection();
+
+ that._select( ui.item.data( "ui-selectmenu-item" ), event );
+ },
+ focus: function( event, ui ) {
+ var item = ui.item.data( "ui-selectmenu-item" );
+
+ // Prevent inital focus from firing and check if its a newly focused item
+ if ( that.focusIndex != null && item.index !== that.focusIndex ) {
+ that._trigger( "focus", event, { item: item } );
+ if ( !that.isOpen ) {
+ that._select( item, event );
+ }
+ }
+ that.focusIndex = item.index;
+
+ that.button.attr( "aria-activedescendant",
+ that.menuItems.eq( item.index ).attr( "id" ) );
+ }
+ })
+ .menu( "instance" );
+
+ // Adjust menu styles to dropdown
+ this.menu
+ .addClass( "ui-corner-bottom" )
+ .removeClass( "ui-corner-all" );
+
+ // Don't close the menu on mouseleave
+ this.menuInstance._off( this.menu, "mouseleave" );
+
+ // Cancel the menu's collapseAll on document click
+ this.menuInstance._closeOnDocumentClick = function() {
+ return false;
+ };
+
+ // Selects often contain empty items, but never contain dividers
+ this.menuInstance._isDivider = function() {
+ return false;
+ };
+ },
+
+ refresh: function() {
+ this._refreshMenu();
+ this._setText( this.buttonText, this._getSelectedItem().text() );
+ if ( !this.options.width ) {
+ this._resizeButton();
+ }
+ },
+
+ _refreshMenu: function() {
+ this.menu.empty();
+
+ var item,
+ options = this.element.find( "option" );
+
+ if ( !options.length ) {
+ return;
+ }
+
+ this._parseOptions( options );
+ this._renderMenu( this.menu, this.items );
+
+ this.menuInstance.refresh();
+ this.menuItems = this.menu.find( "li" ).not(
".ui-selectmenu-optgroup" );
+
+ item = this._getSelectedItem();
+
+ // Update the menu to have the correct item focused
+ this.menuInstance.focus( null, item );
+ this._setAria( item.data( "ui-selectmenu-item" ) );
+
+ // Set disabled state
+ this._setOption( "disabled", this.element.prop( "disabled" ) );
+ },
+
+ open: function( event ) {
+ if ( this.options.disabled ) {
+ return;
+ }
+
+ // If this is the first time the menu is being opened, render the items
+ if ( !this.menuItems ) {
+ this._refreshMenu();
+ } else {
+
+ // Menu clears focus on close, reset focus to selected item
+ this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus"
);
+ this.menuInstance.focus( null, this._getSelectedItem() );
+ }
+
+ this.isOpen = true;
+ this._toggleAttr();
+ this._resizeMenu();
+ this._position();
+
+ this._on( this.document, this._documentClick );
+
+ this._trigger( "open", event );
+ },
+
+ _position: function() {
+ this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
+ },
+
+ close: function( event ) {
+ if ( !this.isOpen ) {
+ return;
+ }
+
+ this.isOpen = false;
+ this._toggleAttr();
+
+ this.range = null;
+ this._off( this.document );
+
+ this._trigger( "close", event );
+ },
+
+ widget: function() {
+ return this.button;
+ },
+
+ menuWidget: function() {
+ return this.menu;
+ },
+
+ _renderMenu: function( ul, items ) {
+ var that = this,
+ currentOptgroup = "";
+
+ $.each( items, function( index, item ) {
+ if ( item.optgroup !== currentOptgroup ) {
+ $( "<li>", {
+ "class": "ui-selectmenu-optgroup ui-menu-divider" +
+ ( item.element.parent( "optgroup" ).prop( "disabled" ) ?
+ " ui-state-disabled" :
+ "" ),
+ text: item.optgroup
+ })
+ .appendTo( ul );
+
+ currentOptgroup = item.optgroup;
+ }
+
+ that._renderItemData( ul, item );
+ });
+ },
+
+ _renderItemData: function( ul, item ) {
+ return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
+ },
+
+ _renderItem: function( ul, item ) {
+ var li = $( "<li>" );
+
+ if ( item.disabled ) {
+ li.addClass( "ui-state-disabled" );
+ }
+ this._setText( li, item.label );
+
+ return li.appendTo( ul );
+ },
+
+ _setText: function( element, value ) {
+ if ( value ) {
+ element.text( value );
+ } else {
+ element.html( " " );
+ }
+ },
+
+ _move: function( direction, event ) {
+ var item, next,
+ filter = ".ui-menu-item";
+
+ if ( this.isOpen ) {
+ item = this.menuItems.eq( this.focusIndex );
+ } else {
+ item = this.menuItems.eq( this.element[ 0 ].selectedIndex );
+ filter += ":not(.ui-state-disabled)";
+ }
+
+ if ( direction === "first" || direction === "last" ) {
+ next = item[ direction === "first" ? "prevAll" :
"nextAll" ]( filter ).eq( -1 );
+ } else {
+ next = item[ direction + "All" ]( filter ).eq( 0 );
+ }
+
+ if ( next.length ) {
+ this.menuInstance.focus( event, next );
+ }
+ },
+
+ _getSelectedItem: function() {
+ return this.menuItems.eq( this.element[ 0 ].selectedIndex );
+ },
+
+ _toggle: function( event ) {
+ this[ this.isOpen ? "close" : "open" ]( event );
+ },
+
+ _setSelection: function() {
+ var selection;
+
+ if ( !this.range ) {
+ return;
+ }
+
+ if ( window.getSelection ) {
+ selection = window.getSelection();
+ selection.removeAllRanges();
+ selection.addRange( this.range );
+
+ // support: IE8
+ } else {
+ this.range.select();
+ }
+
+ // support: IE
+ // Setting the text selection kills the button focus in IE, but
+ // restoring the focus doesn't kill the selection.
+ this.button.focus();
+ },
+
+ _documentClick: {
+ mousedown: function( event ) {
+ if ( !this.isOpen ) {
+ return;
+ }
+
+ if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button
).length ) {
+ this.close( event );
+ }
+ }
+ },
+
+ _buttonEvents: {
+
+ // Prevent text selection from being reset when interacting with the selectmenu
(#10144)
+ mousedown: function() {
+ var selection;
+
+ if ( window.getSelection ) {
+ selection = window.getSelection();
+ if ( selection.rangeCount ) {
+ this.range = selection.getRangeAt( 0 );
+ }
+
+ // support: IE8
+ } else {
+ this.range = document.selection.createRange();
+ }
+ },
+
+ click: function( event ) {
+ this._setSelection();
+ this._toggle( event );
+ },
+
+ keydown: function( event ) {
+ var preventDefault = true;
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.TAB:
+ case $.ui.keyCode.ESCAPE:
+ this.close( event );
+ preventDefault = false;
+ break;
+ case $.ui.keyCode.ENTER:
+ if ( this.isOpen ) {
+ this._selectFocusedItem( event );
+ }
+ break;
+ case $.ui.keyCode.UP:
+ if ( event.altKey ) {
+ this._toggle( event );
+ } else {
+ this._move( "prev", event );
+ }
+ break;
+ case $.ui.keyCode.DOWN:
+ if ( event.altKey ) {
+ this._toggle( event );
+ } else {
+ this._move( "next", event );
+ }
+ break;
+ case $.ui.keyCode.SPACE:
+ if ( this.isOpen ) {
+ this._selectFocusedItem( event );
+ } else {
+ this._toggle( event );
+ }
+ break;
+ case $.ui.keyCode.LEFT:
+ this._move( "prev", event );
+ break;
+ case $.ui.keyCode.RIGHT:
+ this._move( "next", event );
+ break;
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.PAGE_UP:
+ this._move( "first", event );
+ break;
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_DOWN:
+ this._move( "last", event );
+ break;
+ default:
+ this.menu.trigger( event );
+ preventDefault = false;
+ }
+
+ if ( preventDefault ) {
+ event.preventDefault();
+ }
+ }
+ },
+
+ _selectFocusedItem: function( event ) {
+ var item = this.menuItems.eq( this.focusIndex );
+ if ( !item.hasClass( "ui-state-disabled" ) ) {
+ this._select( item.data( "ui-selectmenu-item" ), event );
+ }
+ },
+
+ _select: function( item, event ) {
+ var oldIndex = this.element[ 0 ].selectedIndex;
+
+ // Change native select element
+ this.element[ 0 ].selectedIndex = item.index;
+ this._setText( this.buttonText, item.label );
+ this._setAria( item );
+ this._trigger( "select", event, { item: item } );
+
+ if ( item.index !== oldIndex ) {
+ this._trigger( "change", event, { item: item } );
+ }
+
+ this.close( event );
+ },
+
+ _setAria: function( item ) {
+ var id = this.menuItems.eq( item.index ).attr( "id" );
+
+ this.button.attr({
+ "aria-labelledby": id,
+ "aria-activedescendant": id
+ });
+ this.menu.attr( "aria-activedescendant", id );
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "icons" ) {
+ this.button.find( "span.ui-icon" )
+ .removeClass( this.options.icons.button )
+ .addClass( value.button );
+ }
+
+ this._super( key, value );
+
+ if ( key === "appendTo" ) {
+ this.menuWrap.appendTo( this._appendTo() );
+ }
+
+ if ( key === "disabled" ) {
+ this.menuInstance.option( "disabled", value );
+ this.button
+ .toggleClass( "ui-state-disabled", value )
+ .attr( "aria-disabled", value );
+
+ this.element.prop( "disabled", value );
+ if ( value ) {
+ this.button.attr( "tabindex", -1 );
+ this.close();
+ } else {
+ this.button.attr( "tabindex", 0 );
+ }
+ }
+
+ if ( key === "width" ) {
+ this._resizeButton();
+ }
+ },
+
+ _appendTo: function() {
+ var element = this.options.appendTo;
+
+ if ( element ) {
+ element = element.jquery || element.nodeType ?
+ $( element ) :
+ this.document.find( element ).eq( 0 );
+ }
+
+ if ( !element || !element[ 0 ] ) {
+ element = this.element.closest( ".ui-front" );
+ }
+
+ if ( !element.length ) {
+ element = this.document[ 0 ].body;
+ }
+
+ return element;
+ },
+
+ _toggleAttr: function() {
+ this.button
+ .toggleClass( "ui-corner-top", this.isOpen )
+ .toggleClass( "ui-corner-all", !this.isOpen )
+ .attr( "aria-expanded", this.isOpen );
+ this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
+ this.menu.attr( "aria-hidden", !this.isOpen );
+ },
+
+ _resizeButton: function() {
+ var width = this.options.width;
+
+ if ( !width ) {
+ width = this.element.show().outerWidth();
+ this.element.hide();
+ }
+
+ this.button.outerWidth( width );
+ },
+
+ _resizeMenu: function() {
+ this.menu.outerWidth( Math.max(
+ this.button.outerWidth(),
+
+ // support: IE10
+ // IE10 wraps long text (possibly a rounding bug)
+ // so we add 1px to avoid the wrapping
+ this.menu.width( "" ).outerWidth() + 1
+ ) );
+ },
+
+ _getCreateOptions: function() {
+ return { disabled: this.element.prop( "disabled" ) };
+ },
+
+ _parseOptions: function( options ) {
+ var data = [];
+ options.each(function( index, item ) {
+ var option = $( item ),
+ optgroup = option.parent( "optgroup" );
+ data.push({
+ element: option,
+ index: index,
+ value: option.val(),
+ label: option.text(),
+ optgroup: optgroup.attr( "label" ) || "",
+ disabled: optgroup.prop( "disabled" ) || option.prop( "disabled"
)
+ });
+ });
+ this.items = data;
+ },
+
+ _destroy: function() {
+ this.menuWrap.remove();
+ this.button.remove();
+ this.element.show();
+ this.element.removeUniqueId();
+ this.label.attr( "for", this.ids.element );
+ }
+});
+
+
+/*!
+ * jQuery UI Slider 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/slider/
+ */
+
+
+var slider = $.widget( "ui.slider", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "slide",
+
+ options: {
+ animate: false,
+ distance: 0,
+ max: 100,
+ min: 0,
+ orientation: "horizontal",
+ range: false,
+ step: 1,
+ value: 0,
+ values: null,
+
+ // callbacks
+ change: null,
+ slide: null,
+ start: null,
+ stop: null
+ },
+
+ // number of pages in a slider
+ // (how many times can you page up/down to go through the whole range)
+ numPages: 5,
+
+ _create: function() {
+ this._keySliding = false;
+ this._mouseSliding = false;
+ this._animateOff = true;
+ this._handleIndex = null;
+ this._detectOrientation();
+ this._mouseInit();
+ this._calculateNewMax();
+
+ this.element
+ .addClass( "ui-slider" +
+ " ui-slider-" + this.orientation +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all");
+
+ this._refresh();
+ this._setOption( "disabled", this.options.disabled );
+
+ this._animateOff = false;
+ },
+
+ _refresh: function() {
+ this._createRange();
+ this._createHandles();
+ this._setupEvents();
+ this._refreshValue();
+ },
+
+ _createHandles: function() {
+ var i, handleCount,
+ options = this.options,
+ existingHandles = this.element.find( ".ui-slider-handle" ).addClass(
"ui-state-default ui-corner-all" ),
+ handle = "<span class='ui-slider-handle ui-state-default
ui-corner-all' tabindex='0'></span>",
+ handles = [];
+
+ handleCount = ( options.values && options.values.length ) || 1;
+
+ if ( existingHandles.length > handleCount ) {
+ existingHandles.slice( handleCount ).remove();
+ existingHandles = existingHandles.slice( 0, handleCount );
+ }
+
+ for ( i = existingHandles.length; i < handleCount; i++ ) {
+ handles.push( handle );
+ }
+
+ this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo(
this.element ) );
+
+ this.handle = this.handles.eq( 0 );
+
+ this.handles.each(function( i ) {
+ $( this ).data( "ui-slider-handle-index", i );
+ });
+ },
+
+ _createRange: function() {
+ var options = this.options,
+ classes = "";
+
+ if ( options.range ) {
+ if ( options.range === true ) {
+ if ( !options.values ) {
+ options.values = [ this._valueMin(), this._valueMin() ];
+ } else if ( options.values.length && options.values.length !== 2 ) {
+ options.values = [ options.values[0], options.values[0] ];
+ } else if ( $.isArray( options.values ) ) {
+ options.values = options.values.slice(0);
+ }
+ }
+
+ if ( !this.range || !this.range.length ) {
+ this.range = $( "<div></div>" )
+ .appendTo( this.element );
+
+ classes = "ui-slider-range" +
+ // note: this isn't the most fittingly semantic framework class for this
element,
+ // but worked best visually with a variety of themes
+ " ui-widget-header ui-corner-all";
+ } else {
+ this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
+ // Handle range switching from true to min/max
+ .css({
+ "left": "",
+ "bottom": ""
+ });
+ }
+
+ this.range.addClass( classes +
+ ( ( options.range === "min" || options.range === "max" ) ? "
ui-slider-range-" + options.range : "" ) );
+ } else {
+ if ( this.range ) {
+ this.range.remove();
+ }
+ this.range = null;
+ }
+ },
+
+ _setupEvents: function() {
+ this._off( this.handles );
+ this._on( this.handles, this._handleEvents );
+ this._hoverable( this.handles );
+ this._focusable( this.handles );
+ },
+
+ _destroy: function() {
+ this.handles.remove();
+ if ( this.range ) {
+ this.range.remove();
+ }
+
+ this.element
+ .removeClass( "ui-slider" +
+ " ui-slider-horizontal" +
+ " ui-slider-vertical" +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" );
+
+ this._mouseDestroy();
+ },
+
+ _mouseCapture: function( event ) {
+ var position, normValue, distance, closestHandle, index, allowed, offset,
mouseOverHandle,
+ that = this,
+ o = this.options;
+
+ if ( o.disabled ) {
+ return false;
+ }
+
+ this.elementSize = {
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight()
+ };
+ this.elementOffset = this.element.offset();
+
+ position = { x: event.pageX, y: event.pageY };
+ normValue = this._normValueFromMouse( position );
+ distance = this._valueMax() - this._valueMin() + 1;
+ this.handles.each(function( i ) {
+ var thisDistance = Math.abs( normValue - that.values(i) );
+ if (( distance > thisDistance ) ||
+ ( distance === thisDistance &&
+ (i === that._lastChangedValue || that.values(i) === o.min ))) {
+ distance = thisDistance;
+ closestHandle = $( this );
+ index = i;
+ }
+ });
+
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return false;
+ }
+ this._mouseSliding = true;
+
+ this._handleIndex = index;
+
+ closestHandle
+ .addClass( "ui-state-active" )
+ .focus();
+
+ offset = closestHandle.offset();
+ mouseOverHandle = !$( event.target ).parents().addBack().is(
".ui-slider-handle" );
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+ top: event.pageY - offset.top -
+ ( closestHandle.height() / 2 ) -
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+ };
+
+ if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+ this._slide( event, index, normValue );
+ }
+ this._animateOff = true;
+ return true;
+ },
+
+ _mouseStart: function() {
+ return true;
+ },
+
+ _mouseDrag: function( event ) {
+ var position = { x: event.pageX, y: event.pageY },
+ normValue = this._normValueFromMouse( position );
+
+ this._slide( event, this._handleIndex, normValue );
+
+ return false;
+ },
+
+ _mouseStop: function( event ) {
+ this.handles.removeClass( "ui-state-active" );
+ this._mouseSliding = false;
+
+ this._stop( event, this._handleIndex );
+ this._change( event, this._handleIndex );
+
+ this._handleIndex = null;
+ this._clickOffset = null;
+ this._animateOff = false;
+
+ return false;
+ },
+
+ _detectOrientation: function() {
+ this.orientation = ( this.options.orientation === "vertical" ) ?
"vertical" : "horizontal";
+ },
+
+ _normValueFromMouse: function( position ) {
+ var pixelTotal,
+ pixelMouse,
+ percentMouse,
+ valueTotal,
+ valueMouse;
+
+ if ( this.orientation === "horizontal" ) {
+ pixelTotal = this.elementSize.width;
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ?
this._clickOffset.left : 0 );
+ } else {
+ pixelTotal = this.elementSize.height;
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ?
this._clickOffset.top : 0 );
+ }
+
+ percentMouse = ( pixelMouse / pixelTotal );
+ if ( percentMouse > 1 ) {
+ percentMouse = 1;
+ }
+ if ( percentMouse < 0 ) {
+ percentMouse = 0;
+ }
+ if ( this.orientation === "vertical" ) {
+ percentMouse = 1 - percentMouse;
+ }
+
+ valueTotal = this._valueMax() - this._valueMin();
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+ return this._trimAlignValue( valueMouse );
+ },
+
+ _start: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+ return this._trigger( "start", event, uiHash );
+ },
+
+ _slide: function( event, index, newVal ) {
+ var otherVal,
+ newValues,
+ allowed;
+
+ if ( this.options.values && this.options.values.length ) {
+ otherVal = this.values( index ? 0 : 1 );
+
+ if ( ( this.options.values.length === 2 && this.options.range === true )
&&
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal
< otherVal ) )
+ ) {
+ newVal = otherVal;
+ }
+
+ if ( newVal !== this.values( index ) ) {
+ newValues = this.values();
+ newValues[ index ] = newVal;
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal,
+ values: newValues
+ } );
+ otherVal = this.values( index ? 0 : 1 );
+ if ( allowed !== false ) {
+ this.values( index, newVal );
+ }
+ }
+ } else {
+ if ( newVal !== this.value() ) {
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal
+ } );
+ if ( allowed !== false ) {
+ this.value( newVal );
+ }
+ }
+ }
+ },
+
+ _stop: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "stop", event, uiHash );
+ },
+
+ _change: function( event, index ) {
+ if ( !this._keySliding && !this._mouseSliding ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ //store the last changed value index for reference when handles overlap
+ this._lastChangedValue = index;
+
+ this._trigger( "change", event, uiHash );
+ }
+ },
+
+ value: function( newValue ) {
+ if ( arguments.length ) {
+ this.options.value = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, 0 );
+ return;
+ }
+
+ return this._value();
+ },
+
+ values: function( index, newValue ) {
+ var vals,
+ newValues,
+ i;
+
+ if ( arguments.length > 1 ) {
+ this.options.values[ index ] = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, index );
+ return;
+ }
+
+ if ( arguments.length ) {
+ if ( $.isArray( arguments[ 0 ] ) ) {
+ vals = this.options.values;
+ newValues = arguments[ 0 ];
+ for ( i = 0; i < vals.length; i += 1 ) {
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
+ this._change( null, i );
+ }
+ this._refreshValue();
+ } else {
+ if ( this.options.values && this.options.values.length ) {
+ return this._values( index );
+ } else {
+ return this.value();
+ }
+ }
+ } else {
+ return this._values();
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var i,
+ valsLength = 0;
+
+ if ( key === "range" && this.options.range === true ) {
+ if ( value === "min" ) {
+ this.options.value = this._values( 0 );
+ this.options.values = null;
+ } else if ( value === "max" ) {
+ this.options.value = this._values( this.options.values.length - 1 );
+ this.options.values = null;
+ }
+ }
+
+ if ( $.isArray( this.options.values ) ) {
+ valsLength = this.options.values.length;
+ }
+
+ if ( key === "disabled" ) {
+ this.element.toggleClass( "ui-state-disabled", !!value );
+ }
+
+ this._super( key, value );
+
+ switch ( key ) {
+ case "orientation":
+ this._detectOrientation();
+ this.element
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+ .addClass( "ui-slider-" + this.orientation );
+ this._refreshValue();
+
+ // Reset positioning from previous orientation
+ this.handles.css( value === "horizontal" ? "bottom" :
"left", "" );
+ break;
+ case "value":
+ this._animateOff = true;
+ this._refreshValue();
+ this._change( null, 0 );
+ this._animateOff = false;
+ break;
+ case "values":
+ this._animateOff = true;
+ this._refreshValue();
+ for ( i = 0; i < valsLength; i += 1 ) {
+ this._change( null, i );
+ }
+ this._animateOff = false;
+ break;
+ case "step":
+ case "min":
+ case "max":
+ this._animateOff = true;
+ this._calculateNewMax();
+ this._refreshValue();
+ this._animateOff = false;
+ break;
+ case "range":
+ this._animateOff = true;
+ this._refresh();
+ this._animateOff = false;
+ break;
+ }
+ },
+
+ //internal value getter
+ // _value() returns value trimmed by min and max, aligned by step
+ _value: function() {
+ var val = this.options.value;
+ val = this._trimAlignValue( val );
+
+ return val;
+ },
+
+ //internal values getter
+ // _values() returns array of values trimmed by min and max, aligned by step
+ // _values( index ) returns single value trimmed by min and max, aligned by step
+ _values: function( index ) {
+ var val,
+ vals,
+ i;
+
+ if ( arguments.length ) {
+ val = this.options.values[ index ];
+ val = this._trimAlignValue( val );
+
+ return val;
+ } else if ( this.options.values && this.options.values.length ) {
+ // .slice() creates a copy of the array
+ // this copy gets trimmed by min and max and then returned
+ vals = this.options.values.slice();
+ for ( i = 0; i < vals.length; i += 1) {
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
+ }
+
+ return vals;
+ } else {
+ return [];
+ }
+ },
+
+ // returns the step-aligned value that val is closest to, between (inclusive) min and
max
+ _trimAlignValue: function( val ) {
+ if ( val <= this._valueMin() ) {
+ return this._valueMin();
+ }
+ if ( val >= this._valueMax() ) {
+ return this._valueMax();
+ }
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
+ valModStep = (val - this._valueMin()) % step,
+ alignValue = val - valModStep;
+
+ if ( Math.abs(valModStep) * 2 >= step ) {
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
+ }
+
+ // Since JavaScript has problems with large floats, round
+ // the final value to 5 digits after the decimal point (see #4124)
+ return parseFloat( alignValue.toFixed(5) );
+ },
+
+ _calculateNewMax: function() {
+ var max = this.options.max,
+ min = this._valueMin(),
+ step = this.options.step,
+ aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) *
step;
+ max = aboveMin + min;
+ this.max = parseFloat( max.toFixed( this._precision() ) );
+ },
+
+ _precision: function() {
+ var precision = this._precisionOf( this.options.step );
+ if ( this.options.min !== null ) {
+ precision = Math.max( precision, this._precisionOf( this.options.min ) );
+ }
+ return precision;
+ },
+
+ _precisionOf: function( num ) {
+ var str = num.toString(),
+ decimal = str.indexOf( "." );
+ return decimal === -1 ? 0 : str.length - decimal - 1;
+ },
+
+ _valueMin: function() {
+ return this.options.min;
+ },
+
+ _valueMax: function() {
+ return this.max;
+ },
+
+ _refreshValue: function() {
+ var lastValPercent, valPercent, value, valueMin, valueMax,
+ oRange = this.options.range,
+ o = this.options,
+ that = this,
+ animate = ( !this._animateOff ) ? o.animate : false,
+ _set = {};
+
+ if ( this.options.values && this.options.values.length ) {
+ this.handles.each(function( i ) {
+ valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() -
that._valueMin() ) * 100;
+ _set[ that.orientation === "horizontal" ? "left" :
"bottom" ] = valPercent + "%";
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set,
o.animate );
+ if ( that.options.range === true ) {
+ if ( that.orientation === "horizontal" ) {
+ if ( i === 0 ) {
+ that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
left: valPercent + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ that.range[ animate ? "animate" : "css" ]( { width: (
valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ } else {
+ if ( i === 0 ) {
+ that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
bottom: ( valPercent ) + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ that.range[ animate ? "animate" : "css" ]( { height: (
valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+ lastValPercent = valPercent;
+ });
+ } else {
+ value = this.value();
+ valueMin = this._valueMin();
+ valueMax = this._valueMax();
+ valPercent = ( valueMax !== valueMin ) ?
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+ 0;
+ _set[ this.orientation === "horizontal" ? "left" :
"bottom" ] = valPercent + "%";
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set,
o.animate );
+
+ if ( oRange === "min" && this.orientation === "horizontal"
) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width:
valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "horizontal"
) {
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 -
valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ if ( oRange === "min" && this.orientation === "vertical" )
{
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height:
valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "vertical" )
{
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 -
valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ },
+
+ _handleEvents: {
+ keydown: function( event ) {
+ var allowed, curVal, newVal, step,
+ index = $( event.target ).data( "ui-slider-handle-index" );
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_UP:
+ case $.ui.keyCode.PAGE_DOWN:
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ event.preventDefault();
+ if ( !this._keySliding ) {
+ this._keySliding = true;
+ $( event.target ).addClass( "ui-state-active" );
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return;
+ }
+ }
+ break;
+ }
+
+ step = this.options.step;
+ if ( this.options.values && this.options.values.length ) {
+ curVal = newVal = this.values( index );
+ } else {
+ curVal = newVal = this.value();
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ newVal = this._valueMin();
+ break;
+ case $.ui.keyCode.END:
+ newVal = this._valueMax();
+ break;
+ case $.ui.keyCode.PAGE_UP:
+ newVal = this._trimAlignValue(
+ curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
+ );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ newVal = this._trimAlignValue(
+ curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ if ( curVal === this._valueMax() ) {
+ return;
+ }
+ newVal = this._trimAlignValue( curVal + step );
+ break;
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ if ( curVal === this._valueMin() ) {
+ return;
+ }
+ newVal = this._trimAlignValue( curVal - step );
+ break;
+ }
+
+ this._slide( event, index, newVal );
+ },
+ keyup: function( event ) {
+ var index = $( event.target ).data( "ui-slider-handle-index" );
+
+ if ( this._keySliding ) {
+ this._keySliding = false;
+ this._stop( event, index );
+ this._change( event, index );
+ $( event.target ).removeClass( "ui-state-active" );
+ }
+ }
+ }
+});
+
+
+/*!
+ * jQuery UI Sortable 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/sortable/
+ */
+
+
+var sortable = $.widget("ui.sortable", $.ui.mouse, {
+ version: "1.11.4",
+ widgetEventPrefix: "sort",
+ ready: false,
+ options: {
+ appendTo: "parent",
+ axis: false,
+ connectWith: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ dropOnEmpty: true,
+ forcePlaceholderSize: false,
+ forceHelperSize: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ items: "> *",
+ opacity: false,
+ placeholder: false,
+ revert: false,
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ scope: "default",
+ tolerance: "intersect",
+ zIndex: 1000,
+
+ // callbacks
+ activate: null,
+ beforeStop: null,
+ change: null,
+ deactivate: null,
+ out: null,
+ over: null,
+ receive: null,
+ remove: null,
+ sort: null,
+ start: null,
+ stop: null,
+ update: null
+ },
+
+ _isOverAxis: function( x, reference, size ) {
+ return ( x >= reference ) && ( x < ( reference + size ) );
+ },
+
+ _isFloating: function( item ) {
+ return (/left|right/).test(item.css("float")) ||
(/inline|table-cell/).test(item.css("display"));
+ },
+
+ _create: function() {
+ this.containerCache = {};
+ this.element.addClass("ui-sortable");
+
+ //Get the items
+ this.refresh();
+
+ //Let's determine the parent's offset
+ this.offset = this.element.offset();
+
+ //Initialize mouse events for interaction
+ this._mouseInit();
+
+ this._setHandleClassName();
+
+ //We're ready to go
+ this.ready = true;
+
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+
+ if ( key === "handle" ) {
+ this._setHandleClassName();
+ }
+ },
+
+ _setHandleClassName: function() {
+ this.element.find( ".ui-sortable-handle" ).removeClass(
"ui-sortable-handle" );
+ $.each( this.items, function() {
+ ( this.instance.options.handle ?
+ this.item.find( this.instance.options.handle ) : this.item )
+ .addClass( "ui-sortable-handle" );
+ });
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-sortable ui-sortable-disabled" )
+ .find( ".ui-sortable-handle" )
+ .removeClass( "ui-sortable-handle" );
+ this._mouseDestroy();
+
+ for ( var i = this.items.length - 1; i >= 0; i-- ) {
+ this.items[i].item.removeData(this.widgetName + "-item");
+ }
+
+ return this;
+ },
+
+ _mouseCapture: function(event, overrideHandle) {
+ var currentItem = null,
+ validHandle = false,
+ that = this;
+
+ if (this.reverting) {
+ return false;
+ }
+
+ if(this.options.disabled || this.options.type === "static") {
+ return false;
+ }
+
+ //We have to refresh the items data once first
+ this._refreshItems(event);
+
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
+ $(event.target).parents().each(function() {
+ if($.data(this, that.widgetName + "-item") === that) {
+ currentItem = $(this);
+ return false;
+ }
+ });
+ if($.data(event.target, that.widgetName + "-item") === that) {
+ currentItem = $(event.target);
+ }
+
+ if(!currentItem) {
+ return false;
+ }
+ if(this.options.handle && !overrideHandle) {
+ $(this.options.handle, currentItem).find("*").addBack().each(function() {
+ if(this === event.target) {
+ validHandle = true;
+ }
+ });
+ if(!validHandle) {
+ return false;
+ }
+ }
+
+ this.currentItem = currentItem;
+ this._removeCurrentsFromItems();
+ return true;
+
+ },
+
+ _mouseStart: function(event, overrideHandle, noActivation) {
+
+ var i, body,
+ o = this.options;
+
+ this.currentContainer = this;
+
+ //We only need to call refreshPositions, because the refreshItems call has been moved
to mouseCapture
+ this.refreshPositions();
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Get the next scrolling parent
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.currentItem.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus
the actual position calculation - only used for relative positioned helper
+ });
+
+ // Only after we got the offset, we can change the helper's position to absolute
+ // TODO: Still need to figure out a way to make relative sorting possible
+ this.helper.css("position", "absolute");
+ this.cssPosition = this.helper.css("position");
+
+ //Generate the original position
+ this.originalPosition = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Cache the former DOM position
+ this.domPosition = { prev: this.currentItem.prev()[0], parent:
this.currentItem.parent()[0] };
+
+ //If the helper is not the original, hide the original so it's not playing any role
during the drag, won't cause anything bad this way
+ if(this.helper[0] !== this.currentItem[0]) {
+ this.currentItem.hide();
+ }
+
+ //Create the placeholder
+ this._createPlaceholder();
+
+ //Set a containment if given in the options
+ if(o.containment) {
+ this._setContainment();
+ }
+
+ if( o.cursor && o.cursor !== "auto" ) { // cursor option
+ body = this.document.find( "body" );
+
+ // support: IE
+ this.storedCursor = body.css( "cursor" );
+ body.css( "cursor", o.cursor );
+
+ this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+"
!important; }</style>" ).appendTo( body );
+ }
+
+ if(o.opacity) { // opacity option
+ if (this.helper.css("opacity")) {
+ this._storedOpacity = this.helper.css("opacity");
+ }
+ this.helper.css("opacity", o.opacity);
+ }
+
+ if(o.zIndex) { // zIndex option
+ if (this.helper.css("zIndex")) {
+ this._storedZIndex = this.helper.css("zIndex");
+ }
+ this.helper.css("zIndex", o.zIndex);
+ }
+
+ //Prepare scrolling
+ if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName
!== "HTML") {
+ this.overflowOffset = this.scrollParent.offset();
+ }
+
+ //Call callbacks
+ this._trigger("start", event, this._uiHash());
+
+ //Recache the helper size
+ if(!this._preserveHelperProportions) {
+ this._cacheHelperProportions();
+ }
+
+
+ //Post "activate" events to possible containers
+ if( !noActivation ) {
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
+ this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
+ }
+ }
+
+ //Prepare possible droppables
+ if($.ui.ddmanager) {
+ $.ui.ddmanager.current = this;
+ }
+
+ if ($.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ this.dragging = true;
+
+ this.helper.addClass("ui-sortable-helper");
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be
visible before getting its correct position
+ return true;
+
+ },
+
+ _mouseDrag: function(event) {
+ var i, item, itemElement, intersection,
+ o = this.options,
+ scrolled = false;
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ if (!this.lastPositionAbs) {
+ this.lastPositionAbs = this.positionAbs;
+ }
+
+ //Do scrolling
+ if(this.options.scroll) {
+ if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName
!== "HTML") {
+
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY <
o.scrollSensitivity) {
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop +
o.scrollSpeed;
+ } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop -
o.scrollSpeed;
+ }
+
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX <
o.scrollSensitivity) {
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft +
o.scrollSpeed;
+ } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft -
o.scrollSpeed;
+ }
+
+ } else {
+
+ if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
+ scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
+ } else if(this.window.height() - (event.pageY - this.document.scrollTop()) <
o.scrollSensitivity) {
+ scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
+ }
+
+ if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
+ scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
+ } else if(this.window.width() - (event.pageX - this.document.scrollLeft()) <
o.scrollSensitivity) {
+ scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
+ }
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+ }
+
+ //Regenerate the absolute position used for position checks
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Set the helper position
+ if(!this.options.axis || this.options.axis !== "y") {
+ this.helper[0].style.left = this.position.left+"px";
+ }
+ if(!this.options.axis || this.options.axis !== "x") {
+ this.helper[0].style.top = this.position.top+"px";
+ }
+
+ //Rearrange
+ for (i = this.items.length - 1; i >= 0; i--) {
+
+ //Cache variables and intersection, continue if no intersection
+ item = this.items[i];
+ itemElement = item.item[0];
+ intersection = this._intersectsWithPointer(item);
+ if (!intersection) {
+ continue;
+ }
+
+ // Only put the placeholder inside the current Container, skip all
+ // items from other containers. This works because when moving
+ // an item from one container to another the
+ // currentContainer is switched before the placeholder is moved.
+ //
+ // Without this, moving items in "sub-sortables" can cause
+ // the placeholder to jitter between the outer and inner container.
+ if (item.instance !== this.currentContainer) {
+ continue;
+ }
+
+ // cannot intersect with itself
+ // no useless actions that have been done before
+ // no action if the item moved is the parent of the item checked
+ if (itemElement !== this.currentItem[0] &&
+ this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !==
itemElement &&
+ !$.contains(this.placeholder[0], itemElement) &&
+ (this.options.type === "semi-dynamic" ? !$.contains(this.element[0],
itemElement) : true)
+ ) {
+
+ this.direction = intersection === 1 ? "down" : "up";
+
+ if (this.options.tolerance === "pointer" ||
this._intersectsWithSides(item)) {
+ this._rearrange(event, item);
+ } else {
+ break;
+ }
+
+ this._trigger("change", event, this._uiHash());
+ break;
+ }
+ }
+
+ //Post events to containers
+ this._contactContainers(event);
+
+ //Interconnect with droppables
+ if($.ui.ddmanager) {
+ $.ui.ddmanager.drag(this, event);
+ }
+
+ //Call callbacks
+ this._trigger("sort", event, this._uiHash());
+
+ this.lastPositionAbs = this.positionAbs;
+ return false;
+
+ },
+
+ _mouseStop: function(event, noPropagation) {
+
+ if(!event) {
+ return;
+ }
+
+ //If we are using droppables, inform the manager about the drop
+ if ($.ui.ddmanager && !this.options.dropBehaviour) {
+ $.ui.ddmanager.drop(this, event);
+ }
+
+ if(this.options.revert) {
+ var that = this,
+ cur = this.placeholder.offset(),
+ axis = this.options.axis,
+ animation = {};
+
+ if ( !axis || axis === "x" ) {
+ animation.left = cur.left - this.offset.parent.left - this.margins.left +
(this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
+ }
+ if ( !axis || axis === "y" ) {
+ animation.top = cur.top - this.offset.parent.top - this.margins.top +
(this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
+ }
+ this.reverting = true;
+ $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500,
function() {
+ that._clear(event);
+ });
+ } else {
+ this._clear(event, noPropagation);
+ }
+
+ return false;
+
+ },
+
+ cancel: function() {
+
+ if(this.dragging) {
+
+ this._mouseUp({ target: null });
+
+ if(this.options.helper === "original") {
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ //Post deactivating events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ this.containers[i]._trigger("deactivate", null, this._uiHash(this));
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", null, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ if (this.placeholder) {
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it
unbinds ALL events from the original node!
+ if(this.placeholder[0].parentNode) {
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+ }
+ if(this.options.helper !== "original" && this.helper &&
this.helper[0].parentNode) {
+ this.helper.remove();
+ }
+
+ $.extend(this, {
+ helper: null,
+ dragging: false,
+ reverting: false,
+ _noFinalSort: null
+ });
+
+ if(this.domPosition.prev) {
+ $(this.domPosition.prev).after(this.currentItem);
+ } else {
+ $(this.domPosition.parent).prepend(this.currentItem);
+ }
+ }
+
+ return this;
+
+ },
+
+ serialize: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected),
+ str = [];
+ o = o || {};
+
+ $(items).each(function() {
+ var res = ($(o.item || this).attr(o.attribute || "id") ||
"").match(o.expression || (/(.+)[\-=_](.+)/));
+ if (res) {
+ str.push((o.key || res[1]+"[]")+"="+(o.key &&
o.expression ? res[1] : res[2]));
+ }
+ });
+
+ if(!str.length && o.key) {
+ str.push(o.key + "=");
+ }
+
+ return str.join("&");
+
+ },
+
+ toArray: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected),
+ ret = [];
+
+ o = o || {};
+
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id")
|| ""); });
+ return ret;
+
+ },
+
+ /* Be careful with the following core functions */
+ _intersectsWith: function(item) {
+
+ var x1 = this.positionAbs.left,
+ x2 = x1 + this.helperProportions.width,
+ y1 = this.positionAbs.top,
+ y2 = y1 + this.helperProportions.height,
+ l = item.left,
+ r = l + item.width,
+ t = item.top,
+ b = t + item.height,
+ dyClick = this.offset.click.top,
+ dxClick = this.offset.click.left,
+ isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick )
> t && ( y1 + dyClick ) < b ),
+ isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick )
> l && ( x1 + dxClick ) < r ),
+ isOverElement = isOverElementHeight && isOverElementWidth;
+
+ if ( this.options.tolerance === "pointer" ||
+ this.options.forcePointerForContainers ||
+ (this.options.tolerance !== "pointer" &&
this.helperProportions[this.floating ? "width" : "height"] >
item[this.floating ? "width" : "height"])
+ ) {
+ return isOverElement;
+ } else {
+
+ return (l < x1 + (this.helperProportions.width / 2) && // Right Half
+ x2 - (this.helperProportions.width / 2) < r && // Left Half
+ t < y1 + (this.helperProportions.height / 2) && // Bottom Half
+ y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+ }
+ },
+
+ _intersectsWithPointer: function(item) {
+
+ var isOverElementHeight = (this.options.axis === "x") ||
this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+ isOverElementWidth = (this.options.axis === "y") ||
this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+ isOverElement = isOverElementHeight && isOverElementWidth,
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (!isOverElement) {
+ return false;
+ }
+
+ return this.floating ?
+ ( ((horizontalDirection && horizontalDirection === "right") ||
verticalDirection === "down") ? 2 : 1 )
+ : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
+
+ },
+
+ _intersectsWithSides: function(item) {
+
+ var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top,
item.top + (item.height/2), item.height),
+ isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left,
item.left + (item.width/2), item.width),
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (this.floating && horizontalDirection) {
+ return ((horizontalDirection === "right" && isOverRightHalf) ||
(horizontalDirection === "left" && !isOverRightHalf));
+ } else {
+ return verticalDirection && ((verticalDirection === "down"
&& isOverBottomHalf) || (verticalDirection === "up" &&
!isOverBottomHalf));
+ }
+
+ },
+
+ _getDragVerticalDirection: function() {
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
+ return delta !== 0 && (delta > 0 ? "down" : "up");
+ },
+
+ _getDragHorizontalDirection: function() {
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
+ return delta !== 0 && (delta > 0 ? "right" : "left");
+ },
+
+ refresh: function(event) {
+ this._refreshItems(event);
+ this._setHandleClassName();
+ this.refreshPositions();
+ return this;
+ },
+
+ _connectWith: function() {
+ var options = this.options;
+ return options.connectWith.constructor === String ? [options.connectWith] :
options.connectWith;
+ },
+
+ _getItemsAsjQuery: function(connected) {
+
+ var i, j, cur, inst,
+ items = [],
+ queries = [],
+ connectWith = this._connectWith();
+
+ if(connectWith && connected) {
+ for (i = connectWith.length - 1; i >= 0; i--){
+ cur = $(connectWith[i], this.document[0]);
+ for ( j = cur.length - 1; j >= 0; j--){
+ inst = $.data(cur[j], this.widgetFullName);
+ if(inst && inst !== this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ?
inst.options.items.call(inst.element) : $(inst.options.items,
inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
inst]);
+ }
+ }
+ }
+ }
+
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element,
null, { options: this.options, item: this.currentItem }) : $(this.options.items,
this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
this]);
+
+ function addItems() {
+ items.push( this );
+ }
+ for (i = queries.length - 1; i >= 0; i--){
+ queries[i][0].each( addItems );
+ }
+
+ return $(items);
+
+ },
+
+ _removeCurrentsFromItems: function() {
+
+ var list = this.currentItem.find(":data(" + this.widgetName +
"-item)");
+
+ this.items = $.grep(this.items, function (item) {
+ for (var j=0; j < list.length; j++) {
+ if(list[j] === item.item[0]) {
+ return false;
+ }
+ }
+ return true;
+ });
+
+ },
+
+ _refreshItems: function(event) {
+
+ this.items = [];
+ this.containers = [this];
+
+ var i, j, cur, inst, targetData, _queries, item, queriesLength,
+ items = this.items,
+ queries = [[$.isFunction(this.options.items) ?
this.options.items.call(this.element[0], event, { item: this.currentItem }) :
$(this.options.items, this.element), this]],
+ connectWith = this._connectWith();
+
+ if(connectWith && this.ready) { //Shouldn't be run the first time through
due to massive slow-down
+ for (i = connectWith.length - 1; i >= 0; i--){
+ cur = $(connectWith[i], this.document[0]);
+ for (j = cur.length - 1; j >= 0; j--){
+ inst = $.data(cur[j], this.widgetFullName);
+ if(inst && inst !== this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ?
inst.options.items.call(inst.element[0], event, { item: this.currentItem }) :
$(inst.options.items, inst.element), inst]);
+ this.containers.push(inst);
+ }
+ }
+ }
+ }
+
+ for (i = queries.length - 1; i >= 0; i--) {
+ targetData = queries[i][1];
+ _queries = queries[i][0];
+
+ for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+ item = $(_queries[j]);
+
+ item.data(this.widgetName + "-item", targetData); // Data for target
checking (mouse manager)
+
+ items.push({
+ item: item,
+ instance: targetData,
+ width: 0, height: 0,
+ left: 0, top: 0
+ });
+ }
+ }
+
+ },
+
+ refreshPositions: function(fast) {
+
+ // Determine whether items are being displayed horizontally
+ this.floating = this.items.length ?
+ this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
+ false;
+
+ //This has to be redone because due to the item being moved out/into the offsetParent,
the offsetParent's position will change
+ if(this.offsetParent && this.helper) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ var i, item, t, p;
+
+ for (i = this.items.length - 1; i >= 0; i--){
+ item = this.items[i];
+
+ //We ignore calculating positions of all connected containers when we're not over
them
+ if(item.instance !== this.currentContainer && this.currentContainer &&
item.item[0] !== this.currentItem[0]) {
+ continue;
+ }
+
+ t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) :
item.item;
+
+ if (!fast) {
+ item.width = t.outerWidth();
+ item.height = t.outerHeight();
+ }
+
+ p = t.offset();
+ item.left = p.left;
+ item.top = p.top;
+ }
+
+ if(this.options.custom && this.options.custom.refreshContainers) {
+ this.options.custom.refreshContainers.call(this);
+ } else {
+ for (i = this.containers.length - 1; i >= 0; i--){
+ p = this.containers[i].element.offset();
+ this.containers[i].containerCache.left = p.left;
+ this.containers[i].containerCache.top = p.top;
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+ }
+ }
+
+ return this;
+ },
+
+ _createPlaceholder: function(that) {
+ that = that || this;
+ var className,
+ o = that.options;
+
+ if(!o.placeholder || o.placeholder.constructor === String) {
+ className = o.placeholder;
+ o.placeholder = {
+ element: function() {
+
+ var nodeName = that.currentItem[0].nodeName.toLowerCase(),
+ element = $( "<" + nodeName + ">", that.document[0] )
+ .addClass(className || that.currentItem[0].className+"
ui-sortable-placeholder")
+ .removeClass("ui-sortable-helper");
+
+ if ( nodeName === "tbody" ) {
+ that._createTrPlaceholder(
+ that.currentItem.find( "tr" ).eq( 0 ),
+ $( "<tr>", that.document[ 0 ] ).appendTo( element )
+ );
+ } else if ( nodeName === "tr" ) {
+ that._createTrPlaceholder( that.currentItem, element );
+ } else if ( nodeName === "img" ) {
+ element.attr( "src", that.currentItem.attr( "src" ) );
+ }
+
+ if ( !className ) {
+ element.css( "visibility", "hidden" );
+ }
+
+ return element;
+ },
+ update: function(container, p) {
+
+ // 1. If a className is set as 'placeholder option, we don't force sizes -
the class is responsible for that
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a
class name is specified
+ if(className && !o.forcePlaceholderSize) {
+ return;
+ }
+
+ //If the element doesn't have a actual height by itself (without styles coming
from a stylesheet), it receives the inline height from the dragged item
+ if(!p.height()) { p.height(that.currentItem.innerHeight() -
parseInt(that.currentItem.css("paddingTop")||0, 10) -
parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
+ if(!p.width()) { p.width(that.currentItem.innerWidth() -
parseInt(that.currentItem.css("paddingLeft")||0, 10) -
parseInt(that.currentItem.css("paddingRight")||0, 10)); }
+ }
+ };
+ }
+
+ //Create the placeholder
+ that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
+
+ //Append it after the actual current item
+ that.currentItem.after(that.placeholder);
+
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+ o.placeholder.update(that, that.placeholder);
+
+ },
+
+ _createTrPlaceholder: function( sourceTr, targetTr ) {
+ var that = this;
+
+ sourceTr.children().each(function() {
+ $( "<td> </td>", that.document[ 0 ] )
+ .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
+ .appendTo( targetTr );
+ });
+ },
+
+ _contactContainers: function(event) {
+ var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
floating, axis,
+ innermostContainer = null,
+ innermostIndex = null;
+
+ // get innermost container that intersects with item
+ for (i = this.containers.length - 1; i >= 0; i--) {
+
+ // never consider a container that's located within the item itself
+ if($.contains(this.currentItem[0], this.containers[i].element[0])) {
+ continue;
+ }
+
+ if(this._intersectsWith(this.containers[i].containerCache)) {
+
+ // if we've already found a container and it's more "inner" than
this, then continue
+ if(innermostContainer && $.contains(this.containers[i].element[0],
innermostContainer.element[0])) {
+ continue;
+ }
+
+ innermostContainer = this.containers[i];
+ innermostIndex = i;
+
+ } else {
+ // container doesn't intersect. trigger "out" event if necessary
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", event, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ // if no intersecting containers found, return
+ if(!innermostContainer) {
+ return;
+ }
+
+ // move the item into the container if it's not there already
+ if(this.containers.length === 1) {
+ if (!this.containers[innermostIndex].containerCache.over) {
+ this.containers[innermostIndex]._trigger("over", event,
this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+ } else {
+
+ //When entering a new container, we will find the item with the least distance and
append our item near it
+ dist = 10000;
+ itemWithLeastDistance = null;
+ floating = innermostContainer.floating || this._isFloating(this.currentItem);
+ posProperty = floating ? "left" : "top";
+ sizeProperty = floating ? "width" : "height";
+ axis = floating ? "clientX" : "clientY";
+
+ for (j = this.items.length - 1; j >= 0; j--) {
+ if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
+ continue;
+ }
+ if(this.items[j].item[0] === this.currentItem[0]) {
+ continue;
+ }
+
+ cur = this.items[j].item.offset()[posProperty];
+ nearBottom = false;
+ if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
+ nearBottom = true;
+ }
+
+ if ( Math.abs( event[ axis ] - cur ) < dist ) {
+ dist = Math.abs( event[ axis ] - cur );
+ itemWithLeastDistance = this.items[ j ];
+ this.direction = nearBottom ? "up": "down";
+ }
+ }
+
+ //Check if dropOnEmpty is enabled
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
+ return;
+ }
+
+ if(this.currentContainer === this.containers[innermostIndex]) {
+ if ( !this.currentContainer.containerCache.over ) {
+ this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash()
);
+ this.currentContainer.containerCache.over = 1;
+ }
+ return;
+ }
+
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) :
this._rearrange(event, null, this.containers[innermostIndex].element, true);
+ this._trigger("change", event, this._uiHash());
+ this.containers[innermostIndex]._trigger("change", event,
this._uiHash(this));
+ this.currentContainer = this.containers[innermostIndex];
+
+ //Update the placeholder
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+ this.containers[innermostIndex]._trigger("over", event,
this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options,
+ helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event,
this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() :
this.currentItem);
+
+ //Add the helper to the DOM if that didn't happen already
+ if(!helper.parents("body").length) {
+ $(o.appendTo !== "parent" ? o.appendTo :
this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+ }
+
+ if(helper[0] === this.currentItem[0]) {
+ this._storedCSS = { width: this.currentItem[0].style.width, height:
this.currentItem[0].style.height, position: this.currentItem.css("position"),
top: this.currentItem.css("top"), left: this.currentItem.css("left")
};
+ }
+
+ if(!helper[0].style.width || o.forceHelperSize) {
+ helper.width(this.currentItem.width());
+ }
+ if(!helper[0].style.height || o.forceHelperSize) {
+ helper.height(this.currentItem.height());
+ }
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj === "string") {
+ obj = obj.split(" ");
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ("left" in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ("right" in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right +
this.margins.left;
+ }
+ if ("top" in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ("bottom" in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom +
this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since
the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based
on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent
isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent,
and never recalculated upon drag
+ if(this.cssPosition === "absolute" && this.scrollParent[0] !==
this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ // This needs to be actually done for all browsers, since pageX/pageY includes this
information
+ // with an ugly IE fix
+ if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName
&& this.offsetParent[0].tagName.toLowerCase() === "html" &&
$.ui.ie)) {
+ po = { top: 0, left: 0 };
+ }
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) ||
0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition === "relative") {
+ var p = this.currentItem.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) +
this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) +
this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var ce, co, over,
+ o = this.options;
+ if(o.containment === "parent") {
+ o.containment = this.helper[0].parentNode;
+ }
+ if(o.containment === "document" || o.containment === "window") {
+ this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ o.containment === "document" ? this.document.width() : this.window.width()
- this.helperProportions.width - this.margins.left,
+ (o.containment === "document" ? this.document.width() :
this.window.height() || this.document[0].body.parentNode.scrollHeight) -
this.helperProportions.height - this.margins.top
+ ];
+ }
+
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
+ ce = $(o.containment)[0];
+ co = $(o.containment).offset();
+ over = ($(ce).css("overflow") !== "hidden");
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) +
(parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) +
(parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) -
(parseInt($(ce).css("borderLeftWidth"),10) || 0) -
(parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width -
this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) -
(parseInt($(ce).css("borderTopWidth"),10) || 0) -
(parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height -
this.margins.top
+ ];
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) {
+ pos = this.position;
+ }
+ var mod = d === "absolute" ? 1 : -1,
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0]
!== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ?
this.offsetParent : this.scrollParent,
+ scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top + // The absolute mouse position
+ this.offset.relative.top * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.top * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : (
scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left + // The absolute mouse position
+ this.offset.relative.left * mod + // Only for relative positioned nodes:
Relative offset from element to offset parent
+ this.offset.parent.left * mod - // The offsetParent's offset without
borders (offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() :
scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var top, left,
+ o = this.options,
+ pageX = event.pageX,
+ pageY = event.pageY,
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0]
!== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ?
this.offsetParent : this.scrollParent, scrollIsRootNode =
(/(html|body)/i).test(scroll[0].tagName);
+
+ // This is another very weird special case that only happens for relative elements:
+ // 1. If the css position is relative
+ // 2. and the scroll parent is the document or similar to the offset parent
+ // we have to refresh the relative offset during the scroll so there are no jumps
+ if(this.cssPosition === "relative" && !(this.scrollParent[0] !==
this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
+ this.offset.relative = this._getRelativeOffset();
+ }
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for
options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) {
+ pageX = this.containment[0] + this.offset.click.left;
+ }
+ if(event.pageY - this.offset.click.top < this.containment[1]) {
+ pageY = this.containment[1] + this.offset.click.top;
+ }
+ if(event.pageX - this.offset.click.left > this.containment[2]) {
+ pageX = this.containment[2] + this.offset.click.left;
+ }
+ if(event.pageY - this.offset.click.top > this.containment[3]) {
+ pageY = this.containment[3] + this.offset.click.top;
+ }
+ }
+
+ if(o.grid) {
+ top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) *
o.grid[1];
+ pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1]
&& top - this.offset.click.top <= this.containment[3]) ? top : ((top -
this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) :
top;
+
+ left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) *
o.grid[0];
+ pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0]
&& left - this.offset.click.left <= this.containment[2]) ? left : ((left -
this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0]))
: left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY - // The absolute mouse position
+ this.offset.click.top - // Click offset (relative to the element)
+ this.offset.relative.top - // Only for relative positioned nodes: Relative
offset from element to offset parent
+ this.offset.parent.top + // The offsetParent's offset without borders
(offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : (
scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX - // The absolute mouse position
+ this.offset.click.left - // Click offset (relative to the element)
+ this.offset.relative.left - // Only for relative positioned nodes: Relative
offset from element to offset parent
+ this.offset.parent.left + // The offsetParent's offset without borders
(offset + border)
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() :
scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _rearrange: function(event, i, a, hardRefresh) {
+
+ a ? a[0].appendChild(this.placeholder[0]) :
i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction ===
"down" ? i.item[0] : i.item[0].nextSibling));
+
+ //Various things done here to improve the performance:
+ // 1. we create a setTimeout, that calls refreshPositions
+ // 2. on the instance, we have a counter variable, that get's higher after every
append
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if
it's still the same
+ // 4. this lets only the last addition to the timeout stack through
+ this.counter = this.counter ? ++this.counter : 1;
+ var counter = this.counter;
+
+ this._delay(function() {
+ if(counter === this.counter) {
+ this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on
mousemove
+ }
+ });
+
+ },
+
+ _clear: function(event, noPropagation) {
+
+ this.reverting = false;
+ // We delay all events that have to be triggered to after the point where the
placeholder has been removed and
+ // everything else normalized again
+ var i,
+ delayedTriggers = [];
+
+ // We first have to update the dom position of the actual currentItem
+ // Note: don't do it if the current item is already removed (by a user), or it gets
reappended (see #4088)
+ if(!this._noFinalSort && this.currentItem.parent().length) {
+ this.placeholder.before(this.currentItem);
+ }
+ this._noFinalSort = null;
+
+ if(this.helper[0] === this.currentItem[0]) {
+ for(i in this._storedCSS) {
+ if(this._storedCSS[i] === "auto" || this._storedCSS[i] ===
"static") {
+ this._storedCSS[i] = "";
+ }
+ }
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ if(this.fromOutside && !noPropagation) {
+ delayedTriggers.push(function(event) { this._trigger("receive", event,
this._uiHash(this.fromOutside)); });
+ }
+ if((this.fromOutside || this.domPosition.prev !==
this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent
!== this.currentItem.parent()[0]) && !noPropagation) {
+ delayedTriggers.push(function(event) { this._trigger("update", event,
this._uiHash()); }); //Trigger update callback if the DOM position has changed
+ }
+
+ // Check if the items Container has Changed and trigger appropriate
+ // events.
+ if (this !== this.currentContainer) {
+ if(!noPropagation) {
+ delayedTriggers.push(function(event) { this._trigger("remove", event,
this._uiHash()); });
+ delayedTriggers.push((function(c) { return function(event) {
c._trigger("receive", event, this._uiHash(this)); }; }).call(this,
this.currentContainer));
+ delayedTriggers.push((function(c) { return function(event) {
c._trigger("update", event, this._uiHash(this)); }; }).call(this,
this.currentContainer));
+ }
+ }
+
+
+ //Post events to containers
+ function delayEvent( type, instance, container ) {
+ return function( event ) {
+ container._trigger( type, event, instance._uiHash( instance ) );
+ };
+ }
+ for (i = this.containers.length - 1; i >= 0; i--){
+ if (!noPropagation) {
+ delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ]
) );
+ }
+ if(this.containers[i].containerCache.over) {
+ delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ //Do what was originally in plugins
+ if ( this.storedCursor ) {
+ this.document.find( "body" ).css( "cursor", this.storedCursor );
+ this.storedStylesheet.remove();
+ }
+ if(this._storedOpacity) {
+ this.helper.css("opacity", this._storedOpacity);
+ }
+ if(this._storedZIndex) {
+ this.helper.css("zIndex", this._storedZIndex === "auto" ?
"" : this._storedZIndex);
+ }
+
+ this.dragging = false;
+
+ if(!noPropagation) {
+ this._trigger("beforeStop", event, this._uiHash());
+ }
+
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it
unbinds ALL events from the original node!
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+ if ( !this.cancelHelperRemoval ) {
+ if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
+ this.helper.remove();
+ }
+ this.helper = null;
+ }
+
+ if(!noPropagation) {
+ for (i=0; i < delayedTriggers.length; i++) {
+ delayedTriggers[i].call(this, event);
+ } //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+
+ this.fromOutside = false;
+ return !this.cancelHelperRemoval;
+
+ },
+
+ _trigger: function() {
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+ this.cancel();
+ }
+ },
+
+ _uiHash: function(_inst) {
+ var inst = _inst || this;
+ return {
+ helper: inst.helper,
+ placeholder: inst.placeholder || $([]),
+ position: inst.position,
+ originalPosition: inst.originalPosition,
+ offset: inst.positionAbs,
+ item: inst.currentItem,
+ sender: _inst ? _inst.element : null
+ };
+ }
+
+});
+
+
+/*!
+ * jQuery UI Spinner 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/spinner/
+ */
+
+
+function spinner_modifier( fn ) {
+ return function() {
+ var previous = this.element.val();
+ fn.apply( this, arguments );
+ this._refresh();
+ if ( previous !== this.element.val() ) {
+ this._trigger( "change" );
+ }
+ };
+}
+
+var spinner = $.widget( "ui.spinner", {
+ version: "1.11.4",
+ defaultElement: "<input>",
+ widgetEventPrefix: "spin",
+ options: {
+ culture: null,
+ icons: {
+ down: "ui-icon-triangle-1-s",
+ up: "ui-icon-triangle-1-n"
+ },
+ incremental: true,
+ max: null,
+ min: null,
+ numberFormat: null,
+ page: 10,
+ step: 1,
+
+ change: null,
+ spin: null,
+ start: null,
+ stop: null
+ },
+
+ _create: function() {
+ // handle string values that need to be parsed
+ this._setOption( "max", this.options.max );
+ this._setOption( "min", this.options.min );
+ this._setOption( "step", this.options.step );
+
+ // Only format if there is a value, prevents the field from being marked
+ // as invalid in Firefox, see #9573.
+ if ( this.value() !== "" ) {
+ // Format the value, but don't constrain.
+ this._value( this.element.val(), true );
+ }
+
+ this._draw();
+ this._on( this._events );
+ this._refresh();
+
+ // turning off autocomplete prevents the browser from remembering the
+ // value when navigating through history, so we re-enable autocomplete
+ // if the page is unloaded before the widget is destroyed. #7790
+ this._on( this.window, {
+ beforeunload: function() {
+ this.element.removeAttr( "autocomplete" );
+ }
+ });
+ },
+
+ _getCreateOptions: function() {
+ var options = {},
+ element = this.element;
+
+ $.each( [ "min", "max", "step" ], function( i, option )
{
+ var value = element.attr( option );
+ if ( value !== undefined && value.length ) {
+ options[ option ] = value;
+ }
+ });
+
+ return options;
+ },
+
+ _events: {
+ keydown: function( event ) {
+ if ( this._start( event ) && this._keydown( event ) ) {
+ event.preventDefault();
+ }
+ },
+ keyup: "_stop",
+ focus: function() {
+ this.previous = this.element.val();
+ },
+ blur: function( event ) {
+ if ( this.cancelBlur ) {
+ delete this.cancelBlur;
+ return;
+ }
+
+ this._stop();
+ this._refresh();
+ if ( this.previous !== this.element.val() ) {
+ this._trigger( "change", event );
+ }
+ },
+ mousewheel: function( event, delta ) {
+ if ( !delta ) {
+ return;
+ }
+ if ( !this.spinning && !this._start( event ) ) {
+ return false;
+ }
+
+ this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
+ clearTimeout( this.mousewheelTimer );
+ this.mousewheelTimer = this._delay(function() {
+ if ( this.spinning ) {
+ this._stop( event );
+ }
+ }, 100 );
+ event.preventDefault();
+ },
+ "mousedown .ui-spinner-button": function( event ) {
+ var previous;
+
+ // We never want the buttons to have focus; whenever the user is
+ // interacting with the spinner, the focus should be on the input.
+ // If the input is focused then this.previous is properly set from
+ // when the input first received focus. If the input is not focused
+ // then we need to set this.previous based on the value before spinning.
+ previous = this.element[0] === this.document[0].activeElement ?
+ this.previous : this.element.val();
+ function checkFocus() {
+ var isActive = this.element[0] === this.document[0].activeElement;
+ if ( !isActive ) {
+ this.element.focus();
+ this.previous = previous;
+ // support: IE
+ // IE sets focus asynchronously, so we need to check if focus
+ // moved off of the input because the user clicked on the button.
+ this._delay(function() {
+ this.previous = previous;
+ });
+ }
+ }
+
+ // ensure focus is on (or stays on) the text field
+ event.preventDefault();
+ checkFocus.call( this );
+
+ // support: IE
+ // IE doesn't prevent moving focus even with event.preventDefault()
+ // so we set a flag to know when we should ignore the blur event
+ // and check (again) if focus moved off of the input.
+ this.cancelBlur = true;
+ this._delay(function() {
+ delete this.cancelBlur;
+ checkFocus.call( this );
+ });
+
+ if ( this._start( event ) === false ) {
+ return;
+ }
+
+ this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1
: -1, event );
+ },
+ "mouseup .ui-spinner-button": "_stop",
+ "mouseenter .ui-spinner-button": function( event ) {
+ // button will add ui-state-active if mouse was down while mouseleave and kept down
+ if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
+ return;
+ }
+
+ if ( this._start( event ) === false ) {
+ return false;
+ }
+ this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1
: -1, event );
+ },
+ // TODO: do we really want to consider this a stop?
+ // shouldn't we just stop the repeater and wait until mouseup before
+ // we trigger the stop event?
+ "mouseleave .ui-spinner-button": "_stop"
+ },
+
+ _draw: function() {
+ var uiSpinner = this.uiSpinner = this.element
+ .addClass( "ui-spinner-input" )
+ .attr( "autocomplete", "off" )
+ .wrap( this._uiSpinnerHtml() )
+ .parent()
+ // add buttons
+ .append( this._buttonHtml() );
+
+ this.element.attr( "role", "spinbutton" );
+
+ // button bindings
+ this.buttons = uiSpinner.find( ".ui-spinner-button" )
+ .attr( "tabIndex", -1 )
+ .button()
+ .removeClass( "ui-corner-all" );
+
+ // IE 6 doesn't understand height: 50% for the buttons
+ // unless the wrapper has an explicit height
+ if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
+ uiSpinner.height() > 0 ) {
+ uiSpinner.height( uiSpinner.height() );
+ }
+
+ // disable spinner if element was already disabled
+ if ( this.options.disabled ) {
+ this.disable();
+ }
+ },
+
+ _keydown: function( event ) {
+ var options = this.options,
+ keyCode = $.ui.keyCode;
+
+ switch ( event.keyCode ) {
+ case keyCode.UP:
+ this._repeat( null, 1, event );
+ return true;
+ case keyCode.DOWN:
+ this._repeat( null, -1, event );
+ return true;
+ case keyCode.PAGE_UP:
+ this._repeat( null, options.page, event );
+ return true;
+ case keyCode.PAGE_DOWN:
+ this._repeat( null, -options.page, event );
+ return true;
+ }
+
+ return false;
+ },
+
+ _uiSpinnerHtml: function() {
+ return "<span class='ui-spinner ui-widget ui-widget-content
ui-corner-all'></span>";
+ },
+
+ _buttonHtml: function() {
+ return "" +
+ "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
+ "<span class='ui-icon " + this.options.icons.up +
"'>▲</span>" +
+ "</a>" +
+ "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"
+
+ "<span class='ui-icon " + this.options.icons.down +
"'>▼</span>" +
+ "</a>";
+ },
+
+ _start: function( event ) {
+ if ( !this.spinning && this._trigger( "start", event ) === false ) {
+ return false;
+ }
+
+ if ( !this.counter ) {
+ this.counter = 1;
+ }
+ this.spinning = true;
+ return true;
+ },
+
+ _repeat: function( i, steps, event ) {
+ i = i || 500;
+
+ clearTimeout( this.timer );
+ this.timer = this._delay(function() {
+ this._repeat( 40, steps, event );
+ }, i );
+
+ this._spin( steps * this.options.step, event );
+ },
+
+ _spin: function( step, event ) {
+ var value = this.value() || 0;
+
+ if ( !this.counter ) {
+ this.counter = 1;
+ }
+
+ value = this._adjustValue( value + step * this._increment( this.counter ) );
+
+ if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !==
false) {
+ this._value( value );
+ this.counter++;
+ }
+ },
+
+ _increment: function( i ) {
+ var incremental = this.options.incremental;
+
+ if ( incremental ) {
+ return $.isFunction( incremental ) ?
+ incremental( i ) :
+ Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
+ }
+
+ return 1;
+ },
+
+ _precision: function() {
+ var precision = this._precisionOf( this.options.step );
+ if ( this.options.min !== null ) {
+ precision = Math.max( precision, this._precisionOf( this.options.min ) );
+ }
+ return precision;
+ },
+
+ _precisionOf: function( num ) {
+ var str = num.toString(),
+ decimal = str.indexOf( "." );
+ return decimal === -1 ? 0 : str.length - decimal - 1;
+ },
+
+ _adjustValue: function( value ) {
+ var base, aboveMin,
+ options = this.options;
+
+ // make sure we're at a valid step
+ // - find out where we are relative to the base (min or 0)
+ base = options.min !== null ? options.min : 0;
+ aboveMin = value - base;
+ // - round to the nearest step
+ aboveMin = Math.round(aboveMin / options.step) * options.step;
+ // - rounding is based on 0, so adjust back to our base
+ value = base + aboveMin;
+
+ // fix precision from bad JS floating point math
+ value = parseFloat( value.toFixed( this._precision() ) );
+
+ // clamp the value
+ if ( options.max !== null && value > options.max) {
+ return options.max;
+ }
+ if ( options.min !== null && value < options.min ) {
+ return options.min;
+ }
+
+ return value;
+ },
+
+ _stop: function( event ) {
+ if ( !this.spinning ) {
+ return;
+ }
+
+ clearTimeout( this.timer );
+ clearTimeout( this.mousewheelTimer );
+ this.counter = 0;
+ this.spinning = false;
+ this._trigger( "stop", event );
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "culture" || key === "numberFormat" ) {
+ var prevValue = this._parse( this.element.val() );
+ this.options[ key ] = value;
+ this.element.val( this._format( prevValue ) );
+ return;
+ }
+
+ if ( key === "max" || key === "min" || key === "step" )
{
+ if ( typeof value === "string" ) {
+ value = this._parse( value );
+ }
+ }
+ if ( key === "icons" ) {
+ this.buttons.first().find( ".ui-icon" )
+ .removeClass( this.options.icons.up )
+ .addClass( value.up );
+ this.buttons.last().find( ".ui-icon" )
+ .removeClass( this.options.icons.down )
+ .addClass( value.down );
+ }
+
+ this._super( key, value );
+
+ if ( key === "disabled" ) {
+ this.widget().toggleClass( "ui-state-disabled", !!value );
+ this.element.prop( "disabled", !!value );
+ this.buttons.button( value ? "disable" : "enable" );
+ }
+ },
+
+ _setOptions: spinner_modifier(function( options ) {
+ this._super( options );
+ }),
+
+ _parse: function( val ) {
+ if ( typeof val === "string" && val !== "" ) {
+ val = window.Globalize && this.options.numberFormat ?
+ Globalize.parseFloat( val, 10, this.options.culture ) : +val;
+ }
+ return val === "" || isNaN( val ) ? null : val;
+ },
+
+ _format: function( value ) {
+ if ( value === "" ) {
+ return "";
+ }
+ return window.Globalize && this.options.numberFormat ?
+ Globalize.format( value, this.options.numberFormat, this.options.culture ) :
+ value;
+ },
+
+ _refresh: function() {
+ this.element.attr({
+ "aria-valuemin": this.options.min,
+ "aria-valuemax": this.options.max,
+ // TODO: what should we do with values that can't be parsed?
+ "aria-valuenow": this._parse( this.element.val() )
+ });
+ },
+
+ isValid: function() {
+ var value = this.value();
+
+ // null is invalid
+ if ( value === null ) {
+ return false;
+ }
+
+ // if value gets adjusted, it's invalid
+ return value === this._adjustValue( value );
+ },
+
+ // update the value without triggering change
+ _value: function( value, allowAny ) {
+ var parsed;
+ if ( value !== "" ) {
+ parsed = this._parse( value );
+ if ( parsed !== null ) {
+ if ( !allowAny ) {
+ parsed = this._adjustValue( parsed );
+ }
+ value = this._format( parsed );
+ }
+ }
+ this.element.val( value );
+ this._refresh();
+ },
+
+ _destroy: function() {
+ this.element
+ .removeClass( "ui-spinner-input" )
+ .prop( "disabled", false )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+ this.uiSpinner.replaceWith( this.element );
+ },
+
+ stepUp: spinner_modifier(function( steps ) {
+ this._stepUp( steps );
+ }),
+ _stepUp: function( steps ) {
+ if ( this._start() ) {
+ this._spin( (steps || 1) * this.options.step );
+ this._stop();
+ }
+ },
+
+ stepDown: spinner_modifier(function( steps ) {
+ this._stepDown( steps );
+ }),
+ _stepDown: function( steps ) {
+ if ( this._start() ) {
+ this._spin( (steps || 1) * -this.options.step );
+ this._stop();
+ }
+ },
+
+ pageUp: spinner_modifier(function( pages ) {
+ this._stepUp( (pages || 1) * this.options.page );
+ }),
+
+ pageDown: spinner_modifier(function( pages ) {
+ this._stepDown( (pages || 1) * this.options.page );
+ }),
+
+ value: function( newVal ) {
+ if ( !arguments.length ) {
+ return this._parse( this.element.val() );
+ }
+ spinner_modifier( this._value ).call( this, newVal );
+ },
+
+ widget: function() {
+ return this.uiSpinner;
+ }
+});
+
+
+/*!
+ * jQuery UI Tabs 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/tabs/
+ */
+
+
+var tabs = $.widget( "ui.tabs", {
+ version: "1.11.4",
+ delay: 300,
+ options: {
+ active: null,
+ collapsible: false,
+ event: "click",
+ heightStyle: "content",
+ hide: null,
+ show: null,
+
+ // callbacks
+ activate: null,
+ beforeActivate: null,
+ beforeLoad: null,
+ load: null
+ },
+
+ _isLocal: (function() {
+ var rhash = /#.*$/;
+
+ return function( anchor ) {
+ var anchorUrl, locationUrl;
+
+ // support: IE7
+ // IE7 doesn't normalize the href property when set via script (#9317)
+ anchor = anchor.cloneNode( false );
+
+ anchorUrl = anchor.href.replace( rhash, "" );
+ locationUrl = location.href.replace( rhash, "" );
+
+ // decoding may throw an error if the URL isn't UTF-8 (#9518)
+ try {
+ anchorUrl = decodeURIComponent( anchorUrl );
+ } catch ( error ) {}
+ try {
+ locationUrl = decodeURIComponent( locationUrl );
+ } catch ( error ) {}
+
+ return anchor.hash.length > 1 && anchorUrl === locationUrl;
+ };
+ })(),
+
+ _create: function() {
+ var that = this,
+ options = this.options;
+
+ this.running = false;
+
+ this.element
+ .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
+ .toggleClass( "ui-tabs-collapsible", options.collapsible );
+
+ this._processTabs();
+ options.active = this._initialActive();
+
+ // Take disabling tabs via class attribute from HTML
+ // into account and update option properly.
+ if ( $.isArray( options.disabled ) ) {
+ options.disabled = $.unique( options.disabled.concat(
+ $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
+ return that.tabs.index( li );
+ })
+ ) ).sort();
+ }
+
+ // check for length avoids error when initializing empty list
+ if ( this.options.active !== false && this.anchors.length ) {
+ this.active = this._findActive( options.active );
+ } else {
+ this.active = $();
+ }
+
+ this._refresh();
+
+ if ( this.active.length ) {
+ this.load( options.active );
+ }
+ },
+
+ _initialActive: function() {
+ var active = this.options.active,
+ collapsible = this.options.collapsible,
+ locationHash = location.hash.substring( 1 );
+
+ if ( active === null ) {
+ // check the fragment identifier in the URL
+ if ( locationHash ) {
+ this.tabs.each(function( i, tab ) {
+ if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
+ active = i;
+ return false;
+ }
+ });
+ }
+
+ // check for a tab marked active via a class
+ if ( active === null ) {
+ active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
+ }
+
+ // no active tab, set to false
+ if ( active === null || active === -1 ) {
+ active = this.tabs.length ? 0 : false;
+ }
+ }
+
+ // handle numbers: negative, out of range
+ if ( active !== false ) {
+ active = this.tabs.index( this.tabs.eq( active ) );
+ if ( active === -1 ) {
+ active = collapsible ? false : 0;
+ }
+ }
+
+ // don't allow collapsible: false and active: false
+ if ( !collapsible && active === false && this.anchors.length ) {
+ active = 0;
+ }
+
+ return active;
+ },
+
+ _getCreateEventData: function() {
+ return {
+ tab: this.active,
+ panel: !this.active.length ? $() : this._getPanelForTab( this.active )
+ };
+ },
+
+ _tabKeydown: function( event ) {
+ var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
+ selectedIndex = this.tabs.index( focusedTab ),
+ goingForward = true;
+
+ if ( this._handlePageNav( event ) ) {
+ return;
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ selectedIndex++;
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.LEFT:
+ goingForward = false;
+ selectedIndex--;
+ break;
+ case $.ui.keyCode.END:
+ selectedIndex = this.anchors.length - 1;
+ break;
+ case $.ui.keyCode.HOME:
+ selectedIndex = 0;
+ break;
+ case $.ui.keyCode.SPACE:
+ // Activate only, no collapsing
+ event.preventDefault();
+ clearTimeout( this.activating );
+ this._activate( selectedIndex );
+ return;
+ case $.ui.keyCode.ENTER:
+ // Toggle (cancel delayed activation, allow collapsing)
+ event.preventDefault();
+ clearTimeout( this.activating );
+ // Determine if we should collapse or activate
+ this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+ return;
+ default:
+ return;
+ }
+
+ // Focus the appropriate tab, based on which key was pressed
+ event.preventDefault();
+ clearTimeout( this.activating );
+ selectedIndex = this._focusNextTab( selectedIndex, goingForward );
+
+ // Navigating with control/command key will prevent automatic activation
+ if ( !event.ctrlKey && !event.metaKey ) {
+
+ // Update aria-selected immediately so that AT think the tab is already selected.
+ // Otherwise AT may confuse the user by stating that they need to activate the tab,
+ // but the tab will already be activated by the time the announcement finishes.
+ focusedTab.attr( "aria-selected", "false" );
+ this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
+
+ this.activating = this._delay(function() {
+ this.option( "active", selectedIndex );
+ }, this.delay );
+ }
+ },
+
+ _panelKeydown: function( event ) {
+ if ( this._handlePageNav( event ) ) {
+ return;
+ }
+
+ // Ctrl+up moves focus to the current tab
+ if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
+ event.preventDefault();
+ this.active.focus();
+ }
+ },
+
+ // Alt+page up/down moves focus to the previous/next tab (and activates)
+ _handlePageNav: function( event ) {
+ if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
+ this._activate( this._focusNextTab( this.options.active - 1, false ) );
+ return true;
+ }
+ if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
+ this._activate( this._focusNextTab( this.options.active + 1, true ) );
+ return true;
+ }
+ },
+
+ _findNextTab: function( index, goingForward ) {
+ var lastTabIndex = this.tabs.length - 1;
+
+ function constrain() {
+ if ( index > lastTabIndex ) {
+ index = 0;
+ }
+ if ( index < 0 ) {
+ index = lastTabIndex;
+ }
+ return index;
+ }
+
+ while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
+ index = goingForward ? index + 1 : index - 1;
+ }
+
+ return index;
+ },
+
+ _focusNextTab: function( index, goingForward ) {
+ index = this._findNextTab( index, goingForward );
+ this.tabs.eq( index ).focus();
+ return index;
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "active" ) {
+ // _activate() will handle invalid values and update this.options
+ this._activate( value );
+ return;
+ }
+
+ if ( key === "disabled" ) {
+ // don't use the widget factory's disabled handling
+ this._setupDisabled( value );
+ return;
+ }
+
+ this._super( key, value);
+
+ if ( key === "collapsible" ) {
+ this.element.toggleClass( "ui-tabs-collapsible", value );
+ // Setting collapsible: false while collapsed; open first panel
+ if ( !value && this.options.active === false ) {
+ this._activate( 0 );
+ }
+ }
+
+ if ( key === "event" ) {
+ this._setupEvents( value );
+ }
+
+ if ( key === "heightStyle" ) {
+ this._setupHeightStyle( value );
+ }
+ },
+
+ _sanitizeSelector: function( hash ) {
+ return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,
"\\$&" ) : "";
+ },
+
+ refresh: function() {
+ var options = this.options,
+ lis = this.tablist.children( ":has(a[href])" );
+
+ // get disabled tabs from class attribute from HTML
+ // this will get converted to a boolean if needed in _refresh()
+ options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab )
{
+ return lis.index( tab );
+ });
+
+ this._processTabs();
+
+ // was collapsed or no tabs
+ if ( options.active === false || !this.anchors.length ) {
+ options.active = false;
+ this.active = $();
+ // was active, but active tab is gone
+ } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[
0 ] ) ) {
+ // all remaining tabs are disabled
+ if ( this.tabs.length === options.disabled.length ) {
+ options.active = false;
+ this.active = $();
+ // activate previous tab
+ } else {
+ this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
+ }
+ // was active, active tab still exists
+ } else {
+ // make sure active index is correct
+ options.active = this.tabs.index( this.active );
+ }
+
+ this._refresh();
+ },
+
+ _refresh: function() {
+ this._setupDisabled( this.options.disabled );
+ this._setupEvents( this.options.event );
+ this._setupHeightStyle( this.options.heightStyle );
+
+ this.tabs.not( this.active ).attr({
+ "aria-selected": "false",
+ "aria-expanded": "false",
+ tabIndex: -1
+ });
+ this.panels.not( this._getPanelForTab( this.active ) )
+ .hide()
+ .attr({
+ "aria-hidden": "true"
+ });
+
+ // Make sure one tab is in the tab order
+ if ( !this.active.length ) {
+ this.tabs.eq( 0 ).attr( "tabIndex", 0 );
+ } else {
+ this.active
+ .addClass( "ui-tabs-active ui-state-active" )
+ .attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ this._getPanelForTab( this.active )
+ .show()
+ .attr({
+ "aria-hidden": "false"
+ });
+ }
+ },
+
+ _processTabs: function() {
+ var that = this,
+ prevTabs = this.tabs,
+ prevAnchors = this.anchors,
+ prevPanels = this.panels;
+
+ this.tablist = this._getList()
+ .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header
ui-corner-all" )
+ .attr( "role", "tablist" )
+
+ // Prevent users from focusing disabled tabs via click
+ .delegate( "> li", "mousedown" + this.eventNamespace, function(
event ) {
+ if ( $( this ).is( ".ui-state-disabled" ) ) {
+ event.preventDefault();
+ }
+ })
+
+ // support: IE <9
+ // Preventing the default action in mousedown doesn't prevent IE
+ // from focusing the element, so if the anchor gets focused, blur.
+ // We don't have to worry about focusing the previously focused
+ // element since clicking on a non-focusable element should focus
+ // the body anyway.
+ .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace,
function() {
+ if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+ this.blur();
+ }
+ });
+
+ this.tabs = this.tablist.find( "> li:has(a[href])" )
+ .addClass( "ui-state-default ui-corner-top" )
+ .attr({
+ role: "tab",
+ tabIndex: -1
+ });
+
+ this.anchors = this.tabs.map(function() {
+ return $( "a", this )[ 0 ];
+ })
+ .addClass( "ui-tabs-anchor" )
+ .attr({
+ role: "presentation",
+ tabIndex: -1
+ });
+
+ this.panels = $();
+
+ this.anchors.each(function( i, anchor ) {
+ var selector, panel, panelId,
+ anchorId = $( anchor ).uniqueId().attr( "id" ),
+ tab = $( anchor ).closest( "li" ),
+ originalAriaControls = tab.attr( "aria-controls" );
+
+ // inline tab
+ if ( that._isLocal( anchor ) ) {
+ selector = anchor.hash;
+ panelId = selector.substring( 1 );
+ panel = that.element.find( that._sanitizeSelector( selector ) );
+ // remote tab
+ } else {
+ // If the tab doesn't already have aria-controls,
+ // generate an id by using a throw-away element
+ panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
+ selector = "#" + panelId;
+ panel = that.element.find( selector );
+ if ( !panel.length ) {
+ panel = that._createPanel( panelId );
+ panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
+ }
+ panel.attr( "aria-live", "polite" );
+ }
+
+ if ( panel.length) {
+ that.panels = that.panels.add( panel );
+ }
+ if ( originalAriaControls ) {
+ tab.data( "ui-tabs-aria-controls", originalAriaControls );
+ }
+ tab.attr({
+ "aria-controls": panelId,
+ "aria-labelledby": anchorId
+ });
+ panel.attr( "aria-labelledby", anchorId );
+ });
+
+ this.panels
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .attr( "role", "tabpanel" );
+
+ // Avoid memory leaks (#10056)
+ if ( prevTabs ) {
+ this._off( prevTabs.not( this.tabs ) );
+ this._off( prevAnchors.not( this.anchors ) );
+ this._off( prevPanels.not( this.panels ) );
+ }
+ },
+
+ // allow overriding how to find the list for rare usage scenarios (#7715)
+ _getList: function() {
+ return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
+ },
+
+ _createPanel: function( id ) {
+ return $( "<div>" )
+ .attr( "id", id )
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .data( "ui-tabs-destroy", true );
+ },
+
+ _setupDisabled: function( disabled ) {
+ if ( $.isArray( disabled ) ) {
+ if ( !disabled.length ) {
+ disabled = false;
+ } else if ( disabled.length === this.anchors.length ) {
+ disabled = true;
+ }
+ }
+
+ // disable tabs
+ for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
+ if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+ $( li )
+ .addClass( "ui-state-disabled" )
+ .attr( "aria-disabled", "true" );
+ } else {
+ $( li )
+ .removeClass( "ui-state-disabled" )
+ .removeAttr( "aria-disabled" );
+ }
+ }
+
+ this.options.disabled = disabled;
+ },
+
+ _setupEvents: function( event ) {
+ var events = {};
+ if ( event ) {
+ $.each( event.split(" "), function( index, eventName ) {
+ events[ eventName ] = "_eventHandler";
+ });
+ }
+
+ this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+ // Always prevent the default action, even when disabled
+ this._on( true, this.anchors, {
+ click: function( event ) {
+ event.preventDefault();
+ }
+ });
+ this._on( this.anchors, events );
+ this._on( this.tabs, { keydown: "_tabKeydown" } );
+ this._on( this.panels, { keydown: "_panelKeydown" } );
+
+ this._focusable( this.tabs );
+ this._hoverable( this.tabs );
+ },
+
+ _setupHeightStyle: function( heightStyle ) {
+ var maxHeight,
+ parent = this.element.parent();
+
+ if ( heightStyle === "fill" ) {
+ maxHeight = parent.height();
+ maxHeight -= this.element.outerHeight() - this.element.height();
+
+ this.element.siblings( ":visible" ).each(function() {
+ var elem = $( this ),
+ position = elem.css( "position" );
+
+ if ( position === "absolute" || position === "fixed" ) {
+ return;
+ }
+ maxHeight -= elem.outerHeight( true );
+ });
+
+ this.element.children().not( this.panels ).each(function() {
+ maxHeight -= $( this ).outerHeight( true );
+ });
+
+ this.panels.each(function() {
+ $( this ).height( Math.max( 0, maxHeight -
+ $( this ).innerHeight() + $( this ).height() ) );
+ })
+ .css( "overflow", "auto" );
+ } else if ( heightStyle === "auto" ) {
+ maxHeight = 0;
+ this.panels.each(function() {
+ maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+ }).height( maxHeight );
+ }
+ },
+
+ _eventHandler: function( event ) {
+ var options = this.options,
+ active = this.active,
+ anchor = $( event.currentTarget ),
+ tab = anchor.closest( "li" ),
+ clickedIsActive = tab[ 0 ] === active[ 0 ],
+ collapsing = clickedIsActive && options.collapsible,
+ toShow = collapsing ? $() : this._getPanelForTab( tab ),
+ toHide = !active.length ? $() : this._getPanelForTab( active ),
+ eventData = {
+ oldTab: active,
+ oldPanel: toHide,
+ newTab: collapsing ? $() : tab,
+ newPanel: toShow
+ };
+
+ event.preventDefault();
+
+ if ( tab.hasClass( "ui-state-disabled" ) ||
+ // tab is already loading
+ tab.hasClass( "ui-tabs-loading" ) ||
+ // can't switch durning an animation
+ this.running ||
+ // click on active header, but not collapsible
+ ( clickedIsActive && !options.collapsible ) ||
+ // allow canceling activation
+ ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+ return;
+ }
+
+ options.active = collapsing ? false : this.tabs.index( tab );
+
+ this.active = clickedIsActive ? $() : tab;
+ if ( this.xhr ) {
+ this.xhr.abort();
+ }
+
+ if ( !toHide.length && !toShow.length ) {
+ $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
+ }
+
+ if ( toShow.length ) {
+ this.load( this.tabs.index( tab ), event );
+ }
+ this._toggle( event, eventData );
+ },
+
+ // handles show/hide for selecting tabs
+ _toggle: function( event, eventData ) {
+ var that = this,
+ toShow = eventData.newPanel,
+ toHide = eventData.oldPanel;
+
+ this.running = true;
+
+ function complete() {
+ that.running = false;
+ that._trigger( "activate", event, eventData );
+ }
+
+ function show() {
+ eventData.newTab.closest( "li" ).addClass( "ui-tabs-active
ui-state-active" );
+
+ if ( toShow.length && that.options.show ) {
+ that._show( toShow, that.options.show, complete );
+ } else {
+ toShow.show();
+ complete();
+ }
+ }
+
+ // start out by hiding, then showing, then completing
+ if ( toHide.length && this.options.hide ) {
+ this._hide( toHide, this.options.hide, function() {
+ eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active
ui-state-active" );
+ show();
+ });
+ } else {
+ eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active
ui-state-active" );
+ toHide.hide();
+ show();
+ }
+
+ toHide.attr( "aria-hidden", "true" );
+ eventData.oldTab.attr({
+ "aria-selected": "false",
+ "aria-expanded": "false"
+ });
+ // If we're switching tabs, remove the old tab from the tab order.
+ // If we're opening from collapsed state, remove the previous tab from the tab
order.
+ // If we're collapsing, then keep the collapsing tab in the tab order.
+ if ( toShow.length && toHide.length ) {
+ eventData.oldTab.attr( "tabIndex", -1 );
+ } else if ( toShow.length ) {
+ this.tabs.filter(function() {
+ return $( this ).attr( "tabIndex" ) === 0;
+ })
+ .attr( "tabIndex", -1 );
+ }
+
+ toShow.attr( "aria-hidden", "false" );
+ eventData.newTab.attr({
+ "aria-selected": "true",
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ },
+
+ _activate: function( index ) {
+ var anchor,
+ active = this._findActive( index );
+
+ // trying to activate the already active panel
+ if ( active[ 0 ] === this.active[ 0 ] ) {
+ return;
+ }
+
+ // trying to collapse, simulate a click on the current active header
+ if ( !active.length ) {
+ active = this.active;
+ }
+
+ anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
+ this._eventHandler({
+ target: anchor,
+ currentTarget: anchor,
+ preventDefault: $.noop
+ });
+ },
+
+ _findActive: function( index ) {
+ return index === false ? $() : this.tabs.eq( index );
+ },
+
+ _getIndex: function( index ) {
+ // meta-function to give users option to provide a href string instead of a numerical
index.
+ if ( typeof index === "string" ) {
+ index = this.anchors.index( this.anchors.filter( "[href$='" + index +
"']" ) );
+ }
+
+ return index;
+ },
+
+ _destroy: function() {
+ if ( this.xhr ) {
+ this.xhr.abort();
+ }
+
+ this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all
ui-tabs-collapsible" );
+
+ this.tablist
+ .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header
ui-corner-all" )
+ .removeAttr( "role" );
+
+ this.anchors
+ .removeClass( "ui-tabs-anchor" )
+ .removeAttr( "role" )
+ .removeAttr( "tabIndex" )
+ .removeUniqueId();
+
+ this.tablist.unbind( this.eventNamespace );
+
+ this.tabs.add( this.panels ).each(function() {
+ if ( $.data( this, "ui-tabs-destroy" ) ) {
+ $( this ).remove();
+ } else {
+ $( this )
+ .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
+ "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active
ui-tabs-panel" )
+ .removeAttr( "tabIndex" )
+ .removeAttr( "aria-live" )
+ .removeAttr( "aria-busy" )
+ .removeAttr( "aria-selected" )
+ .removeAttr( "aria-labelledby" )
+ .removeAttr( "aria-hidden" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "role" );
+ }
+ });
+
+ this.tabs.each(function() {
+ var li = $( this ),
+ prev = li.data( "ui-tabs-aria-controls" );
+ if ( prev ) {
+ li
+ .attr( "aria-controls", prev )
+ .removeData( "ui-tabs-aria-controls" );
+ } else {
+ li.removeAttr( "aria-controls" );
+ }
+ });
+
+ this.panels.show();
+
+ if ( this.options.heightStyle !== "content" ) {
+ this.panels.css( "height", "" );
+ }
+ },
+
+ enable: function( index ) {
+ var disabled = this.options.disabled;
+ if ( disabled === false ) {
+ return;
+ }
+
+ if ( index === undefined ) {
+ disabled = false;
+ } else {
+ index = this._getIndex( index );
+ if ( $.isArray( disabled ) ) {
+ disabled = $.map( disabled, function( num ) {
+ return num !== index ? num : null;
+ });
+ } else {
+ disabled = $.map( this.tabs, function( li, num ) {
+ return num !== index ? num : null;
+ });
+ }
+ }
+ this._setupDisabled( disabled );
+ },
+
+ disable: function( index ) {
+ var disabled = this.options.disabled;
+ if ( disabled === true ) {
+ return;
+ }
+
+ if ( index === undefined ) {
+ disabled = true;
+ } else {
+ index = this._getIndex( index );
+ if ( $.inArray( index, disabled ) !== -1 ) {
+ return;
+ }
+ if ( $.isArray( disabled ) ) {
+ disabled = $.merge( [ index ], disabled ).sort();
+ } else {
+ disabled = [ index ];
+ }
+ }
+ this._setupDisabled( disabled );
+ },
+
+ load: function( index, event ) {
+ index = this._getIndex( index );
+ var that = this,
+ tab = this.tabs.eq( index ),
+ anchor = tab.find( ".ui-tabs-anchor" ),
+ panel = this._getPanelForTab( tab ),
+ eventData = {
+ tab: tab,
+ panel: panel
+ },
+ complete = function( jqXHR, status ) {
+ if ( status === "abort" ) {
+ that.panels.stop( false, true );
+ }
+
+ tab.removeClass( "ui-tabs-loading" );
+ panel.removeAttr( "aria-busy" );
+
+ if ( jqXHR === that.xhr ) {
+ delete that.xhr;
+ }
+ };
+
+ // not remote
+ if ( this._isLocal( anchor[ 0 ] ) ) {
+ return;
+ }
+
+ this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
+
+ // support: jQuery <1.8
+ // jQuery <1.8 returns false if the request is canceled in beforeSend,
+ // but as of 1.8, $.ajax() always returns a jqXHR object.
+ if ( this.xhr && this.xhr.statusText !== "canceled" ) {
+ tab.addClass( "ui-tabs-loading" );
+ panel.attr( "aria-busy", "true" );
+
+ this.xhr
+ .done(function( response, status, jqXHR ) {
+ // support: jQuery <1.8
+ //
http://bugs.jquery.com/ticket/11778
+ setTimeout(function() {
+ panel.html( response );
+ that._trigger( "load", event, eventData );
+
+ complete( jqXHR, status );
+ }, 1 );
+ })
+ .fail(function( jqXHR, status ) {
+ // support: jQuery <1.8
+ //
http://bugs.jquery.com/ticket/11778
+ setTimeout(function() {
+ complete( jqXHR, status );
+ }, 1 );
+ });
+ }
+ },
+
+ _ajaxSettings: function( anchor, event, eventData ) {
+ var that = this;
+ return {
+ url: anchor.attr( "href" ),
+ beforeSend: function( jqXHR, settings ) {
+ return that._trigger( "beforeLoad", event,
+ $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
+ }
+ };
+ },
+
+ _getPanelForTab: function( tab ) {
+ var id = $( tab ).attr( "aria-controls" );
+ return this.element.find( this._sanitizeSelector( "#" + id ) );
+ }
+});
+
+
+/*!
+ * jQuery UI Tooltip 1.11.4
+ *
http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ *
http://jquery.org/license
+ *
+ *
http://api.jqueryui.com/tooltip/
+ */
+
+
+var tooltip = $.widget( "ui.tooltip", {
+ version: "1.11.4",
+ options: {
+ content: function() {
+ // support: IE<9, Opera in jQuery <1.7
+ // .text() can't accept undefined, so coerce to a string
+ var title = $( this ).attr( "title" ) || "";
+ // Escape title, since we're going from an attribute to raw HTML
+ return $( "<a>" ).text( title ).html();
+ },
+ hide: true,
+ // Disabled elements have inconsistent behavior across browsers (#8661)
+ items: "[title]:not([disabled])",
+ position: {
+ my: "left top+15",
+ at: "left bottom",
+ collision: "flipfit flip"
+ },
+ show: true,
+ tooltipClass: null,
+ track: false,
+
+ // callbacks
+ close: null,
+ open: null
+ },
+
+ _addDescribedBy: function( elem, id ) {
+ var describedby = (elem.attr( "aria-describedby" ) || "").split(
/\s+/ );
+ describedby.push( id );
+ elem
+ .data( "ui-tooltip-id", id )
+ .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
+ },
+
+ _removeDescribedBy: function( elem ) {
+ var id = elem.data( "ui-tooltip-id" ),
+ describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/
),
+ index = $.inArray( id, describedby );
+
+ if ( index !== -1 ) {
+ describedby.splice( index, 1 );
+ }
+
+ elem.removeData( "ui-tooltip-id" );
+ describedby = $.trim( describedby.join( " " ) );
+ if ( describedby ) {
+ elem.attr( "aria-describedby", describedby );
+ } else {
+ elem.removeAttr( "aria-describedby" );
+ }
+ },
+
+ _create: function() {
+ this._on({
+ mouseover: "open",
+ focusin: "open"
+ });
+
+ // IDs of generated tooltips, needed for destroy
+ this.tooltips = {};
+
+ // IDs of parent tooltips where we removed the title attribute
+ this.parents = {};
+
+ if ( this.options.disabled ) {
+ this._disable();
+ }
+
+ // Append the aria-live region so tooltips announce correctly
+ this.liveRegion = $( "<div>" )
+ .attr({
+ role: "log",
+ "aria-live": "assertive",
+ "aria-relevant": "additions"
+ })
+ .addClass( "ui-helper-hidden-accessible" )
+ .appendTo( this.document[ 0 ].body );
+ },
+
+ _setOption: function( key, value ) {
+ var that = this;
+
+ if ( key === "disabled" ) {
+ this[ value ? "_disable" : "_enable" ]();
+ this.options[ key ] = value;
+ // disable element style changes
+ return;
+ }
+
+ this._super( key, value );
+
+ if ( key === "content" ) {
+ $.each( this.tooltips, function( id, tooltipData ) {
+ that._updateContent( tooltipData.element );
+ });
+ }
+ },
+
+ _disable: function() {
+ var that = this;
+
+ // close open tooltips
+ $.each( this.tooltips, function( id, tooltipData ) {
+ var event = $.Event( "blur" );
+ event.target = event.currentTarget = tooltipData.element[ 0 ];
+ that.close( event, true );
+ });
+
+ // remove title attributes to prevent native tooltips
+ this.element.find( this.options.items ).addBack().each(function() {
+ var element = $( this );
+ if ( element.is( "[title]" ) ) {
+ element
+ .data( "ui-tooltip-title", element.attr( "title" ) )
+ .removeAttr( "title" );
+ }
+ });
+ },
+
+ _enable: function() {
+ // restore title attributes
+ this.element.find( this.options.items ).addBack().each(function() {
+ var element = $( this );
+ if ( element.data( "ui-tooltip-title" ) ) {
+ element.attr( "title", element.data( "ui-tooltip-title" ) );
+ }
+ });
+ },
+
+ open: function( event ) {
+ var that = this,
+ target = $( event ? event.target : this.element )
+ // we need closest here due to mouseover bubbling,
+ // but always pointing at the same event target
+ .closest( this.options.items );
+
+ // No element to show a tooltip for or the tooltip is already open
+ if ( !target.length || target.data( "ui-tooltip-id" ) ) {
+ return;
+ }
+
+ if ( target.attr( "title" ) ) {
+ target.data( "ui-tooltip-title", target.attr( "title" ) );
+ }
+
+ target.data( "ui-tooltip-open", true );
+
+ // kill parent tooltips, custom or native, for hover
+ if ( event && event.type === "mouseover" ) {
+ target.parents().each(function() {
+ var parent = $( this ),
+ blurEvent;
+ if ( parent.data( "ui-tooltip-open" ) ) {
+ blurEvent = $.Event( "blur" );
+ blurEvent.target = blurEvent.currentTarget = this;
+ that.close( blurEvent, true );
+ }
+ if ( parent.attr( "title" ) ) {
+ parent.uniqueId();
+ that.parents[ this.id ] = {
+ element: this,
+ title: parent.attr( "title" )
+ };
+ parent.attr( "title", "" );
+ }
+ });
+ }
+
+ this._registerCloseHandlers( event, target );
+ this._updateContent( target, event );
+ },
+
+ _updateContent: function( target, event ) {
+ var content,
+ contentOption = this.options.content,
+ that = this,
+ eventType = event ? event.type : null;
+
+ if ( typeof contentOption === "string" ) {
+ return this._open( event, target, contentOption );
+ }
+
+ content = contentOption.call( target[0], function( response ) {
+
+ // IE may instantly serve a cached response for ajax requests
+ // delay this call to _open so the other call to _open runs first
+ that._delay(function() {
+
+ // Ignore async response if tooltip was closed already
+ if ( !target.data( "ui-tooltip-open" ) ) {
+ return;
+ }
+
+ // jQuery creates a special event for focusin when it doesn't
+ // exist natively. To improve performance, the native event
+ // object is reused and the type is changed. Therefore, we can't
+ // rely on the type being correct after the event finished
+ // bubbling, so we set it back to the previous value. (#8740)
+ if ( event ) {
+ event.type = eventType;
+ }
+ this._open( event, target, response );
+ });
+ });
+ if ( content ) {
+ this._open( event, target, content );
+ }
+ },
+
+ _open: function( event, target, content ) {
+ var tooltipData, tooltip, delayedShow, a11yContent,
+ positionOption = $.extend( {}, this.options.position );
+
+ if ( !content ) {
+ return;
+ }
+
+ // Content can be updated multiple times. If the tooltip already
+ // exists, then just update the content and bail.
+ tooltipData = this._find( target );
+ if ( tooltipData ) {
+ tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
+ return;
+ }
+
+ // if we have a title, clear it to prevent the native tooltip
+ // we have to check first to avoid defining a title if none exists
+ // (we don't want to cause an element to start matching [title])
+ //
+ // We use removeAttr only for key events, to allow IE to export the correct
+ // accessible attributes. For mouse events, set to empty string to avoid
+ // native tooltip showing up (happens only when removing inside mouseover).
+ if ( target.is( "[title]" ) ) {
+ if ( event && event.type === "mouseover" ) {
+ target.attr( "title", "" );
+ } else {
+ target.removeAttr( "title" );
+ }
+ }
+
+ tooltipData = this._tooltip( target );
+ tooltip = tooltipData.tooltip;
+ this._addDescribedBy( target, tooltip.attr( "id" ) );
+ tooltip.find( ".ui-tooltip-content" ).html( content );
+
+ // Support: Voiceover on OS X, JAWS on IE <= 9
+ // JAWS announces deletions even when aria-relevant="additions"
+ // Voiceover will sometimes re-read the entire log region's contents from the
beginning
+ this.liveRegion.children().hide();
+ if ( content.clone ) {
+ a11yContent = content.clone();
+ a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr(
"id" );
+ } else {
+ a11yContent = content;
+ }
+ $( "<div>" ).html( a11yContent ).appendTo( this.liveRegion );
+
+ function position( event ) {
+ positionOption.of = event;
+ if ( tooltip.is( ":hidden" ) ) {
+ return;
+ }
+ tooltip.position( positionOption );
+ }
+ if ( this.options.track && event && /^mouse/.test( event.type ) ) {
+ this._on( this.document, {
+ mousemove: position
+ });
+ // trigger once to override element-relative positioning
+ position( event );
+ } else {
+ tooltip.position( $.extend({
+ of: target
+ }, this.options.position ) );
+ }
+
+ tooltip.hide();
+
+ this._show( tooltip, this.options.show );
+ // Handle tracking tooltips that are shown with a delay (#8644). As soon
+ // as the tooltip is visible, position the tooltip using the most recent
+ // event.
+ if ( this.options.show && this.options.show.delay ) {
+ delayedShow = this.delayedShow = setInterval(function() {
+ if ( tooltip.is( ":visible" ) ) {
+ position( positionOption.of );
+ clearInterval( delayedShow );
+ }
+ }, $.fx.interval );
+ }
+
+ this._trigger( "open", event, { tooltip: tooltip } );
+ },
+
+ _registerCloseHandlers: function( event, target ) {
+ var events = {
+ keyup: function( event ) {
+ if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
+ var fakeEvent = $.Event(event);
+ fakeEvent.currentTarget = target[0];
+ this.close( fakeEvent, true );
+ }
+ }
+ };
+
+ // Only bind remove handler for delegated targets. Non-delegated
+ // tooltips will handle this in destroy.
+ if ( target[ 0 ] !== this.element[ 0 ] ) {
+ events.remove = function() {
+ this._removeTooltip( this._find( target ).tooltip );
+ };
+ }
+
+ if ( !event || event.type === "mouseover" ) {
+ events.mouseleave = "close";
+ }
+ if ( !event || event.type === "focusin" ) {
+ events.focusout = "close";
+ }
+ this._on( true, target, events );
+ },
+
+ close: function( event ) {
+ var tooltip,
+ that = this,
+ target = $( event ? event.currentTarget : this.element ),
+ tooltipData = this._find( target );
+
+ // The tooltip may already be closed
+ if ( !tooltipData ) {
+
+ // We set ui-tooltip-open immediately upon open (in open()), but only set the
+ // additional data once there's actually content to show (in _open()). So even if
the
+ // tooltip doesn't have full data, we always remove ui-tooltip-open in case
we're in
+ // the period between open() and _open().
+ target.removeData( "ui-tooltip-open" );
+ return;
+ }
+
+ tooltip = tooltipData.tooltip;
+
+ // disabling closes the tooltip, so we need to track when we're closing
+ // to avoid an infinite loop in case the tooltip becomes disabled on close
+ if ( tooltipData.closing ) {
+ return;
+ }
+
+ // Clear the interval for delayed tracking tooltips
+ clearInterval( this.delayedShow );
+
+ // only set title if we had one before (see comment in _open())
+ // If the title attribute has changed since open(), don't restore
+ if ( target.data( "ui-tooltip-title" ) && !target.attr(
"title" ) ) {
+ target.attr( "title", target.data( "ui-tooltip-title" ) );
+ }
+
+ this._removeDescribedBy( target );
+
+ tooltipData.hiding = true;
+ tooltip.stop( true );
+ this._hide( tooltip, this.options.hide, function() {
+ that._removeTooltip( $( this ) );
+ });
+
+ target.removeData( "ui-tooltip-open" );
+ this._off( target, "mouseleave focusout keyup" );
+
+ // Remove 'remove' binding only on delegated targets
+ if ( target[ 0 ] !== this.element[ 0 ] ) {
+ this._off( target, "remove" );
+ }
+ this._off( this.document, "mousemove" );
+
+ if ( event && event.type === "mouseleave" ) {
+ $.each( this.parents, function( id, parent ) {
+ $( parent.element ).attr( "title", parent.title );
+ delete that.parents[ id ];
+ });
+ }
+
+ tooltipData.closing = true;
+ this._trigger( "close", event, { tooltip: tooltip } );
+ if ( !tooltipData.hiding ) {
+ tooltipData.closing = false;
+ }
+ },
+
+ _tooltip: function( element ) {
+ var tooltip = $( "<div>" )
+ .attr( "role", "tooltip" )
+ .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
+ ( this.options.tooltipClass || "" ) ),
+ id = tooltip.uniqueId().attr( "id" );
+
+ $( "<div>" )
+ .addClass( "ui-tooltip-content" )
+ .appendTo( tooltip );
+
+ tooltip.appendTo( this.document[0].body );
+
+ return this.tooltips[ id ] = {
+ element: element,
+ tooltip: tooltip
+ };
+ },
+
+ _find: function( target ) {
+ var id = target.data( "ui-tooltip-id" );
+ return id ? this.tooltips[ id ] : null;
+ },
+
+ _removeTooltip: function( tooltip ) {
+ tooltip.remove();
+ delete this.tooltips[ tooltip.attr( "id" ) ];
+ },
+
+ _destroy: function() {
+ var that = this;
+
+ // close open tooltips
+ $.each( this.tooltips, function( id, tooltipData ) {
+ // Delegate to close method to handle common cleanup
+ var event = $.Event( "blur" ),
+ element = tooltipData.element;
+ event.target = event.currentTarget = element[ 0 ];
+ that.close( event, true );
+
+ // Remove immediately; destroying an open tooltip doesn't use the
+ // hide animation
+ $( "#" + id ).remove();
+
+ // Restore the title
+ if ( element.data( "ui-tooltip-title" ) ) {
+ // If the title attribute has changed since open(), don't restore
+ if ( !element.attr( "title" ) ) {
+ element.attr( "title", element.data( "ui-tooltip-title" ) );
+ }
+ element.removeData( "ui-tooltip-title" );
+ }
+ });
+ this.liveRegion.remove();
+ }
+});
+
+
+
+}));
\ No newline at end of file
diff --git a/ui/src/dist/libs/jquery.js b/ui/src/dist/libs/jquery.js
new file mode 100644
index 0000000..eed1777
--- /dev/null
+++ b/ui/src/dist/libs/jquery.js
@@ -0,0 +1,9210 @@
+/*!
+ * jQuery JavaScript Library v2.1.4
+ *
http://jquery.com/
+ *
+ * Includes Sizzle.js
+ *
http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ *
http://jquery.org/license
+ *
+ * Date: 2015-04-28T16:01Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports ===
"object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal )
{
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including
ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray =
jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, ""
),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals
("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object
Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj
) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be
removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object
Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 )
in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.0-pre
+ *
http://sizzlejs.com/
+ *
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ *
http://jquery.org/license
+ *
+ * Date: 2014-12-16
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ //
http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans =
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters
http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ //
http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier
http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax:
http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors:
http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding +
")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or
capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("
+ identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer
arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|"
+
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters
preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)"
+ whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace +
"*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" +
whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace +
"*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")"
),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w",
"w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp(
"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$",
"i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace +
"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
"i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes
http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" +
whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+ nodeType = context.nodeType;
+
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ if ( !seed && documentIsHTML ) {
+
+ // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById(
m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType !== 1 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" )
{
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode )
|| context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself
with
+ * property name the (space-suffixed) string and (if the cache is larger than
Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see
Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type
=== type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy
value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined"
&& context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the
document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+ parent = doc.defaultView;
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has
been reloaded,
+ // IE will throw "permission denied" error when accessing "document"
variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Support tests
+ ---------------------------------------------------------------------- */
+ documentIsHTML = !isXML( doc );
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML
) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function(
className, context ) {
+ if ( documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See
http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ //
http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = "<a id='" + expando +
"'></a>" +
+ "<select id='" + expando + "-\f]'
msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ //
http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace +
"*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans +
")" );
+ }
+
+ // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+,
PhantomJS<1.9.7+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ //
http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ //
https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still
enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp(
rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc,
a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc,
b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See
https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape,
funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] ===
"even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) -
unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className +
"(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" &&
elem.className || typeof elem.getAttribute !== "undefined" &&
elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) ===
check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, "
" ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1
) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start &&
"nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] =
{}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 )
&& ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ //
http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase
letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) >
-1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed
case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ //
http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) )
{
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus ||
document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ //
http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName ===
"option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ //
http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref:
5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name
=== "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type ===
"text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() ===
"text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir
caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector )
{
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [
context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting
results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder
contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level
context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) ||
(
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit
any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ?
"*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*",
outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00"
below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>)
matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers,
setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID"
&&
+ support.getById && context.nodeType === 9 && documentIsHTML
&&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape),
context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) ||
context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") ===
expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+//
http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc
with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] ===
">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex
check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length :
-1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false &&
options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"),
"resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"),
"rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise()
: this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this,
arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction(
subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use
that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) )
{
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already
occurred.
+ // We once tried to use readyState "interactive" here, but it caused issues
like the one
+ // discovered by ChrisS here:
http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw )
{
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android<4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android<4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) )
{
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user"
data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data,
_removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" )
) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom",
"Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" ||
!jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) ===
false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" +
namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**"
&& handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle )
=== false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ?
event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") +
"(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem,
data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) )
{
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] &&
data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false)
&&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be
(#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow(
elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false )
{
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) &&
!event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle ||
handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !==
"click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey
relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY
toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body &&
body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body &&
body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body &&
body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop
|| 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0
) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click &&
jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+//
http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-bind...
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) )
{
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Support: Firefox, Chrome, Safari
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig,
fix ) {
+
+ // Attach a single capturing handler on the document while someone wants
focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace :
handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag =
/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE9
+ option: [ 1, "<select multiple='multiple'>",
"</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>",
"</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>",
"</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>",
"</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr"
) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ],
"globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag ||
"*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning
options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 )
&&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons:
http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1
].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag,
"<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value )
&&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1
].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can
end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc,
node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style =
window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optimization) until something
better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0'
height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$",
"i" );
+
+var getStyles = function( elem ) {
+ // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through
"defaultView.getComputedStyle"
+ if ( elem.ownerDocument.defaultView.opener ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ }
+
+ return window.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') (#12537)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems
to be reliably pixels
+ // this is against the CSSOM draft spec:
http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ // Support: IE9-11+
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText =
"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+ div.removeChild( marginDiv );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // Swappable if display is none or starts with table except "table",
"table-cell", or "table-caption"
+ // See here for display values:
https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display:
"block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // Shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // Check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // Both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // At this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width",
true, styles );
+ }
+ } else {
+ // At this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // At this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width",
true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) ===
"border-box";
+
+ // Some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg -
https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML -
https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // Use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay",
defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem,
"display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display ===
"" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName(
style, origName ) );
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Support: IE9-11+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" &&
name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra
)) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem,
false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName(
elem.style, origName ) );
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ // Convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) ===
"border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value
];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[
tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$",
"i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" :
"px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target )
&&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged
below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur(),
+ // break the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 &&
--maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // We're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // Handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // Ensure the complete handler is called before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // Height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width"
in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) :
display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float"
) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to
proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !==
undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // Store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display)
=== "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // Support: Android 2.3
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // Resolve when we played the last frame; otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {},
speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing )
&& easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ?
opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] :
jQuery.fx.speeds._default;
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // Show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // Animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue
=== type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // Look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name
) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+//
http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS<=5.1, Android<=4.2+
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE<=11+
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: Android<=2.3
+ // Options inside disabled selects are incorrectly marked as disabled
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<=11+
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set(
elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get(
elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem,
value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem,
name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName )
|| elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " )
:
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" &&
value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " )
:
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" )
{
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal
);
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // Toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get(
this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + "
").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase()
];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem,
"value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // Handle most common string cases
+ ret.replace(rreturn, "") :
+ // Handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase()
];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value"
) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute(
"disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode,
"optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick
" +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split("
"), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types,
selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to
"*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if
needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat( "*" ),
+
+ // Document location
+ ajaxLocation = window.location.href,
+
+ // Segment location into parts
+ ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport
&& !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] &&
inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " +
current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion
from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single
space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery
collection
+ globalEventContext = s.context && ( callbackContext.nodeType ||
callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash,
"" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite
) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" :
"443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" :
"443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" )
{
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario
(#15118)
+ fireGlobals = jQuery.event && s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" )
+ s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) +
"_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL
] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false ||
options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " +
allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false
|| state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // Aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // Extract error from statusText and normalize for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" :
"ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // Shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i :
"" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional,
add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value
);
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value
);
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type )
&&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+// See
https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+ window.attachEvent( "onunload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported
);
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username,
options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript,
application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || ""
).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data )
&& "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp +
"=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context,
defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be
used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find(
selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete",
"ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type
) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 &&
elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position ===
"fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // Support: BlackBerry 5, iOS 3 (original iPhone)
+ // If we don't have gBCR, just use 0,0 rather than error
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it
is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // Assume getBoundingClientRect is there when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true
);
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true
);
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true
)
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" )
&& jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" },
function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Support: Safari<7+, Chrome<37+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug:
https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug:
https://code.google.com/p/chromium/issues/detail?id=229280
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name,
type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "":
"outer" + name }, function( defaultExtra, funcName ) {
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !==
"boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" :
"border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ //
https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+//
https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wik...
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10,
https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/ui/src/dist/libs/modernizr.js b/ui/src/dist/libs/modernizr.js
new file mode 100644
index 0000000..3365339
--- /dev/null
+++ b/ui/src/dist/libs/modernizr.js
@@ -0,0 +1,1406 @@
+/*!
+ * Modernizr v2.8.3
+ *
www.modernizr.com
+ *
+ * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
+ * Available under the BSD and MIT licenses:
www.modernizr.com/license/
+ */
+
+/*
+ * Modernizr tests which native CSS3 and HTML5 features are available in
+ * the current UA and makes the results available to you in two ways:
+ * as properties on a global Modernizr object, and as classes on the
+ * <html> element. This information allows you to progressively enhance
+ * your pages with a granular level of control over the experience.
+ *
+ * Modernizr has an optional (not included) conditional resource loader
+ * called Modernizr.load(), based on Yepnope.js (
yepnopejs.com).
+ * To get a build that includes Modernizr.load(), as well as choosing
+ * which tests to include, go to
www.modernizr.com/download/
+ *
+ * Authors Faruk Ates, Paul Irish, Alex Sexton
+ * Contributors Ryan Seddon, Ben Alman
+ */
+
+window.Modernizr = (function( window, document, undefined ) {
+
+ var version = '2.8.3',
+
+ Modernizr = {},
+
+ /*>>cssclasses*/
+ // option for enabling the HTML classes to be added
+ enableClasses = true,
+ /*>>cssclasses*/
+
+ docElement = document.documentElement,
+
+ /**
+ * Create our "modernizr" element that we do most feature tests on.
+ */
+ mod = 'modernizr',
+ modElem = document.createElement(mod),
+ mStyle = modElem.style,
+
+ /**
+ * Create the input element for various Web Forms feature tests.
+ */
+ inputElem /*>>inputelem*/ = document.createElement('input')
/*>>inputelem*/ ,
+
+ /*>>smile*/
+ smile = ':)',
+ /*>>smile*/
+
+ toString = {}.toString,
+
+ // TODO :: make the prefixes more granular
+ /*>>prefixes*/
+ // List of property values to set for css tests. See ticket #21
+ prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
+ /*>>prefixes*/
+
+ /*>>domprefixes*/
+ // Following spec is to expose vendor-specific style properties as:
+ // elem.style.WebkitBorderRadius
+ // and the following would be incorrect:
+ // elem.style.webkitBorderRadius
+
+ // Webkit ghosts their properties in lowercase but Opera & Moz do not.
+ // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+
+ //
erik.eae.net/archives/2008/03/10/21.48.10/
+
+ // More here:
github.com/Modernizr/Modernizr/issues/issue/21
+ omPrefixes = 'Webkit Moz O ms',
+
+ cssomPrefixes = omPrefixes.split(' '),
+
+ domPrefixes = omPrefixes.toLowerCase().split(' '),
+ /*>>domprefixes*/
+
+ /*>>ns*/
+ ns = {'svg': 'http://www.w3.org/2000/svg'},
+ /*>>ns*/
+
+ tests = {},
+ inputs = {},
+ attrs = {},
+
+ classes = [],
+
+ slice = classes.slice,
+
+ featureName, // used in testing loop
+
+
+ /*>>teststyles*/
+ // Inject element with style element and some CSS rules
+ injectElementWithStyles = function( rule, callback, nodes, testnames ) {
+
+ var style, ret, node, docOverflow,
+ div = document.createElement('div'),
+ // After page load injecting a fake body doesn't work so check if body
exists
+ body = document.body,
+ // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in
the body element, so we fake it.
+ fakeBody = body || document.createElement('body');
+
+ if ( parseInt(nodes, 10) ) {
+ // In order not to give false positives we create a node for each test
+ // This also allows the method to scale for unspecified uses
+ while ( nodes-- ) {
+ node = document.createElement('div');
+ node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
+ div.appendChild(node);
+ }
+ }
+
+ // <style> elements in IE6-9 are considered 'NoScope' elements and
therefore will be removed
+ // when injected with innerHTML. To get around this you need to prepend the
'NoScope' element
+ // with a 'scoped' element, in our case the soft-hyphen entity as it
won't mess with our measurements.
+ //
msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
+ // Documents served as xml will throw if using ­ so use xml friendly
encoded version. See issue #277
+ style = ['­','<style id="s', mod,
'">', rule, '</style>'].join('');
+ div.id = mod;
+ // IE6 will false positive on some tests due to the style element inside the test
div somehow interfering offsetHeight, so insert it into body or fakebody.
+ // Opera will act all quirky when injecting elements in documentElement when page
is served as xml, needs fakebody too. #270
+ (body ? div : fakeBody).innerHTML += style;
+ fakeBody.appendChild(div);
+ if ( !body ) {
+ //avoid crashing IE8, if background image is used
+ fakeBody.style.background = '';
+ //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and
scrollbars are visible
+ fakeBody.style.overflow = 'hidden';
+ docOverflow = docElement.style.overflow;
+ docElement.style.overflow = 'hidden';
+ docElement.appendChild(fakeBody);
+ }
+
+ ret = callback(div, rule);
+ // If this is done after page load we don't want to remove the body so check if
body exists
+ if ( !body ) {
+ fakeBody.parentNode.removeChild(fakeBody);
+ docElement.style.overflow = docOverflow;
+ } else {
+ div.parentNode.removeChild(div);
+ }
+
+ return !!ret;
+
+ },
+ /*>>teststyles*/
+
+ /*>>mq*/
+ // adapted from matchMedia polyfill
+ // by Scott Jehl and Paul Irish
+ //
gist.github.com/786768
+ testMediaQuery = function( mq ) {
+
+ var matchMedia = window.matchMedia || window.msMatchMedia;
+ if ( matchMedia ) {
+ return matchMedia(mq) && matchMedia(mq).matches || false;
+ }
+
+ var bool;
+
+ injectElementWithStyles('@media ' + mq + ' { #' + mod + ' {
position: absolute; } }', function( node ) {
+ bool = (window.getComputedStyle ?
+ getComputedStyle(node, null) :
+ node.currentStyle)['position'] == 'absolute';
+ });
+
+ return bool;
+
+ },
+ /*>>mq*/
+
+
+ /*>>hasevent*/
+ //
+ // isEventSupported determines if a given element supports the given event
+ //
kangax.github.com/iseventsupported/
+ //
+ // The following results are known incorrects:
+ // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative
+ // Modernizr.hasEvent("textInput") // in Webkit.
github.com/Modernizr/Modernizr/issues/333
+ // ...
+ isEventSupported = (function() {
+
+ var TAGNAMES = {
+ 'select': 'input', 'change': 'input',
+ 'submit': 'form', 'reset': 'form',
+ 'error': 'img', 'load': 'img', 'abort':
'img'
+ };
+
+ function isEventSupported( eventName, element ) {
+
+ element = element || document.createElement(TAGNAMES[eventName] ||
'div');
+ eventName = 'on' + eventName;
+
+ // When using `setAttribute`, IE skips "unload", WebKit skips
"unload" and "resize", whereas `in` "catches" those
+ var isSupported = eventName in element;
+
+ if ( !isSupported ) {
+ // If it has no `setAttribute` (i.e. doesn't implement Node interface), try
generic element
+ if ( !element.setAttribute ) {
+ element = document.createElement('div');
+ }
+ if ( element.setAttribute && element.removeAttribute ) {
+ element.setAttribute(eventName, '');
+ isSupported = is(element[eventName], 'function');
+
+ // If property was created, "remove it" (by setting value to
`undefined`)
+ if ( !is(element[eventName], 'undefined') ) {
+ element[eventName] = undefined;
+ }
+ element.removeAttribute(eventName);
+ }
+ }
+
+ element = null;
+ return isSupported;
+ }
+ return isEventSupported;
+ })(),
+ /*>>hasevent*/
+
+ // TODO :: Add flag for hasownprop ? didn't last time
+
+ // hasOwnProperty shim by kangax needed for Safari 2.0 support
+ _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
+
+ if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call,
'undefined') ) {
+ hasOwnProp = function (object, property) {
+ return _hasOwnProperty.call(object, property);
+ };
+ }
+ else {
+ hasOwnProp = function (object, property) { /* yes, this can give false
positives/negatives, but most of the time we don't care about those */
+ return ((property in object) &&
is(object.constructor.prototype[property], 'undefined'));
+ };
+ }
+
+ // Adapted from ES5-shim
https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
+ //
es5.github.com/#x15.3.4.5
+
+ if (!Function.prototype.bind) {
+ Function.prototype.bind = function bind(that) {
+
+ var target = this;
+
+ if (typeof target != "function") {
+ throw new TypeError();
+ }
+
+ var args = slice.call(arguments, 1),
+ bound = function () {
+
+ if (this instanceof bound) {
+
+ var F = function(){};
+ F.prototype = target.prototype;
+ var self = new F();
+
+ var result = target.apply(
+ self,
+ args.concat(slice.call(arguments))
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return self;
+
+ } else {
+
+ return target.apply(
+ that,
+ args.concat(slice.call(arguments))
+ );
+
+ }
+
+ };
+
+ return bound;
+ };
+ }
+
+ /**
+ * setCss applies given styles to the Modernizr DOM node.
+ */
+ function setCss( str ) {
+ mStyle.cssText = str;
+ }
+
+ /**
+ * setCssAll extrapolates all vendor-specific css strings.
+ */
+ function setCssAll( str1, str2 ) {
+ return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
+ }
+
+ /**
+ * is returns a boolean for if typeof obj is exactly type.
+ */
+ function is( obj, type ) {
+ return typeof obj === type;
+ }
+
+ /**
+ * contains returns a boolean for if substr is found within str.
+ */
+ function contains( str, substr ) {
+ return !!~('' + str).indexOf(substr);
+ }
+
+ /*>>testprop*/
+
+ // testProps is a generic CSS / DOM property test.
+
+ // In testing support for a given CSS property, it's legit to test:
+ // `elem.style[styleName] !== undefined`
+ // If the property is supported it will return an empty string,
+ // if unsupported it will return undefined.
+
+ // We'll take advantage of this quick test and skip setting a style
+ // on our modernizr element, but instead just testing undefined vs
+ // empty string.
+
+ // Because the testing of the CSS property names (with "-", as
+ // opposed to the camelCase DOM properties) is non-portable and
+ // non-standard but works in WebKit and IE (but not Gecko or Opera),
+ // we explicitly reject properties with dashes so that authors
+ // developing in WebKit or IE first don't end up with
+ // browser-specific content by accident.
+
+ function testProps( props, prefixed ) {
+ for ( var i in props ) {
+ var prop = props[i];
+ if ( !contains(prop, "-") && mStyle[prop] !== undefined )
{
+ return prefixed == 'pfx' ? prop : true;
+ }
+ }
+ return false;
+ }
+ /*>>testprop*/
+
+ // TODO :: add testDOMProps
+ /**
+ * testDOMProps is a generic DOM property test; if a browser supports
+ * a certain property, it won't return undefined for it.
+ */
+ function testDOMProps( props, obj, elem ) {
+ for ( var i in props ) {
+ var item = obj[props[i]];
+ if ( item !== undefined) {
+
+ // return the property name as a string
+ if (elem === false) return props[i];
+
+ // let's bind a function
+ if (is(item, 'function')){
+ // default to autobind unless override
+ return item.bind(elem || obj);
+ }
+
+ // return the unbound function or obj or value
+ return item;
+ }
+ }
+ return false;
+ }
+
+ /*>>testallprops*/
+ /**
+ * testPropsAll tests a list of DOM properties we want to check against.
+ * We specify literally ALL possible (known and/or likely) properties on
+ * the element including the non-vendor prefixed one, for forward-
+ * compatibility.
+ */
+ function testPropsAll( prop, prefixed, elem ) {
+
+ var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
+ props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') +
ucProp).split(' ');
+
+ // did they call .prefixed('boxSizing') or are we just testing a prop?
+ if(is(prefixed, "string") || is(prefixed, "undefined")) {
+ return testProps(props, prefixed);
+
+ // otherwise, they called .prefixed('requestAnimationFrame', window[,
elem])
+ } else {
+ props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') +
ucProp).split(' ');
+ return testDOMProps(props, prefixed, elem);
+ }
+ }
+ /*>>testallprops*/
+
+
+ /**
+ * Tests
+ * -----
+ */
+
+ // The *new* flexbox
+ //
dev.w3.org/csswg/css3-flexbox
+
+ tests['flexbox'] = function() {
+ return testPropsAll('flexWrap');
+ };
+
+ // The *old* flexbox
+ //
www.w3.org/TR/2009/WD-css3-flexbox-20090723/
+
+ tests['flexboxlegacy'] = function() {
+ return testPropsAll('boxDirection');
+ };
+
+ // On the S60 and BB Storm, getContext exists, but always returns undefined
+ // so we actually have to call getContext() to verify
+ //
github.com/Modernizr/Modernizr/issues/issue/97/
+
+ tests['canvas'] = function() {
+ var elem = document.createElement('canvas');
+ return !!(elem.getContext && elem.getContext('2d'));
+ };
+
+ tests['canvastext'] = function() {
+ return !!(Modernizr['canvas'] &&
is(document.createElement('canvas').getContext('2d').fillText,
'function'));
+ };
+
+ // webk.it/70117 is tracking a legit WebGL feature detect proposal
+
+ // We do a soft detect which may false positive in order to avoid
+ // an expensive context creation: bugzil.la/732441
+
+ tests['webgl'] = function() {
+ return !!window.WebGLRenderingContext;
+ };
+
+ /*
+ * The Modernizr.touch test only indicates if the browser supports
+ * touch events, which does not necessarily reflect a touchscreen
+ * device, as evidenced by tablets running Windows 7 or, alas,
+ * the Palm Pre / WebOS (touch) phones.
+ *
+ * Additionally, Chrome (desktop) used to lie about its support on this,
+ * but that has since been rectified:
crbug.com/36415
+ *
+ * We also test for Firefox 4 Multitouch Support.
+ *
+ * For more info, see:
modernizr.github.com/Modernizr/touch.html
+ */
+
+ tests['touch'] = function() {
+ var bool;
+
+ if(('ontouchstart' in window) || window.DocumentTouch && document
instanceof DocumentTouch) {
+ bool = true;
+ } else {
+ injectElementWithStyles(['@media
(',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''),
function( node ) {
+ bool = node.offsetTop === 9;
+ });
+ }
+
+ return bool;
+ };
+
+
+ // geolocation is often considered a trivial feature detect...
+ // Turns out, it's quite tricky to get right:
+ //
+ // Using !!navigator.geolocation does two things we don't want. It:
+ // 1. Leaks memory in IE9:
github.com/Modernizr/Modernizr/issues/513
+ // 2. Disables page caching in WebKit: webk.it/43956
+ //
+ // Meanwhile, in Firefox < 8, an about:config setting could expose
+ // a false positive that would throw an exception: bugzil.la/688158
+
+ tests['geolocation'] = function() {
+ return 'geolocation' in navigator;
+ };
+
+
+ tests['postmessage'] = function() {
+ return !!window.postMessage;
+ };
+
+
+ // Chrome incognito mode used to throw an exception when using openDatabase
+ // It doesn't anymore.
+ tests['websqldatabase'] = function() {
+ return !!window.openDatabase;
+ };
+
+ // Vendors had inconsistent prefixing with the experimental Indexed DB:
+ // - Webkit's implementation is accessible through webkitIndexedDB
+ // - Firefox shipped moz_indexedDB before FF4b9, but since then has been
mozIndexedDB
+ // For speed, we don't test the legacy (and beta-only) indexedDB
+ tests['indexedDB'] = function() {
+ return !!testPropsAll("indexedDB", window);
+ };
+
+ // documentMode logic from YUI to filter out IE8 Compat Mode
+ // which false positives.
+ tests['hashchange'] = function() {
+ return isEventSupported('hashchange', window) &&
(document.documentMode === undefined || document.documentMode > 7);
+ };
+
+ // Per 1.6:
+ // This used to be Modernizr.historymanagement but the longer
+ // name has been deprecated in favor of a shorter and property-matching one.
+ // The old API is still available in 1.6, but as of 2.0 will throw a warning,
+ // and in the first release thereafter disappear entirely.
+ tests['history'] = function() {
+ return !!(window.history && history.pushState);
+ };
+
+ tests['draganddrop'] = function() {
+ var div = document.createElement('div');
+ return ('draggable' in div) || ('ondragstart' in div &&
'ondrop' in div);
+ };
+
+ // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10
+ // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.
+ // FF10 still uses prefixes, so check for it until then.
+ // for more ESR info, see:
mozilla.org/en-US/firefox/organizations/faq/
+ tests['websockets'] = function() {
+ return 'WebSocket' in window || 'MozWebSocket' in window;
+ };
+
+
+ //
css-tricks.com/rgba-browser-support/
+ tests['rgba'] = function() {
+ // Set an rgba() color and check the returned value
+
+ setCss('background-color:rgba(150,255,150,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba');
+ };
+
+ tests['hsla'] = function() {
+ // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
+ // except IE9 who retains it as hsla
+
+ setCss('background-color:hsla(120,40%,100%,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba') ||
contains(mStyle.backgroundColor, 'hsla');
+ };
+
+ tests['multiplebgs'] = function() {
+ // Setting multiple images AND a color on the background shorthand property
+ // and then querying the style.background property value for the number of
+ // occurrences of "url(" is a reliable method for detecting ACTUAL
support for this!
+
+ setCss('background:url(https://),url(https://),red url(https://)');
+
+ // If the UA supports multiple backgrounds, there should be three occurrences
+ // of the string "url(" in the return value for elemStyle.background
+
+ return (/(url\s*\(.*?){3}/).test(mStyle.background);
+ };
+
+
+
+ // this will false positive in Opera Mini
+ //
github.com/Modernizr/Modernizr/issues/396
+
+ tests['backgroundsize'] = function() {
+ return testPropsAll('backgroundSize');
+ };
+
+ tests['borderimage'] = function() {
+ return testPropsAll('borderImage');
+ };
+
+
+ // Super comprehensive table about all the unique implementations of
+ // border-radius:
muddledramblings.com/table-of-css3-border-radius-compliance
+
+ tests['borderradius'] = function() {
+ return testPropsAll('borderRadius');
+ };
+
+ // WebOS unfortunately false positives on this test.
+ tests['boxshadow'] = function() {
+ return testPropsAll('boxShadow');
+ };
+
+ // FF3.0 will false positive on this test
+ tests['textshadow'] = function() {
+ return document.createElement('div').style.textShadow === '';
+ };
+
+
+ tests['opacity'] = function() {
+ // Browsers that actually have CSS Opacity implemented have done so
+ // according to spec, which means their return values are within the
+ // range of [0.0,1.0] - including the leading zero.
+
+ setCssAll('opacity:.55');
+
+ // The non-literal . in this regex is intentional:
+ // German Chrome returns this value as 0,55
+ //
github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
+ return (/^0.55$/).test(mStyle.opacity);
+ };
+
+
+ // Note, Android < 4 will pass this test, but can only animate
+ // a single property at a time
+ // goo.gl/v3V4Gp
+ tests['cssanimations'] = function() {
+ return testPropsAll('animationName');
+ };
+
+
+ tests['csscolumns'] = function() {
+ return testPropsAll('columnCount');
+ };
+
+
+ tests['cssgradients'] = function() {
+ /**
+ * For CSS Gradients syntax, please see:
+ *
webkit.org/blog/175/introducing-css-gradients/
+ *
developer.mozilla.org/en/CSS/-moz-linear-gradient
+ *
developer.mozilla.org/en/CSS/-moz-radial-gradient
+ *
dev.w3.org/csswg/css3-images/#gradients-
+ */
+
+ var str1 = 'background-image:',
+ str2 = 'gradient(linear,left top,right
bottom,from(#9f9),to(white));',
+ str3 = 'linear-gradient(left top,#9f9, white);';
+
+ setCss(
+ // legacy webkit syntax (FIXME: remove when syntax not in use anymore)
+ (str1 + '-webkit- '.split(' ').join(str2 + str1) +
+ // standard syntax // trailing 'background-image:'
+ prefixes.join(str3 + str1)).slice(0, -str1.length)
+ );
+
+ return contains(mStyle.backgroundImage, 'gradient');
+ };
+
+
+ tests['cssreflections'] = function() {
+ return testPropsAll('boxReflect');
+ };
+
+
+ tests['csstransforms'] = function() {
+ return !!testPropsAll('transform');
+ };
+
+
+ tests['csstransforms3d'] = function() {
+
+ var ret = !!testPropsAll('perspective');
+
+ // Webkit's 3D transforms are passed off to the browser's own graphics
renderer.
+ // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
+ // some conditions. As a result, Webkit typically recognizes the syntax but
+ // will sometimes throw a false positive, thus we must do a more thorough
check:
+ if ( ret && 'webkitPerspective' in docElement.style ) {
+
+ // Webkit allows this media query to succeed only if the feature is enabled.
+ // `@media (transform-3d),(-webkit-transform-3d){ ... }`
+ injectElementWithStyles('@media
(transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}',
function( node, rule ) {
+ ret = node.offsetLeft === 9 && node.offsetHeight === 3;
+ });
+ }
+ return ret;
+ };
+
+
+ tests['csstransitions'] = function() {
+ return testPropsAll('transition');
+ };
+
+
+ /*>>fontface*/
+ // @font-face detection routine by Diego Perini
+ //
javascript.nwbox.com/CSSSupport/
+
+ // false positives:
+ // WebOS
github.com/Modernizr/Modernizr/issues/342
+ // WP7
github.com/Modernizr/Modernizr/issues/538
+ tests['fontface'] = function() {
+ var bool;
+
+ injectElementWithStyles('@font-face
{font-family:"font";src:url("https://")}', function( node, rule )
{
+ var style = document.getElementById('smodernizr'),
+ sheet = style.sheet || style.styleSheet,
+ cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ?
sheet.cssRules[0].cssText : sheet.cssText || '') : '';
+
+ bool = /src/i.test(cssText) && cssText.indexOf(rule.split('
')[0]) === 0;
+ });
+
+ return bool;
+ };
+ /*>>fontface*/
+
+ // CSS generated content detection
+ tests['generatedcontent'] = function() {
+ var bool;
+
+ injectElementWithStyles(['#',mod,'{font:0/0
a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1
a}'].join(''), function( node ) {
+ bool = node.offsetHeight >= 3;
+ });
+
+ return bool;
+ };
+
+
+
+ // These tests evaluate support of the video/audio elements, as well as
+ // testing what types of content they support.
+ //
+ // We're using the Boolean constructor here, so that we can extend the value
+ // e.g. Modernizr.video // true
+ // Modernizr.video.ogg // 'probably'
+ //
+ // Codec values from :
github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
+ // thx to NielsLeenheer and zcorpan
+
+ // Note: in some older browsers, "no" was a return value instead of empty
string.
+ // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2
+ // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5
+
+ tests['video'] = function() {
+ var elem = document.createElement('video'),
+ bool = false;
+
+ // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug
#224
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('video/ogg;
codecs="theora"') .replace(/^no$/,'');
+
+ // Without QuickTime, this value will be `undefined`.
github.com/Modernizr/Modernizr/issues/546
+ bool.h264 = elem.canPlayType('video/mp4;
codecs="avc1.42E01E"') .replace(/^no$/,'');
+
+ bool.webm = elem.canPlayType('video/webm; codecs="vp8,
vorbis"').replace(/^no$/,'');
+ }
+
+ } catch(e) { }
+
+ return bool;
+ };
+
+ tests['audio'] = function() {
+ var elem = document.createElement('audio'),
+ bool = false;
+
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('audio/ogg;
codecs="vorbis"').replace(/^no$/,'');
+ bool.mp3 = elem.canPlayType('audio/mpeg;')
.replace(/^no$/,'');
+
+ // Mimetypes accepted:
+ //
developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_e...
+ // bit.ly/iphoneoscodecs
+ bool.wav = elem.canPlayType('audio/wav; codecs="1"')
.replace(/^no$/,'');
+ bool.m4a = ( elem.canPlayType('audio/x-m4a;') ||
+ elem.canPlayType('audio/aac;'))
.replace(/^no$/,'');
+ }
+ } catch(e) { }
+
+ return bool;
+ };
+
+
+ // In FF4, if disabled, window.localStorage should === null.
+
+ // Normally, we could not test that directly and need to do a
+ // `('localStorage' in window) && ` test first because otherwise
Firefox will
+ // throw bugzil.la/365772 if cookies are disabled
+
+ // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem
+ // will throw the exception:
+ // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
+ // Peculiarly, getItem and removeItem calls do not throw.
+
+ // Because we are forced to try/catch this, we'll go aggressive.
+
+ // Just FWIW: IE8 Compat mode supports these features completely:
+ //
www.quirksmode.org/dom/html5.html
+ // But IE8 doesn't support either with local files
+
+ tests['localstorage'] = function() {
+ try {
+ localStorage.setItem(mod, mod);
+ localStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+ tests['sessionstorage'] = function() {
+ try {
+ sessionStorage.setItem(mod, mod);
+ sessionStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+
+ tests['webworkers'] = function() {
+ return !!window.Worker;
+ };
+
+
+ tests['applicationcache'] = function() {
+ return !!window.applicationCache;
+ };
+
+
+ // Thanks to Erik Dahlstrom
+ tests['svg'] = function() {
+ return !!document.createElementNS && !!document.createElementNS(ns.svg,
'svg').createSVGRect;
+ };
+
+ // specifically for SVG inline in HTML, not within XHTML
+ // test page:
paulirish.com/demo/inline-svg
+ tests['inlinesvg'] = function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<svg/>';
+ return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
+ };
+
+ // SVG SMIL animation
+ tests['smil'] = function() {
+ return !!document.createElementNS &&
/SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));
+ };
+
+ // This test is only for clip paths in SVG proper, not clip paths on HTML content
+ // demo:
srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg
+
+ // However read the comments to dig into applying SVG clippaths to HTML content
here:
+ //
github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491
+ tests['svgclippaths'] = function() {
+ return !!document.createElementNS &&
/SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));
+ };
+
+ /*>>webforms*/
+ // input features and input types go directly onto the ret object, bypassing the
tests loop.
+ // Hold this guy to execute in a moment.
+ function webforms() {
+ /*>>input*/
+ // Run through HTML5's new input attributes to see if the UA understands
any.
+ // We're using f which is the <input> element created early on
+ // Mike Taylr has created a comprehensive resource for testing these attributes
+ // when applied to all input types:
+ //
miketaylr.com/code/input-type-attr.html
+ // spec:
www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.ht...
+
+ // Only input placeholder is tested while textarea's placeholder is not.
+ // Currently Safari 4 and Opera 11 have support only for the input placeholder
+ // Both tests are available in feature-detects/forms-placeholder.js
+ Modernizr['input'] = (function( props ) {
+ for ( var i = 0, len = props.length; i < len; i++ ) {
+ attrs[ props[i] ] = !!(props[i] in inputElem);
+ }
+ if (attrs.list){
+ // safari false positive's on datalist: webk.it/74252
+ // see also
github.com/Modernizr/Modernizr/issues/146
+ attrs.list = !!(document.createElement('datalist') &&
window.HTMLDataListElement);
+ }
+ return attrs;
+ })('autocomplete autofocus list placeholder max min multiple pattern required
step'.split(' '));
+ /*>>input*/
+
+ /*>>inputtypes*/
+ // Run through HTML5's new input types to see if the UA understands any.
+ // This is put behind the tests runloop because it doesn't return a
+ // true/false like all the other tests; instead, it returns an object
+ // containing each input type with its corresponding true/false value
+
+ // Big thanks to @miketaylr for the html5 forms expertise.
miketaylr.com/
+ Modernizr['inputtypes'] = (function(props) {
+
+ for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i <
len; i++ ) {
+
+ inputElem.setAttribute('type', inputElemType = props[i]);
+ bool = inputElem.type !== 'text';
+
+ // We first check to see if the type we give it sticks..
+ // If the type does, we feed it a textual value, which shouldn't be
valid.
+ // If the value doesn't stick, we know there's input sanitization
which infers a custom UI
+ if ( bool ) {
+
+ inputElem.value = smile;
+ inputElem.style.cssText =
'position:absolute;visibility:hidden;';
+
+ if ( /^range$/.test(inputElemType) &&
inputElem.style.WebkitAppearance !== undefined ) {
+
+ docElement.appendChild(inputElem);
+ defaultView = document.defaultView;
+
+ // Safari 2-4 allows the smiley as a value, despite making a
slider
+ bool = defaultView.getComputedStyle &&
+ defaultView.getComputedStyle(inputElem,
null).WebkitAppearance !== 'textfield' &&
+ // Mobile android web browser has false positive, so must
+ // check the height to see if the widget is actually
there.
+ (inputElem.offsetHeight !== 0);
+
+ docElement.removeChild(inputElem);
+
+ } else if ( /^(search|tel)$/.test(inputElemType) ){
+ // Spec doesn't define any special parsing or detectable UI
+ // behaviors so we pass these through as true
+
+ // Interestingly, opera fails the earlier test, so it doesn't
+ // even make it here.
+
+ } else if ( /^(url|email)$/.test(inputElemType) ) {
+ // Real url and email support comes with prebaked validation.
+ bool = inputElem.checkValidity && inputElem.checkValidity()
=== false;
+
+ } else {
+ // If the upgraded input compontent rejects the :) text, we got a
winner
+ bool = inputElem.value != smile;
+ }
+ }
+
+ inputs[ props[i] ] = !!bool;
+ }
+ return inputs;
+ })('search tel url email datetime date month week time datetime-local number
range color'.split(' '));
+ /*>>inputtypes*/
+ }
+ /*>>webforms*/
+
+
+ // End of test definitions
+ // -----------------------
+
+
+
+ // Run through all tests and detect their support in the current UA.
+ // todo: hypothetically we could be doing an array of tests and use a basic loop
here.
+ for ( var feature in tests ) {
+ if ( hasOwnProp(tests, feature) ) {
+ // run the test, throw the return value into the Modernizr,
+ // then based on that boolean, define an appropriate className
+ // and push it into an array of classes we'll join later.
+ featureName = feature.toLowerCase();
+ Modernizr[featureName] = tests[feature]();
+
+ classes.push((Modernizr[featureName] ? '' : 'no-') +
featureName);
+ }
+ }
+
+ /*>>webforms*/
+ // input tests need to run.
+ Modernizr.input || webforms();
+ /*>>webforms*/
+
+
+ /**
+ * addTest allows the user to define their own feature tests
+ * the result will be added onto the Modernizr object,
+ * as well as an appropriate className set on the html element
+ *
+ * @param feature - String naming the feature
+ * @param test - Function returning true if feature is supported, false if not
+ */
+ Modernizr.addTest = function ( feature, test ) {
+ if ( typeof feature == 'object' ) {
+ for ( var key in feature ) {
+ if ( hasOwnProp( feature, key ) ) {
+ Modernizr.addTest( key, feature[ key ] );
+ }
+ }
+ } else {
+
+ feature = feature.toLowerCase();
+
+ if ( Modernizr[feature] !== undefined ) {
+ // we're going to quit if you're trying to overwrite an existing test
+ // if we were to allow it, we'd do this:
+ // var re = new RegExp("\\b(no-)?" + feature + "\\b");
+ // docElement.className = docElement.className.replace( re, '' );
+ // but, no rly, stuff 'em.
+ return Modernizr;
+ }
+
+ test = typeof test == 'function' ? test() : test;
+
+ if (typeof enableClasses !== "undefined" && enableClasses) {
+ docElement.className += ' ' + (test ? '' : 'no-') +
feature;
+ }
+ Modernizr[feature] = test;
+
+ }
+
+ return Modernizr; // allow chaining.
+ };
+
+
+ // Reset modElem.cssText to nothing to reduce memory footprint.
+ setCss('');
+ modElem = inputElem = null;
+
+ /*>>shiv*/
+ /**
+ * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2
Licensed
+ */
+ ;(function(window, document) {
+ /*jshint evil:true */
+ /** version */
+ var version = '3.7.0';
+
+ /** Preset options */
+ var options = window.html5 || {};
+
+ /** Used to skip problem elements */
+ var reSkip =
/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ /** Not all elements can be cloned in IE **/
+ var saveClones =
/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
+
+ /** Detect whether the browser supports default html5 styles */
+ var supportsHtml5Styles;
+
+ /** Name of the expando, to work with multiple documents or to re-shiv one
document */
+ var expando = '_html5shiv';
+
+ /** The id for the the documents expando */
+ var expanID = 0;
+
+ /** Cached data for each document */
+ var expandoData = {};
+
+ /** Detect whether the browser supports unknown elements */
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = '<xyz></xyz>';
+ //if the hidden property is implemented we can assume, that the browser
supports basic HTML5 Styles
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ // assign a false positive if unable to shiv
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ // assign a false positive if detection fails => unable to shiv
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Creates a style sheet with the given CSS text and adds it to the document.
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @param {String} cssText The CSS text.
+ * @returns {StyleSheet} The style element.
+ */
+ function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] ||
ownerDocument.documentElement;
+
+ p.innerHTML = 'x<style>' + cssText + '</style>';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ /**
+ * Returns the value of `html5.elements` as an array.
+ * @private
+ * @returns {Array} An array of shived element node names.
+ */
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') :
elements;
+ }
+
+ /**
+ * Returns the data associated to the given document
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Object} An object of data.
+ */
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ /**
+ * returns a shived element for the given nodeName and document
+ * @memberOf html5
+ * @param {String} nodeName name of the element
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived element.
+ */
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ // Avoid adding some elements to fragments in IE < 9 because
+ // * Attributes like `name` or `type` cannot be set/changed once an element
+ // is inserted into a document/fragment
+ // * Link elements with `src` attributes that are inaccessible, as with
+ // a 403 response, will cause the tab/window to crash
+ // * Script elements appended to fragments will execute when their `src`
+ // or `text` property is set
+ return node.canHaveChildren && !reSkip.test(nodeName) &&
!node.tagUrn ? data.frag.appendChild(node) : node;
+ }
+
+ /**
+ * returns a shived DocumentFragment for the given document
+ * @memberOf html5
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived DocumentFragment.
+ */
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;i<l;i++){
+ clone.createElement(elems[i]);
+ }
+ return clone;
+ }
+
+ /**
+ * Shivs the `createElement` and `createDocumentFragment` methods of the
document.
+ * @private
+ * @param {Document|DocumentFragment} ownerDocument The document.
+ * @param {Object} data of the document.
+ */
+ function shivMethods(ownerDocument, data) {
+ if (!data.cache) {
+ data.cache = {};
+ data.createElem = ownerDocument.createElement;
+ data.createFrag = ownerDocument.createDocumentFragment;
+ data.frag = data.createFrag();
+ }
+
+
+ ownerDocument.createElement = function(nodeName) {
+ //abort shiv
+ if (!html5.shivMethods) {
+ return data.createElem(nodeName);
+ }
+ return createElement(nodeName, ownerDocument, data);
+ };
+
+ ownerDocument.createDocumentFragment = Function('h,f', 'return
function(){' +
+ 'var
n=f.cloneNode(),c=n.createElement;' +
+
'h.shivMethods&&(' +
+ // unroll the `createElement`
calls
+
getElements().join().replace(/[\w\-]+/g, function(nodeName) {
+ data.createElem(nodeName);
+ data.frag.createElement(nodeName);
+ return 'c("' + nodeName + '")';
+ }) +
+ ');return n}'
+ )(html5, data.frag);
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Shivs the given document.
+ * @memberOf html5
+ * @param {Document} ownerDocument The document to shiv.
+ * @returns {Document} The shived document.
+ */
+ function shivDocument(ownerDocument) {
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ var data = getExpandoData(ownerDocument);
+
+ if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
+ data.hasCSS = !!addStyleSheet(ownerDocument,
+ // corrects block display not defined in
IE6/7/8/9
+
'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}'
+
+ // adds styling not present in IE6/7/8/9
+ 'mark{background:#FF0;color:#000}' +
+ // hides non-rendered elements
+ 'template{display:none}'
+ );
+ }
+ if (!supportsUnknownElements) {
+ shivMethods(ownerDocument, data);
+ }
+ return ownerDocument;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * The `html5` object is exposed so that more elements can be shived and
+ * existing shiving can be detected on iframes.
+ * @type Object
+ * @example
+ *
+ * // options can be changed before the script is included
+ * html5 = { 'elements': 'mark section', 'shivCSS':
false, 'shivMethods': false };
+ */
+ var html5 = {
+
+ /**
+ * An array or space separated string of node names of the elements to shiv.
+ * @memberOf html5
+ * @type Array|String
+ */
+ 'elements': options.elements || 'abbr article aside audio bdi
canvas data datalist details dialog figcaption figure footer header hgroup main mark meter
nav output progress section summary template time video',
+
+ /**
+ * current version of html5shiv
+ */
+ 'version': version,
+
+ /**
+ * A flag to indicate that the HTML5 style sheet should be inserted.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivCSS': (options.shivCSS !== false),
+
+ /**
+ * Is equal to true if a browser supports creating unknown/HTML5 elements
+ * @memberOf html5
+ * @type boolean
+ */
+ 'supportsUnknownElements': supportsUnknownElements,
+
+ /**
+ * A flag to indicate that the document's `createElement` and
`createDocumentFragment`
+ * methods should be overwritten.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivMethods': (options.shivMethods !== false),
+
+ /**
+ * A string to describe the type of `html5` object ("default" or
"default print").
+ * @memberOf html5
+ * @type String
+ */
+ 'type': 'default',
+
+ // shivs the document according to the specified `html5` object options
+ 'shivDocument': shivDocument,
+
+ //creates a shived element
+ createElement: createElement,
+
+ //creates a shived documentFragment
+ createDocumentFragment: createDocumentFragment
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ // expose html5
+ window.html5 = html5;
+
+ // shiv the document
+ shivDocument(document);
+
+ }(this, document));
+ /*>>shiv*/
+
+ // Assign private properties to the return object with prefix
+ Modernizr._version = version;
+
+ // expose these for the plugin API. Look in the source for how to join() them against
your input
+ /*>>prefixes*/
+ Modernizr._prefixes = prefixes;
+ /*>>prefixes*/
+ /*>>domprefixes*/
+ Modernizr._domPrefixes = domPrefixes;
+ Modernizr._cssomPrefixes = cssomPrefixes;
+ /*>>domprefixes*/
+
+ /*>>mq*/
+ // Modernizr.mq tests a given media query, live against the current state of the
window
+ // A few important notes:
+ // * If a browser does not support media queries at all (eg. oldIE) the mq() will
always return false
+ // * A max-width or orientation query will be evaluated against the current state,
which may change later.
+ // * You must specify values. Eg. If you are testing support for the min-width
media query use:
+ // Modernizr.mq('(min-width:0)')
+ // usage:
+ // Modernizr.mq('only screen and (max-width:768)')
+ Modernizr.mq = testMediaQuery;
+ /*>>mq*/
+
+ /*>>hasevent*/
+ // Modernizr.hasEvent() detects support for a given event, with an optional element
to test on
+ // Modernizr.hasEvent('gesturestart', elem)
+ Modernizr.hasEvent = isEventSupported;
+ /*>>hasevent*/
+
+ /*>>testprop*/
+ // Modernizr.testProp() investigates whether a given style property is recognized
+ // Note that the property names must be provided in the camelCase variant.
+ // Modernizr.testProp('pointerEvents')
+ Modernizr.testProp = function(prop){
+ return testProps([prop]);
+ };
+ /*>>testprop*/
+
+ /*>>testallprops*/
+ // Modernizr.testAllProps() investigates whether a given style property,
+ // or any of its vendor-prefixed variants, is recognized
+ // Note that the property names must be provided in the camelCase variant.
+ // Modernizr.testAllProps('boxSizing')
+ Modernizr.testAllProps = testPropsAll;
+ /*>>testallprops*/
+
+
+ /*>>teststyles*/
+ // Modernizr.testStyles() allows you to add custom styles to the document and test an
element afterwards
+ // Modernizr.testStyles('#modernizr { position:absolute }', function(elem,
rule){ ... })
+ Modernizr.testStyles = injectElementWithStyles;
+ /*>>teststyles*/
+
+
+ /*>>prefixed*/
+ // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of
your input
+ // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
+
+ // Properties must be passed as dom-style camelcase, rather than `box-sizing`
hypentated style.
+ // Return values will also be the camelCase variant, if you need to translate that to
hypenated style use:
+ //
+ // str.replace(/([A-Z])/g, function(str,m1){ return '-' +
m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
+
+ // If you're trying to ascertain which transition end event to bind to, you might
do something like...
+ //
+ // var transEndEventNames = {
+ // 'WebkitTransition' : 'webkitTransitionEnd',
+ // 'MozTransition' : 'transitionend',
+ // 'OTransition' : 'oTransitionEnd',
+ // 'msTransition' : 'MSTransitionEnd',
+ // 'transition' : 'transitionend'
+ // },
+ // transEndEventName = transEndEventNames[
Modernizr.prefixed('transition') ];
+
+ Modernizr.prefixed = function(prop, obj, elem){
+ if(!obj) {
+ return testPropsAll(prop, 'pfx');
+ } else {
+ // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame',
window) // 'mozRequestAnimationFrame'
+ return testPropsAll(prop, obj, elem);
+ }
+ };
+ /*>>prefixed*/
+
+
+ /*>>cssclasses*/
+ // Remove "no-js" class from <html> element, if it exists:
+ docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/,
'$1$2') +
+
+ // Add the new classes to the <html> element.
+ (enableClasses ? ' js ' + classes.join(' ') :
'');
+ /*>>cssclasses*/
+
+ return Modernizr;
+
+})(this, this.document);
diff --git a/ui/src/dist/libs/themes/base/bootstrap.custom.css
b/ui/src/dist/libs/themes/base/bootstrap.custom.css
new file mode 100755
index 0000000..a595cae
--- /dev/null
+++ b/ui/src/dist/libs/themes/base/bootstrap.custom.css
@@ -0,0 +1,8059 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * A partial implementation of the Ruby list functions from Compass:
+ *
https://github.com/Compass/compass/blob/stable/lib/compass/sass_extension...
+ */
+/*
+ * A partial implementation of the Ruby constants functions from Compass:
+ *
https://github.com/Compass/compass/blob/stable/lib/compass/sass_extension...
+ */
+/*
+ * A partial implementation of the Ruby display functions from Compass:
+ *
https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass...
+ */
+/*!
+ * Bootstrap v3.3.5 (
http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (
https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License |
github.com/necolas/normalize.css */
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline;
+}
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+[hidden],
+template {
+ display: none;
+}
+
+a {
+ background-color: transparent;
+}
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+b,
+strong {
+ font-weight: bold;
+}
+
+dfn {
+ font-style: italic;
+}
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+img {
+ border: 0;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+figure {
+ margin: 1em 40px;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+}
+
+pre {
+ overflow: auto;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0;
+}
+
+button {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+html input[type="button"], input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+input {
+ line-height: normal;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: textfield;
+ box-sizing: content-box;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+legend {
+ border: 0;
+ padding: 0;
+}
+
+textarea {
+ overflow: auto;
+}
+
+optgroup {
+ font-weight: bold;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
+
+/*! Source:
https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+ *,
+ *:before,
+ *:after {
+ background: transparent !important;
+ color: #000 !important;
+ box-shadow: none !important;
+ text-shadow: none !important;
+ }
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+ a[href^="#"]:after,
+ a[href^="javascript:"]:after {
+ content: "";
+ }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ img {
+ max-width: 100% !important;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ .navbar {
+ display: none;
+ }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+ .label {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+
+* {
+ box-sizing: border-box;
+}
+
+*:before,
+*:after {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 10px;
+ -webkit-tap-highlight-color: transparent;
+}
+
+body {
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #222;
+ background-color: #fff;
+}
+
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+a {
+ color: #3a393b;
+ text-decoration: none;
+}
+
+a:hover,
+a:focus {
+ color: #141314;
+ text-decoration: underline;
+}
+
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+figure {
+ margin: 0;
+}
+
+img {
+ vertical-align: middle;
+}
+
+.img-responsive {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-rounded {
+ border-radius: 3px;
+}
+
+.img-thumbnail {
+ padding: 4px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ transition: all 0.2s ease-in-out;
+ display: inline-block;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-circle {
+ border-radius: 50%;
+}
+
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #fff;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
+
+[role="button"] {
+ cursor: pointer;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
+h1 small,
+h1 .small, h2 small,
+h2 .small, h3 small,
+h3 .small, h4 small,
+h4 .small, h5 small,
+h5 .small, h6 small,
+h6 .small,
+.h1 small,
+.h1 .small, .h2 small,
+.h2 .small, .h3 small,
+.h3 .small, .h4 small,
+.h4 .small, .h5 small,
+.h5 .small, .h6 small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #999;
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+
+h1 small,
+h1 .small, .h1 small,
+.h1 .small,
+h2 small,
+h2 .small, .h2 small,
+.h2 .small,
+h3 small,
+h3 .small, .h3 small,
+.h3 .small {
+ font-size: 65%;
+}
+
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+h4 small,
+h4 .small, .h4 small,
+.h4 .small,
+h5 small,
+h5 .small, .h5 small,
+.h5 .small,
+h6 small,
+h6 .small, .h6 small,
+.h6 .small {
+ font-size: 75%;
+}
+
+h1, .h1 {
+ font-size: 1.571em;
+}
+
+h2, .h2 {
+ font-size: 22px;
+}
+
+h3, .h3 {
+ font-size: 17px;
+}
+
+h4, .h4 {
+ font-size: 14px;
+}
+
+h5, .h5 {
+ font-size: 14px;
+}
+
+h6, .h6 {
+ font-size: 14px;
+}
+
+p {
+ margin: 0 0 10px;
+}
+
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4;
+}
+
+@media (min-width: 992px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+
+small,
+.small {
+ font-size: 85%;
+}
+
+mark,
+.mark {
+ background-color: #f1e3c2;
+ padding: .2em;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-justify {
+ text-align: justify;
+}
+
+.text-nowrap {
+ white-space: nowrap;
+}
+
+.text-lowercase {
+ text-transform: lowercase;
+}
+
+.text-uppercase, .initialism {
+ text-transform: uppercase;
+}
+
+.text-capitalize {
+ text-transform: capitalize;
+}
+
+.text-muted {
+ color: #999;
+}
+
+.text-primary {
+ color: #3a393b;
+}
+
+a.text-primary:hover,
+a.text-primary:focus {
+ color: #212021;
+}
+
+.text-success {
+ color: #6c6c6c;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+ color: #525252;
+}
+
+.text-info {
+ color: #6c6c6c;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+ color: #525252;
+}
+
+.text-warning {
+ color: #6c6c6c;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+ color: #525252;
+}
+
+.text-danger {
+ color: #6c6c6c;
+}
+
+a.text-danger:hover,
+a.text-danger:focus {
+ color: #525252;
+}
+
+.bg-primary {
+ color: #fff;
+}
+
+.bg-primary {
+ background-color: #3a393b;
+}
+
+a.bg-primary:hover,
+a.bg-primary:focus {
+ background-color: #212021;
+}
+
+.bg-success {
+ background-color: #dae6cb;
+}
+
+a.bg-success:hover,
+a.bg-success:focus {
+ background-color: #c1d5a9;
+}
+
+.bg-info {
+ background-color: #d9edf7;
+}
+
+a.bg-info:hover,
+a.bg-info:focus {
+ background-color: #afd9ee;
+}
+
+.bg-warning {
+ background-color: #f1e3c2;
+}
+
+a.bg-warning:hover,
+a.bg-warning:focus {
+ background-color: #e7d099;
+}
+
+.bg-danger {
+ background-color: #eac3c7;
+}
+
+a.bg-danger:hover,
+a.bg-danger:focus {
+ background-color: #dd9da4;
+}
+
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #fff;
+}
+
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+ul ul,
+ul ol,
+ol ul,
+ol ol {
+ margin-bottom: 0;
+}
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+ margin-left: -5px;
+}
+
+.list-inline > li {
+ display: inline-block;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+dt,
+dd {
+ line-height: 1.428571429;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 0;
+}
+
+.dl-horizontal dd:before,
+.dl-horizontal dd:after {
+ content: " ";
+ display: table;
+}
+
+.dl-horizontal dd:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ clear: left;
+ text-align: right;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .dl-horizontal dd {
+ margin-left: 180px;
+ }
+}
+
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #999;
+}
+
+.initialism {
+ font-size: 90%;
+}
+
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #fff;
+}
+
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+ margin-bottom: 0;
+}
+
+blockquote footer,
+blockquote small,
+blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.428571429;
+ color: #999;
+}
+
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+ content: '\2014 \00A0';
+}
+
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid #fff;
+ border-left: 0;
+ text-align: right;
+}
+
+.blockquote-reverse footer:before,
+.blockquote-reverse small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right footer:before,
+blockquote.pull-right small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+
+.blockquote-reverse footer:after,
+.blockquote-reverse small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right footer:after,
+blockquote.pull-right small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.428571429;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ background-color: #f9f2f4;
+ border-radius: 3px;
+}
+
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+ box-shadow: none;
+}
+
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.428571429;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #222;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+}
+
+pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.container:before,
+.container:after {
+ content: " ";
+ display: table;
+}
+
+.container:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 940px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ width: 1140px;
+ }
+}
+
+@media (min-width: 1680) {
+ .container {
+ width: 1540px;
+ }
+}
+
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+ content: " ";
+ display: table;
+}
+
+.container-fluid:after {
+ clear: both;
+}
+
+.row {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.row:before,
+.row:after {
+ content: " ";
+ display: table;
+}
+
+.row:after {
+ clear: both;
+}
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2,
.col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4,
.col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6,
.col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8,
.col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10,
.col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12,
.col-md-12, .col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8,
.col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+ float: left;
+}
+
+.col-xs-1 {
+ width: 8.3333333333%;
+}
+
+.col-xs-2 {
+ width: 16.6666666667%;
+}
+
+.col-xs-3 {
+ width: 25%;
+}
+
+.col-xs-4 {
+ width: 33.3333333333%;
+}
+
+.col-xs-5 {
+ width: 41.6666666667%;
+}
+
+.col-xs-6 {
+ width: 50%;
+}
+
+.col-xs-7 {
+ width: 58.3333333333%;
+}
+
+.col-xs-8 {
+ width: 66.6666666667%;
+}
+
+.col-xs-9 {
+ width: 75%;
+}
+
+.col-xs-10 {
+ width: 83.3333333333%;
+}
+
+.col-xs-11 {
+ width: 91.6666666667%;
+}
+
+.col-xs-12 {
+ width: 100%;
+}
+
+.col-xs-pull-0 {
+ right: auto;
+}
+
+.col-xs-pull-1 {
+ right: 8.3333333333%;
+}
+
+.col-xs-pull-2 {
+ right: 16.6666666667%;
+}
+
+.col-xs-pull-3 {
+ right: 25%;
+}
+
+.col-xs-pull-4 {
+ right: 33.3333333333%;
+}
+
+.col-xs-pull-5 {
+ right: 41.6666666667%;
+}
+
+.col-xs-pull-6 {
+ right: 50%;
+}
+
+.col-xs-pull-7 {
+ right: 58.3333333333%;
+}
+
+.col-xs-pull-8 {
+ right: 66.6666666667%;
+}
+
+.col-xs-pull-9 {
+ right: 75%;
+}
+
+.col-xs-pull-10 {
+ right: 83.3333333333%;
+}
+
+.col-xs-pull-11 {
+ right: 91.6666666667%;
+}
+
+.col-xs-pull-12 {
+ right: 100%;
+}
+
+.col-xs-push-0 {
+ left: auto;
+}
+
+.col-xs-push-1 {
+ left: 8.3333333333%;
+}
+
+.col-xs-push-2 {
+ left: 16.6666666667%;
+}
+
+.col-xs-push-3 {
+ left: 25%;
+}
+
+.col-xs-push-4 {
+ left: 33.3333333333%;
+}
+
+.col-xs-push-5 {
+ left: 41.6666666667%;
+}
+
+.col-xs-push-6 {
+ left: 50%;
+}
+
+.col-xs-push-7 {
+ left: 58.3333333333%;
+}
+
+.col-xs-push-8 {
+ left: 66.6666666667%;
+}
+
+.col-xs-push-9 {
+ left: 75%;
+}
+
+.col-xs-push-10 {
+ left: 83.3333333333%;
+}
+
+.col-xs-push-11 {
+ left: 91.6666666667%;
+}
+
+.col-xs-push-12 {
+ left: 100%;
+}
+
+.col-xs-offset-0 {
+ margin-left: 0%;
+}
+
+.col-xs-offset-1 {
+ margin-left: 8.3333333333%;
+}
+
+.col-xs-offset-2 {
+ margin-left: 16.6666666667%;
+}
+
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+
+.col-xs-offset-4 {
+ margin-left: 33.3333333333%;
+}
+
+.col-xs-offset-5 {
+ margin-left: 41.6666666667%;
+}
+
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+
+.col-xs-offset-7 {
+ margin-left: 58.3333333333%;
+}
+
+.col-xs-offset-8 {
+ margin-left: 66.6666666667%;
+}
+
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+
+.col-xs-offset-10 {
+ margin-left: 83.3333333333%;
+}
+
+.col-xs-offset-11 {
+ margin-left: 91.6666666667%;
+}
+
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+
+@media (min-width: 992px) {
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8,
.col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+ float: left;
+ }
+ .col-sm-1 {
+ width: 8.3333333333%;
+ }
+ .col-sm-2 {
+ width: 16.6666666667%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-4 {
+ width: 33.3333333333%;
+ }
+ .col-sm-5 {
+ width: 41.6666666667%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-7 {
+ width: 58.3333333333%;
+ }
+ .col-sm-8 {
+ width: 66.6666666667%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-10 {
+ width: 83.3333333333%;
+ }
+ .col-sm-11 {
+ width: 91.6666666667%;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-pull-0 {
+ right: auto;
+ }
+ .col-sm-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-sm-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-sm-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-sm-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-sm-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-push-0 {
+ left: auto;
+ }
+ .col-sm-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-sm-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-sm-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-sm-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-sm-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8,
.col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+ float: left;
+ }
+ .col-md-1 {
+ width: 8.3333333333%;
+ }
+ .col-md-2 {
+ width: 16.6666666667%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-4 {
+ width: 33.3333333333%;
+ }
+ .col-md-5 {
+ width: 41.6666666667%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-7 {
+ width: 58.3333333333%;
+ }
+ .col-md-8 {
+ width: 66.6666666667%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-10 {
+ width: 83.3333333333%;
+ }
+ .col-md-11 {
+ width: 91.6666666667%;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-pull-0 {
+ right: auto;
+ }
+ .col-md-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-md-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-md-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-md-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-md-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-push-0 {
+ left: auto;
+ }
+ .col-md-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-md-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-md-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-md-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-md-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+@media (min-width: 1680) {
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8,
.col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+ float: left;
+ }
+ .col-lg-1 {
+ width: 8.3333333333%;
+ }
+ .col-lg-2 {
+ width: 16.6666666667%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-4 {
+ width: 33.3333333333%;
+ }
+ .col-lg-5 {
+ width: 41.6666666667%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-7 {
+ width: 58.3333333333%;
+ }
+ .col-lg-8 {
+ width: 66.6666666667%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-10 {
+ width: 83.3333333333%;
+ }
+ .col-lg-11 {
+ width: 91.6666666667%;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-pull-0 {
+ right: auto;
+ }
+ .col-lg-pull-1 {
+ right: 8.3333333333%;
+ }
+ .col-lg-pull-2 {
+ right: 16.6666666667%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-4 {
+ right: 33.3333333333%;
+ }
+ .col-lg-pull-5 {
+ right: 41.6666666667%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-7 {
+ right: 58.3333333333%;
+ }
+ .col-lg-pull-8 {
+ right: 66.6666666667%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-10 {
+ right: 83.3333333333%;
+ }
+ .col-lg-pull-11 {
+ right: 91.6666666667%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-push-0 {
+ left: auto;
+ }
+ .col-lg-push-1 {
+ left: 8.3333333333%;
+ }
+ .col-lg-push-2 {
+ left: 16.6666666667%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-4 {
+ left: 33.3333333333%;
+ }
+ .col-lg-push-5 {
+ left: 41.6666666667%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-7 {
+ left: 58.3333333333%;
+ }
+ .col-lg-push-8 {
+ left: 66.6666666667%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-10 {
+ left: 83.3333333333%;
+ }
+ .col-lg-push-11 {
+ left: 91.6666666667%;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+}
+
+table {
+ background-color: transparent;
+}
+
+caption {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: #999;
+ text-align: left;
+}
+
+th {
+ text-align: left;
+}
+
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 20px;
+}
+
+.table > thead > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > th,
+.table > tbody > tr > td,
+.table > tfoot > tr > th,
+.table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.428571429;
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+}
+
+.table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ddd;
+}
+
+.table > caption + thead > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > th,
+.table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+
+.table > tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+
+.table .table {
+ background-color: #fff;
+}
+
+.table-condensed > thead > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > th,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > th,
+.table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+
+.table-bordered {
+ border: 1px solid #ddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > th,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > th,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #ddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) {
+ background-color: #f9f9f9;
+}
+
+.table-hover > tbody > tr:hover {
+ background-color: #f5f5f5;
+}
+
+table col[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-column;
+}
+
+table td[class*="col-"],
+table th[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-cell;
+}
+
+.table > thead > tr > td.active,
+.table > thead > tr > th.active,
+.table > thead > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr > td.active,
+.table > tbody > tr > th.active,
+.table > tbody > tr.active > td,
+.table > tbody > tr.active > th,
+.table > tfoot > tr > td.active,
+.table > tfoot > tr > th.active,
+.table > tfoot > tr.active > td,
+.table > tfoot > tr.active > th {
+ background-color: #f5f5f5;
+}
+
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+ background-color: #e8e8e8;
+}
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success,
+.table > thead > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+ background-color: #dae6cb;
+}
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #cedeba;
+}
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info,
+.table > thead > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+ background-color: #d9edf7;
+}
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #c4e3f3;
+}
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+ background-color: #f1e3c2;
+}
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #ecd9ad;
+}
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+ background-color: #eac3c7;
+}
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #e3b0b5;
+}
+
+.table-responsive {
+ overflow-x: auto;
+ min-height: 0.01%;
+}
+
+@media screen and (max-width: 991px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-y: hidden;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #ddd;
+ }
+ .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > th,
+ .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap;
+ }
+ .table-responsive > .table-bordered {
+ border: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+ }
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+ }
+}
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+ min-width: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #222;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+label {
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+
+input[type="search"] {
+ box-sizing: border-box;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ line-height: normal;
+}
+
+input[type="file"] {
+ display: block;
+}
+
+input[type="range"] {
+ display: block;
+ width: 100%;
+}
+
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #444;
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #444;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+
+.form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+
+.form-control::-moz-placeholder {
+ color: #999;
+ opacity: 1;
+}
+
+.form-control:-ms-input-placeholder {
+ color: #999;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #999;
+}
+
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+ background-color: #fff;
+ opacity: 1;
+}
+
+.form-control[disabled],
+fieldset[disabled] .form-control {
+ cursor: not-allowed;
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: none;
+}
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ input[type="date"].form-control,
+ input[type="time"].form-control,
+ input[type="datetime-local"].form-control,
+ input[type="month"].form-control {
+ line-height: 34px;
+ }
+ input[type="date"].input-sm,
+ .input-group-sm > input[type="date"].form-control,
+ .input-group-sm > input[type="date"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="date"].btn,
+ .input-group-sm input[type="date"],
+ input[type="time"].input-sm,
+ .input-group-sm > input[type="time"].form-control,
+ .input-group-sm > input[type="time"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="time"].btn,
+ .input-group-sm input[type="time"],
+ input[type="datetime-local"].input-sm,
+ .input-group-sm > input[type="datetime-local"].form-control,
+ .input-group-sm > input[type="datetime-local"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-sm input[type="datetime-local"],
+ input[type="month"].input-sm,
+ .input-group-sm > input[type="month"].form-control,
+ .input-group-sm > input[type="month"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="month"].btn,
+ .input-group-sm input[type="month"] {
+ line-height: 30px;
+ }
+ input[type="date"].input-lg,
+ .input-group-lg > input[type="date"].form-control,
+ .input-group-lg > input[type="date"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="date"].btn,
+ .input-group-lg input[type="date"],
+ input[type="time"].input-lg,
+ .input-group-lg > input[type="time"].form-control,
+ .input-group-lg > input[type="time"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="time"].btn,
+ .input-group-lg input[type="time"],
+ input[type="datetime-local"].input-lg,
+ .input-group-lg > input[type="datetime-local"].form-control,
+ .input-group-lg > input[type="datetime-local"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-lg input[type="datetime-local"],
+ input[type="month"].input-lg,
+ .input-group-lg > input[type="month"].form-control,
+ .input-group-lg > input[type="month"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="month"].btn,
+ .input-group-lg input[type="month"] {
+ line-height: 46px;
+ }
+}
+
+.form-group {
+ margin-bottom: 15px;
+}
+
+.radio,
+.checkbox {
+ position: relative;
+ display: block;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.radio label,
+.checkbox label {
+ min-height: 20px;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ position: absolute;
+ margin-left: -20px;
+ margin-top: 4px \9;
+}
+
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px;
+}
+
+.radio-inline,
+.checkbox-inline {
+ position: relative;
+ display: inline-block;
+ padding-left: 20px;
+ margin-bottom: 0;
+ vertical-align: middle;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
+ margin-left: 10px;
+}
+
+input[type="radio"][disabled],
+input[type="radio"].disabled,
+fieldset[disabled] input[type="radio"],
+input[type="checkbox"][disabled],
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="checkbox"] {
+ cursor: not-allowed;
+}
+
+.radio-inline.disabled,
+fieldset[disabled] .radio-inline,
+.checkbox-inline.disabled,
+fieldset[disabled] .checkbox-inline {
+ cursor: not-allowed;
+}
+
+.radio.disabled label,
+fieldset[disabled] .radio label,
+.checkbox.disabled label,
+fieldset[disabled] .checkbox label {
+ cursor: not-allowed;
+}
+
+.form-control-static {
+ padding-top: 7px;
+ padding-bottom: 7px;
+ margin-bottom: 0;
+ min-height: 34px;
+}
+
+.form-control-static.input-lg,
+.input-group-lg > .form-control-static.form-control,
+.input-group-lg > .form-control-static.input-group-addon,
+.input-group-lg > .input-group-btn > .form-control-static.btn,
+.form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
+.input-group-sm > .form-control-static.input-group-addon,
+.input-group-sm > .input-group-btn > .form-control-static.btn {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.input-sm, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+select.input-sm, .input-group-sm > select.form-control,
+.input-group-sm > select.input-group-addon,
+.input-group-sm > .input-group-btn > select.btn {
+ height: 30px;
+ line-height: 30px;
+}
+
+textarea.input-sm,
+.input-group-sm > textarea.form-control,
+.input-group-sm > textarea.input-group-addon,
+.input-group-sm > .input-group-btn > textarea.btn,
+select[multiple].input-sm, .input-group-sm > select[multiple].form-control,
+.input-group-sm > select[multiple].input-group-addon,
+.input-group-sm > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.form-group-sm .form-control {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.form-group-sm select.form-control {
+ height: 30px;
+ line-height: 30px;
+}
+
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+ height: auto;
+}
+
+.form-group-sm .form-control-static {
+ height: 30px;
+ min-height: 32px;
+ padding: 6px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.input-lg, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 3px;
+}
+
+select.input-lg, .input-group-lg > select.form-control,
+.input-group-lg > select.input-group-addon,
+.input-group-lg > .input-group-btn > select.btn {
+ height: 46px;
+ line-height: 46px;
+}
+
+textarea.input-lg,
+.input-group-lg > textarea.form-control,
+.input-group-lg > textarea.input-group-addon,
+.input-group-lg > .input-group-btn > textarea.btn,
+select[multiple].input-lg, .input-group-lg > select[multiple].form-control,
+.input-group-lg > select[multiple].input-group-addon,
+.input-group-lg > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.form-group-lg .form-control {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 3px;
+}
+
+.form-group-lg select.form-control {
+ height: 46px;
+ line-height: 46px;
+}
+
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+ height: auto;
+}
+
+.form-group-lg .form-control-static {
+ height: 46px;
+ min-height: 38px;
+ padding: 11px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+
+.has-feedback {
+ position: relative;
+}
+
+.has-feedback .form-control {
+ padding-right: 42.5px;
+}
+
+.form-control-feedback {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+ pointer-events: none;
+}
+
+.input-lg + .form-control-feedback,
+.input-group-lg > .form-control + .form-control-feedback,
+.input-group-lg > .input-group-addon + .form-control-feedback,
+.input-group-lg > .input-group-btn > .btn + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+ width: 46px;
+ height: 46px;
+ line-height: 46px;
+}
+
+.input-sm + .form-control-feedback,
+.input-group-sm > .form-control + .form-control-feedback,
+.input-group-sm > .input-group-addon + .form-control-feedback,
+.input-group-sm > .input-group-btn > .btn + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+}
+
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+ color: #6c6c6c;
+}
+
+.has-success .form-control {
+ border-color: #6c6c6c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-success .form-control:focus {
+ border-color: #525252;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #9f9f9f;
+}
+
+.has-success .input-group-addon {
+ color: #6c6c6c;
+ border-color: #6c6c6c;
+ background-color: #dae6cb;
+}
+
+.has-success .form-control-feedback {
+ color: #6c6c6c;
+}
+
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+ color: #6c6c6c;
+}
+
+.has-warning .form-control {
+ border-color: #6c6c6c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-warning .form-control:focus {
+ border-color: #525252;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #9f9f9f;
+}
+
+.has-warning .input-group-addon {
+ color: #6c6c6c;
+ border-color: #6c6c6c;
+ background-color: #f1e3c2;
+}
+
+.has-warning .form-control-feedback {
+ color: #6c6c6c;
+}
+
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+ color: #6c6c6c;
+}
+
+.has-error .form-control {
+ border-color: #6c6c6c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-error .form-control:focus {
+ border-color: #525252;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #9f9f9f;
+}
+
+.has-error .input-group-addon {
+ color: #6c6c6c;
+ border-color: #6c6c6c;
+ background-color: #eac3c7;
+}
+
+.has-error .form-control-feedback {
+ color: #6c6c6c;
+}
+
+.has-feedback label ~ .form-control-feedback {
+ top: 25px;
+}
+
+.has-feedback label.sr-only ~ .form-control-feedback {
+ top: 0;
+}
+
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #626262;
+}
+
+@media (min-width: 992px) {
+ .form-inline .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-static {
+ display: inline-block;
+ }
+ .form-inline .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .form-inline .input-group .input-group-addon,
+ .form-inline .input-group .input-group-btn,
+ .form-inline .input-group .form-control {
+ width: auto;
+ }
+ .form-inline .input-group > .form-control {
+ width: 100%;
+ }
+ .form-inline .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio label,
+ .form-inline .checkbox label {
+ padding-left: 0;
+ }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-top: 7px;
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px;
+}
+
+.form-horizontal .form-group {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after {
+ content: " ";
+ display: table;
+}
+
+.form-horizontal .form-group:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .form-horizontal .control-label {
+ text-align: right;
+ margin-bottom: 0;
+ padding-top: 7px;
+ }
+}
+
+.form-horizontal .has-feedback .form-control-feedback {
+ right: 0;
+}
+
+@media (min-width: 992px) {
+ .form-horizontal .form-group-lg .control-label {
+ padding-top: 14.333333px;
+ font-size: 18px;
+ }
+}
+
+@media (min-width: 992px) {
+ .form-horizontal .form-group-sm .control-label {
+ padding-top: 6px;
+ font-size: 12px;
+ }
+}
+
+.btn {
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: normal;
+ text-align: center;
+ vertical-align: middle;
+ touch-action: manipulation;
+ cursor: pointer;
+ background-image: none;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ border-radius: 3px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.btn:focus,
+.btn.focus,
+.btn:active:focus,
+.btn:active.focus,
+.btn.active:focus,
+.btn.active.focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+.btn:hover,
+.btn:focus,
+.btn.focus {
+ color: #444;
+ text-decoration: none;
+}
+
+.btn:active,
+.btn.active {
+ outline: 0;
+ background-image: none;
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+ cursor: not-allowed;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ box-shadow: none;
+}
+
+a.btn.disabled,
+fieldset[disabled] a.btn {
+ pointer-events: none;
+}
+
+.btn-default {
+ color: #444;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.btn-default:focus,
+.btn-default.focus {
+ color: #444;
+ background-color: #e6e6e6;
+ border-color: #8c8c8c;
+}
+
+.btn-default:hover {
+ color: #444;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open > .btn-default.dropdown-toggle {
+ color: #444;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+
+.btn-default:active:hover,
+.btn-default:active:focus,
+.btn-default:active.focus,
+.btn-default.active:hover,
+.btn-default.active:focus,
+.btn-default.active.focus,
+.open > .btn-default.dropdown-toggle:hover,
+.open > .btn-default.dropdown-toggle:focus,
+.open > .btn-default.dropdown-toggle.focus {
+ color: #444;
+ background-color: #d4d4d4;
+ border-color: #8c8c8c;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open > .btn-default.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-default.disabled,
+.btn-default.disabled:hover,
+.btn-default.disabled:focus,
+.btn-default.disabled.focus,
+.btn-default.disabled:active,
+.btn-default.disabled.active,
+.btn-default[disabled],
+.btn-default[disabled]:hover,
+.btn-default[disabled]:focus,
+.btn-default[disabled].focus,
+.btn-default[disabled]:active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-default:hover,
+fieldset[disabled] .btn-default:focus,
+fieldset[disabled] .btn-default.focus,
+fieldset[disabled] .btn-default:active,
+fieldset[disabled] .btn-default.active {
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.btn-default .badge {
+ color: #fff;
+ background-color: #444;
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.btn-primary:focus,
+.btn-primary.focus {
+ color: #fff;
+ background-color: #212021;
+ border-color: black;
+}
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #212021;
+ border-color: #1b1b1c;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #212021;
+ border-color: #1b1b1c;
+}
+
+.btn-primary:active:hover,
+.btn-primary:active:focus,
+.btn-primary:active.focus,
+.btn-primary.active:hover,
+.btn-primary.active:focus,
+.btn-primary.active.focus,
+.open > .btn-primary.dropdown-toggle:hover,
+.open > .btn-primary.dropdown-toggle:focus,
+.open > .btn-primary.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #0f0e0f;
+ border-color: black;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open > .btn-primary.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-primary.disabled,
+.btn-primary.disabled:hover,
+.btn-primary.disabled:focus,
+.btn-primary.disabled.focus,
+.btn-primary.disabled:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled],
+.btn-primary[disabled]:hover,
+.btn-primary[disabled]:focus,
+.btn-primary[disabled].focus,
+.btn-primary[disabled]:active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-primary:hover,
+fieldset[disabled] .btn-primary:focus,
+fieldset[disabled] .btn-primary.focus,
+fieldset[disabled] .btn-primary:active,
+fieldset[disabled] .btn-primary.active {
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.btn-primary .badge {
+ color: #3a393b;
+ background-color: #fff;
+}
+
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+}
+
+.btn-success:focus,
+.btn-success.focus {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #2d672d;
+}
+
+.btn-success:hover {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #419641;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #419641;
+}
+
+.btn-success:active:hover,
+.btn-success:active:focus,
+.btn-success:active.focus,
+.btn-success.active:hover,
+.btn-success.active:focus,
+.btn-success.active.focus,
+.open > .btn-success.dropdown-toggle:hover,
+.open > .btn-success.dropdown-toggle:focus,
+.open > .btn-success.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #398439;
+ border-color: #2d672d;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open > .btn-success.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-success.disabled,
+.btn-success.disabled:hover,
+.btn-success.disabled:focus,
+.btn-success.disabled.focus,
+.btn-success.disabled:active,
+.btn-success.disabled.active,
+.btn-success[disabled],
+.btn-success[disabled]:hover,
+.btn-success[disabled]:focus,
+.btn-success[disabled].focus,
+.btn-success[disabled]:active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-success:hover,
+fieldset[disabled] .btn-success:focus,
+fieldset[disabled] .btn-success.focus,
+fieldset[disabled] .btn-success:active,
+fieldset[disabled] .btn-success.active {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+}
+
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
+}
+
+.btn-info:focus,
+.btn-info.focus {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #1f7e9a;
+}
+
+.btn-info:hover {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #2aabd2;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #2aabd2;
+}
+
+.btn-info:active:hover,
+.btn-info:active:focus,
+.btn-info:active.focus,
+.btn-info.active:hover,
+.btn-info.active:focus,
+.btn-info.active.focus,
+.open > .btn-info.dropdown-toggle:hover,
+.open > .btn-info.dropdown-toggle:focus,
+.open > .btn-info.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #269abc;
+ border-color: #1f7e9a;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open > .btn-info.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-info.disabled,
+.btn-info.disabled:hover,
+.btn-info.disabled:focus,
+.btn-info.disabled.focus,
+.btn-info.disabled:active,
+.btn-info.disabled.active,
+.btn-info[disabled],
+.btn-info[disabled]:hover,
+.btn-info[disabled]:focus,
+.btn-info[disabled].focus,
+.btn-info[disabled]:active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-info:hover,
+fieldset[disabled] .btn-info:focus,
+fieldset[disabled] .btn-info.focus,
+fieldset[disabled] .btn-info:active,
+fieldset[disabled] .btn-info.active {
+ background-color: #5bc0de;
+ border-color: #5bc0de;
+}
+
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-warning:focus,
+.btn-warning.focus {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #b06d0f;
+}
+
+.btn-warning:hover {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #eb9316;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open > .btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #eb9316;
+}
+
+.btn-warning:active:hover,
+.btn-warning:active:focus,
+.btn-warning:active.focus,
+.btn-warning.active:hover,
+.btn-warning.active:focus,
+.btn-warning.active.focus,
+.open > .btn-warning.dropdown-toggle:hover,
+.open > .btn-warning.dropdown-toggle:focus,
+.open > .btn-warning.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #d58512;
+ border-color: #b06d0f;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open > .btn-warning.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-warning.disabled,
+.btn-warning.disabled:hover,
+.btn-warning.disabled:focus,
+.btn-warning.disabled.focus,
+.btn-warning.disabled:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled],
+.btn-warning[disabled]:hover,
+.btn-warning[disabled]:focus,
+.btn-warning[disabled].focus,
+.btn-warning[disabled]:active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-warning:hover,
+fieldset[disabled] .btn-warning:focus,
+fieldset[disabled] .btn-warning.focus,
+fieldset[disabled] .btn-warning:active,
+fieldset[disabled] .btn-warning.active {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d9534f;
+}
+
+.btn-danger:focus,
+.btn-danger.focus {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #8b211e;
+}
+
+.btn-danger:hover {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #c12e2a;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #c12e2a;
+}
+
+.btn-danger:active:hover,
+.btn-danger:active:focus,
+.btn-danger:active.focus,
+.btn-danger.active:hover,
+.btn-danger.active:focus,
+.btn-danger.active.focus,
+.open > .btn-danger.dropdown-toggle:hover,
+.open > .btn-danger.dropdown-toggle:focus,
+.open > .btn-danger.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #ac2925;
+ border-color: #8b211e;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open > .btn-danger.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-danger.disabled,
+.btn-danger.disabled:hover,
+.btn-danger.disabled:focus,
+.btn-danger.disabled.focus,
+.btn-danger.disabled:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled],
+.btn-danger[disabled]:hover,
+.btn-danger[disabled]:focus,
+.btn-danger[disabled].focus,
+.btn-danger[disabled]:active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger,
+fieldset[disabled] .btn-danger:hover,
+fieldset[disabled] .btn-danger:focus,
+fieldset[disabled] .btn-danger.focus,
+fieldset[disabled] .btn-danger:active,
+fieldset[disabled] .btn-danger.active {
+ background-color: #d9534f;
+ border-color: #d9534f;
+}
+
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+
+.btn-link {
+ color: #3a393b;
+ font-weight: normal;
+ border-radius: 0;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+ background-color: transparent;
+ box-shadow: none;
+}
+
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+ border-color: transparent;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+ color: #141314;
+ text-decoration: underline;
+ background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:hover,
+fieldset[disabled] .btn-link:focus {
+ color: #999;
+ text-decoration: none;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 3px;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-xs, .btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+}
+
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.fade {
+ opacity: 0;
+ transition: opacity 0.15s linear;
+}
+
+.fade.in {
+ opacity: 1;
+}
+
+.collapse {
+ display: none;
+}
+
+.collapse.in {
+ display: block;
+}
+
+tr.collapse.in {
+ display: table-row;
+}
+
+tbody.collapse.in {
+ display: table-row-group;
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition-property: height, visibility;
+ transition-duration: 0.35s;
+ transition-timing-function: ease;
+}
+
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px dashed;
+ border-top: 4px solid \9;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+
+.dropup,
+.dropdown {
+ position: relative;
+}
+
+.dropdown-toggle:focus {
+ outline: 0;
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0;
+ list-style: none;
+ font-size: 14px;
+ text-align: left;
+ background-color: #fcfcfc;
+ border: 1px solid #ccc;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #eee;
+}
+
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+ color: #222;
+ white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ text-decoration: none;
+ color: #151515;
+ background-color: #f5f5f5;
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ background-color: #3a393b;
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ cursor: not-allowed;
+}
+
+.open > .dropdown-menu {
+ display: block;
+}
+
+.open > a {
+ outline: 0;
+}
+
+.dropdown-menu-right {
+ left: auto;
+ right: 0;
+}
+
+.dropdown-menu-left {
+ left: 0;
+ right: auto;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.428571429;
+ color: #999;
+ white-space: nowrap;
+}
+
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: 990;
+}
+
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ border-top: 0;
+ border-bottom: 4px dashed;
+ border-bottom: 4px solid \9;
+ content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+}
+
+@media (min-width: 992px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .navbar-right .dropdown-menu-left {
+ left: 0;
+ right: auto;
+ }
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ float: left;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+ margin-left: -1px;
+}
+
+.btn-toolbar {
+ margin-left: -5px;
+}
+
+.btn-toolbar:before,
+.btn-toolbar:after {
+ content: " ";
+ display: table;
+}
+
+.btn-toolbar:after {
+ clear: both;
+}
+
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+ float: left;
+}
+
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+ margin-left: 5px;
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+
+.btn-group > .btn:first-child {
+ margin-left: 0;
+}
+
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group > .btn-group {
+ float: left;
+}
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px;
+}
+
+.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn +
.dropdown-toggle {
+ padding-left: 12px;
+ padding-right: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn-group.open .dropdown-toggle.btn-link {
+ box-shadow: none;
+}
+
+.btn .caret {
+ margin-left: 0;
+}
+
+.btn-lg .caret, .btn-group-lg > .btn .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0;
+}
+
+.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {
+ border-width: 0 5px 5px;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+}
+
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+ content: " ";
+ display: table;
+}
+
+.btn-group-vertical > .btn-group:after {
+ clear: both;
+}
+
+.btn-group-vertical > .btn-group > .btn {
+ float: none;
+}
+
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
+}
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-bottom-left-radius: 3px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ border-collapse: separate;
+}
+
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+ float: none;
+ display: table-cell;
+ width: 1%;
+}
+
+.btn-group-justified > .btn-group .btn {
+ width: 100%;
+}
+
+.btn-group-justified > .btn-group .dropdown-menu {
+ left: auto;
+}
+
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn
input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn
input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+
+.input-group[class*="col-"] {
+ float: none;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.input-group .form-control {
+ position: relative;
+ z-index: 2;
+ float: left;
+ width: 100%;
+ margin-bottom: 0;
+}
+
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+}
+
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #444;
+ text-align: center;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+}
+
+.input-group-addon.input-sm, .input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px;
+}
+
+.input-group-addon.input-lg, .input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 3px;
+}
+
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.input-group-addon:first-child {
+ border-right: 0;
+}
+
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.input-group-addon:last-child {
+ border-left: 0;
+}
+
+.input-group-btn {
+ position: relative;
+ font-size: 0;
+ white-space: nowrap;
+}
+
+.input-group-btn > .btn {
+ position: relative;
+}
+
+.input-group-btn > .btn + .btn {
+ margin-left: -1px;
+}
+
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+ z-index: 2;
+}
+
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+ margin-right: -1px;
+}
+
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+ z-index: 2;
+ margin-left: -1px;
+}
+
+.nav {
+ margin-bottom: 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+.nav:before,
+.nav:after {
+ content: " ";
+ display: table;
+}
+
+.nav:after {
+ clear: both;
+}
+
+.nav > li {
+ position: relative;
+ display: block;
+}
+
+.nav > li > a {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #fff;
+}
+
+.nav > li.disabled > a {
+ color: #999;
+}
+
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+ color: #999;
+ text-decoration: none;
+ background-color: transparent;
+ cursor: not-allowed;
+}
+
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background-color: #fff;
+ border-color: #3a393b;
+}
+
+.nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+
+.nav > li > a > img {
+ max-width: none;
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.428571429;
+ border: 1px solid transparent;
+ border-radius: 3px 3px 0 0;
+}
+
+.nav-tabs > li > a:hover {
+ border-color: #fff #fff #ddd;
+}
+
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ color: #444;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default;
+}
+
+.nav-pills > li {
+ float: left;
+}
+
+.nav-pills > li > a {
+ border-radius: 3px;
+}
+
+.nav-pills > li + li {
+ margin-left: 2px;
+}
+
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #3a393b;
+}
+
+.nav-stacked > li {
+ float: none;
+}
+
+.nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0;
+}
+
+.nav-justified, .nav-tabs.nav-justified {
+ width: 100%;
+}
+
+.nav-justified > li, .nav-tabs.nav-justified > li {
+ float: none;
+}
+
+.nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+
+@media (min-width: 992px) {
+ .nav-justified > li, .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+
+.nav-tabs-justified, .nav-tabs.nav-justified {
+ border-bottom: 0;
+}
+
+.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 3px;
+}
+
+.nav-tabs-justified > .active > a,
+.nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active >
a:hover,
+.nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active >
a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+
+@media (min-width: 992px) {
+ .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 3px 3px 0 0;
+ }
+ .nav-tabs-justified > .active > a,
+ .nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active >
a:hover,
+ .nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active
> a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+
+.tab-content > .active {
+ display: block;
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.navbar {
+ position: relative;
+ min-height: 40px;
+ margin-bottom: 0;
+ border: 0;
+}
+
+.navbar:before,
+.navbar:after {
+ content: " ";
+ display: table;
+}
+
+.navbar:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .navbar {
+ border-radius: 0;
+ }
+}
+
+.navbar-header:before,
+.navbar-header:after {
+ content: " ";
+ display: table;
+}
+
+.navbar-header:after {
+ clear: both;
+}
+
+@media (min-width: 992px) {
+ .navbar-header {
+ float: left;
+ }
+}
+
+.navbar-collapse {
+ overflow-x: visible;
+ padding-right: 0;
+ padding-left: 0;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ -webkit-overflow-scrolling: touch;
+}
+
+.navbar-collapse:before,
+.navbar-collapse:after {
+ content: " ";
+ display: table;
+}
+
+.navbar-collapse:after {
+ clear: both;
+}
+
+.navbar-collapse.in {
+ overflow-y: auto;
+}
+
+@media (min-width: 992px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ box-shadow: none;
+ }
+ .navbar-collapse.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important;
+ }
+ .navbar-collapse.in {
+ overflow-y: visible;
+ }
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-static-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
+
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+ max-height: 340px;
+}
+
+@media (max-device-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ max-height: 200px;
+ }
+}
+
+.container > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-header,
+.container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+@media (min-width: 992px) {
+ .container > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-header,
+ .container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+ }
+}
+
+.navbar-static-top {
+ z-index: 1000;
+ border-width: 0 0 1px;
+}
+
+@media (min-width: 992px) {
+ .navbar-static-top {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+@media (min-width: 992px) {
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0;
+ border-width: 1px 0 0;
+}
+
+.navbar-brand {
+ display: block;
+ margin: 0 0 0 -80px;
+ padding: 0 0 0 80px;
+ height: 55px;
+ background: transparent url("../images/theme-default/logo-white.png")
no-repeat 24px 3px;
+ color: #fff;
+ font-family: "HelveticaNeueBold", "HelveticaNeue-Bold",
"HelveticaNeue Bold", "Helvetica Neue Bold", "Helvetica
Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande",
sans-serif;
+ font-weight: 600;
+ font-size: 1.571em;
+ line-height: 55px;
+ cursor: default;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.navbar-brand:hover,
+.navbar-brand:focus {
+ text-decoration: none;
+}
+
+.navbar-brand > img {
+ display: block;
+}
+
+@media (min-width: 992px) {
+ .navbar > .container .navbar-brand,
+ .navbar > .container-fluid .navbar-brand {
+ margin-left: -80px;
+ }
+}
+
+.navbar-toggle {
+ position: relative;
+ float: right;
+ margin-right: 0;
+ padding: 9px 10px;
+ margin-top: 3px;
+ margin-bottom: 3px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 3px;
+}
+
+.navbar-toggle:focus {
+ outline: 0;
+}
+
+.navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+}
+
+.navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px;
+}
+
+@media (min-width: 992px) {
+ .navbar-toggle {
+ display: none;
+ }
+}
+
+.navbar-nav {
+ margin: 5px 0;
+}
+
+.navbar-nav > li > a {
+ padding-left: 40px;
+ padding-right: 40px;
+ line-height: 20px;
+ font-family: "Helvetica Neue LT W1G 55 Roman", "Helvetica Neue LT
W1G", "HelveticaNeue Roman", "HelveticaNeue-Roman",
"Helvetica Neue Roman", "Helvetica Neue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+}
+
+.navbar-nav > li > a > .fa {
+ font-size: 26px;
+}
+
+.navbar-nav > li > a.dropdown-toggle {
+ padding-right: 22px;
+ padding-left: 22px;
+}
+
+@media (max-width: 991px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none;
+ }
+}
+
+@media (min-width: 992px) {
+ .navbar-nav {
+ float: left;
+ margin: 0;
+ }
+ .navbar-nav > li {
+ float: left;
+ }
+ .navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ }
+}
+
+.navbar-form {
+ margin-left: 0;
+ margin-right: 0;
+ padding: 10px 0;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+@media (min-width: 992px) {
+ .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control-static {
+ display: inline-block;
+ }
+ .navbar-form .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .navbar-form .input-group .input-group-addon,
+ .navbar-form .input-group .input-group-btn,
+ .navbar-form .input-group .form-control {
+ width: auto;
+ }
+ .navbar-form .input-group > .form-control {
+ width: 100%;
+ }
+ .navbar-form .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio,
+ .navbar-form .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio label,
+ .navbar-form .checkbox label {
+ padding-left: 0;
+ }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .navbar-form .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+
+@media (max-width: 991px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+ .navbar-form .form-group:last-child {
+ margin-bottom: 0;
+ }
+}
+
+@media (min-width: 992px) {
+ .navbar-form {
+ width: auto;
+ border: 0;
+ margin-left: 0;
+ margin-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ box-shadow: none;
+ }
+}
+
+.navbar-nav > li > a.dropdown-toggle > .caret {
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+ margin-left: 10px;
+ width: 40px;
+ height: 39px;
+}
+
+.navbar-nav > li > a.dropdown-toggle > .caret:before {
+ content: '\f078';
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: 13px;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+ color: #fff;
+ position: absolute;
+ top: 24px;
+ margin-left: 14px;
+ display: block;
+}
+
+.navbar-nav > li.dropdown.open > a > .caret {
+ background-color: #3a393b;
+}
+
+.navbar-nav > li.dropdown.open > a > .caret:before {
+ content: '\f077';
+}
+
+.navbar-right > li > a {
+ height: 49px;
+}
+
+.navbar-right > li > a .fa {
+ margin-right: 15px;
+}
+
+.navbar-right > li > a .topbar-text, .navbar-right > li > a .caret,
.navbar-right > li > a .fa {
+ vertical-align: middle;
+}
+
+.navbar-nav > li > .dropdown-menu {
+ padding: 0;
+ margin-top: 0;
+ background-color: #3a393b;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none !important;
+ background-clip: padding-box;
+ height: auto;
+ max-height: 400px;
+ overflow-x: hidden;
+ /* Track */
+ /* Handle */
+}
+
+.navbar-nav > li > .dropdown-menu > li {
+ display: block;
+}
+
+.navbar-nav > li > .dropdown-menu > li > a,
+.navbar-nav > li > .dropdown-menu > li > span {
+ margin: 0 !important;
+ display: block;
+ vertical-align: middle;
+ color: #fff;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+ font-weight: normal;
+ line-height: 24px;
+ padding: 7px 30px;
+ height: 40px;
+ border-top: 1px solid #2e2e2e;
+ box-shadow: inset 0px 1px 0px 0px #404042;
+ clear: both;
+ white-space: nowrap;
+}
+
+.navbar-nav > li > .dropdown-menu > li > a:hover,
+.navbar-nav > li > .dropdown-menu > li > a:focus,
+.navbar-nav > li > .dropdown-menu > li > span:hover,
+.navbar-nav > li > .dropdown-menu > li > span:focus {
+ text-decoration: none;
+ color: #fff;
+ background-color: #3a393b;
+}
+
+.navbar-nav > li > .dropdown-menu > li > a > .fa {
+ vertical-align: middle;
+ font-size: 26px;
+ margin-right: 15px;
+ margin-left: -15px;
+}
+
+.navbar-nav > li > .dropdown-menu > li.critical > a {
+ background: #d9182d;
+}
+
+.navbar-nav > li > .dropdown-menu::-webkit-scrollbar {
+ width: 12px;
+}
+
+.navbar-nav > li > .dropdown-menu::-webkit-scrollbar-track {
+ box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+}
+
+.navbar-nav > li > .dropdown-menu::-webkit-scrollbar-thumb {
+ border-radius: 4px;
+ background: #797979;
+ border-left: 1px solid #B3B3B3;
+ box-shadow: inset 6px 1px 6px #9e9e9e;
+}
+
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ margin-bottom: 0;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.navbar-btn {
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
+ margin-top: 9px;
+ margin-bottom: 9px;
+}
+
+.navbar-text {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+@media (min-width: 992px) {
+ .navbar-text {
+ float: left;
+ margin-left: 0;
+ margin-right: 0;
+ }
+}
+
+@media (min-width: 992px) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ margin-right: 0;
+ }
+ .navbar-right ~ .navbar-right {
+ margin-right: 0;
+ }
+}
+
+.navbar-default {
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.navbar-default .navbar-brand {
+ color: #fff;
+}
+
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+ color: #e6e6e6;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-text {
+ color: #fff;
+}
+
+.navbar-default .navbar-nav > li > a {
+ margin: 0 !important;
+ font-size: 13pt;
+ font-family: "HelveticaNeueBold", "HelveticaNeue-Bold",
"HelveticaNeue Bold", "Helvetica Neue Bold", "Helvetica
Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande",
sans-serif;
+ font-weight: 600;
+ color: #fff;
+ text-decoration: none;
+ outline: none;
+ min-width: 190px;
+ text-align: center;
+ height: 40px;
+}
+
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > li > a .digit-container {
+ display: inline-block;
+ margin-left: 10px;
+ margin-top: -2px;
+ border-radius: 16px;
+ height: 20px;
+ line-height: 16px;
+ background: #555;
+ border: 2px solid #555;
+ color: #fff;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 14px;
+ padding: 0 8px;
+}
+
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > .active > a .digit-container {
+ border-color: #fff;
+ background: transparent;
+}
+
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+ cursor: default;
+ color: #999;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > .disabled > a .digit-container {
+ display: none;
+}
+
+.navbar-default .navbar-nav > .active > a.host,
+.navbar-default .navbar-nav > .active > a.host:hover,
+.navbar-default .navbar-nav > .active > a.host:focus {
+ background-color: #008abf !important;
+}
+
+.navbar-default .navbar-nav > .active > a.guests,
+.navbar-default .navbar-nav > .active > a.guests:hover,
+.navbar-default .navbar-nav > .active > a.guests:focus {
+ background-color: #8cc63f !important;
+}
+
+.navbar-default .navbar-nav > .active > a.templates,
+.navbar-default .navbar-nav > .active > a.templates:hover,
+.navbar-default .navbar-nav > .active > a.templates:focus {
+ background-color: #00a6a0 !important;
+}
+
+.navbar-default .navbar-nav > .active > a.storage,
+.navbar-default .navbar-nav > .active > a.storage:hover,
+.navbar-default .navbar-nav > .active > a.storage:focus {
+ background-color: #feb813 !important;
+}
+
+.navbar-default .navbar-nav > .active > a.network,
+.navbar-default .navbar-nav > .active > a.network:hover,
+.navbar-default .navbar-nav > .active > a.network:focus {
+ background-color: #7f1c7d !important;
+}
+
+.navbar-default .navbar-nav > .active > a.administration,
+.navbar-default .navbar-nav > .active > a.administration:hover,
+.navbar-default .navbar-nav > .active > a.administration:focus {
+ background-color: #d9182d !important;
+}
+
+.navbar-default .navbar-nav > .hostname {
+ margin: 0;
+ padding: 8px 0;
+ vertical-align: top;
+ width: 180px;
+ padding-right: 24px;
+ box-sizing: border-box;
+}
+
+.navbar-default .navbar-nav > .hostname .host-location {
+ display: block;
+ font-family: "Helvetica Neue LT W1G 55 Roman", "Helvetica Neue LT
W1G", "HelveticaNeue Roman", "HelveticaNeue-Roman",
"Helvetica Neue Roman", "Helvetica Neue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ color: #fff;
+ font-size: 13pt;
+ font-weight: 400;
+ width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.navbar-default .navbar-toggle {
+ border-color: #ddd;
+}
+
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+ background-color: #ddd;
+}
+
+.navbar-default .navbar-toggle .icon-bar {
+ background-color: #888;
+}
+
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+ border-color: #3a393b;
+}
+
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+ background-color: transparent;
+ color: #fff;
+}
+
+@media (max-width: 991px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #fff;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #999;
+ background-color: transparent;
+ }
+}
+
+.navbar-default .navbar-link {
+ color: #fff;
+}
+
+.navbar-default .navbar-link:hover {
+ color: #fff;
+}
+
+.navbar-default .btn-link {
+ color: #fff;
+}
+
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+ color: #fff;
+}
+
+.navbar-default .btn-link[disabled]:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:hover,
+fieldset[disabled] .navbar-default .btn-link:focus {
+ color: #999;
+}
+
+.navbar-inverse {
+ background-color: #222;
+ border-color: #222;
+}
+
+.navbar-inverse .navbar-brand {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-text {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-nav > li > a {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #999;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-toggle {
+ border-color: #333;
+}
+
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #fff;
+}
+
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #101010;
+}
+
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+ background-color: transparent;
+ color: #fff;
+}
+
+@media (max-width: 991px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #222;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #222;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #fff;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #999;
+ background-color: transparent;
+ }
+}
+
+.navbar-inverse .navbar-link {
+ color: #fff;
+}
+
+.navbar-inverse .navbar-link:hover {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+ color: #fff;
+}
+
+.navbar-inverse .btn-link[disabled]:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+ color: #999;
+}
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 3px;
+}
+
+.breadcrumb > li {
+ display: inline-block;
+}
+
+.breadcrumb > li + li:before {
+ content: "/\\00a0";
+ padding: 0 5px;
+ color: #ccc;
+}
+
+.breadcrumb > .active {
+ color: #999;
+}
+
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 3px;
+}
+
+.pagination > li {
+ display: inline;
+}
+
+.pagination > li > a,
+.pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ line-height: 1.428571429;
+ text-decoration: none;
+ color: #3a393b;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ margin-left: -1px;
+}
+
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+ margin-left: 0;
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.pagination > li > a:hover,
+.pagination > li > a:focus,
+.pagination > li > span:hover,
+.pagination > li > span:focus {
+ z-index: 3;
+ color: #141314;
+ background-color: #fff;
+ border-color: #ddd;
+}
+
+.pagination > .active > a,
+.pagination > .active > a:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span,
+.pagination > .active > span:hover,
+.pagination > .active > span:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+ cursor: default;
+}
+
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+ color: #999;
+ background-color: #fff;
+ border-color: #ddd;
+ cursor: not-allowed;
+}
+
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+
+.pager {
+ padding-left: 0;
+ margin: 20px 0;
+ list-style: none;
+ text-align: center;
+}
+
+.pager:before,
+.pager:after {
+ content: " ";
+ display: table;
+}
+
+.pager:after {
+ clear: both;
+}
+
+.pager li {
+ display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #fff;
+}
+
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #999;
+ background-color: #fff;
+ cursor: not-allowed;
+}
+
+.label {
+ display: inline;
+ padding: 0.2em 0.6em 0.3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+
+.label:empty {
+ display: none;
+}
+
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+
+a.label:hover,
+a.label:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.label-default {
+ background-color: #999;
+}
+
+.label-default[href]:hover,
+.label-default[href]:focus {
+ background-color: gray;
+}
+
+.label-primary {
+ background-color: #3a393b;
+}
+
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+ background-color: #212021;
+}
+
+.label-success {
+ background-color: #5cb85c;
+}
+
+.label-success[href]:hover,
+.label-success[href]:focus {
+ background-color: #449d44;
+}
+
+.label-info {
+ background-color: #5bc0de;
+}
+
+.label-info[href]:hover,
+.label-info[href]:focus {
+ background-color: #31b0d5;
+}
+
+.label-warning {
+ background-color: #f0ad4e;
+}
+
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+ background-color: #ec971f;
+}
+
+.label-danger {
+ background-color: #d9534f;
+}
+
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+ background-color: #c9302c;
+}
+
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ color: #fff;
+ line-height: 1;
+ vertical-align: middle;
+ white-space: nowrap;
+ text-align: center;
+ background-color: #999;
+ border-radius: 10px;
+}
+
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.btn-xs .badge,
+.btn-group-xs > .btn .badge,
+.btn-group-xs > .btn .badge {
+ top: 0;
+ padding: 1px 5px;
+}
+
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+ color: #3a393b;
+ background-color: #fff;
+}
+
+.list-group-item > .badge {
+ float: right;
+}
+
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+
+a.badge:hover,
+a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.jumbotron {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ margin-bottom: 30px;
+ color: inherit;
+ background-color: #fff;
+}
+
+.jumbotron h1,
+.jumbotron .h1 {
+ color: inherit;
+}
+
+.jumbotron p {
+ margin-bottom: 15px;
+ font-size: 21px;
+ font-weight: 200;
+}
+
+.jumbotron > hr {
+ border-top-color: #e6e6e6;
+}
+
+.container .jumbotron,
+.container-fluid .jumbotron {
+ border-radius: 3px;
+}
+
+.jumbotron .container {
+ max-width: 100%;
+}
+
+@media screen and (min-width: 992px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px;
+ }
+ .container .jumbotron,
+ .container-fluid .jumbotron {
+ padding-left: 60px;
+ padding-right: 60px;
+ }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px;
+ }
+}
+
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ transition: border 0.2s ease-in-out;
+}
+
+.thumbnail > img,
+.thumbnail a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.thumbnail .caption {
+ padding: 9px;
+ color: #222;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #3a393b;
+}
+
+.alert {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 0;
+}
+
+.alert h4 {
+ margin-top: 0;
+ color: inherit;
+}
+
+.alert .alert-link {
+ font-weight: bold;
+}
+
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+
+.alert > p + p {
+ margin-top: 5px;
+}
+
+.alert-dismissable, .alert-dismissible {
+ padding-right: 8px 15px20;
+}
+
+.alert-dismissable .close, .alert-dismissible .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+}
+
+.alert-success {
+ background-color: #dae6cb;
+ border-color: #8cc63f;
+ color: #6c6c6c;
+}
+
+.alert-success hr {
+ border-top-color: #7fb636;
+}
+
+.alert-success .alert-link {
+ color: #525252;
+}
+
+.alert-info {
+ background-color: #d9edf7;
+ border-color: #008abf;
+ color: #6c6c6c;
+}
+
+.alert-info hr {
+ border-top-color: #0078a6;
+}
+
+.alert-info .alert-link {
+ color: #525252;
+}
+
+.alert-warning {
+ background-color: #f1e3c2;
+ border-color: #fdb813;
+ color: #6c6c6c;
+}
+
+.alert-warning hr {
+ border-top-color: #f4ad02;
+}
+
+.alert-warning .alert-link {
+ color: #525252;
+}
+
+.alert-danger {
+ background-color: #eac3c7;
+ border-color: #d9182d;
+ color: #6c6c6c;
+}
+
+.alert-danger hr {
+ border-top-color: #c21528;
+}
+
+.alert-danger .alert-link {
+ color: #525252;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+.progress {
+ overflow: hidden;
+ height: 20px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress-bar {
+ float: left;
+ width: 0%;
+ height: 100%;
+ font-size: 12px;
+ line-height: 20px;
+ color: #fff;
+ text-align: center;
+ background-color: #3a393b;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ transition: width 0.6s ease;
+}
+
+.progress-striped .progress-bar,
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+ background-size: 40px 40px;
+}
+
+.progress.active .progress-bar,
+.progress-bar.active {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-bar-success {
+ background-color: #5cb85c;
+}
+
+.progress-striped .progress-bar-success {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-info {
+ background-color: #5bc0de;
+}
+
+.progress-striped .progress-bar-info {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-warning {
+ background-color: #f0ad4e;
+}
+
+.progress-striped .progress-bar-warning {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.progress-bar-danger {
+ background-color: #d9534f;
+}
+
+.progress-striped .progress-bar-danger {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent
25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%,
transparent 75%, transparent);
+}
+
+.media {
+ margin-top: 15px;
+}
+
+.media:first-child {
+ margin-top: 0;
+}
+
+.media,
+.media-body {
+ zoom: 1;
+ overflow: hidden;
+}
+
+.media-body {
+ width: 10000px;
+}
+
+.media-object {
+ display: block;
+}
+
+.media-object.img-thumbnail {
+ max-width: none;
+}
+
+.media-right,
+.media > .pull-right {
+ padding-left: 10px;
+}
+
+.media-left,
+.media > .pull-left {
+ padding-right: 10px;
+}
+
+.media-left,
+.media-right,
+.media-body {
+ display: table-cell;
+ vertical-align: top;
+}
+
+.media-middle {
+ vertical-align: middle;
+}
+
+.media-bottom {
+ vertical-align: bottom;
+}
+
+.media-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.media-list {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-group {
+ margin-bottom: 20px;
+ padding-left: 0;
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+}
+
+.list-group-item:first-child {
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+a.list-group-item,
+button.list-group-item {
+ color: #555;
+}
+
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+ color: #333;
+}
+
+a.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:hover,
+button.list-group-item:focus {
+ text-decoration: none;
+ color: #555;
+ background-color: #f5f5f5;
+}
+
+button.list-group-item {
+ width: 100%;
+ text-align: left;
+}
+
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+ background-color: #fff;
+ color: #999;
+ cursor: not-allowed;
+}
+
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+ color: inherit;
+}
+
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+ color: #999;
+}
+
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+ color: inherit;
+}
+
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+ color: #a09ea2;
+}
+
+.list-group-item-success {
+ color: #6c6c6c;
+ background-color: #dae6cb;
+}
+
+a.list-group-item-success,
+button.list-group-item-success {
+ color: #6c6c6c;
+}
+
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:hover,
+button.list-group-item-success:focus {
+ color: #6c6c6c;
+ background-color: #cedeba;
+}
+
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active,
+button.list-group-item-success.active:hover,
+button.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-info {
+ color: #6c6c6c;
+ background-color: #d9edf7;
+}
+
+a.list-group-item-info,
+button.list-group-item-info {
+ color: #6c6c6c;
+}
+
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:hover,
+button.list-group-item-info:focus {
+ color: #6c6c6c;
+ background-color: #c4e3f3;
+}
+
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active,
+button.list-group-item-info.active:hover,
+button.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-warning {
+ color: #6c6c6c;
+ background-color: #f1e3c2;
+}
+
+a.list-group-item-warning,
+button.list-group-item-warning {
+ color: #6c6c6c;
+}
+
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:hover,
+button.list-group-item-warning:focus {
+ color: #6c6c6c;
+ background-color: #ecd9ad;
+}
+
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active,
+button.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-danger {
+ color: #6c6c6c;
+ background-color: #eac3c7;
+}
+
+a.list-group-item-danger,
+button.list-group-item-danger {
+ color: #6c6c6c;
+}
+
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:hover,
+button.list-group-item-danger:focus {
+ color: #6c6c6c;
+ background-color: #e3b0b5;
+}
+
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active,
+button.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:focus {
+ color: #fff;
+ background-color: #6c6c6c;
+ border-color: #6c6c6c;
+}
+
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
+
+.panel {
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 3px;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.panel-body {
+ padding: 15px;
+}
+
+.panel-body:before,
+.panel-body:after {
+ content: " ";
+ display: table;
+}
+
+.panel-body:after {
+ clear: both;
+}
+
+.panel-heading {
+ padding: 10px 15px;
+ border-bottom: 1px solid transparent;
+ border-top-right-radius: 2px;
+ border-top-left-radius: 2px;
+}
+
+.panel-heading > .dropdown .dropdown-toggle {
+ color: inherit;
+}
+
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 16px;
+ color: inherit;
+}
+
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+ color: inherit;
+}
+
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+ margin-bottom: 0;
+}
+
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+}
+
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+ border-top: 0;
+ border-top-right-radius: 2px;
+ border-top-left-radius: 2px;
+}
+
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+ border-bottom: 0;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .panel-heading + .panel-collapse > .list-group
.list-group-item:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0;
+}
+
+.list-group + .panel-footer {
+ border-top-width: 0;
+}
+
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+ margin-bottom: 0;
+}
+
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+ border-top-right-radius: 2px;
+ border-top-left-radius: 2px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child
td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child
th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child
td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child
th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child th:first-child {
+ border-top-left-radius: 2px;
+}
+
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child
> tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child
> tr:first-child th:last-child {
+ border-top-right-radius: 2px;
+}
+
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child {
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child th:first-child {
+ border-bottom-left-radius: 2px;
+}
+
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child
> tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child
> tr:last-child th:last-child {
+ border-bottom-right-radius: 2px;
+}
+
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+ border-top: 1px solid #ddd;
+}
+
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+ border-top: 0;
+}
+
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr >
th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child
{
+ border-left: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr >
td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr >
td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr >
th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child
{
+ border-right: 0;
+}
+
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child >
td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child >
th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child >
td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th
{
+ border-bottom: 0;
+}
+
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child >
td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child >
th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child >
td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th
{
+ border-bottom: 0;
+}
+
+.panel > .table-responsive {
+ border: 0;
+ margin-bottom: 0;
+}
+
+.panel-group {
+ margin-bottom: 20px;
+}
+
+.panel-group .panel {
+ margin-bottom: 0;
+ border-radius: 3px;
+}
+
+.panel-group .panel + .panel {
+ margin-top: 5px;
+}
+
+.panel-group .panel-heading {
+ border-bottom: 0;
+}
+
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+ border-top: 1px solid #ddd;
+}
+
+.panel-group .panel-footer {
+ border-top: 0;
+}
+
+.panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd;
+}
+
+.panel-default {
+ border-color: #ddd;
+}
+
+.panel-default > .panel-heading {
+ color: #222;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ddd;
+}
+
+.panel-default > .panel-heading .badge {
+ color: #f5f5f5;
+ background-color: #222;
+}
+
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ddd;
+}
+
+.panel-primary {
+ border-color: #3a393b;
+}
+
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #3a393b;
+ border-color: #3a393b;
+}
+
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #3a393b;
+}
+
+.panel-primary > .panel-heading .badge {
+ color: #3a393b;
+ background-color: #fff;
+}
+
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #3a393b;
+}
+
+.panel-success {
+ border-color: #8cc63f;
+}
+
+.panel-success > .panel-heading {
+ color: #6c6c6c;
+ background-color: #dae6cb;
+ border-color: #8cc63f;
+}
+
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #8cc63f;
+}
+
+.panel-success > .panel-heading .badge {
+ color: #dae6cb;
+ background-color: #6c6c6c;
+}
+
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #8cc63f;
+}
+
+.panel-info {
+ border-color: #008abf;
+}
+
+.panel-info > .panel-heading {
+ color: #6c6c6c;
+ background-color: #d9edf7;
+ border-color: #008abf;
+}
+
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #008abf;
+}
+
+.panel-info > .panel-heading .badge {
+ color: #d9edf7;
+ background-color: #6c6c6c;
+}
+
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #008abf;
+}
+
+.panel-warning {
+ border-color: #fdb813;
+}
+
+.panel-warning > .panel-heading {
+ color: #6c6c6c;
+ background-color: #f1e3c2;
+ border-color: #fdb813;
+}
+
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #fdb813;
+}
+
+.panel-warning > .panel-heading .badge {
+ color: #f1e3c2;
+ background-color: #6c6c6c;
+}
+
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #fdb813;
+}
+
+.panel-danger {
+ border-color: #d9182d;
+}
+
+.panel-danger > .panel-heading {
+ color: #6c6c6c;
+ background-color: #eac3c7;
+ border-color: #d9182d;
+}
+
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #d9182d;
+}
+
+.panel-danger > .panel-heading .badge {
+ color: #eac3c7;
+ background-color: #6c6c6c;
+}
+
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #d9182d;
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden;
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ height: 100%;
+ width: 100%;
+ border: 0;
+}
+
+.embed-responsive-16by9 {
+ padding-bottom: 56.25%;
+}
+
+.embed-responsive-4by3 {
+ padding-bottom: 75%;
+}
+
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-lg {
+ padding: 24px;
+ border-radius: 3px;
+}
+
+.well-sm {
+ padding: 9px;
+ border-radius: 3px;
+}
+
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+.modal-open {
+ overflow: hidden;
+}
+
+.modal {
+ display: none;
+ overflow: hidden;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1050;
+ -webkit-overflow-scrolling: touch;
+ outline: 0;
+}
+
+.modal.fade .modal-dialog {
+ -webkit-transform: translate(0, -25%);
+ -ms-transform: translate(0, -25%);
+ transform: translate(0, -25%);
+ transition: -webkit-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+}
+
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+ border: 6px solid #aaa;
+ border: 6px solid rgba(170, 170, 170, 0.3);
+ border-radius: 5px;
+ background-clip: padding-box;
+}
+
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ border-radius: 0;
+ border: 3px solid #999;
+ background-clip: padding-box;
+ box-shadow: none !important;
+ border-radius: 0;
+ outline: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #fff;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.modal-backdrop.in {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+.modal-header {
+ padding: 27px 14px 14px 30px;
+ border-bottom: 1px solid transparent;
+ min-height: 27px 14px 14px 30px23px;
+}
+
+.modal-header .close {
+ margin-top: -2px;
+}
+
+.modal-title {
+ margin: 0;
+ line-height: 23px;
+ font-size: 27px;
+ font-family: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-weight: 300 !important;
+}
+
+.modal-body {
+ position: relative;
+ padding: 20px 30px;
+}
+
+.modal-footer {
+ padding: 20px 30px;
+ text-align: left !important;
+ border-top: 0;
+ margin-top: 20px;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+ content: " ";
+ display: table;
+}
+
+.modal-footer:after {
+ clear: both;
+}
+
+.modal-footer .btn {
+ padding: 6px 12px;
+ min-width: 75px;
+}
+
+.modal-footer .btn + .btn {
+ margin-left: 5px;
+ margin-bottom: 0;
+}
+
+.modal-footer .btn-group .btn + .btn {
+ margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+ margin-left: 0;
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+@media (min-width: 992px) {
+ .modal-dialog {
+ width: 824px;
+ margin: 30px auto;
+ }
+ .modal-content {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+ }
+ .modal-sm {
+ width: 524px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .modal-lg {
+ width: 1124px;
+ }
+}
+
+.modal {
+ text-align: center;
+}
+
+@media screen and (min-width: 768px) {
+ .modal:before {
+ display: inline-block;
+ vertical-align: middle;
+ content: " ";
+ height: 100%;
+ }
+}
+
+.modal-dialog {
+ display: inline-block;
+ text-align: left;
+ vertical-align: middle;
+}
+
+#host-root-container .modal-footer {
+ background: #008abf !important;
+}
+
+#guests-root-container .modal-footer {
+ background: #8cc63f !important;
+}
+
+#templates-root-container .modal-footer {
+ background: #00a6a0 !important;
+}
+
+#storage-root-container .modal-footer {
+ background: #feb813 !important;
+}
+
+#network-root-container .modal-footer {
+ background: #7f1c7d !important;
+}
+
+#administration-root-container .modal-footer {
+ background: #d9182d !important;
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.428571429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 12px;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.tooltip.in {
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.tooltip.top {
+ margin-top: -3px;
+ padding: 5px 0;
+}
+
+.tooltip.right {
+ margin-left: 3px;
+ padding: 0 5px;
+}
+
+.tooltip.bottom {
+ margin-top: 3px;
+ padding: 5px 0;
+}
+
+.tooltip.left {
+ margin-left: -3px;
+ padding: 0 5px;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 3px;
+}
+
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.top-left .tooltip-arrow {
+ bottom: 0;
+ right: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.top-right .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000;
+}
+
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.428571429;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 14px;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 3px;
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+
+.popover.top {
+ margin-top: -10px;
+}
+
+.popover.right {
+ margin-left: 10px;
+}
+
+.popover.bottom {
+ margin-top: 10px;
+}
+
+.popover.left {
+ margin-left: -10px;
+}
+
+.popover-title {
+ margin: 0;
+ padding: 8px 14px;
+ font-size: 14px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 2px 2px 0 0;
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+.popover > .arrow,
+.popover > .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.popover > .arrow {
+ border-width: 11px;
+}
+
+.popover > .arrow:after {
+ border-width: 10px;
+ content: "";
+}
+
+.popover.top > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-bottom-width: 0;
+ border-top-color: #999999;
+ border-top-color: rgba(0, 0, 0, 0.25);
+ bottom: -11px;
+}
+
+.popover.top > .arrow:after {
+ content: " ";
+ bottom: 1px;
+ margin-left: -10px;
+ border-bottom-width: 0;
+ border-top-color: #fff;
+}
+
+.popover.right > .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-left-width: 0;
+ border-right-color: #999999;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.right > .arrow:after {
+ content: " ";
+ left: 1px;
+ bottom: -10px;
+ border-left-width: 0;
+ border-right-color: #fff;
+}
+
+.popover.bottom > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-top-width: 0;
+ border-bottom-color: #999999;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+ top: -11px;
+}
+
+.popover.bottom > .arrow:after {
+ content: " ";
+ top: 1px;
+ margin-left: -10px;
+ border-top-width: 0;
+ border-bottom-color: #fff;
+}
+
+.popover.left > .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-right-width: 0;
+ border-left-color: #999999;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.left > .arrow:after {
+ content: " ";
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: #fff;
+ bottom: -10px;
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel-inner {
+ position: relative;
+ overflow: hidden;
+ width: 100%;
+}
+
+.carousel-inner > .item {
+ display: none;
+ position: relative;
+ transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ line-height: 1;
+}
+
+@media all and (transform-3d), (-webkit-transform-3d) {
+ .carousel-inner > .item {
+ transition: -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000px;
+ perspective: 1000px;
+ }
+ .carousel-inner > .item.next,
+ .carousel-inner > .item.active.right {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ left: 0;
+ }
+ .carousel-inner > .item.prev,
+ .carousel-inner > .item.active.left {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ left: 0;
+ }
+ .carousel-inner > .item.next.left,
+ .carousel-inner > .item.prev.right,
+ .carousel-inner > .item.active {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ left: 0;
+ }
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ display: block;
+}
+
+.carousel-inner > .active {
+ left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+.carousel-inner > .next {
+ left: 100%;
+}
+
+.carousel-inner > .prev {
+ left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+ left: 0;
+}
+
+.carousel-inner > .active.left {
+ left: -100%;
+}
+
+.carousel-inner > .active.right {
+ left: 100%;
+}
+
+.carousel-control {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 15%;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ font-size: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+
+.carousel-control.left {
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0,
0.0001) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',
endColorstr='#00000000', GradientType=1);
+}
+
+.carousel-control.right {
+ left: auto;
+ right: 0;
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0,
0.5) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',
endColorstr='#80000000', GradientType=1);
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+ outline: 0;
+ color: #fff;
+ text-decoration: none;
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ margin-top: -10px;
+ z-index: 5;
+ display: inline-block;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+ left: 50%;
+ margin-left: -10px;
+}
+
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+ right: 50%;
+ margin-right: -10px;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ line-height: 1;
+ font-family: serif;
+}
+
+.carousel-control .icon-prev:before {
+ content: '\2039';
+}
+
+.carousel-control .icon-next:before {
+ content: '\203a';
+}
+
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ margin-left: -30%;
+ padding-left: 0;
+ list-style: none;
+ text-align: center;
+}
+
+.carousel-indicators li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ border: 1px solid #fff;
+ border-radius: 10px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: transparent;
+}
+
+.carousel-indicators .active {
+ margin: 0;
+ width: 12px;
+ height: 12px;
+ background-color: #fff;
+}
+
+.carousel-caption {
+ position: absolute;
+ left: 15%;
+ right: 15%;
+ bottom: 20px;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+
+.carousel-caption .btn {
+ text-shadow: none;
+}
+
+@media screen and (min-width: 992px) {
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ font-size: 30px;
+ }
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .icon-prev {
+ margin-left: -15px;
+ }
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-next {
+ margin-right: -15px;
+ }
+ .carousel-caption {
+ left: 20%;
+ right: 20%;
+ padding-bottom: 30px;
+ }
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+
+.clearfix:before,
+.clearfix:after {
+ content: " ";
+ display: table;
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+.pull-left {
+ float: left !important;
+}
+
+.hide {
+ display: none !important;
+}
+
+.show {
+ display: block !important;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.hidden {
+ display: none !important;
+}
+
+.affix {
+ position: fixed;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+.visible-xs {
+ display: none !important;
+}
+
+.visible-sm {
+ display: none !important;
+}
+
+.visible-md {
+ display: none !important;
+}
+
+.visible-lg {
+ display: none !important;
+}
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+
+@media (max-width: 991px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table !important;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .visible-xs-block {
+ display: block !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .visible-xs-inline {
+ display: inline !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table !important;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table !important;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .visible-md-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table !important;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg-inline {
+ display: inline !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .visible-lg-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .hidden-xs {
+ display: none !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-sm {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) and (max-width: 1679) {
+ .hidden-md {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1680) {
+ .hidden-lg {
+ display: none !important;
+ }
+}
+
+.visible-print {
+ display: none !important;
+}
+
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table !important;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+}
+
+.visible-print-block {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-block {
+ display: block !important;
+ }
+}
+
+.visible-print-inline {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-inline {
+ display: inline !important;
+ }
+}
+
+.visible-print-inline-block {
+ display: none !important;
+}
+
+@media print {
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+}
+
+@media print {
+ .hidden-print {
+ display: none !important;
+ }
+}
+
+/*
+The MIT License (MIT)
+
+Copyright (c) 2013-2015 bootstrap-select
+
+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. */
+.bootstrap-select {
+ /*width: 220px\9; IE8 and below*/
+ width: 220px \0;
+ /*IE9 and below*/
+}
+
+.bootstrap-select > .btn {
+ width: 100%;
+ height: 40px;
+ padding-right: 25px;
+}
+
+.error .bootstrap-select .btn {
+ border: 1px solid #b94a48;
+}
+
+.control-group.error .bootstrap-select .dropdown-toggle {
+ border-color: #b94a48;
+}
+
+.bootstrap-select.fit-width {
+ width: auto !important;
+}
+
+.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn)
{
+ width: 220px;
+}
+
+.bootstrap-select .btn:focus {
+ outline: thin dotted #333333 !important;
+ outline: 5px auto -webkit-focus-ring-color !important;
+ outline-offset: -2px;
+}
+
+.bootstrap-select.form-control {
+ margin-bottom: 0;
+ padding: 0;
+ border: none;
+}
+
+.bootstrap-select.form-control:not([class*="col-"]) {
+ width: 100%;
+}
+
+.bootstrap-select.btn-group:not(.input-group-btn),
+.bootstrap-select.btn-group[class*="col-"] {
+ float: none;
+ display: inline-block;
+ margin-left: 0;
+}
+
+.bootstrap-select.btn-group.dropdown-menu-right,
+.bootstrap-select.btn-group[class*="col-"].dropdown-menu-right,
+.row-fluid .bootstrap-select.btn-group[class*="col-"].dropdown-menu-right {
+ float: right;
+}
+
+.form-search .bootstrap-select.btn-group,
+.form-inline .bootstrap-select.btn-group,
+.form-horizontal .bootstrap-select.btn-group,
+.form-group .bootstrap-select.btn-group {
+ margin-bottom: 0;
+}
+
+.form-group-lg .bootstrap-select.btn-group.form-control,
+.form-group-sm .bootstrap-select.btn-group.form-control {
+ padding: 0;
+}
+
+.form-inline .bootstrap-select.btn-group .form-control {
+ width: 100%;
+}
+
+.input-append .bootstrap-select.btn-group {
+ margin-left: -1px;
+}
+
+.input-prepend .bootstrap-select.btn-group {
+ margin-right: -1px;
+}
+
+.bootstrap-select.btn-group > .disabled {
+ cursor: not-allowed;
+}
+
+.bootstrap-select.btn-group > .disabled:focus {
+ outline: none !important;
+}
+
+.bootstrap-select.btn-group .btn .filter-option {
+ display: inline-block;
+ overflow: hidden;
+ width: 100%;
+ text-align: left;
+}
+
+.bootstrap-select.btn-group .btn .caret {
+ position: absolute;
+ top: 0;
+ right: 40px;
+ margin-top: 0;
+ vertical-align: top;
+ border: 0;
+ border-left: 1px solid #ccc;
+ height: 38px;
+}
+
+.bootstrap-select.btn-group .btn .caret:before {
+ content: '\f078';
+ font-family: "FontAwesome";
+ font-size: 15px;
+ color: #666666;
+ position: absolute;
+ left: 12px;
+ top: 9px;
+ display: block;
+}
+
+.bootstrap-select.btn-group .btn:hover .caret {
+ border-color: #adadad;
+}
+
+.bootstrap-select.btn-group .btn:focus .caret {
+ border-color: #8c8c8c;
+}
+
+.bootstrap-select.btn-group[class*="col-"] .btn {
+ width: 100%;
+}
+
+.bootstrap-select.btn-group .dropdown-menu {
+ min-width: 100%;
+ z-index: 1035;
+ box-sizing: border-box;
+}
+
+.bootstrap-select.btn-group .dropdown-menu.inner {
+ position: static;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ border-radius: 0;
+ box-shadow: none;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li {
+ position: relative;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:hover small,
+.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:focus small,
+.bootstrap-select.btn-group .dropdown-menu li.active:not(.disabled) a small {
+ color: #64b1d8;
+ color: fade(#64b1d8, 40%);
+}
+
+.bootstrap-select.btn-group .dropdown-menu li.disabled a {
+ cursor: not-allowed;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a {
+ outline: none;
+ cursor: pointer;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a.opt {
+ position: relative;
+ padding-left: 2.25em;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {
+ display: none;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a span.text {
+ display: inline-block;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li small {
+ padding-left: 0.5em;
+}
+
+.bootstrap-select.btn-group .dropdown-menu .notify {
+ position: absolute;
+ bottom: 5px;
+ width: 96%;
+ margin: 0 2%;
+ min-height: 26px;
+ padding: 3px 5px;
+ background: whitesmoke;
+ border: 1px solid #e3e3e3;
+ box-shadow: inset 0 1px 1px fade(black, 5%);
+ pointer-events: none;
+ opacity: 0.9;
+ box-sizing: border-box;
+}
+
+.bootstrap-select.btn-group .no-results {
+ padding: 3px;
+ background: #f5f5f5;
+ margin: 0 5px;
+}
+
+.bootstrap-select.btn-group.fit-width .btn .filter-option {
+ position: static;
+}
+
+.bootstrap-select.btn-group.fit-width .btn .caret {
+ position: static;
+ top: auto;
+ margin-top: -1px;
+}
+
+.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {
+ position: absolute;
+ display: inline-block;
+ right: 15px;
+ margin-top: 5px;
+}
+
+.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {
+ margin-right: 34px;
+}
+
+.bootstrap-select.show-menu-arrow.open > .btn {
+ z-index: 1036;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle:before {
+ content: '';
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom-width: 7px;
+ border-bottom-style: solid;
+ border-bottom-color: #cccccc;
+ border-bottom-color: fade(#cccccc, 20%);
+ position: absolute;
+ bottom: -4px;
+ left: 9px;
+ display: none;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle:after {
+ content: '';
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid white;
+ position: absolute;
+ bottom: -4px;
+ left: 10px;
+ display: none;
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {
+ bottom: auto;
+ top: -3px;
+ border-bottom: 0;
+ border-top-width: 7px;
+ border-top-style: solid;
+ border-top-color: #cccccc;
+ border-top-color: fade(#cccccc, 20%);
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {
+ bottom: auto;
+ top: -3px;
+ border-top: 6px solid white;
+ border-bottom: 0;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {
+ right: 12px;
+ left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {
+ right: 13px;
+ left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {
+ display: block;
+}
+
+.bootstrap-select.btn-group.open .btn .caret {
+ border-left-color: #adadad;
+}
+
+.bootstrap-select.btn-group.open .btn:hover .caret {
+ border-left-color: #8c8c8c;
+}
+
+.bs-searchbox,
+.bs-actionsbox {
+ padding: 4px 8px;
+}
+
+.bs-actionsbox {
+ float: left;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.bs-actionsbox .btn-group button {
+ width: 50%;
+}
+
+.bs-searchbox + .bs-actionsbox {
+ padding: 0 8px 4px;
+}
+
+.bs-searchbox input.form-control {
+ margin-bottom: 0;
+ width: 100%;
+}
+
+.mobile-device {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block !important;
+ width: 100%;
+ height: 100% !important;
+ opacity: 0;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 80px !important;
+ padding-right: 60px !important;
+}
+
+.alert {
+ border-width: 0 0 0 5px;
+}
+
+.hide-content {
+ display: none !important;
+}
+
+.login-area {
+ margin: 90px auto 0;
+ width: 300px;
+}
+
+.login-area .btn-login {
+ display: block;
+ position: static;
+ float: none;
+ margin-bottom: 50px;
+}
+
+.login-area .col-md-12, .login-area .col-lg-12 {
+ width: 100%;
+}
+
+.login-area .bootstrap-select,
+.login-area .selectpicker {
+ font-family: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+}
+
+.login-area .dropdown-toggle.selectpicker {
+ height: 40px;
+}
+
+.login-area .form-group {
+ margin-bottom: 20px;
+}
+
+.login-area .form-group:last-child {
+ margin-bottom: 0;
+}
+
+.toolbar {
+ height: 40px;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ background: #3a393b;
+}
+
+.toolbar .tools {
+ height: 40px;
+}
+
+.toolbar a {
+ font-family: "Helvetica Neue LT W1G 55 Roman", "Helvetica Neue LT
W1G", "HelveticaNeue Roman", "HelveticaNeue-Roman",
"Helvetica Neue Roman", "Helvetica Neue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ display: inline-block;
+ color: #fff;
+ text-decoration: none;
+ font-size: 13pt;
+ vertical-align: middle;
+ padding: 6px 0;
+ margin-left: 50px;
+}
+
+.toolbar span, .toolbar .fa {
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.toolbar .fa {
+ font-size: 24px;
+ margin-right: 15px;
+}
+
+#host-root-container .toolbar {
+ background-color: #008abf !important;
+}
+
+#guests-root-container .toolbar {
+ background-color: #8cc63f !important;
+}
+
+#templates-root-container .toolbar {
+ background-color: #00a6a0 !important;
+}
+
+#storage-root-container .toolbar {
+ background-color: #feb813 !important;
+}
+
+#network-root-container .toolbar {
+ background-color: #7f1c7d !important;
+}
+
+#administration-root-container .toolbar {
+ background-color: #d9182d !important;
+}
+
+.btn {
+ font-family: "HelveticaNeueMedium", "HelveticaNeue-Medium",
"Helvetica Neue Medium", "HelveticaNeue", "Helvetica Neue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 13pt;
+}
+
+.btn-login {
+ color: #fff;
+ background-color: #008abf;
+ border-color: #008abf;
+}
+
+.btn-login:focus,
+.btn-login.focus {
+ color: #fff;
+ background-color: #00658c;
+ border-color: #002e40;
+}
+
+.btn-login:hover {
+ color: #fff;
+ background-color: #00658c;
+ border-color: #005e82;
+}
+
+.btn-login:active,
+.btn-login.active,
+.open > .btn-login.dropdown-toggle {
+ color: #fff;
+ background-color: #00658c;
+ border-color: #005e82;
+}
+
+.btn-login:active:hover,
+.btn-login:active:focus,
+.btn-login:active.focus,
+.btn-login.active:hover,
+.btn-login.active:focus,
+.btn-login.active.focus,
+.open > .btn-login.dropdown-toggle:hover,
+.open > .btn-login.dropdown-toggle:focus,
+.open > .btn-login.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #004b68;
+ border-color: #002e40;
+}
+
+.btn-login:active,
+.btn-login.active,
+.open > .btn-login.dropdown-toggle {
+ background-image: none;
+}
+
+.btn-login.disabled,
+.btn-login.disabled:hover,
+.btn-login.disabled:focus,
+.btn-login.disabled.focus,
+.btn-login.disabled:active,
+.btn-login.disabled.active,
+.btn-login[disabled],
+.btn-login[disabled]:hover,
+.btn-login[disabled]:focus,
+.btn-login[disabled].focus,
+.btn-login[disabled]:active,
+.btn-login[disabled].active,
+fieldset[disabled] .btn-login,
+fieldset[disabled] .btn-login:hover,
+fieldset[disabled] .btn-login:focus,
+fieldset[disabled] .btn-login.focus,
+fieldset[disabled] .btn-login:active,
+fieldset[disabled] .btn-login.active {
+ background-color: #008abf;
+ border-color: #008abf;
+}
+
+.btn-login .badge {
+ color: #008abf;
+ background-color: #fff;
+}
+
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+.dialog-border-grey {
+ background-clip: border-box;
+ border: 6px solid rgba(170, 170, 170, 0.3);
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ border-radius: 5px;
+}
+
+.dialog-container {
+ border: 3px solid #999999;
+ background: white;
+}
+
+.dialog-container .dialog-title {
+ height: 60px;
+ padding: 20px 0 20px 20px;
+ margin: 0;
+ float: left;
+ font-size: 27px;
+ font-family: "HelveticaNeueLight", "HelveticaNeue-Light",
"HelveticaNeue Light", "HelveticaNeue", "HelveticaNeue",
Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-weight: 300 !important;
+}
+
+.dialog-container .dialog-body {
+ position: relative;
+}
+
+.dialog-container .dialog-footer {
+ height: 50px;
+ background-color: #008ABF;
+}
+
+.dialog-container .dialog-footer .dialog-button {
+ display: inline-block;
+ background-color: white;
+ width: 75px;
+ height: 30px;
+ line-height: 30px;
+ position: relative;
+ margin-left: 10px;
+ margin-top: 10px;
+ text-align: center;
+ vertical-align: middle;
+}
+
+.dialog-container .dialog-footer .dialog-button:hover {
+ background-color: #EEEEEE;
+ cursor: pointer;
+}
+
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+.menu-flat .btn {
+ background: #4d4c4e !important;
+ min-width: 160px;
+ border: 0 !important;
+ font-family: "HelveticaNeueBold", "HelveticaNeue-Bold",
"HelveticaNeue Bold", "Helvetica Neue Bold", "Helvetica
Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande",
sans-serif;
+ font-weight: 700;
+ font-size: 13.5pt;
+ position: relative;
+ height: 40px;
+ padding: 4px 45px 5px 38px;
+}
+
+.menu-flat .btn > i {
+ font-size: 22px;
+ vertical-align: bottom;
+ width: 26px;
+ height: 40px;
+ text-align: left;
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 6px;
+}
+
+.menu-flat .btn > i:before {
+ line-height: 40px;
+}
+
+.menu-flat .caret {
+ position: absolute;
+ top: 0;
+ right: 0;
+ display: block;
+ width: 40px;
+ height: 40px;
+ margin-left: 0;
+ vertical-align: middle;
+ border-top: 0;
+ border-top: 0 \9;
+ border-right: 0;
+ border-left: 0;
+}
+
+.menu-flat .caret:before {
+ font-family: "fontello";
+ font-style: normal;
+ font-weight: normal;
+ font-size: 13px;
+ speak: none;
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1.2em;
+ height: 1.2em;
+ margin: .5em;
+ text-align: center;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 2em;
+ content: '\e861';
+}
+
+.menu-flat.dropup,
+.menu-flat.dropdown {
+ position: relative;
+}
+
+.menu-flat .dropdown-toggle:focus {
+ outline: 0;
+}
+
+.menu-flat .dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ font-size: 13.5pt;
+ text-align: left;
+ background-color: #3a393b;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none !important;
+ background-clip: padding-box;
+}
+
+.menu-flat .dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.menu-flat .dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #404042;
+}
+
+.menu-flat .dropdown-menu > li > a {
+ border-top: 1px solid #2e2e2e;
+ box-shadow: inset 0px 1px 0px 0px #404042;
+}
+
+.menu-flat .dropdown-menu > li:first-child > a {
+ border-top: 1px solid #3a393b;
+ box-shadow: none;
+}
+
+.menu-flat .dropdown-menu > li.critical:last-child > a {
+ box-shadow: none;
+}
+
+.menu-flat .dropdown-menu > li > a {
+ display: block;
+ padding: 4px 6px;
+ clear: both;
+ font-weight: normal;
+ line-height: 31px;
+ color: #fff;
+ white-space: nowrap;
+}
+
+.menu-flat .dropdown-menu > li > a > i {
+ font-size: 22px;
+ margin-right: 10px;
+ vertical-align: top;
+ width: 26px;
+ height: 26px;
+ text-align: left;
+ display: inline-block;
+}
+
+.menu-flat .dropdown-menu > li > a:hover,
+.menu-flat .dropdown-menu > li > a:focus {
+ text-decoration: none;
+ color: #fff;
+ background-color: #3a393b;
+}
+
+.menu-flat .dropdown-menu > .active > a,
+.menu-flat .dropdown-menu > .active > a:hover,
+.menu-flat .dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ background-color: #3a393b;
+}
+
+.menu-flat .dropdown-menu > li.critical > a {
+ background: #d9182d;
+}
+
+.menu-flat .dropdown-menu > .disabled > a,
+.menu-flat .dropdown-menu > .disabled > a:hover,
+.menu-flat .dropdown-menu > .disabled > a:focus {
+ color: #999;
+}
+
+.menu-flat .dropdown-menu > .disabled > a:hover,
+.menu-flat .dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ cursor: not-allowed;
+}
+
+.menu-flat.open .btn {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.menu-flat.open > .dropdown-menu {
+ display: block;
+}
+
+.menu-flat.open .caret {
+ background: #3a393b;
+}
+
+.menu-flat.open .caret:before {
+ content: '\e864';
+}
+
+.menu-flat.open > a {
+ outline: 0;
+}
+
+.dropdown-menu-right {
+ left: auto;
+ right: 0;
+}
+
+.dropdown-menu-left {
+ left: 0;
+ right: auto;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.428571429;
+ color: #999;
+ white-space: nowrap;
+}
+
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: 990;
+}
+
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ border-top: 0;
+ border-bottom: 4px dashed;
+ border-bottom: 4px solid \9;
+ content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+}
+
+@media (min-width: 992px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .navbar-right .dropdown-menu-left {
+ left: 0;
+ right: auto;
+ }
+}
+
+pre {
+ margin-top: 20px;
+}
+
+@media screen and (min-width: 768px) {
+ .container {
+ width: 1540px;
+ }
+}
+
+@media screen and (min-width: 1680px) {
+ .container {
+ width: 1540px;
+ }
+}
+
+/*#
sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb3RzdHJhcC5jdXN0b20uc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvY29tcGFzcy1taXhpbnMvbGliL2NvbXBhc3MvZnVuY3Rpb25zL19saXN0cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9jb21wYXNzLW1peGlucy9saWIvY29tcGFzcy9mdW5jdGlvbnMvX2NvbnN0YW50cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9jb21wYXNzLW1peGlucy9saWIvY29tcGFzcy9mdW5jdGlvbnMvX2Rpc3BsYXkuc2NzcyIsInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9fYm9vdHN0cmFwLXdvay5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19ub3JtYWxpemUuc2NzcyIsImJvb3RzdHJhcC5jdXN0b20uY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19wcmludC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19zY2FmZm9sZGluZy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdmVuZG9yLXByZWZpeGVzLnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX3dvay12YXJpYWJsZXMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3RhYi1mb2N1cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9faW1hZ2Uuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fdHlwZS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdGV4dC1lbXBoYXNpcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fYmFja2dyb3VuZC12YXJpYW50LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19jbGVhcmZpeC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdGV4dC1vdmVyZmxvdy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19jb2RlLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2dyaWQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2dyaWQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2dyaWQtZnJhbWV3b3JrLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3RhYmxlcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fdGFibGUtcm93LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2Zvcm1zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19mb3Jtcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19idXR0b25zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19idXR0b25zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19vcGFjaXR5LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2NvbXBvbmVudC1hbmltYXRpb25zLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2Ryb3Bkb3ducy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fbmF2LWRpdmlkZXIuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3Jlc2V0LWZpbHRlci5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19idXR0b24tZ3JvdXBzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19ib3JkZXItcmFkaXVzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2lucHV0LWdyb3Vwcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19uYXZzLnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX25hdmJhci1mbGF0LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2NvbXBhc3MtbWl4aW5zL2xpYi9jb21wYXNzL2NzczMvX3NoYXJlZC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9jb21wYXNzLW1peGlucy9saWIvY29tcGFzcy9jc3MzL191c2VyLWludGVyZmFjZS5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fbmF2LXZlcnRpY2FsLWFsaWduLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2JyZWFkY3J1bWJzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3BhZ2luYXRpb24uc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3BhZ2luYXRpb24uc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcGFnZXIuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fbGFiZWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19sYWJlbHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fYmFkZ2VzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2p1bWJvdHJvbi5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL190aHVtYm5haWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2FsZXJ0cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fYWxlcnRzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3Byb2dyZXNzLWJhcnMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2dyYWRpZW50cy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fcHJvZ3Jlc3MtYmFyLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX21lZGlhLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX2xpc3QtZ3JvdXAuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2xpc3QtZ3JvdXAuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcGFuZWxzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19wYW5lbHMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcmVzcG9uc2l2ZS1lbWJlZC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL193ZWxscy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19jbG9zZS5zY3NzIiwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL19tb2RhbC1mbGF0LnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvX3Rvb2x0aXAuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX3Jlc2V0LXRleHQuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fcG9wb3ZlcnMuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fY2Fyb3VzZWwuc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9fdXRpbGl0aWVzLnNjc3MiLCIuLi8uLi9ib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zL19jZW50ZXItYmxvY2suc2NzcyIsIi4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnMvX2hpZGUtdGV4dC5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL19yZXNwb25zaXZlLXV0aWxpdGllcy5zY3NzIiwiLi4vLi4vYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGlucy9fcmVzcG9uc2l2ZS12aXNpYmlsaXR5LnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX2Jvb3RzdHJhcC1zZWxlY3Quc2NzcyIsInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9fbG9naW4uc2NzcyIsInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9fdG9vbGJhci5zY3NzIiwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL19idXR0b25zLnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX2RpYWxvZy1mbGF0LnNjc3MiLCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvX21lbnUtZmxhdC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FDaEJIOzs7R0FHRztBQ0hIOzs7R0FHRztBQ0hIOzs7R0FHRztBQ0hIOzs7O0dBSUc7QUNKSCw0RUFBNEU7QUFRNUU7RUFDRSx3QkFBd0I7RUFDeEIsMkJBQTJCO0VBQzNCLCtCQUErQjtDQUgzQjs7QUFVTjtFQUNFLFVBQVU7Q0FETjs7QUEwQk47Ozs7Ozs7Ozs7Ozs7RUFDRSxlQUFlO0NBRFI7O0FBWVQ7Ozs7RUFDRSxzQkFBc0I7RUFDdEIseUJBQXlCO0NBRnBCOztBQVVhO0VBQ2xCLGNBQWM7RUFDZCxVQUFVO0NBRlc7O0FDUXZC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LG1CZmdFMkI7Q2VyRTNCOztBQU1EOzs7RUFHQyxhZnlLa0M7RWV4S2xDLGtCZndLa0M7Q2UxS2xDOztBQUdEOzs7Ozs7O0VBR0MsYUFBYTtDQURiOztBRDZRRjtFQUNFLGFkekdrQztFYzBHbEMsbUJkbk80QjtFY29PNUIsZ0JkblIwQjtFY29SMUIsdUJkN05pQztFYzhOakMsbUJkMU4yQjtDY3FOZDs7QUFPVDtFQUNKLGFkaEhrQztFY2lIbEMsa0JkakhrQztDYytHZjs7QUFLTDs7RUFDZCxhQUFhO0NBRGdCOztBQUcvQjtFQUNFLGFkeEhrQztFY3lIbEMsaUJBQWtDO0VBQ2xDLG1CZG5QNEI7RWNvUDVCLGdCZG5TMEI7RWNvUzFCLHVCZDdPaUM7Q2N3T2I7O0FBY3hCO0VBRUUsbUJBQW1CO0NBRk47O0FBS2I7RUFDRSxzQkFBa0M7Q0FEckI7O0FBS2pCO0VBQ0UsbUJBQW1CO0VBQ25CLE9BQU87RUFDUCxTQUFTO0VBQ1QsV0FBVztFQUNYLGVBQWU7RUFDZixZZHZKcUQ7RWN3SnJELGFkeEpxRDtFY3lKckQsa0JkekpxRDtFYzBKckQsbUJBQW1CO0VBQ25CLHFCQUFxQjtDQVZDOztBQWNPOzs7Ozs7RUFDN0IsWWQ5Sm9DO0VjK0pwQyxhZC9Kb0M7RWNnS3BDLGtCZGhLb0M7Q2M2SmlCOztBQU94Qjs7Ozs7O0VBQzdCLFlkbktxQztFY29LckMsYWRwS3FDO0VjcUtyQyxrQmRyS3FDO0Nja0tnQjs7QUM1WW5DOzs7Ozs7Ozs7O0VBQ2hCLGVmNmhCb0M7Q2U5aEJaOztBQUkxQjtFQUNFLHNCZnloQm9DO0VEemU5QixpRGdCL0NrQztDQUYzQjs7QUFHWjtFQUNDLHNCQUFvQjtFaEI2Q2hCLGtFZ0I1Q3NEO0NBRm5EOztBQU9YO0VBQ0UsZWYrZ0JvQztFZTlnQnBDLHNCZjhnQm9DO0VlN2dCcEMsMEJmOGdCb0M7Q2VqaEJsQjs7QUFNcEI7RUFDRSxlZnlnQm9DO0NlMWdCZDs7QUFwQk47Ozs7Ozs7Ozs7RUFDaEIsZWZxaUJvQztDZXRpQlo7O0FBSTFCO0VBQ0Usc0JmaWlCb0M7RURqZjlCLGlEZ0IvQ2tD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d0I7Q0FUVjs7QUFnQnBCO0VBQ0UsbUIzQmpOMkM7QzJCZ043Qjs7QUFHYjs7RUFDQyx1QjNCdE55QztDMkJxTmxDOztBQUdUO0VBQ0UsdUIzQnhOeUM7QzJCdU5oQzs7QUFNYjs7RUFDRSxzQjNCem9CMkI7QzJCd29CZjs7QUFVVDs7O0VBQ0MsOEIzQm5QOEM7RTJCb1A5QyxZM0JqbkJtQjtDMkIrbUJaOztBQU1YO0VBR1c7SUFDTCxZM0J6bkJpQjtHMkJ3bkJUO0VBR1A7O0lBQ0MsWTNCNW5CZTtJMkI2bkJmLDhCM0JsUTBDO0cyQmdRbkM7RUFRUjs7O0lBQ0MsWTNCcG9CZTtJMkJxb0JmLDhCM0J4UTBDO0cyQnNRbkM7RUFRUjs7O0lBQ0MsWTNCM29CZTtJMkI0b0JmLDhCM0I5UTBDO0cyQjRRbkM7Qy9CNDBIbEI7O0ErQjl6SEM7RUFDRSxZM0IxcEJ1QjtDMkJ5cEJYOztBQUVYO0VBQ0MsWTNCNXBCcUI7QzJCMnBCZDs7QUFLWDtFQUNFLFkzQmpxQnVCO0MyQmdxQmQ7O0FBR1I7O0VBQ0MsWTNCcHFCcUI7QzJCbXFCZDs7QUFNTjs7OztFQUNDLFkzQnpxQm1CO0MyQndxQlo7O0FBU2Y7RUFDRSx1QjNCcFM4QztFMkJxUzlDLG1CM0JyUzhDO0MyQm1TL0I7O0FBSWY7RUFDRSxZM0J2ckJ1QjtDMkJzckJWOztBQUdaOztFQUNDLFkzQjFyQnFCO0UyQjJyQnJCLDhCM0I3UmlEO0MyQjJSMUM7O0FBTVg7RUFDRSxZM0Joc0J1QjtDMkIrckJYOztBQUtMO0VBQ0wsWTNCcnNCcUI7QzJCb3NCYjs7QUFJUDs7RUFDQyxZM0J6c0JtQjtFMkIwc0JuQiw4QjNCclQrQztDMkJtVHhDOztBQVFSOzs7RUFDQyxZM0JqdEJtQjtFMkJrdEJuQiw4QjNCN1QrQztDMkIyVHhDOztBQVFSOzs7RUFDQyxZM0JqVXdDO0UyQmtVeEMsOEIzQmpVK0M7QzJCK1R4Qzs7QUFRYjtFQUNFLG1CM0I5VDRDO0MyQjZUOUI7O0FBR2I7O0VBQ0MsOEIzQm5VaUQ7QzJCa1UxQzs7QUFHVDtFQUNFLHVCM0JyVTBDO0MyQm9VakM7O0FBTWI7O0VBQ0Usc0JBQW9CO0NBRFI7O0FBU1Q7OztFQUNDLDhCM0JqVytDO0UyQmtXL0MsWTNCdnZCbUI7QzJCcXZCWjs7QUFNWDtFQUdNO0lBQ0EsbUIzQmhYc0M7RzJCK1dwQjtFQUdwQjtJQUNFLHVCM0JuWHNDO0cyQmtYOUI7RUFHSDtJQUNMLFkzQnJ3QmlCO0cyQm93QlQ7RUFHUDs7SUFDQyxZM0J4d0JlO0kyQnl3QmYsOEIzQnBYMkM7RzJCa1hwQztFQVFSOzs7SUFDQyxZM0JoeEJlO0kyQml4QmYsOEIzQjVYMkM7RzJCMFhwQztFQVFSOzs7SUFDQyxZM0JoWW9DO0kyQmlZcEMsOEIzQmhZMkM7RzJCOFhwQztDL0J5ekhsQjs7QStCaHpIQztFQUNFLFkzQmp5QnVCO0MyQmd5Qlg7O0FBRVg7RUFDQyxZM0JueUJxQjtDMkJreUJkOztBQUtYO0VBQ0UsWTNCeHlCdUI7QzJCdXlCZDs7QUFHUjs7RUFDQyxZM0IzeUJxQjtDMkIweUJkOztBQU1OOzs7O0VBQ0MsWTNCelp3QztDMkJ3WmpDOztBSWoyQmY7RUFDRSxrQi9CODBCa0M7RStCNzBCbEMsb0IvQnVGNkI7RStCdEY3QixpQkFBaUI7RUFDakIsMEIvQjYwQnFDO0UrQjUwQnJDLG1CL0JnSTZCO0MrQnJJbEI7O0FBT1Q7RUFDQSxzQkFBc0I7Q0FEbEI7O0FBR0E7RUFDRixtQkFBd0M7RUFDeEMsZUFBYztFQUNkLFkvQnMwQjhCO0MrQnowQm5COztBQU9iO0VBQ0EsWS9CUDJCO0MrQk1sQjs7QUNuQmI7RUFDRSxzQkFBc0I7RUFDdEIsZ0JBQWdCO0VBQ2hCLGVBQStCO0VBQy9CLG1CaENtSTZCO0NnQ3ZJbEI7O0FBTVQ7RUFDQSxnQkFBZ0I7Q0FEWjs7QUFHRjs7RUFDQSxtQkFBbUI7RUFDbkIsWUFBWTtFQUNaLGtCaEM2RzBCO0VnQzVHMUIseUJoQzRFK0I7RWdDM0UvQixzQkFBc0I7RUFDdEIsZWhDQ3lCO0VnQ0F6Qix1QmhDMmVxQztFZ0MxZXJDLHVCaEMyZXFDO0VnQzFlckMsa0JBQWtCO0NBVFo7O0FBYUo7O0VBQ0EsZUFBZTtFUlhyQiwrQnhCMkg2QjtFd0IxSDFCLDRCeEIwSDBCO0NnQ2pIakI7O0FBT047O0VSekJOLGdDeEJtSTZCO0V3QmxJMUIsNkJ4QmtJMEI7Q2dDMUdqQjs7QUFTVDs7OztFQUNDLFdBQVc7RUFDWCxlaENpQndCO0VnQ2hCeEIsdUJoQzNCd0I7RWdDNEJ4QixtQmhDc2RxQztDZ0MxZDlCOztBQVlSOzs7Ozs7RUFDQyxXQUFXO0VBQ1gsWWhDOGNxQztFZ0M3Y3JDLDBCaENyQ3lCO0VnQ3NDekIsc0JoQ3RDeUI7RWdDdUN6QixnQkFBZ0I7Q0FMVDs7QUFlTjs7Ozs7O0VBQ0QsWWhDckR5QjtFZ0NzRHpCLHVCaENvY3FDO0VnQ25jckMsbUJoQ29jcUM7RWdDbmNyQyxvQmhDZ01zQztDZ0NwTTdCOztBQy9EVDs7RUFDQSxtQmpDeUgwQjtFaUN4SDFCLGdCakN5RXdCO0VpQ3hFeEIsdUJqQytIK0I7Q2lDbEl6Qjs7QUFPSjs7RVRHTiwrQnhCNEg2QjtFd0IzSDFCLDRCeEIySDBCO0NpQy9IakI7O0FBTU47O0VUWE4sZ0N4Qm9JNkI7RXdCbkkxQiw2QnhCbUkwQjtDaUN6SGpCOztBQWJSOztFQUNBLGtCakM0SDBCO0VpQzNIMUIsZ0JqQzBFd0I7RWlDekV4QixpQmpDZ0l5QjtDaUNuSW5COztBQU9KOztFVEdOLCtCeEI2SDZCO0V3QjVIMUIsNEJ4QjRIMEI7Q2lDaElqQjs7QUFNTjs7RVRYTixnQ3hCcUk2QjtFd0JwSTFCLDZCeEJvSTBCO0NpQzFIakI7O0FDYmQ7RUFDRSxnQkFBZ0I7RUFDaEIsZUFBK0I7RUFDL0IsaUJBQWlCO0VBQ2pCLG1CQUFtQjtDQUpiOztBNUJTTDs7RUFDQyxhQUFhO0VBQ2IsZUFBZTtDQUZSOztBQUlSO0VBQ0MsWUFBWTtDQURMOztBNEJQVDtFQUNFLGdCQUFnQjtDQURkOztBQUdBOztFQUNBLHNCQUFzQjtFQUN0QixrQkFBaUI7RUFDakIsdUJsQzZlcUM7RWtDNWVyQyx1QmxDNmVxQztFa0M1ZXJDLG9CbENpZ0JxQztDa0N0Z0IvQjs7QUFTTDs7RUFDRCxzQkFBc0I7RUFDdEIsdUJsQ1J3QjtD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Qm9DO0NpRDNpQmxCOztBQUtFO0VBQ2xCLDBCakRxaUJrQztDaUR0aUJIOztBQUdqQztFQUNFLGVqRGlpQmtDO0VpRGhpQmxDLDBCakQraEJrQztDaURqaUI1Qjs7QUFNWTtFQUNsQiw2QmpENGhCa0M7Q2lEN2hCSDs7QURtUHJDO0VDblFFLHNCakRpakJzQztDZ0Q5UzNCOztBQ2pRUDtFQUNGLGVqRDRpQm9DO0VpRDNpQnBDLDBCakQ0aUJvQztFaUQzaUJwQyxzQmpENGlCb0M7Q2lEL2lCbEI7O0FBS0U7RUFDbEIsMEJqRHlpQmtDO0NpRDFpQkg7O0FBR2pDO0VBQ0UsZWpEcWlCa0M7RWlEcGlCbEMsMEJqRG1pQmtDO0NpRHJpQjVCOztBQU1ZO0VBQ2xCLDZCakRnaUJrQztDaURqaUJIOztBRHNQckM7RUN0UUUsc0JqRHFqQnNDO0NnRC9TeEI7O0FDcFFWO0VBQ0YsZWpEZ2pCb0M7RWlEL2lCcEMsMEJqRGdqQm9DO0VpRC9pQnBDLHNCakRnakJvQztDaURuakJsQjs7QUFLRTtFQUNsQiwwQmpENmlCa0M7Q2lEOWlCSDs7QUFHakM7RUFDRSxlakR5aUJrQztFaUR4aUJsQywwQmpEdWlCa0M7Q2lEemlCNUI7O0FBTVk7RUFDbEIsNkJqRG9pQmtDO0NpRHJpQkg7O0FEeVByQztFQ3pRRSxzQmpEeWpCcUM7Q2dEaFR4Qjs7QUN2UVQ7RUFDRixlakRvakJvQztFaURuakJwQywwQmpEb2pCcUM7RWlEbmpCckMsc0JqRG9qQm1DO0NpRHZqQmpCOztBQUtFO0VBQ2xCLDBCakRpakJpQztDaURsakJGOztBQUdqQztFQUNFLGVqRDZpQm1DO0VpRDVpQm5DLDBCakQyaUJrQztDaUQ3aUI1Qjs7QUFNWTtFQUNsQiw2QmpEd2lCaUM7Q2lEemlCRjs7QUNmckM7RUFDRSxtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLFVBQVU7RUFDVixXQUFXO0VBQ1gsaUJBQWlCO0NBTEE7O0FBV2pCOzs7OztFQUNFLG1CQUFtQjtFQUNuQixPQUFPO0VBQ1AsUUFBUTtFQUNSLFVBQVU7RUFDVixhQUFhO0VBQ2IsWUFBWTtFQUNaLFVBQVU7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QU5SOztBQVVOO0VBQ1osU0FBUztFQUNULFdBQVc7Q0FGaUI7O0FBYTVCOztFQUNFLGNBQWM7RUFDZCwwQkFBdUM7RUFDdkMsNEJBQXlDO0VBQ3pDLFlBQVk7Q0FKTjs7QUFPUjs7RUFDRSxVQUFVO0VBQ1YsYUFBYTtFQUNiLG1CQUFtQjtDQUhMOztBQVlsQjtFQUVJO0lBQ0UsU0FBUztJQUFFLFdBQVc7R0FEUjtFQUtoQjtJQUNFLFFBQVE7SUFBRSxZQUFZO0dBREg7Q3hFd21QeEI7O0FObjNQRDtFQUNFLGlCQUFpQjtDQURkOztBQU1MO0VBRUU7SUFDRSxjQUFjO0dBREo7Q01xM1BiOztBTi8yUEQ7RUFFRTtJQUNFLGNBQWM7R0FESjtDTW0zUGIiLCJmaWxlIjoiYm9vdHN0cmFwLmN1c3RvbS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHJvamVjdCBLaW1jaGlcbiAqXG4gKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDE1XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIE92ZXJyaWRlIEJvb3RzdHJhcCBTQVNTIHZhcmlhYmxlc1xuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy93b2stdmFyaWFibGVzXCI7XG5cbi8vIGJvd2VyOnNjc3NcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2NvbXBhc3MtbWl4aW5zL2xpYi9jb21wYXNzXCI7XG4vLyBlbmRib3dlclxuXG4vLyBCb290c3RyYXAgY3VzdG9tIGltcG9ydHNcbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvYm9vdHN0cmFwLXdva1wiO1xuXG4vLyBCb290c3RyYXAgc2VsZWN0IHBsdWdpblxuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9ib290c3RyYXAtc2VsZWN0XCI7XG5cbi8vIE92ZXJyaWRlIEJvb3RzdHJhcCBtaXhpblxuLmNvbnRhaW5lciB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogIDgwcHggIWltcG9ydGFudDtcbiAgcGFkZGluZy1yaWdodDogNjBweCAhaW1wb3J0YW50O1xufVxuXG4vLyBPdmVycmlkZSBhbGVydFxuXG4uYWxlcnQge1xuICBib3JkZXItd2lkdGg6ICRhbGVydC1ib3JkZXItd2lkdGg7XG59XG5cbi5oaWRlLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuXG4vLyBMb2dpblxuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9sb2dpblwiO1xuXG4vLyBUb3BiYXIgYW5kIG5hdmlnYXRpb25cbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvdG9vbGJhclwiO1xuXG4vLyBCdXR0b25zXG5AaW1wb3J0IFwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL2J1dHRvbnNcIjtcblxuLy8gRGlhbG9nIEZsYXRcbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvZGlhbG9nLWZsYXRcIjtcblxuLy8gRHJvcGRvd24gQnV0dG9uIC0gRmxhdFxuQGltcG9ydCBcInRoZW1lLWRlZmF1bHQvbW9kdWxlcy9tZW51LWZsYXRcIjtcblxucHJlIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbn1cblxuLy8gTWVkaWEgcXVlcmllc1xuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIHdpZHRoOiAxNTQwcHg7XG4gIH1cblxufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxNjgwcHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTU0MHB4O1xuICB9XG5cbn0iLCIvKlxuICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSdWJ5IGxpc3QgZnVuY3Rpb25zIGZyb20gQ29tcGFzczpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Db21wYXNzL2NvbXBhc3MvYmxvYi9zdGFibGUvbGliL2NvbXBhc3Mvc2Fzc19leHRlbnNpb25zL2Z1bmN0aW9ucy9saXN0cy5yYlxuICovXG5cblxuLy8gY29tcGFjdCBpcyBwYXJ0IG9mIGxpYnNhc3NcblxuQGZ1bmN0aW9uIC1jb21wYXNzLW50aCgkbGlzdCwgJHBsYWNlKSB7XG4gIC8vIFllcCwgU2Fzcy1saXN0cyBhcmUgMS1pbmRleGVkLlxuICBAaWYgJHBsYWNlID09IFwiZmlyc3RcIiB7XG4gICAgJHBsYWNlOiAxO1xuICB9XG4gIEBpZiAkcGxhY2UgPT0gXCJsYXN0XCIge1xuICAgICRwbGFjZTogbGVuZ3RoKCRsaXN0KTtcbiAgfVxuICBAcmV0dXJuIG50aCgkbGlzdCwgJHBsYWNlKTtcbn1cblxuLy8gY29tcGFzc19saXN0IGFuZCBjb21wYXNzX3NwYWNlX2xpc3QgY2FuJ3QgYmUgaW1wbGVtZW50ZWQgaW4gc2FzcyBzY3JpcHRcblxuQGZ1bmN0aW9uIC1jb21wYXNzLWxpc3Qtc2l6ZSgkbGlzdCkge1xuICBAcmV0dXJuIGxlbmd0aCgkbGlzdCk7XG59XG5cbkBmdW5jdGlvbiAtY29tcGFzcy1zbGljZSgkbGlzdCwgJHN0YXJ0LCAkZW5kOiBmYWxzZSkge1xuICBAaWYgJGVuZCA9PSBmYWxzZSB7XG4gICAgJGVuZDogbGVuZ3RoKCRsaXN0KTtcbiAgfVxuICAkZnVsbDogbnRoKCRsaXN0LCAkc3RhcnQpO1xuICBAZm9yICRpIGZyb20gJHN0YXJ0ICsgMSB0aHJvdWdoICRlbmQge1xuICAgICRmdWxsOiAkZnVsbCwgbnRoKCRsaXN0LCAkaSk7XG4gIH1cbiAgQHJldHVybiAkZnVsbDtcbn1cblxuQGZ1bmN0aW9uIHJlamVjdCgkbGlzdCwgJHJlamVjdDEsICRyZWplY3QyOm51bGwsICRyZWplY3QzOm51bGwsICRyZWplY3Q0Om51bGwsICRyZWplY3Q1Om51bGwsICRyZWplY3Q2Om51bGwsICRyZWplY3Q3Om51bGwsICRyZWplY3Q4Om51bGwsICRyZWplY3Q5Om51bGwpIHtcbiAgJHJlamVjdHM6ICRyZWplY3QxLCAkcmVqZWN0MiwgJHJlamVjdDMsICRyZWplY3Q0LCAkcmVqZWN0NSwgJHJlamVjdDYsICRyZWplY3Q3LCAkcmVqZWN0OCwgJHJlamVjdDk7XG5cbiAgJGZ1bGw6IGZhbHNlO1xuICBAZWFjaCAkaXRlbSBpbiAkbGlzdCB7XG4gICAgQGlmIGluZGV4KCRyZWplY3RzLCAkaXRlbSkge31cbiAgICBAZWxzZSB7XG4gICAgICBAaWYgJGZ1bGwge1xuICAgICAgICAkZnVsbDogJGZ1bGwsICRpdGVtO1xuICAgICAgfVxuICAgICAgQGVsc2Uge1xuICAgICAgICAkZnVsbDogJGl0ZW07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEByZXR1cm4gJGZ1bGw7XG59XG4iLCIvKlxuICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSdWJ5IGNvbnN0YW50cyBmdW5jdGlvbnMgZnJvbSBDb21wYXNzOlxuICogaHR0cHM6Ly9naXRodWIuY29tL0NvbXBhc3MvY29tcGFzcy9ibG9iL3N0YWJsZS9saWIvY29tcGFzcy9zYXNzX2V4dGVuc2lvbnMvZnVuY3Rpb25zL2NvbnN0YW50cy5yYlxuICovXG5cbkBmdW5jdGlvbiBvcHBvc2l0ZS1wb3NpdGlvbigkZnJvbSkge1xuICAgIEBpZiAoJGZyb20gPT0gdG9wKSB7XG4gICAgICAgIEByZXR1cm4gYm90dG9tO1xuICAgIH0gQGVsc2UgaWYgKCRmcm9tID09IGJvdHRvbSkge1xuICAgICAgICBAcmV0dXJuIHRvcDtcbiAgICB9IEBlbHNlIGlmICgkZnJvbSA9PSBsZWZ0KSB7XG4gICAgICAgIEByZXR1cm4gcmlnaHQ7XG4gICAgfSBAZWxzZSBpZiAoJGZyb20gPT0gcmlnaHQpIHtcbiAgICAgICAgQHJldHVybiBsZWZ0O1xuICAgIH0gQGVsc2UgaWYgKCRmcm9tID09IGNlbnRlcikge1xuICAgICAgICBAcmV0dXJuIGNlbnRlcjtcbiAgICB9XG59XG4iLCIvKlxuICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSdWJ5IGRpc3BsYXkgZnVuY3Rpb25zIGZyb20gQ29tcGFzczpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Db21wYXNzL2NvbXBhc3MvYmxvYi9zdGFibGUvY29yZS9saWIvY29tcGFzcy9jb3JlL3Nhc3NfZXh0ZW5zaW9ucy9mdW5jdGlvbnMvZGlzcGxheS5yYlxuICovXG5cbkBmdW5jdGlvbiBlbGVtZW50cy1vZi10eXBlKCR0eXBlKXtcbiAgICBAaWYgKCR0eXBlID09IGJsb2NrKXtcbiAgICAgICAgQHJldHVybiBhZGRyZXNzLCBhcnRpY2xlLCBhc2lkZSwgYmxvY2txdW90ZSwgY2VudGVyLCBkaXIsIGRpdiwgZGQsIGRldGFpbHMsIGRsLCBkdCwgZmllbGRzZXQsIGZpZ2NhcHRpb24sIGZpZ3VyZSwgZm9ybSwgZm9vdGVyLCBmcmFtZXNldCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaHIsIGhlYWRlciwgaGdyb3VwLCBpc2luZGV4LCBtYWluLCBtZW51LCBuYXYsIG5vZnJhbWVzLCBub3NjcmlwdCwgb2wsIHAsIHByZSwgc2VjdGlvbiwgc3VtbWFyeSwgdWw7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gaW5saW5lKXtcbiAgICAgICAgQHJldHVybiBhLCBhYmJyLCBhY3JvbnltLCBhdWRpbywgYiwgYmFzZWZvbnQsIGJkbywgYmlnLCBiciwgY2FudmFzLCBjaXRlLCBjb2RlLCBjb21tYW5kLCBkYXRhbGlzdCwgZGZuLCBlbSwgZW1iZWQsIGZvbnQsIGksIGltZywgaW5wdXQsIGtleWdlbiwga2JkLCBsYWJlbCwgbWFyaywgbWV0ZXIsIG91dHB1dCwgcHJvZ3Jlc3MsIHEsIHJwLCBydCwgcnVieSwgcywgc2FtcCwgc2VsZWN0LCBzbWFsbCwgc3Bhbiwgc3RyaWtlLCBzdHJvbmcsIHN1Yiwgc3VwLCB0ZXh0YXJlYSwgdGltZSwgdHQsIHUsIHZhciwgdmlkZW8sIHdicjtcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSBpbmxpbmUtYmxvY2spe1xuICAgICAgICBAcmV0dXJuIGltZztcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSB0YWJsZSl7XG4gICAgICAgIEByZXR1cm4gdGFibGU7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gbGlzdC1pdGVtKXtcbiAgICAgICAgQHJldHVybiBsaTtcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSB0YWJsZS1yb3ctZ3JvdXApe1xuICAgICAgICBAcmV0dXJuIHRib2R5O1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IHRhYmxlLWhlYWRlci1ncm91cCl7XG4gICAgICAgIEByZXR1cm4gdGhlYWQ7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gdGFibGUtZm9vdGVyLWdyb3VwKXtcbiAgICAgICAgQHJldHVybiB0Zm9vdDtcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSB0YWJsZS1yb3cpe1xuICAgICAgICBAcmV0dXJuIHRyO1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IHRhYmxlLWNlbGwpe1xuICAgICAgICBAcmV0dXJuIHRoLCB0ZDtcbiAgICB9IEBlbHNlIGlmICgkdHlwZSA9PSBodG1sNS1ibG9jayl7XG4gICAgICAgIEByZXR1cm4gYXJ0aWNsZSwgYXNpZGUsIGRldGFpbHMsIGZpZ2NhcHRpb24sIGZpZ3VyZSwgZm9vdGVyLCBoZWFkZXIsIGhncm91cCwgbWFpbiwgbWVudSwgbmF2LCBzZWN0aW9uLCBzdW1tYXJ5O1xuICAgIH0gQGVsc2UgaWYgKCR0eXBlID09IGh0bWw1LWlubGluZSl7XG4gICAgICAgIEByZXR1cm4gYXVkaW8sIGNhbnZhcywgY29tbWFuZCwgZGF0YWxpc3QsIGVtYmVkLCBrZXlnZW4sIG1hcmssIG1ldGVyLCBvdXRwdXQsIHByb2dyZXNzLCBycCwgcnQsIHJ1YnksIHRpbWUsIHZpZGVvLCB3YnI7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gaHRtbDUpe1xuICAgICAgICBAcmV0dXJuIGFydGljbGUsIGFzaWRlLCBhdWRpbywgY2FudmFzLCBjb21tYW5kLCBkYXRhbGlzdCwgZGV0YWlscywgZW1iZWQsIGZpZ2NhcHRpb24sIGZpZ3VyZSwgZm9vdGVyLCBoZWFkZXIsIGhncm91cCwga2V5Z2VuLCBtYWluLCBtYXJrLCBtZW51LCBtZXRlciwgbmF2LCBvdXRwdXQsIHByb2dyZXNzLCBycCwgcnQsIHJ1YnksIHNlY3Rpb24sIHN1bW1hcnksIHRpbWUsIHZpZGVvLCB3YnI7XG4gICAgfSBAZWxzZSBpZiAoJHR5cGUgPT0gdGV4dC1pbnB1dCl7XG4gICAgICAgIEByZXR1cm4gaW5wdXQsIHRleHRhcmVhO1xuICAgIH1cbn1cbiIsIi8qIVxuICogQm9vdHN0cmFwIHYzLjMuNSAoaHR0cDovL2dldGJvb3RzdHJhcC5jb20pXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE1IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKi9cblxuLy8gQ29yZSB2YXJpYWJsZXMgYW5kIG1peGluc1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnNcIjtcblxuLy8gUmVzZXQgYW5kIGRlcGVuZGVuY2llc1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9ub3JtYWxpemVcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcHJpbnRcIjtcbi8vQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9nbHlwaGljb25zXCI7IC8vIFJlbW92aW5nIEdseXBoaWNvbnMgZHVlIHRvIEZlZG9yYSBmb250IGZpbGVzIGxlZ2FsIGlzc3VlXG5cbi8vIENvcmUgQ1NTXG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3NjYWZmb2xkaW5nXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3R5cGVcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvY29kZVwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9ncmlkXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3RhYmxlc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9mb3Jtc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9idXR0b25zXCI7XG5cbi8vIENvbXBvbmVudHNcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvY29tcG9uZW50LWFuaW1hdGlvbnNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvZHJvcGRvd25zXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2J1dHRvbi1ncm91cHNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvaW5wdXQtZ3JvdXBzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL25hdnNcIjtcbkBpbXBvcnQgXCJ0aGVtZS1kZWZhdWx0L21vZHVsZXMvbmF2YmFyLWZsYXRcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvYnJlYWRjcnVtYnNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcGFnaW5hdGlvblwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9wYWdlclwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9sYWJlbHNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvYmFkZ2VzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2p1bWJvdHJvblwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC90aHVtYm5haWxzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2FsZXJ0c1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9wcm9ncmVzcy1iYXJzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21lZGlhXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL2xpc3QtZ3JvdXBcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvcGFuZWxzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3Jlc3BvbnNpdmUtZW1iZWRcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvd2VsbHNcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvY2xvc2VcIjtcblxuLy8gQ29tcG9uZW50cyB3LyBKYXZhU2NyaXB0XG5AaW1wb3J0IFwidGhlbWUtZGVmYXVsdC9tb2R1bGVzL21vZGFsLWZsYXRcIjtcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvdG9vbHRpcFwiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9wb3BvdmVyc1wiO1xuQGltcG9ydCBcImJvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwLXNhc3Mtb2ZmaWNpYWwvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9jYXJvdXNlbFwiO1xuXG4vLyBVdGlsaXR5IGNsYXNzZXNcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC1zYXNzLW9mZmljaWFsL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvdXRpbGl0aWVzXCI7XG5AaW1wb3J0IFwiYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAtc2Fzcy1vZmZpY2lhbC9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL3Jlc3BvbnNpdmUtdXRpbGl0aWVzXCI7XG4iLCIvKiEgbm9ybWFsaXplLmNzcyB2My4wLjMgfCBNSVQgTGljZW5zZSB8IGdpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzICovXG5cbi8vXG4vLyAxLiBTZXQgZGVmYXVsdCBmb250IGZhbWlseSB0byBzYW5zLXNlcmlmLlxuLy8gMi4gUHJldmVudCBpT1MgYW5kIElFIHRleHQgc2l6ZSBhZGp1c3QgYWZ0ZXIgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSxcbi8vICAgIHdpdGhvdXQgZGlzYWJsaW5nIHVzZXIgem9vbS5cbi8vXG5cbmh0bWwge1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgLy8gMVxuICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLy8gMlxuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IC8vIDJcbn1cblxuLy9cbi8vIFJlbW92ZSBkZWZhdWx0IG1hcmdpbi5cbi8vXG5cbmJvZHkge1xuICBtYXJnaW46IDA7XG59XG5cbi8vIEhUTUw1IGRpc3BsYXkgZGVmaW5pdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYW55IEhUTUw1IGVsZW1lbnQgaW4gSUUgOC85LlxuLy8gQ29ycmVjdCBgYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgZm9yIGBkZXRhaWxzYCBvciBgc3VtbWFyeWAgaW4gSUUgMTAvMTFcbi8vIGFuZCBGaXJlZm94LlxuLy8gQ29ycmVjdCBgYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgZm9yIGBtYWluYCBpbiBJRSAxMS5cbi8vXG5cbmFydGljbGUsXG5hc2lkZSxcbmRldGFpbHMsXG5maWdjYXB0aW9uLFxuZmlndXJlLFxuZm9vdGVyLFxuaGVhZGVyLFxuaGdyb3VwLFxubWFpbixcbm1lbnUsXG5uYXYsXG5zZWN0aW9uLFxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4vL1xuLy8gMS4gQ29ycmVjdCBgaW5saW5lLWJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGluIElFIDgvOS5cbi8vIDIuIE5vcm1hbGl6ZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYHByb2dyZXNzYCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cbi8vXG5cbmF1ZGlvLFxuY2FudmFzLFxucHJvZ3Jlc3MsXG52aWRlbyB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jazsgLy8gMVxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7IC8vIDJcbn1cblxuLy9cbi8vIFByZXZlbnQgbW9kZXJuIGJyb3dzZXJzIGZyb20gZGlzcGxheWluZyBgYXVkaW9gIHdpdGhvdXQgY29udHJvbHMuXG4vLyBSZW1vdmUgZXhjZXNzIGhlaWdodCBpbiBpT1MgNSBkZXZpY2VzLlxuLy9cblxuYXVkaW86bm90KFtjb250cm9sc10pIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgaGVpZ2h0OiAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBgW2hpZGRlbl1gIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gSUUgOC85LzEwLlxuLy8gSGlkZSB0aGUgYHRlbXBsYXRlYCBlbGVtZW50IGluIElFIDgvOS8xMC8xMSwgU2FmYXJpLCBhbmQgRmlyZWZveCA8IDIyLlxuLy9cblxuW2hpZGRlbl0sXG50ZW1wbGF0ZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8vIExpbmtzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gUmVtb3ZlIHRoZSBncmF5IGJhY2tncm91bmQgY29sb3IgZnJvbSBhY3RpdmUgbGlua3MgaW4gSUUgMTAuXG4vL1xuXG5hIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi8vXG4vLyBJbXByb3ZlIHJlYWRhYmlsaXR5IG9mIGZvY3VzZWQgZWxlbWVudHMgd2hlbiB0aGV5IGFyZSBhbHNvIGluIGFuXG4vLyBhY3RpdmUvaG92ZXIgc3RhdGUuXG4vL1xuXG5hOmFjdGl2ZSxcbmE6aG92ZXIge1xuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBUZXh0LWxldmVsIHNlbWFudGljc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAvMTEsIFNhZmFyaSwgYW5kIENocm9tZS5cbi8vXG5cbmFiYnJbdGl0bGVdIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZDtcbn1cblxuLy9cbi8vIEFkZHJlc3Mgc3R5bGUgc2V0IHRvIGBib2xkZXJgIGluIEZpcmVmb3ggNCssIFNhZmFyaSwgYW5kIENocm9tZS5cbi8vXG5cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLy9cbi8vIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBTYWZhcmkgYW5kIENocm9tZS5cbi8vXG5cbmRmbiB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLy9cbi8vIEFkZHJlc3MgdmFyaWFibGUgYGgxYCBmb250LXNpemUgYW5kIG1hcmdpbiB3aXRoaW4gYHNlY3Rpb25gIGFuZCBgYXJ0aWNsZWBcbi8vIGNvbnRleHRzIGluIEZpcmVmb3ggNCssIFNhZmFyaSwgYW5kIENocm9tZS5cbi8vXG5cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gSUUgOC85LlxuLy9cblxubWFyayB7XG4gIGJhY2tncm91bmQ6ICNmZjA7XG4gIGNvbG9yOiAjMDAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBpbmNvbnNpc3RlbnQgYW5kIHZhcmlhYmxlIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4vL1xuXG5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogODAlO1xufVxuXG4vL1xuLy8gUHJldmVudCBgc3ViYCBhbmQgYHN1cGAgYWZmZWN0aW5nIGBsaW5lLWhlaWdodGAgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxuc3ViLFxuc3VwIHtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGxpbmUtaGVpZ2h0OiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG5cbnN1YiB7XG4gIGJvdHRvbTogLTAuMjVlbTtcbn1cblxuLy8gRW1iZWRkZWQgY29udGVudFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIFJlbW92ZSBib3JkZXIgd2hlbiBpbnNpZGUgYGFgIGVsZW1lbnQgaW4gSUUgOC85LzEwLlxuLy9cblxuaW1nIHtcbiAgYm9yZGVyOiAwO1xufVxuXG4vL1xuLy8gQ29ycmVjdCBvdmVyZmxvdyBub3QgaGlkZGVuIGluIElFIDkvMTAvMTEuXG4vL1xuXG5zdmc6bm90KDpyb290KSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8vIEdyb3VwaW5nIGNvbnRlbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBBZGRyZXNzIG1hcmdpbiBub3QgcHJlc2VudCBpbiBJRSA4LzkgYW5kIFNhZmFyaS5cbi8vXG5cbmZpZ3VyZSB7XG4gIG1hcmdpbjogMWVtIDQwcHg7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGRpZmZlcmVuY2VzIGJldHdlZW4gRmlyZWZveCBhbmQgb3RoZXIgYnJvd3NlcnMuXG4vL1xuXG5ociB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICBoZWlnaHQ6IDA7XG59XG5cbi8vXG4vLyBDb250YWluIG92ZXJmbG93IGluIGFsbCBicm93c2Vycy5cbi8vXG5cbnByZSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBvZGQgYGVtYC11bml0IGZvbnQgc2l6ZSByZW5kZXJpbmcgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxuY29kZSxcbmtiZCxcbnByZSxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIGZvbnQtc2l6ZTogMWVtO1xufVxuXG4vLyBGb3Jtc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIEtub3duIGxpbWl0YXRpb246IGJ5IGRlZmF1bHQsIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFggYWxsb3cgdmVyeSBsaW1pdGVkXG4vLyBzdHlsaW5nIG9mIGBzZWxlY3RgLCB1bmxlc3MgYSBgYm9yZGVyYCBwcm9wZXJ0eSBpcyBzZXQuXG4vL1xuXG4vL1xuLy8gMS4gQ29ycmVjdCBjb2xvciBub3QgYmVpbmcgaW5oZXJpdGVkLlxuLy8gICAgS25vd24gaXNzdWU6IGFmZmVjdHMgY29sb3Igb2YgZGlzYWJsZWQgZWxlbWVudHMuXG4vLyAyLiBDb3JyZWN0IGZvbnQgcHJvcGVydGllcyBub3QgYmVpbmcgaW5oZXJpdGVkLlxuLy8gMy4gQWRkcmVzcyBtYXJnaW5zIHNldCBkaWZmZXJlbnRseSBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5idXR0b24sXG5pbnB1dCxcbm9wdGdyb3VwLFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBjb2xvcjogaW5oZXJpdDsgLy8gMVxuICBmb250OiBpbmhlcml0OyAvLyAyXG4gIG1hcmdpbjogMDsgLy8gM1xufVxuXG4vL1xuLy8gQWRkcmVzcyBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEuXG4vL1xuXG5idXR0b24ge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLy9cbi8vIEFkZHJlc3MgaW5jb25zaXN0ZW50IGB0ZXh0LXRyYW5zZm9ybWAgaW5oZXJpdGFuY2UgZm9yIGBidXR0b25gIGFuZCBgc2VsZWN0YC5cbi8vIEFsbCBvdGhlciBmb3JtIGNvbnRyb2wgZWxlbWVudHMgZG8gbm90IGluaGVyaXQgYHRleHQtdHJhbnNmb3JtYCB2YWx1ZXMuXG4vLyBDb3JyZWN0IGBidXR0b25gIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3gsIElFIDgvOS8xMC8xMSwgYW5kIE9wZXJhLlxuLy8gQ29ycmVjdCBgc2VsZWN0YCBzdHlsZSBpbmhlcml0YW5jZSBpbiBGaXJlZm94LlxuLy9cblxuYnV0dG9uLFxuc2VsZWN0IHtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG59XG5cbi8vXG4vLyAxLiBBdm9pZCB0aGUgV2ViS2l0IGJ1ZyBpbiBBbmRyb2lkIDQuMC4qIHdoZXJlICgyKSBkZXN0cm95cyBuYXRpdmUgYGF1ZGlvYFxuLy8gICAgYW5kIGB2aWRlb2AgY29udHJvbHMuXG4vLyAyLiBDb3JyZWN0IGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgYGlucHV0YCB0eXBlcyBpbiBpT1MuXG4vLyAzLiBJbXByb3ZlIHVzYWJpbGl0eSBhbmQgY29uc2lzdGVuY3kgb2YgY3Vyc29yIHN0eWxlIGJldHdlZW4gaW1hZ2UtdHlwZVxuLy8gICAgYGlucHV0YCBhbmQgb3RoZXJzLlxuLy9cblxuYnV0dG9uLFxuaHRtbCBpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCAvLyAxXG5pbnB1dFt0eXBlPVwicmVzZXRcIl0sXG5pbnB1dFt0eXBlPVwic3VibWl0XCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8vIDJcbiAgY3Vyc29yOiBwb2ludGVyOyAvLyAzXG59XG5cbi8vXG4vLyBSZS1zZXQgZGVmYXVsdCBjdXJzb3IgZm9yIGRpc2FibGVkIGVsZW1lbnRzLlxuLy9cblxuYnV0dG9uW2Rpc2FibGVkXSxcbmh0bWwgaW5wdXRbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4vL1xuLy8gUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIGJvcmRlciBpbiBGaXJlZm94IDQrLlxuLy9cblxuYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxuaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXIge1xuICBib3JkZXI6IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8vXG4vLyBBZGRyZXNzIEZpcmVmb3ggNCsgc2V0dGluZyBgbGluZS1oZWlnaHRgIG9uIGBpbnB1dGAgdXNpbmcgYCFpbXBvcnRhbnRgIGluXG4vLyB0aGUgVUEgc3R5bGVzaGVldC5cbi8vXG5cbmlucHV0IHtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuLy9cbi8vIEl0J3MgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG9uJ3QgYXR0ZW1wdCB0byBzdHlsZSB0aGVzZSBlbGVtZW50cy5cbi8vIEZpcmVmb3gncyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHJlc3BlY3QgYm94LXNpemluZywgcGFkZGluZywgb3Igd2lkdGguXG4vL1xuLy8gMS4gQWRkcmVzcyBib3ggc2l6aW5nIHNldCB0byBgY29udGVudC1ib3hgIGluIElFIDgvOS8xMC5cbi8vIDIuIFJlbW92ZSBleGNlc3MgcGFkZGluZyBpbiBJRSA4LzkvMTAuXG4vL1xuXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAvLyAxXG4gIHBhZGRpbmc6IDA7IC8vIDJcbn1cblxuLy9cbi8vIEZpeCB0aGUgY3Vyc29yIHN0eWxlIGZvciBDaHJvbWUncyBpbmNyZW1lbnQvZGVjcmVtZW50IGJ1dHRvbnMuIEZvciBjZXJ0YWluXG4vLyBgZm9udC1zaXplYCB2YWx1ZXMgb2YgdGhlIGBpbnB1dGAsIGl0IGNhdXNlcyB0aGUgY3Vyc29yIHN0eWxlIG9mIHRoZVxuLy8gZGVjcmVtZW50IGJ1dHRvbiB0byBjaGFuZ2UgZnJvbSBgZGVmYXVsdGAgdG8gYHRleHRgLlxuLy9cblxuaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8vXG4vLyAxLiBBZGRyZXNzIGBhcHBlYXJhbmNlYCBzZXQgdG8gYHNlYXJjaGZpZWxkYCBpbiBTYWZhcmkgYW5kIENocm9tZS5cbi8vIDIuIEFkZHJlc3MgYGJveC1zaXppbmdgIHNldCB0byBgYm9yZGVyLWJveGAgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4vL1xuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8vIDFcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8vMlxufVxuXG4vL1xuLy8gUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIHNlYXJjaCBjYW5jZWwgYnV0dG9uIGluIFNhZmFyaSBhbmQgQ2hyb21lIG9uIE9TIFguXG4vLyBTYWZhcmkgKGJ1dCBub3QgQ2hyb21lKSBjbGlwcyB0aGUgY2FuY2VsIGJ1dHRvbiB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaGFzXG4vLyBwYWRkaW5nIChhbmQgYHRleHRmaWVsZGAgYXBwZWFyYW5jZSkuXG4vL1xuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLy9cbi8vIERlZmluZSBjb25zaXN0ZW50IGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZy5cbi8vXG5cbmZpZWxkc2V0IHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgbWFyZ2luOiAwIDJweDtcbiAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtO1xufVxuXG4vL1xuLy8gMS4gQ29ycmVjdCBgY29sb3JgIG5vdCBiZWluZyBpbmhlcml0ZWQgaW4gSUUgOC85LzEwLzExLlxuLy8gMi4gUmVtb3ZlIHBhZGRpbmcgc28gcGVvcGxlIGFyZW4ndCBjYXVnaHQgb3V0IGlmIHRoZXkgemVybyBvdXQgZmllbGRzZXRzLlxuLy9cblxubGVnZW5kIHtcbiAgYm9yZGVyOiAwOyAvLyAxXG4gIHBhZGRpbmc6IDA7IC8vIDJcbn1cblxuLy9cbi8vIFJlbW92ZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRSA4LzkvMTAvMTEuXG4vL1xuXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vL1xuLy8gRG9uJ3QgaW5oZXJpdCB0aGUgYGZvbnQtd2VpZ2h0YCAoYXBwbGllZCBieSBhIHJ1bGUgYWJvdmUpLlxuLy8gTk9URTogdGhlIGRlZmF1bHQgY2Fubm90IHNhZmVseSBiZSBjaGFuZ2VkIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFguXG4vL1xuXG5vcHRncm91cCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4vLyBUYWJsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgbW9zdCBzcGFjaW5nIGJldHdlZW4gdGFibGUgY2VsbHMuXG4vL1xuXG50YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG50ZCxcbnRoIHtcbiAgcGFkZGluZzogMDtcbn1cbiIsIi8qXG4gKiBQcm9qZWN0IEtpbWNoaVxuICpcbiAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMTVcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qXG4gKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJ1YnkgbGlzdCBmdW5jdGlvbnMgZnJvbSBDb21wYXNzOlxuICogaHR0cHM6Ly9naXRodWIuY29tL0NvbXBhc3MvY29tcGFzcy9ibG9iL3N0YWJsZS9saWIvY29tcGFzcy9zYXNzX2V4dGVuc2lvbnMvZnVuY3Rpb25zL2xpc3RzLnJiXG4gKi9cbi8qXG4gKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJ1YnkgY29uc3RhbnRzIGZ1bmN0aW9ucyBmcm9tIENvbXBhc3M6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vQ29tcGFzcy9jb21wYXNzL2Jsb2Ivc3RhYmxlL2xpYi9jb21wYXNzL3Nhc3NfZXh0ZW5zaW9ucy9mdW5jdGlvbnMvY29uc3RhbnRzLnJiXG4gKi9cbi8qXG4gKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJ1YnkgZGlzcGxheSBmdW5jdGlvbnMgZnJvbSBDb21wYXNzOlxuICogaHR0cHM6Ly9naXRodWIuY29tL0NvbXBhc3MvY29tcGFzcy9ibG9iL3N0YWJsZS9jb3JlL2xpYi9jb21wYXNzL2NvcmUvc2Fzc19leHRlbnNpb25zL2Z1bmN0aW9ucy9kaXNwbGF5LnJiXG4gKi9cbi8qIVxuICogQm9vdHN0cmFwIHYzLjMuNSAoaHR0cDovL2dldGJvb3RzdHJhcC5jb20pXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE1IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKi9cbi8qISBub3JtYWxpemUuY3NzIHYzLjAuMyB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9cbmh0bWwge1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgLW1zLXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbn1cblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbn1cblxuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5oZ3JvdXAsXG5tYWluLFxubWVudSxcbm5hdixcbnNlY3Rpb24sXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbmF1ZGlvLFxuY2FudmFzLFxucHJvZ3Jlc3MsXG52aWRlbyB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5hdWRpbzpub3QoW2NvbnRyb2xzXSkge1xuICBkaXNwbGF5OiBub25lO1xuICBoZWlnaHQ6IDA7XG59XG5cbltoaWRkZW5dLFxudGVtcGxhdGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG5hIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbmE6YWN0aXZlLFxuYTpob3ZlciB7XG4gIG91dGxpbmU6IDA7XG59XG5cbmFiYnJbdGl0bGVdIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZDtcbn1cblxuYixcbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5kZm4ge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG5cbm1hcmsge1xuICBiYWNrZ3JvdW5kOiAjZmYwO1xuICBjb2xvcjogIzAwMDtcbn1cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuc3ViLFxuc3VwIHtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGxpbmUtaGVpZ2h0OiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG5cbnN1YiB7XG4gIGJvdHRvbTogLTAuMjVlbTtcbn1cblxuaW1nIHtcbiAgYm9yZGVyOiAwO1xufVxuXG5zdmc6bm90KDpyb290KSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbmZpZ3VyZSB7XG4gIG1hcmdpbjogMWVtIDQwcHg7XG59XG5cbmhyIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIGhlaWdodDogMDtcbn1cblxucHJlIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbmNvZGUsXG5rYmQsXG5wcmUsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDFlbTtcbn1cblxuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIG1hcmdpbjogMDtcbn1cblxuYnV0dG9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG5idXR0b24sXG5odG1sIGlucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJyZXNldFwiXSxcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5idXR0b25bZGlzYWJsZWRdLFxuaHRtbCBpbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0OjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5pbnB1dCB7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDA7XG59XG5cbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuZmllbGRzZXQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICBtYXJnaW46IDAgMnB4O1xuICBwYWRkaW5nOiAwLjM1ZW0gMC42MjVlbSAwLjc1ZW07XG59XG5cbmxlZ2VuZCB7XG4gIGJvcmRlcjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxub3B0Z3JvdXAge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxudGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICBib3JkZXItc3BhY2luZzogMDtcbn1cblxudGQsXG50aCB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qISBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2Jsb2IvbWFzdGVyL3NyYy9jc3MvbWFpbi5jc3MgKi9cbkBtZWRpYSBwcmludCB7XG4gICosXG4gICo6YmVmb3JlLFxuICAqOmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIHRleHQtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgYSxcbiAgYTp2aXNpdGVkIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgfVxuICBhW2hyZWZdOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIiAoXCIgYXR0cihocmVmKSBcIilcIjtcbiAgfVxuICBhYmJyW3RpdGxlXTphZnRlciB7XG4gICAgY29udGVudDogXCIgKFwiIGF0dHIodGl0bGUpIFwiKVwiO1xuICB9XG4gIGFbaHJlZl49XCIjXCJdOmFmdGVyLFxuICBhW2hyZWZePVwiamF2YXNjcmlwdDpcIl06YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gIH1cbiAgcHJlLFxuICBibG9ja3F1b3RlIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xuICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgfVxuICB0aGVhZCB7XG4gICAgZGlzcGxheTogdGFibGUtaGVhZGVyLWdyb3VwO1xuICB9XG4gIHRyLFxuICBpbWcge1xuICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgfVxuICBpbWcge1xuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICB9XG4gIHAsXG4gIGgyLFxuICBoMyB7XG4gICAgb3JwaGFuczogMztcbiAgICB3aWRvd3M6IDM7XG4gIH1cbiAgaDIsXG4gIGgzIHtcbiAgICBwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDtcbiAgfVxuICAubmF2YmFyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gIC5idG4gPiAuY2FyZXQsXG4gIC5kcm9wdXAgPiAuYnRuID4gLmNhcmV0IHtcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7XG4gIH1cbiAgLmxhYmVsIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xuICB9XG4gIC50YWJsZSB7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50O1xuICB9XG4gIC50YWJsZSB0ZCxcbiAgLnRhYmxlIHRoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7XG4gIH1cbiAgLnRhYmxlLWJvcmRlcmVkIHRoLFxuICAudGFibGUtYm9yZGVyZWQgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQgIWltcG9ydGFudDtcbiAgfVxufVxuXG4qIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbio6YmVmb3JlLFxuKjphZnRlciB7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG5odG1sIHtcbiAgZm9udC1zaXplOiAxMHB4O1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG5ib2R5IHtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhTmV1ZU1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWUtTWVkaXVtXCIsIFwiSGVsdmV0aWNhIE5ldWUgTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICMyMjI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbmlucHV0LFxuYnV0dG9uLFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbn1cblxuYSB7XG4gIGNvbG9yOiAjM2EzOTNiO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbmE6aG92ZXIsXG5hOmZvY3VzIHtcbiAgY29sb3I6ICMxNDEzMTQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG5hOmZvY3VzIHtcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIG91dGxpbmU6IDVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG59XG5cbmZpZ3VyZSB7XG4gIG1hcmdpbjogMDtcbn1cblxuaW1nIHtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmltZy1yZXNwb25zaXZlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4uaW1nLXJvdW5kZWQge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5pbWctdGh1bWJuYWlsIHtcbiAgcGFkZGluZzogNHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbiAgLW8tdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4uaW1nLWNpcmNsZSB7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cblxuaHIge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZmZmO1xufVxuXG4uc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbiAgYm9yZGVyOiAwO1xufVxuXG4uc3Itb25seS1mb2N1c2FibGU6YWN0aXZlLFxuLnNyLW9ubHktZm9jdXNhYmxlOmZvY3VzIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbiAgd2lkdGg6IGF1dG87XG4gIGhlaWdodDogYXV0bztcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgY2xpcDogYXV0bztcbn1cblxuW3JvbGU9XCJidXR0b25cIl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsXG4uaDEsIC5oMiwgLmgzLCAuaDQsIC5oNSwgLmg2IHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjE7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG5oMSBzbWFsbCxcbmgxIC5zbWFsbCwgaDIgc21hbGwsXG5oMiAuc21hbGwsIGgzIHNtYWxsLFxuaDMgLnNtYWxsLCBoNCBzbWFsbCxcbmg0IC5zbWFsbCwgaDUgc21hbGwsXG5oNSAuc21hbGwsIGg2IHNtYWxsLFxuaDYgLnNtYWxsLFxuLmgxIHNtYWxsLFxuLmgxIC5zbWFsbCwgLmgyIHNtYWxsLFxuLmgyIC5zbWFsbCwgLmgzIHNtYWxsLFxuLmgzIC5zbWFsbCwgLmg0IHNtYWxsLFxuLmg0IC5zbWFsbCwgLmg1IHNtYWxsLFxuLmg1IC5zbWFsbCwgLmg2IHNtYWxsLFxuLmg2IC5zbWFsbCB7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogIzk5OTtcbn1cblxuaDEsIC5oMSxcbmgyLCAuaDIsXG5oMywgLmgzIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuaDEgc21hbGwsXG5oMSAuc21hbGwsIC5oMSBzbWFsbCxcbi5oMSAuc21hbGwsXG5oMiBzbWFsbCxcbmgyIC5zbWFsbCwgLmgyIHNtYWxsLFxuLmgyIC5zbWFsbCxcbmgzIHNtYWxsLFxuaDMgLnNtYWxsLCAuaDMgc21hbGwsXG4uaDMgLnNtYWxsIHtcbiAgZm9udC1zaXplOiA2NSU7XG59XG5cbmg0LCAuaDQsXG5oNSwgLmg1LFxuaDYsIC5oNiB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbmg0IHNtYWxsLFxuaDQgLnNtYWxsLCAuaDQgc21hbGwsXG4uaDQgLnNtYWxsLFxuaDUgc21hbGwsXG5oNSAuc21hbGwsIC5oNSBzbWFsbCxcbi5oNSAuc21hbGwsXG5oNiBzbWFsbCxcbmg2IC5zbWFsbCwgLmg2IHNtYWxsLFxuLmg2IC5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xufVxuXG5oMSwgLmgxIHtcbiAgZm9udC1zaXplOiAxLjU3MWVtO1xufVxuXG5oMiwgLmgyIHtcbiAgZm9udC1zaXplOiAyMnB4O1xufVxuXG5oMywgLmgzIHtcbiAgZm9udC1zaXplOiAxN3B4O1xufVxuXG5oNCwgLmg0IHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG5oNSwgLmg1IHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG5oNiwgLmg2IHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG5wIHtcbiAgbWFyZ2luOiAwIDAgMTBweDtcbn1cblxuLmxlYWQge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjQ7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubGVhZCB7XG4gICAgZm9udC1zaXplOiAyMXB4O1xuICB9XG59XG5cbnNtYWxsLFxuLnNtYWxsIHtcbiAgZm9udC1zaXplOiA4NSU7XG59XG5cbm1hcmssXG4ubWFyayB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMWUzYzI7XG4gIHBhZGRpbmc6IC4yZW07XG59XG5cbi50ZXh0LWxlZnQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4udGV4dC1yaWdodCB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4udGV4dC1jZW50ZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi50ZXh0LWp1c3RpZnkge1xuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xufVxuXG4udGV4dC1ub3dyYXAge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udGV4dC1sb3dlcmNhc2Uge1xuICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlO1xufVxuXG4udGV4dC11cHBlcmNhc2UsIC5pbml0aWFsaXNtIHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cblxuLnRleHQtY2FwaXRhbGl6ZSB7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xufVxuXG4udGV4dC1tdXRlZCB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4udGV4dC1wcmltYXJ5IHtcbiAgY29sb3I6ICMzYTM5M2I7XG59XG5cbmEudGV4dC1wcmltYXJ5OmhvdmVyLFxuYS50ZXh0LXByaW1hcnk6Zm9jdXMge1xuICBjb2xvcjogIzIxMjAyMTtcbn1cblxuLnRleHQtc3VjY2VzcyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG5hLnRleHQtc3VjY2Vzczpob3ZlcixcbmEudGV4dC1zdWNjZXNzOmZvY3VzIHtcbiAgY29sb3I6ICM1MjUyNTI7XG59XG5cbi50ZXh0LWluZm8ge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuYS50ZXh0LWluZm86aG92ZXIsXG5hLnRleHQtaW5mbzpmb2N1cyB7XG4gIGNvbG9yOiAjNTI1MjUyO1xufVxuXG4udGV4dC13YXJuaW5nIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbmEudGV4dC13YXJuaW5nOmhvdmVyLFxuYS50ZXh0LXdhcm5pbmc6Zm9jdXMge1xuICBjb2xvcjogIzUyNTI1Mjtcbn1cblxuLnRleHQtZGFuZ2VyIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbmEudGV4dC1kYW5nZXI6aG92ZXIsXG5hLnRleHQtZGFuZ2VyOmZvY3VzIHtcbiAgY29sb3I6ICM1MjUyNTI7XG59XG5cbi5iZy1wcmltYXJ5IHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5iZy1wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuYS5iZy1wcmltYXJ5OmhvdmVyLFxuYS5iZy1wcmltYXJ5OmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxMjAyMTtcbn1cblxuLmJnLXN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFlNmNiO1xufVxuXG5hLmJnLXN1Y2Nlc3M6aG92ZXIsXG5hLmJnLXN1Y2Nlc3M6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzFkNWE5O1xufVxuXG4uYmctaW5mbyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XG59XG5cbmEuYmctaW5mbzpob3ZlcixcbmEuYmctaW5mbzpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNhZmQ5ZWU7XG59XG5cbi5iZy13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZTNjMjtcbn1cblxuYS5iZy13YXJuaW5nOmhvdmVyLFxuYS5iZy13YXJuaW5nOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZDA5OTtcbn1cblxuLmJnLWRhbmdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYWMzYzc7XG59XG5cbmEuYmctZGFuZ2VyOmhvdmVyLFxuYS5iZy1kYW5nZXI6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGQ5ZGE0O1xufVxuXG4ucGFnZS1oZWFkZXIge1xuICBwYWRkaW5nLWJvdHRvbTogOXB4O1xuICBtYXJnaW46IDQwcHggMCAyMHB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZjtcbn1cblxudWwsXG5vbCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbnVsIHVsLFxudWwgb2wsXG5vbCB1bCxcbm9sIG9sIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmxpc3QtdW5zdHlsZWQge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5saXN0LWlubGluZSB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgbWFyZ2luLWxlZnQ6IC01cHg7XG59XG5cbi5saXN0LWlubGluZSA+IGxpIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgcGFkZGluZy1yaWdodDogNXB4O1xufVxuXG5kbCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbmR0LFxuZGQge1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG59XG5cbmR0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbmRkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5kbC1ob3Jpem9udGFsIGRkOmJlZm9yZSxcbi5kbC1ob3Jpem9udGFsIGRkOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4uZGwtaG9yaXpvbnRhbCBkZDphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmRsLWhvcml6b250YWwgZHQge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIHdpZHRoOiAxNjBweDtcbiAgICBjbGVhcjogbGVmdDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbiAgLmRsLWhvcml6b250YWwgZGQge1xuICAgIG1hcmdpbi1sZWZ0OiAxODBweDtcbiAgfVxufVxuXG5hYmJyW3RpdGxlXSxcbmFiYnJbZGF0YS1vcmlnaW5hbC10aXRsZV0ge1xuICBjdXJzb3I6IGhlbHA7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgIzk5OTtcbn1cblxuLmluaXRpYWxpc20ge1xuICBmb250LXNpemU6IDkwJTtcbn1cblxuYmxvY2txdW90ZSB7XG4gIHBhZGRpbmc6IDEwcHggMjBweDtcbiAgbWFyZ2luOiAwIDAgMjBweDtcbiAgZm9udC1zaXplOiAxNy41cHg7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2ZmZjtcbn1cblxuYmxvY2txdW90ZSBwOmxhc3QtY2hpbGQsXG5ibG9ja3F1b3RlIHVsOmxhc3QtY2hpbGQsXG5ibG9ja3F1b3RlIG9sOmxhc3QtY2hpbGQge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG5ibG9ja3F1b3RlIGZvb3RlcixcbmJsb2NrcXVvdGUgc21hbGwsXG5ibG9ja3F1b3RlIC5zbWFsbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LXNpemU6IDgwJTtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBjb2xvcjogIzk5OTtcbn1cblxuYmxvY2txdW90ZSBmb290ZXI6YmVmb3JlLFxuYmxvY2txdW90ZSBzbWFsbDpiZWZvcmUsXG5ibG9ja3F1b3RlIC5zbWFsbDpiZWZvcmUge1xuICBjb250ZW50OiAnXFwyMDE0IFxcMDBBMCc7XG59XG5cbi5ibG9ja3F1b3RlLXJldmVyc2UsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQge1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGJvcmRlci1yaWdodDogNXB4IHNvbGlkICNmZmY7XG4gIGJvcmRlci1sZWZ0OiAwO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmJsb2NrcXVvdGUtcmV2ZXJzZSBmb290ZXI6YmVmb3JlLFxuLmJsb2NrcXVvdGUtcmV2ZXJzZSBzbWFsbDpiZWZvcmUsXG4uYmxvY2txdW90ZS1yZXZlcnNlIC5zbWFsbDpiZWZvcmUsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgZm9vdGVyOmJlZm9yZSxcbmJsb2NrcXVvdGUucHVsbC1yaWdodCBzbWFsbDpiZWZvcmUsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgLnNtYWxsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICcnO1xufVxuXG4uYmxvY2txdW90ZS1yZXZlcnNlIGZvb3RlcjphZnRlcixcbi5ibG9ja3F1b3RlLXJldmVyc2Ugc21hbGw6YWZ0ZXIsXG4uYmxvY2txdW90ZS1yZXZlcnNlIC5zbWFsbDphZnRlcixcbmJsb2NrcXVvdGUucHVsbC1yaWdodCBmb290ZXI6YWZ0ZXIsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgc21hbGw6YWZ0ZXIsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQgLnNtYWxsOmFmdGVyIHtcbiAgY29udGVudDogJ1xcMDBBMCBcXDIwMTQnO1xufVxuXG5hZGRyZXNzIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG59XG5cbmNvZGUsXG5rYmQsXG5wcmUsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTtcbn1cblxuY29kZSB7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBjb2xvcjogI2M3MjU0ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjJmNDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG5rYmQge1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBmb250LXNpemU6IDkwJTtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTtcbn1cblxua2JkIGtiZCB7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbnByZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiA5LjVweDtcbiAgbWFyZ2luOiAwIDAgMTBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBjb2xvcjogIzIyMjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG5wcmUgY29kZSB7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5wcmUtc2Nyb2xsYWJsZSB7XG4gIG1heC1oZWlnaHQ6IDM0MHB4O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG5cbi5jb250YWluZXIge1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIHBhZGRpbmctcmlnaHQ6IDA7XG59XG5cbi5jb250YWluZXI6YmVmb3JlLFxuLmNvbnRhaW5lcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmNvbnRhaW5lcjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDk0MHB4O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcbiAgLmNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDExNDBweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTU0MHB4O1xuICB9XG59XG5cbi5jb250YWluZXItZmx1aWQge1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIHBhZGRpbmctcmlnaHQ6IDA7XG59XG5cbi5jb250YWluZXItZmx1aWQ6YmVmb3JlLFxuLmNvbnRhaW5lci1mbHVpZDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmNvbnRhaW5lci1mbHVpZDphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4ucm93IHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIG1hcmdpbi1yaWdodDogMDtcbn1cblxuLnJvdzpiZWZvcmUsXG4ucm93OmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4ucm93OmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5jb2wteHMtMSwgLmNvbC1zbS0xLCAuY29sLW1kLTEsIC5jb2wtbGctMSwgLmNvbC14cy0yLCAuY29sLXNtLTIsIC5jb2wtbWQtMiwgLmNvbC1sZy0yLCAuY29sLXhzLTMsIC5jb2wtc20tMywgLmNvbC1tZC0zLCAuY29sLWxnLTMsIC5jb2wteHMtNCwgLmNvbC1zbS00LCAuY29sLW1kLTQsIC5jb2wtbGctNCwgLmNvbC14cy01LCAuY29sLXNtLTUsIC5jb2wtbWQtNSwgLmNvbC1sZy01LCAuY29sLXhzLTYsIC5jb2wtc20tNiwgLmNvbC1tZC02LCAuY29sLWxnLTYsIC5jb2wteHMtNywgLmNvbC1zbS03LCAuY29sLW1kLTcsIC5jb2wtbGctNywgLmNvbC14cy04LCAuY29sLXNtLTgsIC5jb2wtbWQtOCwgLmNvbC1sZy04LCAuY29sLXhzLTksIC5jb2wtc20tOSwgLmNvbC1tZC05LCAuY29sLWxnLTksIC5jb2wteHMtMTAsIC5jb2wtc20tMTAsIC5jb2wtbWQtMTAsIC5jb2wtbGctMTAsIC5jb2wteHMtMTEsIC5jb2wtc20tMTEsIC5jb2wtbWQtMTEsIC5jb2wtbGctMTEsIC5jb2wteHMtMTIsIC5jb2wtc20tMTIsIC5jb2wtbWQtMTIsIC5jb2wtbGctMTIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBwYWRkaW5nLXJpZ2h0OiAwO1xufVxuXG4uY29sLXhzLTEsIC5jb2wteHMtMiwgLmNvbC14cy0zLCAuY29sLXhzLTQsIC5jb2wteHMtNSwgLmNvbC14cy02LCAuY29sLXhzLTcsIC5jb2wteHMtOCwgLmNvbC14cy05LCAuY29sLXhzLTEwLCAuY29sLXhzLTExLCAuY29sLXhzLTEyIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi5jb2wteHMtMSB7XG4gIHdpZHRoOiA4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLTIge1xuICB3aWR0aDogMTYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtMyB7XG4gIHdpZHRoOiAyNSU7XG59XG5cbi5jb2wteHMtNCB7XG4gIHdpZHRoOiAzMy4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy01IHtcbiAgd2lkdGg6IDQxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLTYge1xuICB3aWR0aDogNTAlO1xufVxuXG4uY29sLXhzLTcge1xuICB3aWR0aDogNTguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtOCB7XG4gIHdpZHRoOiA2Ni42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy05IHtcbiAgd2lkdGg6IDc1JTtcbn1cblxuLmNvbC14cy0xMCB7XG4gIHdpZHRoOiA4My4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy0xMSB7XG4gIHdpZHRoOiA5MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy0xMiB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uY29sLXhzLXB1bGwtMCB7XG4gIHJpZ2h0OiBhdXRvO1xufVxuXG4uY29sLXhzLXB1bGwtMSB7XG4gIHJpZ2h0OiA4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1bGwtMiB7XG4gIHJpZ2h0OiAxNi42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdWxsLTMge1xuICByaWdodDogMjUlO1xufVxuXG4uY29sLXhzLXB1bGwtNCB7XG4gIHJpZ2h0OiAzMy4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdWxsLTUge1xuICByaWdodDogNDEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVsbC02IHtcbiAgcmlnaHQ6IDUwJTtcbn1cblxuLmNvbC14cy1wdWxsLTcge1xuICByaWdodDogNTguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVsbC04IHtcbiAgcmlnaHQ6IDY2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1bGwtOSB7XG4gIHJpZ2h0OiA3NSU7XG59XG5cbi5jb2wteHMtcHVsbC0xMCB7XG4gIHJpZ2h0OiA4My4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdWxsLTExIHtcbiAgcmlnaHQ6IDkxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1bGwtMTIge1xuICByaWdodDogMTAwJTtcbn1cblxuLmNvbC14cy1wdXNoLTAge1xuICBsZWZ0OiBhdXRvO1xufVxuXG4uY29sLXhzLXB1c2gtMSB7XG4gIGxlZnQ6IDguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtcHVzaC0yIHtcbiAgbGVmdDogMTYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtcHVzaC0zIHtcbiAgbGVmdDogMjUlO1xufVxuXG4uY29sLXhzLXB1c2gtNCB7XG4gIGxlZnQ6IDMzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1c2gtNSB7XG4gIGxlZnQ6IDQxLjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLXB1c2gtNiB7XG4gIGxlZnQ6IDUwJTtcbn1cblxuLmNvbC14cy1wdXNoLTcge1xuICBsZWZ0OiA1OC4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1wdXNoLTgge1xuICBsZWZ0OiA2Ni42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdXNoLTkge1xuICBsZWZ0OiA3NSU7XG59XG5cbi5jb2wteHMtcHVzaC0xMCB7XG4gIGxlZnQ6IDgzLjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLXB1c2gtMTEge1xuICBsZWZ0OiA5MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1wdXNoLTEyIHtcbiAgbGVmdDogMTAwJTtcbn1cblxuLmNvbC14cy1vZmZzZXQtMCB7XG4gIG1hcmdpbi1sZWZ0OiAwJTtcbn1cblxuLmNvbC14cy1vZmZzZXQtMSB7XG4gIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlO1xufVxuXG4uY29sLXhzLW9mZnNldC0yIHtcbiAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclO1xufVxuXG4uY29sLXhzLW9mZnNldC0zIHtcbiAgbWFyZ2luLWxlZnQ6IDI1JTtcbn1cblxuLmNvbC14cy1vZmZzZXQtNCB7XG4gIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1vZmZzZXQtNSB7XG4gIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTtcbn1cblxuLmNvbC14cy1vZmZzZXQtNiB7XG4gIG1hcmdpbi1sZWZ0OiA1MCU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTcge1xuICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTgge1xuICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTkge1xuICBtYXJnaW4tbGVmdDogNzUlO1xufVxuXG4uY29sLXhzLW9mZnNldC0xMCB7XG4gIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTtcbn1cblxuLmNvbC14cy1vZmZzZXQtMTEge1xuICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7XG59XG5cbi5jb2wteHMtb2Zmc2V0LTEyIHtcbiAgbWFyZ2luLWxlZnQ6IDEwMCU7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY29sLXNtLTEsIC5jb2wtc20tMiwgLmNvbC1zbS0zLCAuY29sLXNtLTQsIC5jb2wtc20tNSwgLmNvbC1zbS02LCAuY29sLXNtLTcsIC5jb2wtc20tOCwgLmNvbC1zbS05LCAuY29sLXNtLTEwLCAuY29sLXNtLTExLCAuY29sLXNtLTEyIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxuICAuY29sLXNtLTEge1xuICAgIHdpZHRoOiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tMiB7XG4gICAgd2lkdGg6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tMyB7XG4gICAgd2lkdGg6IDI1JTtcbiAgfVxuICAuY29sLXNtLTQge1xuICAgIHdpZHRoOiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLTUge1xuICAgIHdpZHRoOiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLTYge1xuICAgIHdpZHRoOiA1MCU7XG4gIH1cbiAgLmNvbC1zbS03IHtcbiAgICB3aWR0aDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS04IHtcbiAgICB3aWR0aDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS05IHtcbiAgICB3aWR0aDogNzUlO1xuICB9XG4gIC5jb2wtc20tMTAge1xuICAgIHdpZHRoOiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLTExIHtcbiAgICB3aWR0aDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS0xMiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTAge1xuICAgIHJpZ2h0OiBhdXRvO1xuICB9XG4gIC5jb2wtc20tcHVsbC0xIHtcbiAgICByaWdodDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1bGwtMiB7XG4gICAgcmlnaHQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVsbC0zIHtcbiAgICByaWdodDogMjUlO1xuICB9XG4gIC5jb2wtc20tcHVsbC00IHtcbiAgICByaWdodDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTUge1xuICAgIHJpZ2h0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1bGwtNiB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgfVxuICAuY29sLXNtLXB1bGwtNyB7XG4gICAgcmlnaHQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVsbC04IHtcbiAgICByaWdodDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTkge1xuICAgIHJpZ2h0OiA3NSU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTEwIHtcbiAgICByaWdodDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTExIHtcbiAgICByaWdodDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdWxsLTEyIHtcbiAgICByaWdodDogMTAwJTtcbiAgfVxuICAuY29sLXNtLXB1c2gtMCB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxuICAuY29sLXNtLXB1c2gtMSB7XG4gICAgbGVmdDogOC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLXB1c2gtMiB7XG4gICAgbGVmdDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTMge1xuICAgIGxlZnQ6IDI1JTtcbiAgfVxuICAuY29sLXNtLXB1c2gtNCB7XG4gICAgbGVmdDogMzMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTUge1xuICAgIGxlZnQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tcHVzaC02IHtcbiAgICBsZWZ0OiA1MCU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTcge1xuICAgIGxlZnQ6IDU4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tcHVzaC04IHtcbiAgICBsZWZ0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1c2gtOSB7XG4gICAgbGVmdDogNzUlO1xuICB9XG4gIC5jb2wtc20tcHVzaC0xMCB7XG4gICAgbGVmdDogODMuMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1wdXNoLTExIHtcbiAgICBsZWZ0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLXB1c2gtMTIge1xuICAgIGxlZnQ6IDEwMCU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDAlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTEge1xuICAgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC0zIHtcbiAgICBtYXJnaW4tbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTQge1xuICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC01IHtcbiAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtNiB7XG4gICAgbWFyZ2luLWxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC03IHtcbiAgICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtOCB7XG4gICAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTkge1xuICAgIG1hcmdpbi1sZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1zbS1vZmZzZXQtMTAge1xuICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLXNtLW9mZnNldC0xMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtc20tb2Zmc2V0LTEyIHtcbiAgICBtYXJnaW4tbGVmdDogMTAwJTtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XG4gIC5jb2wtbWQtMSwgLmNvbC1tZC0yLCAuY29sLW1kLTMsIC5jb2wtbWQtNCwgLmNvbC1tZC01LCAuY29sLW1kLTYsIC5jb2wtbWQtNywgLmNvbC1tZC04LCAuY29sLW1kLTksIC5jb2wtbWQtMTAsIC5jb2wtbWQtMTEsIC5jb2wtbWQtMTIge1xuICAgIGZsb2F0OiBsZWZ0O1xuICB9XG4gIC5jb2wtbWQtMSB7XG4gICAgd2lkdGg6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC0yIHtcbiAgICB3aWR0aDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC0zIHtcbiAgICB3aWR0aDogMjUlO1xuICB9XG4gIC5jb2wtbWQtNCB7XG4gICAgd2lkdGg6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtNSB7XG4gICAgd2lkdGg6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtNiB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxuICAuY29sLW1kLTcge1xuICAgIHdpZHRoOiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLTgge1xuICAgIHdpZHRoOiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLTkge1xuICAgIHdpZHRoOiA3NSU7XG4gIH1cbiAgLmNvbC1tZC0xMCB7XG4gICAgd2lkdGg6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtMTEge1xuICAgIHdpZHRoOiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLTEyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICAuY29sLW1kLXB1bGwtMCB7XG4gICAgcmlnaHQ6IGF1dG87XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTEge1xuICAgIHJpZ2h0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtcHVsbC0yIHtcbiAgICByaWdodDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTMge1xuICAgIHJpZ2h0OiAyNSU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTQge1xuICAgIHJpZ2h0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1bGwtNSB7XG4gICAgcmlnaHQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtcHVsbC02IHtcbiAgICByaWdodDogNTAlO1xuICB9XG4gIC5jb2wtbWQtcHVsbC03IHtcbiAgICByaWdodDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdWxsLTgge1xuICAgIHJpZ2h0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1bGwtOSB7XG4gICAgcmlnaHQ6IDc1JTtcbiAgfVxuICAuY29sLW1kLXB1bGwtMTAge1xuICAgIHJpZ2h0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1bGwtMTEge1xuICAgIHJpZ2h0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1bGwtMTIge1xuICAgIHJpZ2h0OiAxMDAlO1xuICB9XG4gIC5jb2wtbWQtcHVzaC0wIHtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG4gIC5jb2wtbWQtcHVzaC0xIHtcbiAgICBsZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtcHVzaC0yIHtcbiAgICBsZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMyB7XG4gICAgbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtbWQtcHVzaC00IHtcbiAgICBsZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1c2gtNSB7XG4gICAgbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTYge1xuICAgIGxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLW1kLXB1c2gtNyB7XG4gICAgbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTgge1xuICAgIGxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtcHVzaC05IHtcbiAgICBsZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1tZC1wdXNoLTEwIHtcbiAgICBsZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLXB1c2gtMTEge1xuICAgIGxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtcHVzaC0xMiB7XG4gICAgbGVmdDogMTAwJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC0wIHtcbiAgICBtYXJnaW4tbGVmdDogMCU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtMiB7XG4gICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTMge1xuICAgIG1hcmdpbi1sZWZ0OiAyNSU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtNCB7XG4gICAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTUge1xuICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC02IHtcbiAgICBtYXJnaW4tbGVmdDogNTAlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTcge1xuICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC04IHtcbiAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtOSB7XG4gICAgbWFyZ2luLWxlZnQ6IDc1JTtcbiAgfVxuICAuY29sLW1kLW9mZnNldC0xMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbWQtb2Zmc2V0LTExIHtcbiAgICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1tZC1vZmZzZXQtMTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxMDAlO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxNjgwKSB7XG4gIC5jb2wtbGctMSwgLmNvbC1sZy0yLCAuY29sLWxnLTMsIC5jb2wtbGctNCwgLmNvbC1sZy01LCAuY29sLWxnLTYsIC5jb2wtbGctNywgLmNvbC1sZy04LCAuY29sLWxnLTksIC5jb2wtbGctMTAsIC5jb2wtbGctMTEsIC5jb2wtbGctMTIge1xuICAgIGZsb2F0OiBsZWZ0O1xuICB9XG4gIC5jb2wtbGctMSB7XG4gICAgd2lkdGg6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy0yIHtcbiAgICB3aWR0aDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy0zIHtcbiAgICB3aWR0aDogMjUlO1xuICB9XG4gIC5jb2wtbGctNCB7XG4gICAgd2lkdGg6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctNSB7XG4gICAgd2lkdGg6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctNiB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxuICAuY29sLWxnLTcge1xuICAgIHdpZHRoOiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLTgge1xuICAgIHdpZHRoOiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLTkge1xuICAgIHdpZHRoOiA3NSU7XG4gIH1cbiAgLmNvbC1sZy0xMCB7XG4gICAgd2lkdGg6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctMTEge1xuICAgIHdpZHRoOiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLTEyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMCB7XG4gICAgcmlnaHQ6IGF1dG87XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTEge1xuICAgIHJpZ2h0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctcHVsbC0yIHtcbiAgICByaWdodDogMTYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTMge1xuICAgIHJpZ2h0OiAyNSU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTQge1xuICAgIHJpZ2h0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtNSB7XG4gICAgcmlnaHQ6IDQxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVsbC02IHtcbiAgICByaWdodDogNTAlO1xuICB9XG4gIC5jb2wtbGctcHVsbC03IHtcbiAgICByaWdodDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdWxsLTgge1xuICAgIHJpZ2h0OiA2Ni42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1bGwtOSB7XG4gICAgcmlnaHQ6IDc1JTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMTAge1xuICAgIHJpZ2h0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMTEge1xuICAgIHJpZ2h0OiA5MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1bGwtMTIge1xuICAgIHJpZ2h0OiAxMDAlO1xuICB9XG4gIC5jb2wtbGctcHVzaC0wIHtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG4gIC5jb2wtbGctcHVzaC0xIHtcbiAgICBsZWZ0OiA4LjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctcHVzaC0yIHtcbiAgICBsZWZ0OiAxNi42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLXB1c2gtMyB7XG4gICAgbGVmdDogMjUlO1xuICB9XG4gIC5jb2wtbGctcHVzaC00IHtcbiAgICBsZWZ0OiAzMy4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtNSB7XG4gICAgbGVmdDogNDEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTYge1xuICAgIGxlZnQ6IDUwJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtNyB7XG4gICAgbGVmdDogNTguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTgge1xuICAgIGxlZnQ6IDY2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVzaC05IHtcbiAgICBsZWZ0OiA3NSU7XG4gIH1cbiAgLmNvbC1sZy1wdXNoLTEwIHtcbiAgICBsZWZ0OiA4My4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLXB1c2gtMTEge1xuICAgIGxlZnQ6IDkxLjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctcHVzaC0xMiB7XG4gICAgbGVmdDogMTAwJTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC0wIHtcbiAgICBtYXJnaW4tbGVmdDogMCU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMiB7XG4gICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTMge1xuICAgIG1hcmdpbi1sZWZ0OiAyNSU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtNCB7XG4gICAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTUge1xuICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC02IHtcbiAgICBtYXJnaW4tbGVmdDogNTAlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTcge1xuICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC04IHtcbiAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtOSB7XG4gICAgbWFyZ2luLWxlZnQ6IDc1JTtcbiAgfVxuICAuY29sLWxnLW9mZnNldC0xMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlO1xuICB9XG4gIC5jb2wtbGctb2Zmc2V0LTExIHtcbiAgICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7XG4gIH1cbiAgLmNvbC1sZy1vZmZzZXQtMTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxMDAlO1xuICB9XG59XG5cbnRhYmxlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbmNhcHRpb24ge1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxudGgge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4udGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGgsXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGgsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGQsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGgsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGQge1xuICBwYWRkaW5nOiA4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0aCB7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZGRkO1xufVxuXG4udGFibGUgPiBjYXB0aW9uICsgdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnRhYmxlID4gY2FwdGlvbiArIHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0ZCxcbi50YWJsZSA+IGNvbGdyb3VwICsgdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnRhYmxlID4gY29sZ3JvdXAgKyB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkID4gdGQsXG4udGFibGUgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkID4gdGgsXG4udGFibGUgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkID4gdGQge1xuICBib3JkZXItdG9wOiAwO1xufVxuXG4udGFibGUgPiB0Ym9keSArIHRib2R5IHtcbiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZSAudGFibGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4udGFibGUtY29uZGVuc2VkID4gdGhlYWQgPiB0ciA+IHRoLFxuLnRhYmxlLWNvbmRlbnNlZCA+IHRoZWFkID4gdHIgPiB0ZCxcbi50YWJsZS1jb25kZW5zZWQgPiB0Ym9keSA+IHRyID4gdGgsXG4udGFibGUtY29uZGVuc2VkID4gdGJvZHkgPiB0ciA+IHRkLFxuLnRhYmxlLWNvbmRlbnNlZCA+IHRmb290ID4gdHIgPiB0aCxcbi50YWJsZS1jb25kZW5zZWQgPiB0Zm9vdCA+IHRyID4gdGQge1xuICBwYWRkaW5nOiA1cHg7XG59XG5cbi50YWJsZS1ib3JkZXJlZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZCxcbi50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0ZCxcbi50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aCxcbi50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0ZCB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDJweDtcbn1cblxuLnRhYmxlLXN0cmlwZWQgPiB0Ym9keSA+IHRyOm50aC1vZi10eXBlKG9kZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cblxudGFibGUgY29sW2NsYXNzKj1cImNvbC1cIl0ge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICBmbG9hdDogbm9uZTtcbiAgZGlzcGxheTogdGFibGUtY29sdW1uO1xufVxuXG50YWJsZSB0ZFtjbGFzcyo9XCJjb2wtXCJdLFxudGFibGUgdGhbY2xhc3MqPVwiY29sLVwiXSB7XG4gIHBvc2l0aW9uOiBzdGF0aWM7XG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQuYWN0aXZlLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLmFjdGl2ZSxcbi50YWJsZSA+IHRoZWFkID4gdHIuYWN0aXZlID4gdGQsXG4udGFibGUgPiB0aGVhZCA+IHRyLmFjdGl2ZSA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLmFjdGl2ZSxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0aC5hY3RpdmUsXG4udGFibGUgPiB0Ym9keSA+IHRyLmFjdGl2ZSA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5hY3RpdmUgPiB0aCxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0ZC5hY3RpdmUsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGguYWN0aXZlLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5hY3RpdmUgPiB0ZCxcbi50YWJsZSA+IHRmb290ID4gdHIuYWN0aXZlID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGQuYWN0aXZlOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRoLmFjdGl2ZTpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuYWN0aXZlOmhvdmVyID4gdGQsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyID4gLmFjdGl2ZSxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuYWN0aXZlOmhvdmVyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlOGU4O1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQuc3VjY2Vzcyxcbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0aC5zdWNjZXNzLFxuLnRhYmxlID4gdGhlYWQgPiB0ci5zdWNjZXNzID4gdGQsXG4udGFibGUgPiB0aGVhZCA+IHRyLnN1Y2Nlc3MgPiB0aCxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0ZC5zdWNjZXNzLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRoLnN1Y2Nlc3MsXG4udGFibGUgPiB0Ym9keSA+IHRyLnN1Y2Nlc3MgPiB0ZCxcbi50YWJsZSA+IHRib2R5ID4gdHIuc3VjY2VzcyA+IHRoLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRkLnN1Y2Nlc3MsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGguc3VjY2Vzcyxcbi50YWJsZSA+IHRmb290ID4gdHIuc3VjY2VzcyA+IHRkLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5zdWNjZXNzID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFlNmNiO1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGQuc3VjY2Vzczpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0aC5zdWNjZXNzOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ci5zdWNjZXNzOmhvdmVyID4gdGQsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyID4gLnN1Y2Nlc3MsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLnN1Y2Nlc3M6aG92ZXIgPiB0aCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjZWRlYmE7XG59XG5cbi50YWJsZSA+IHRoZWFkID4gdHIgPiB0ZC5pbmZvLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLmluZm8sXG4udGFibGUgPiB0aGVhZCA+IHRyLmluZm8gPiB0ZCxcbi50YWJsZSA+IHRoZWFkID4gdHIuaW5mbyA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLmluZm8sXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGguaW5mbyxcbi50YWJsZSA+IHRib2R5ID4gdHIuaW5mbyA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5pbmZvID4gdGgsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGQuaW5mbyxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0aC5pbmZvLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5pbmZvID4gdGQsXG4udGFibGUgPiB0Zm9vdCA+IHRyLmluZm8gPiB0aCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XG59XG5cbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIgPiB0ZC5pbmZvOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRoLmluZm86aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyLmluZm86aG92ZXIgPiB0ZCxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHI6aG92ZXIgPiAuaW5mbyxcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuaW5mbzpob3ZlciA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0ZTNmMztcbn1cblxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRkLndhcm5pbmcsXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGgud2FybmluZyxcbi50YWJsZSA+IHRoZWFkID4gdHIud2FybmluZyA+IHRkLFxuLnRhYmxlID4gdGhlYWQgPiB0ci53YXJuaW5nID4gdGgsXG4udGFibGUgPiB0Ym9keSA+IHRyID4gdGQud2FybmluZyxcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0aC53YXJuaW5nLFxuLnRhYmxlID4gdGJvZHkgPiB0ci53YXJuaW5nID4gdGQsXG4udGFibGUgPiB0Ym9keSA+IHRyLndhcm5pbmcgPiB0aCxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0ZC53YXJuaW5nLFxuLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRoLndhcm5pbmcsXG4udGFibGUgPiB0Zm9vdCA+IHRyLndhcm5pbmcgPiB0ZCxcbi50YWJsZSA+IHRmb290ID4gdHIud2FybmluZyA+IHRoIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZTNjMjtcbn1cblxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRkLndhcm5pbmc6aG92ZXIsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGgud2FybmluZzpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIud2FybmluZzpob3ZlciA+IHRkLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0cjpob3ZlciA+IC53YXJuaW5nLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ci53YXJuaW5nOmhvdmVyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNkOWFkO1xufVxuXG4udGFibGUgPiB0aGVhZCA+IHRyID4gdGQuZGFuZ2VyLFxuLnRhYmxlID4gdGhlYWQgPiB0ciA+IHRoLmRhbmdlcixcbi50YWJsZSA+IHRoZWFkID4gdHIuZGFuZ2VyID4gdGQsXG4udGFibGUgPiB0aGVhZCA+IHRyLmRhbmdlciA+IHRoLFxuLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRkLmRhbmdlcixcbi50YWJsZSA+IHRib2R5ID4gdHIgPiB0aC5kYW5nZXIsXG4udGFibGUgPiB0Ym9keSA+IHRyLmRhbmdlciA+IHRkLFxuLnRhYmxlID4gdGJvZHkgPiB0ci5kYW5nZXIgPiB0aCxcbi50YWJsZSA+IHRmb290ID4gdHIgPiB0ZC5kYW5nZXIsXG4udGFibGUgPiB0Zm9vdCA+IHRyID4gdGguZGFuZ2VyLFxuLnRhYmxlID4gdGZvb3QgPiB0ci5kYW5nZXIgPiB0ZCxcbi50YWJsZSA+IHRmb290ID4gdHIuZGFuZ2VyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWFjM2M3O1xufVxuXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyID4gdGQuZGFuZ2VyOmhvdmVyLFxuLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciA+IHRoLmRhbmdlcjpob3Zlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuZGFuZ2VyOmhvdmVyID4gdGQsXG4udGFibGUtaG92ZXIgPiB0Ym9keSA+IHRyOmhvdmVyID4gLmRhbmdlcixcbi50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIuZGFuZ2VyOmhvdmVyID4gdGgge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNiMGI1O1xufVxuXG4udGFibGUtcmVzcG9uc2l2ZSB7XG4gIG92ZXJmbG93LXg6IGF1dG87XG4gIG1pbi1oZWlnaHQ6IDAuMDElO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTFweCkge1xuICAudGFibGUtcmVzcG9uc2l2ZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgLW1zLW92ZXJmbG93LXN0eWxlOiAtbXMtYXV0b2hpZGluZy1zY3JvbGxiYXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgfVxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSA+IHRoZWFkID4gdHIgPiB0aCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUgPiB0aGVhZCA+IHRyID4gdGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlID4gdGJvZHkgPiB0ciA+IHRoLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSA+IHRib2R5ID4gdHIgPiB0ZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUgPiB0Zm9vdCA+IHRyID4gdGgsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlID4gdGZvb3QgPiB0ciA+IHRkIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICBib3JkZXI6IDA7XG4gIH1cbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuICAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLWxlZnQ6IDA7XG4gIH1cbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbiAgLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQ6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGgsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGgsXG4gIC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0cjpsYXN0LWNoaWxkID4gdGQge1xuICAgIGJvcmRlci1ib3R0b206IDA7XG4gIH1cbn1cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlcjogMDtcbiAgbWluLXdpZHRoOiAwO1xufVxuXG5sZWdlbmQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGZvbnQtc2l6ZTogMjFweDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gIGNvbG9yOiAjMjIyO1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1O1xufVxuXG5sYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbmlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIG1hcmdpbjogNHB4IDAgMDtcbiAgbWFyZ2luLXRvcDogMXB4IFxcOTtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuaW5wdXRbdHlwZT1cImZpbGVcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuaW5wdXRbdHlwZT1cInJhbmdlXCJdIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG5zZWxlY3RbbXVsdGlwbGVdLFxuc2VsZWN0W3NpemVdIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG5pbnB1dFt0eXBlPVwiZmlsZVwiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpmb2N1cyB7XG4gIG91dGxpbmU6IHRoaW4gZG90dGVkO1xuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuXG5vdXRwdXQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZy10b3A6IDdweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7XG4gIGNvbG9yOiAjNDQ0O1xufVxuXG4uZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDM0cHg7XG4gIHBhZGRpbmc6IDZweCAxMnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICM0NDQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgMC4xNXMsIGJveC1zaGFkb3cgZWFzZS1pbi1vdXQgMC4xNXM7XG4gIC1vLXRyYW5zaXRpb246IGJvcmRlci1jb2xvciBlYXNlLWluLW91dCAwLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAwLjE1cztcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIGVhc2UtaW4tb3V0IDAuMTVzLCBib3gtc2hhZG93IGVhc2UtaW4tb3V0IDAuMTVzO1xufVxuXG4uZm9ybS1jb250cm9sOmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjNjZhZmU5O1xuICBvdXRsaW5lOiAwO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDhweCByZ2JhKDEwMiwgMTc1LCAyMzMsIDAuNik7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDhweCByZ2JhKDEwMiwgMTc1LCAyMzMsIDAuNik7XG59XG5cbi5mb3JtLWNvbnRyb2w6Oi1tb3otcGxhY2Vob2xkZXIge1xuICBjb2xvcjogIzk5OTtcbiAgb3BhY2l0eTogMTtcbn1cblxuLmZvcm0tY29udHJvbDotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLmZvcm0tY29udHJvbDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4uZm9ybS1jb250cm9sW2Rpc2FibGVkXSxcbi5mb3JtLWNvbnRyb2xbcmVhZG9ubHldLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5mb3JtLWNvbnRyb2wge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAxO1xufVxuXG4uZm9ybS1jb250cm9sW2Rpc2FibGVkXSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuZm9ybS1jb250cm9sIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxudGV4dGFyZWEuZm9ybS1jb250cm9sIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAwKSB7XG4gIGlucHV0W3R5cGU9XCJkYXRlXCJdLmZvcm0tY29udHJvbCxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0uZm9ybS1jb250cm9sLFxuICBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uZm9ybS1jb250cm9sLFxuICBpbnB1dFt0eXBlPVwibW9udGhcIl0uZm9ybS1jb250cm9sIHtcbiAgICBsaW5lLWhlaWdodDogMzRweDtcbiAgfVxuICBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5pbnB1dC1zbSxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cImRhdGVcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtc20gPiBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJkYXRlXCJdLmJ0bixcbiAgLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9XCJkYXRlXCJdLFxuICBpbnB1dFt0eXBlPVwidGltZVwiXS5pbnB1dC1zbSxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cInRpbWVcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtc20gPiBpbnB1dFt0eXBlPVwidGltZVwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJ0aW1lXCJdLmJ0bixcbiAgLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9XCJ0aW1lXCJdLFxuICBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uaW5wdXQtc20sXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXS5mb3JtLWNvbnRyb2wsXG4gIC5pbnB1dC1ncm91cC1zbSA+IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1zbSBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0sXG4gIGlucHV0W3R5cGU9XCJtb250aFwiXS5pbnB1dC1zbSxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLXNtID4gaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmlucHV0LWdyb3VwLWFkZG9uLFxuICAuaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gaW5wdXRbdHlwZT1cIm1vbnRoXCJdLmJ0bixcbiAgLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9XCJtb250aFwiXSB7XG4gICAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIH1cbiAgaW5wdXRbdHlwZT1cImRhdGVcIl0uaW5wdXQtbGcsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJkYXRlXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLWxnID4gaW5wdXRbdHlwZT1cImRhdGVcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwiZGF0ZVwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0uaW5wdXQtbGcsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJ0aW1lXCJdLmZvcm0tY29udHJvbCxcbiAgLmlucHV0LWdyb3VwLWxnID4gaW5wdXRbdHlwZT1cInRpbWVcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwidGltZVwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPVwidGltZVwiXSxcbiAgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLmlucHV0LWxnLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uZm9ybS1jb250cm9sLFxuICAuaW5wdXQtZ3JvdXAtbGcgPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0uYnRuLFxuICAuaW5wdXQtZ3JvdXAtbGcgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdLFxuICBpbnB1dFt0eXBlPVwibW9udGhcIl0uaW5wdXQtbGcsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5mb3JtLWNvbnRyb2wsXG4gIC5pbnB1dC1ncm91cC1sZyA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5pbnB1dC1ncm91cC1hZGRvbixcbiAgLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IGlucHV0W3R5cGU9XCJtb250aFwiXS5idG4sXG4gIC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPVwibW9udGhcIl0ge1xuICAgIGxpbmUtaGVpZ2h0OiA0NnB4O1xuICB9XG59XG5cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnJhZGlvLFxuLmNoZWNrYm94IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLnJhZGlvIGxhYmVsLFxuLmNoZWNrYm94IGxhYmVsIHtcbiAgbWluLWhlaWdodDogMjBweDtcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4ucmFkaW8taW5saW5lIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbi5jaGVja2JveCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sXG4uY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbWFyZ2luLWxlZnQ6IC0yMHB4O1xuICBtYXJnaW4tdG9wOiA0cHggXFw5O1xufVxuXG4ucmFkaW8gKyAucmFkaW8sXG4uY2hlY2tib3ggKyAuY2hlY2tib3gge1xuICBtYXJnaW4tdG9wOiAtNXB4O1xufVxuXG4ucmFkaW8taW5saW5lLFxuLmNoZWNrYm94LWlubGluZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnJhZGlvLWlubGluZSArIC5yYWRpby1pbmxpbmUsXG4uY2hlY2tib3gtaW5saW5lICsgLmNoZWNrYm94LWlubGluZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG5pbnB1dFt0eXBlPVwicmFkaW9cIl1bZGlzYWJsZWRdLFxuaW5wdXRbdHlwZT1cInJhZGlvXCJdLmRpc2FibGVkLFxuZmllbGRzZXRbZGlzYWJsZWRdIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXVtkaXNhYmxlZF0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uZGlzYWJsZWQsXG5maWVsZHNldFtkaXNhYmxlZF0gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLnJhZGlvLWlubGluZS5kaXNhYmxlZCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAucmFkaW8taW5saW5lLFxuLmNoZWNrYm94LWlubGluZS5kaXNhYmxlZCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuY2hlY2tib3gtaW5saW5lIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLnJhZGlvLmRpc2FibGVkIGxhYmVsLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5yYWRpbyBsYWJlbCxcbi5jaGVja2JveC5kaXNhYmxlZCBsYWJlbCxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuY2hlY2tib3ggbGFiZWwge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4uZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG4gIHBhZGRpbmctYm90dG9tOiA3cHg7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIG1pbi1oZWlnaHQ6IDM0cHg7XG59XG5cbi5mb3JtLWNvbnRyb2wtc3RhdGljLmlucHV0LWxnLFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tY29udHJvbC1zdGF0aWMuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tY29udHJvbC1zdGF0aWMuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmZvcm0tY29udHJvbC1zdGF0aWMuYnRuLFxuLmZvcm0tY29udHJvbC1zdGF0aWMuaW5wdXQtc20sIC5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IC5mb3JtLWNvbnRyb2wtc3RhdGljLmJ0biB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgcGFkZGluZy1yaWdodDogMDtcbn1cblxuLmlucHV0LXNtLCAuaW5wdXQtZ3JvdXAtc20gPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuc2VsZWN0LmlucHV0LXNtLCAuaW5wdXQtZ3JvdXAtc20gPiBzZWxlY3QuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLXNtID4gc2VsZWN0LmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IHNlbGVjdC5idG4ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xufVxuXG50ZXh0YXJlYS5pbnB1dC1zbSxcbi5pbnB1dC1ncm91cC1zbSA+IHRleHRhcmVhLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1zbSA+IHRleHRhcmVhLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLWJ0biA+IHRleHRhcmVhLmJ0bixcbnNlbGVjdFttdWx0aXBsZV0uaW5wdXQtc20sIC5pbnB1dC1ncm91cC1zbSA+IHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLXNtID4gc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiBzZWxlY3RbbXVsdGlwbGVdLmJ0biB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLmZvcm0tZ3JvdXAtc20gLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogMzBweDtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uZm9ybS1ncm91cC1zbSBzZWxlY3QuZm9ybS1jb250cm9sIHtcbiAgaGVpZ2h0OiAzMHB4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbn1cblxuLmZvcm0tZ3JvdXAtc20gdGV4dGFyZWEuZm9ybS1jb250cm9sLFxuLmZvcm0tZ3JvdXAtc20gc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgaGVpZ2h0OiAzMHB4O1xuICBtaW4taGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiA2cHggMTBweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xufVxuXG4uaW5wdXQtbGcsIC5pbnB1dC1ncm91cC1sZyA+IC5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIGhlaWdodDogNDZweDtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuc2VsZWN0LmlucHV0LWxnLCAuaW5wdXQtZ3JvdXAtbGcgPiBzZWxlY3QuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gc2VsZWN0LmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IHNlbGVjdC5idG4ge1xuICBoZWlnaHQ6IDQ2cHg7XG4gIGxpbmUtaGVpZ2h0OiA0NnB4O1xufVxuXG50ZXh0YXJlYS5pbnB1dC1sZyxcbi5pbnB1dC1ncm91cC1sZyA+IHRleHRhcmVhLmZvcm0tY29udHJvbCxcbi5pbnB1dC1ncm91cC1sZyA+IHRleHRhcmVhLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IHRleHRhcmVhLmJ0bixcbnNlbGVjdFttdWx0aXBsZV0uaW5wdXQtbGcsIC5pbnB1dC1ncm91cC1sZyA+IHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiBzZWxlY3RbbXVsdGlwbGVdLmJ0biB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLmZvcm0tZ3JvdXAtbGcgLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogNDZweDtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmZvcm0tZ3JvdXAtbGcgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogNDZweDtcbiAgbGluZS1oZWlnaHQ6IDQ2cHg7XG59XG5cbi5mb3JtLWdyb3VwLWxnIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbi5mb3JtLWdyb3VwLWxnIHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gIGhlaWdodDogNDZweDtcbiAgbWluLWhlaWdodDogMzhweDtcbiAgcGFkZGluZzogMTFweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG59XG5cbi5oYXMtZmVlZGJhY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5oYXMtZmVlZGJhY2sgLmZvcm0tY29udHJvbCB7XG4gIHBhZGRpbmctcmlnaHQ6IDQyLjVweDtcbn1cblxuLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgei1pbmRleDogMjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAzNHB4O1xuICBoZWlnaHQ6IDM0cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uaW5wdXQtbGcgKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tY29udHJvbCArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtbGcgPiAuaW5wdXQtZ3JvdXAtYWRkb24gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmlucHV0LWdyb3VwLWxnICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5mb3JtLWdyb3VwLWxnIC5mb3JtLWNvbnRyb2wgKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgd2lkdGg6IDQ2cHg7XG4gIGhlaWdodDogNDZweDtcbiAgbGluZS1oZWlnaHQ6IDQ2cHg7XG59XG5cbi5pbnB1dC1zbSArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtc20gPiAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1hZGRvbiArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uaW5wdXQtZ3JvdXAtc20gKyAuZm9ybS1jb250cm9sLWZlZWRiYWNrLFxuLmZvcm0tZ3JvdXAtc20gLmZvcm0tY29udHJvbCArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB3aWR0aDogMzBweDtcbiAgaGVpZ2h0OiAzMHB4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbn1cblxuLmhhcy1zdWNjZXNzIC5oZWxwLWJsb2NrLFxuLmhhcy1zdWNjZXNzIC5jb250cm9sLWxhYmVsLFxuLmhhcy1zdWNjZXNzIC5yYWRpbyxcbi5oYXMtc3VjY2VzcyAuY2hlY2tib3gsXG4uaGFzLXN1Y2Nlc3MgLnJhZGlvLWlubGluZSxcbi5oYXMtc3VjY2VzcyAuY2hlY2tib3gtaW5saW5lLFxuLmhhcy1zdWNjZXNzLnJhZGlvIGxhYmVsLFxuLmhhcy1zdWNjZXNzLmNoZWNrYm94IGxhYmVsLFxuLmhhcy1zdWNjZXNzLnJhZGlvLWlubGluZSBsYWJlbCxcbi5oYXMtc3VjY2Vzcy5jaGVja2JveC1pbmxpbmUgbGFiZWwge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuLmhhcy1zdWNjZXNzIC5mb3JtLWNvbnRyb2wge1xuICBib3JkZXItY29sb3I6ICM2YzZjNmM7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSk7XG59XG5cbi5oYXMtc3VjY2VzcyAuZm9ybS1jb250cm9sOmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjNTI1MjUyO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjOWY5ZjlmO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggIzlmOWY5Zjtcbn1cblxuLmhhcy1zdWNjZXNzIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBib3JkZXItY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWU2Y2I7XG59XG5cbi5oYXMtc3VjY2VzcyAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbi5oYXMtd2FybmluZyAuaGVscC1ibG9jayxcbi5oYXMtd2FybmluZyAuY29udHJvbC1sYWJlbCxcbi5oYXMtd2FybmluZyAucmFkaW8sXG4uaGFzLXdhcm5pbmcgLmNoZWNrYm94LFxuLmhhcy13YXJuaW5nIC5yYWRpby1pbmxpbmUsXG4uaGFzLXdhcm5pbmcgLmNoZWNrYm94LWlubGluZSxcbi5oYXMtd2FybmluZy5yYWRpbyBsYWJlbCxcbi5oYXMtd2FybmluZy5jaGVja2JveCBsYWJlbCxcbi5oYXMtd2FybmluZy5yYWRpby1pbmxpbmUgbGFiZWwsXG4uaGFzLXdhcm5pbmcuY2hlY2tib3gtaW5saW5lIGxhYmVsIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbi5oYXMtd2FybmluZyAuZm9ybS1jb250cm9sIHtcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xufVxuXG4uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogIzUyNTI1MjtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA2cHggIzlmOWY5ZjtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpLCAwIDAgNnB4ICM5ZjlmOWY7XG59XG5cbi5oYXMtd2FybmluZyAuaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFlM2MyO1xufVxuXG4uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG4uaGFzLWVycm9yIC5oZWxwLWJsb2NrLFxuLmhhcy1lcnJvciAuY29udHJvbC1sYWJlbCxcbi5oYXMtZXJyb3IgLnJhZGlvLFxuLmhhcy1lcnJvciAuY2hlY2tib3gsXG4uaGFzLWVycm9yIC5yYWRpby1pbmxpbmUsXG4uaGFzLWVycm9yIC5jaGVja2JveC1pbmxpbmUsXG4uaGFzLWVycm9yLnJhZGlvIGxhYmVsLFxuLmhhcy1lcnJvci5jaGVja2JveCBsYWJlbCxcbi5oYXMtZXJyb3IucmFkaW8taW5saW5lIGxhYmVsLFxuLmhhcy1lcnJvci5jaGVja2JveC1pbmxpbmUgbGFiZWwge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuLmhhcy1lcnJvciAuZm9ybS1jb250cm9sIHtcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpO1xufVxuXG4uaGFzLWVycm9yIC5mb3JtLWNvbnRyb2w6Zm9jdXMge1xuICBib3JkZXItY29sb3I6ICM1MjUyNTI7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNzUpLCAwIDAgNnB4ICM5ZjlmOWY7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDZweCAjOWY5ZjlmO1xufVxuXG4uaGFzLWVycm9yIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBib3JkZXItY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYWMzYzc7XG59XG5cbi5oYXMtZXJyb3IgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG4uaGFzLWZlZWRiYWNrIGxhYmVsIH4gLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHRvcDogMjVweDtcbn1cblxuLmhhcy1mZWVkYmFjayBsYWJlbC5zci1vbmx5IH4gLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHRvcDogMDtcbn1cblxuLmhlbHAtYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLXRvcDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICBjb2xvcjogIzYyNjI2Mjtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5mb3JtLWlubGluZSAuZm9ybS1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuICAuZm9ybS1pbmxpbmUgLmZvcm0tY29udHJvbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXAgLmlucHV0LWdyb3VwLWJ0bixcbiAgLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgICB3aWR0aDogYXV0bztcbiAgfVxuICAuZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwID4gLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5jb250cm9sLWxhYmVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLmZvcm0taW5saW5lIC5yYWRpbyxcbiAgLmZvcm0taW5saW5lIC5jaGVja2JveCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5mb3JtLWlubGluZSAucmFkaW8gbGFiZWwsXG4gIC5mb3JtLWlubGluZSAuY2hlY2tib3ggbGFiZWwge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgfVxuICAuZm9ybS1pbmxpbmUgLnJhZGlvIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgLmZvcm0taW5saW5lIC5jaGVja2JveCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxuICAuZm9ybS1pbmxpbmUgLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLmZvcm0taG9yaXpvbnRhbCAucmFkaW8sXG4uZm9ybS1ob3Jpem9udGFsIC5jaGVja2JveCxcbi5mb3JtLWhvcml6b250YWwgLnJhZGlvLWlubGluZSxcbi5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94LWlubGluZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG59XG5cbi5mb3JtLWhvcml6b250YWwgLnJhZGlvLFxuLmZvcm0taG9yaXpvbnRhbCAuY2hlY2tib3gge1xuICBtaW4taGVpZ2h0OiAyN3B4O1xufVxuXG4uZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIG1hcmdpbi1yaWdodDogMDtcbn1cblxuLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cDpiZWZvcmUsXG4uZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4uZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwOmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWxhYmVsIHtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHBhZGRpbmctdG9wOiA3cHg7XG4gIH1cbn1cblxuLmZvcm0taG9yaXpvbnRhbCAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICByaWdodDogMDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXAtbGcgLmNvbnRyb2wtbGFiZWwge1xuICAgIHBhZGRpbmctdG9wOiAxNC4zMzMzMzNweDtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXAtc20gLmNvbnRyb2wtbGFiZWwge1xuICAgIHBhZGRpbmctdG9wOiA2cHg7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICB9XG59XG5cbi5idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBhZGRpbmc6IDZweCAxMnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uYnRuOmZvY3VzLFxuLmJ0bi5mb2N1cyxcbi5idG46YWN0aXZlOmZvY3VzLFxuLmJ0bjphY3RpdmUuZm9jdXMsXG4uYnRuLmFjdGl2ZTpmb2N1cyxcbi5idG4uYWN0aXZlLmZvY3VzIHtcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIG91dGxpbmU6IDVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG59XG5cbi5idG46aG92ZXIsXG4uYnRuOmZvY3VzLFxuLmJ0bi5mb2N1cyB7XG4gIGNvbG9yOiAjNDQ0O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5idG46YWN0aXZlLFxuLmJ0bi5hY3RpdmUge1xuICBvdXRsaW5lOiAwO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgM3B4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTI1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMjUpO1xufVxuXG4uYnRuLmRpc2FibGVkLFxuLmJ0bltkaXNhYmxlZF0sXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0biB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIG9wYWNpdHk6IDAuNjU7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuYS5idG4uZGlzYWJsZWQsXG5maWVsZHNldFtkaXNhYmxlZF0gYS5idG4ge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmJ0bi1kZWZhdWx0IHtcbiAgY29sb3I6ICM0NDQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1jb2xvcjogI2NjYztcbn1cblxuLmJ0bi1kZWZhdWx0OmZvY3VzLFxuLmJ0bi1kZWZhdWx0LmZvY3VzIHtcbiAgY29sb3I6ICM0NDQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNmU2ZTY7XG4gIGJvcmRlci1jb2xvcjogIzhjOGM4Yztcbn1cblxuLmJ0bi1kZWZhdWx0OmhvdmVyIHtcbiAgY29sb3I6ICM0NDQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNmU2ZTY7XG4gIGJvcmRlci1jb2xvcjogI2FkYWRhZDtcbn1cblxuLmJ0bi1kZWZhdWx0OmFjdGl2ZSxcbi5idG4tZGVmYXVsdC5hY3RpdmUsXG4ub3BlbiA+IC5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogIzQ0NDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgYm9yZGVyLWNvbG9yOiAjYWRhZGFkO1xufVxuXG4uYnRuLWRlZmF1bHQ6YWN0aXZlOmhvdmVyLFxuLmJ0bi1kZWZhdWx0OmFjdGl2ZTpmb2N1cyxcbi5idG4tZGVmYXVsdDphY3RpdmUuZm9jdXMsXG4uYnRuLWRlZmF1bHQuYWN0aXZlOmhvdmVyLFxuLmJ0bi1kZWZhdWx0LmFjdGl2ZTpmb2N1cyxcbi5idG4tZGVmYXVsdC5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGU6aG92ZXIsXG4ub3BlbiA+IC5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGU6Zm9jdXMsXG4ub3BlbiA+IC5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogIzQ0NDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDtcbiAgYm9yZGVyLWNvbG9yOiAjOGM4YzhjO1xufVxuXG4uYnRuLWRlZmF1bHQ6YWN0aXZlLFxuLmJ0bi1kZWZhdWx0LmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1kZWZhdWx0LmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5idG4tZGVmYXVsdC5kaXNhYmxlZCxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZDpob3Zlcixcbi5idG4tZGVmYXVsdC5kaXNhYmxlZDpmb2N1cyxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZC5mb2N1cyxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZDphY3RpdmUsXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQuYWN0aXZlLFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXSxcbi5idG4tZGVmYXVsdFtkaXNhYmxlZF06aG92ZXIsXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmZvY3VzLFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXS5mb2N1cyxcbi5idG4tZGVmYXVsdFtkaXNhYmxlZF06YWN0aXZlLFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXS5hY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0LFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdDpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQ6Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0LmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdDphY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0LmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1jb2xvcjogI2NjYztcbn1cblxuLmJ0bi1kZWZhdWx0IC5iYWRnZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0O1xufVxuXG4uYnRuLXByaW1hcnkge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4uYnRuLXByaW1hcnk6Zm9jdXMsXG4uYnRuLXByaW1hcnkuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxMjAyMTtcbiAgYm9yZGVyLWNvbG9yOiBibGFjaztcbn1cblxuLmJ0bi1wcmltYXJ5OmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTIwMjE7XG4gIGJvcmRlci1jb2xvcjogIzFiMWIxYztcbn1cblxuLmJ0bi1wcmltYXJ5OmFjdGl2ZSxcbi5idG4tcHJpbWFyeS5hY3RpdmUsXG4ub3BlbiA+IC5idG4tcHJpbWFyeS5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxMjAyMTtcbiAgYm9yZGVyLWNvbG9yOiAjMWIxYjFjO1xufVxuXG4uYnRuLXByaW1hcnk6YWN0aXZlOmhvdmVyLFxuLmJ0bi1wcmltYXJ5OmFjdGl2ZTpmb2N1cyxcbi5idG4tcHJpbWFyeTphY3RpdmUuZm9jdXMsXG4uYnRuLXByaW1hcnkuYWN0aXZlOmhvdmVyLFxuLmJ0bi1wcmltYXJ5LmFjdGl2ZTpmb2N1cyxcbi5idG4tcHJpbWFyeS5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4tcHJpbWFyeS5kcm9wZG93bi10b2dnbGU6aG92ZXIsXG4ub3BlbiA+IC5idG4tcHJpbWFyeS5kcm9wZG93bi10b2dnbGU6Zm9jdXMsXG4ub3BlbiA+IC5idG4tcHJpbWFyeS5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzBmMGUwZjtcbiAgYm9yZGVyLWNvbG9yOiBibGFjaztcbn1cblxuLmJ0bi1wcmltYXJ5OmFjdGl2ZSxcbi5idG4tcHJpbWFyeS5hY3RpdmUsXG4ub3BlbiA+IC5idG4tcHJpbWFyeS5kcm9wZG93bi10b2dnbGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xufVxuXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQ6aG92ZXIsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQ6Zm9jdXMsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLXByaW1hcnkuZGlzYWJsZWQ6YWN0aXZlLFxuLmJ0bi1wcmltYXJ5LmRpc2FibGVkLmFjdGl2ZSxcbi5idG4tcHJpbWFyeVtkaXNhYmxlZF0sXG4uYnRuLXByaW1hcnlbZGlzYWJsZWRdOmhvdmVyLFxuLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXTpmb2N1cyxcbi5idG4tcHJpbWFyeVtkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLXByaW1hcnlbZGlzYWJsZWRdOmFjdGl2ZSxcbi5idG4tcHJpbWFyeVtkaXNhYmxlZF0uYWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5OmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeS5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6YWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeS5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xuICBib3JkZXItY29sb3I6ICMzYTM5M2I7XG59XG5cbi5idG4tcHJpbWFyeSAuYmFkZ2Uge1xuICBjb2xvcjogIzNhMzkzYjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1zdWNjZXNzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1Y2I4NWM7XG4gIGJvcmRlci1jb2xvcjogIzVjYjg1Yztcbn1cblxuLmJ0bi1zdWNjZXNzOmZvY3VzLFxuLmJ0bi1zdWNjZXNzLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0NDlkNDQ7XG4gIGJvcmRlci1jb2xvcjogIzJkNjcyZDtcbn1cblxuLmJ0bi1zdWNjZXNzOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0NDlkNDQ7XG4gIGJvcmRlci1jb2xvcjogIzQxOTY0MTtcbn1cblxuLmJ0bi1zdWNjZXNzOmFjdGl2ZSxcbi5idG4tc3VjY2Vzcy5hY3RpdmUsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0OWQ0NDtcbiAgYm9yZGVyLWNvbG9yOiAjNDE5NjQxO1xufVxuXG4uYnRuLXN1Y2Nlc3M6YWN0aXZlOmhvdmVyLFxuLmJ0bi1zdWNjZXNzOmFjdGl2ZTpmb2N1cyxcbi5idG4tc3VjY2VzczphY3RpdmUuZm9jdXMsXG4uYnRuLXN1Y2Nlc3MuYWN0aXZlOmhvdmVyLFxuLmJ0bi1zdWNjZXNzLmFjdGl2ZTpmb2N1cyxcbi5idG4tc3VjY2Vzcy5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGU6aG92ZXIsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGU6Zm9jdXMsXG4ub3BlbiA+IC5idG4tc3VjY2Vzcy5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzM5ODQzOTtcbiAgYm9yZGVyLWNvbG9yOiAjMmQ2NzJkO1xufVxuXG4uYnRuLXN1Y2Nlc3M6YWN0aXZlLFxuLmJ0bi1zdWNjZXNzLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1zdWNjZXNzLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5idG4tc3VjY2Vzcy5kaXNhYmxlZCxcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZDpob3Zlcixcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZDpmb2N1cyxcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZC5mb2N1cyxcbi5idG4tc3VjY2Vzcy5kaXNhYmxlZDphY3RpdmUsXG4uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQuYWN0aXZlLFxuLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXSxcbi5idG4tc3VjY2Vzc1tkaXNhYmxlZF06aG92ZXIsXG4uYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdOmZvY3VzLFxuLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXS5mb2N1cyxcbi5idG4tc3VjY2Vzc1tkaXNhYmxlZF06YWN0aXZlLFxuLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXS5hY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2Vzczpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3M6Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2VzczphY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1Y2I4NWM7XG4gIGJvcmRlci1jb2xvcjogIzVjYjg1Yztcbn1cblxuLmJ0bi1zdWNjZXNzIC5iYWRnZSB7XG4gIGNvbG9yOiAjNWNiODVjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4uYnRuLWluZm8ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzViYzBkZTtcbiAgYm9yZGVyLWNvbG9yOiAjNWJjMGRlO1xufVxuXG4uYnRuLWluZm86Zm9jdXMsXG4uYnRuLWluZm8uZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMxYjBkNTtcbiAgYm9yZGVyLWNvbG9yOiAjMWY3ZTlhO1xufVxuXG4uYnRuLWluZm86aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMxYjBkNTtcbiAgYm9yZGVyLWNvbG9yOiAjMmFhYmQyO1xufVxuXG4uYnRuLWluZm86YWN0aXZlLFxuLmJ0bi1pbmZvLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzFiMGQ1O1xuICBib3JkZXItY29sb3I6ICMyYWFiZDI7XG59XG5cbi5idG4taW5mbzphY3RpdmU6aG92ZXIsXG4uYnRuLWluZm86YWN0aXZlOmZvY3VzLFxuLmJ0bi1pbmZvOmFjdGl2ZS5mb2N1cyxcbi5idG4taW5mby5hY3RpdmU6aG92ZXIsXG4uYnRuLWluZm8uYWN0aXZlOmZvY3VzLFxuLmJ0bi1pbmZvLmFjdGl2ZS5mb2N1cyxcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZTpob3Zlcixcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyxcbi5vcGVuID4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZS5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjY5YWJjO1xuICBib3JkZXItY29sb3I6ICMxZjdlOWE7XG59XG5cbi5idG4taW5mbzphY3RpdmUsXG4uYnRuLWluZm8uYWN0aXZlLFxuLm9wZW4gPiAuYnRuLWluZm8uZHJvcGRvd24tdG9nZ2xlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLmJ0bi1pbmZvLmRpc2FibGVkLFxuLmJ0bi1pbmZvLmRpc2FibGVkOmhvdmVyLFxuLmJ0bi1pbmZvLmRpc2FibGVkOmZvY3VzLFxuLmJ0bi1pbmZvLmRpc2FibGVkLmZvY3VzLFxuLmJ0bi1pbmZvLmRpc2FibGVkOmFjdGl2ZSxcbi5idG4taW5mby5kaXNhYmxlZC5hY3RpdmUsXG4uYnRuLWluZm9bZGlzYWJsZWRdLFxuLmJ0bi1pbmZvW2Rpc2FibGVkXTpob3Zlcixcbi5idG4taW5mb1tkaXNhYmxlZF06Zm9jdXMsXG4uYnRuLWluZm9bZGlzYWJsZWRdLmZvY3VzLFxuLmJ0bi1pbmZvW2Rpc2FibGVkXTphY3RpdmUsXG4uYnRuLWluZm9bZGlzYWJsZWRdLmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8sXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mbzpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8uZm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8uYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzViYzBkZTtcbiAgYm9yZGVyLWNvbG9yOiAjNWJjMGRlO1xufVxuXG4uYnRuLWluZm8gLmJhZGdlIHtcbiAgY29sb3I6ICM1YmMwZGU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5idG4td2FybmluZyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBhZDRlO1xuICBib3JkZXItY29sb3I6ICNmMGFkNGU7XG59XG5cbi5idG4td2FybmluZzpmb2N1cyxcbi5idG4td2FybmluZy5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmO1xuICBib3JkZXItY29sb3I6ICNiMDZkMGY7XG59XG5cbi5idG4td2FybmluZzpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmO1xuICBib3JkZXItY29sb3I6ICNlYjkzMTY7XG59XG5cbi5idG4td2FybmluZzphY3RpdmUsXG4uYnRuLXdhcm5pbmcuYWN0aXZlLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYzk3MWY7XG4gIGJvcmRlci1jb2xvcjogI2ViOTMxNjtcbn1cblxuLmJ0bi13YXJuaW5nOmFjdGl2ZTpob3Zlcixcbi5idG4td2FybmluZzphY3RpdmU6Zm9jdXMsXG4uYnRuLXdhcm5pbmc6YWN0aXZlLmZvY3VzLFxuLmJ0bi13YXJuaW5nLmFjdGl2ZTpob3Zlcixcbi5idG4td2FybmluZy5hY3RpdmU6Zm9jdXMsXG4uYnRuLXdhcm5pbmcuYWN0aXZlLmZvY3VzLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlOmZvY3VzLFxuLm9wZW4gPiAuYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkNTg1MTI7XG4gIGJvcmRlci1jb2xvcjogI2IwNmQwZjtcbn1cblxuLmJ0bi13YXJuaW5nOmFjdGl2ZSxcbi5idG4td2FybmluZy5hY3RpdmUsXG4ub3BlbiA+IC5idG4td2FybmluZy5kcm9wZG93bi10b2dnbGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xufVxuXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQ6aG92ZXIsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQ6Zm9jdXMsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLXdhcm5pbmcuZGlzYWJsZWQ6YWN0aXZlLFxuLmJ0bi13YXJuaW5nLmRpc2FibGVkLmFjdGl2ZSxcbi5idG4td2FybmluZ1tkaXNhYmxlZF0sXG4uYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmhvdmVyLFxuLmJ0bi13YXJuaW5nW2Rpc2FibGVkXTpmb2N1cyxcbi5idG4td2FybmluZ1tkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmFjdGl2ZSxcbi5idG4td2FybmluZ1tkaXNhYmxlZF0uYWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nOmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZy5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6YWN0aXZlLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZy5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBhZDRlO1xuICBib3JkZXItY29sb3I6ICNmMGFkNGU7XG59XG5cbi5idG4td2FybmluZyAuYmFkZ2Uge1xuICBjb2xvcjogI2YwYWQ0ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1kYW5nZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5NTM0ZjtcbiAgYm9yZGVyLWNvbG9yOiAjZDk1MzRmO1xufVxuXG4uYnRuLWRhbmdlcjpmb2N1cyxcbi5idG4tZGFuZ2VyLmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjOTMwMmM7XG4gIGJvcmRlci1jb2xvcjogIzhiMjExZTtcbn1cblxuLmJ0bi1kYW5nZXI6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M5MzAyYztcbiAgYm9yZGVyLWNvbG9yOiAjYzEyZTJhO1xufVxuXG4uYnRuLWRhbmdlcjphY3RpdmUsXG4uYnRuLWRhbmdlci5hY3RpdmUsXG4ub3BlbiA+IC5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzkzMDJjO1xuICBib3JkZXItY29sb3I6ICNjMTJlMmE7XG59XG5cbi5idG4tZGFuZ2VyOmFjdGl2ZTpob3Zlcixcbi5idG4tZGFuZ2VyOmFjdGl2ZTpmb2N1cyxcbi5idG4tZGFuZ2VyOmFjdGl2ZS5mb2N1cyxcbi5idG4tZGFuZ2VyLmFjdGl2ZTpob3Zlcixcbi5idG4tZGFuZ2VyLmFjdGl2ZTpmb2N1cyxcbi5idG4tZGFuZ2VyLmFjdGl2ZS5mb2N1cyxcbi5vcGVuID4gLmJ0bi1kYW5nZXIuZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLWRhbmdlci5kcm9wZG93bi10b2dnbGU6Zm9jdXMsXG4ub3BlbiA+IC5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZS5mb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWMyOTI1O1xuICBib3JkZXItY29sb3I6ICM4YjIxMWU7XG59XG5cbi5idG4tZGFuZ2VyOmFjdGl2ZSxcbi5idG4tZGFuZ2VyLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1kYW5nZXIuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLmJ0bi1kYW5nZXIuZGlzYWJsZWQsXG4uYnRuLWRhbmdlci5kaXNhYmxlZDpob3Zlcixcbi5idG4tZGFuZ2VyLmRpc2FibGVkOmZvY3VzLFxuLmJ0bi1kYW5nZXIuZGlzYWJsZWQuZm9jdXMsXG4uYnRuLWRhbmdlci5kaXNhYmxlZDphY3RpdmUsXG4uYnRuLWRhbmdlci5kaXNhYmxlZC5hY3RpdmUsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF0sXG4uYnRuLWRhbmdlcltkaXNhYmxlZF06aG92ZXIsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF06Zm9jdXMsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLWRhbmdlcltkaXNhYmxlZF06YWN0aXZlLFxuLmJ0bi1kYW5nZXJbZGlzYWJsZWRdLmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjpmb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlci5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjphY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXIuYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5NTM0ZjtcbiAgYm9yZGVyLWNvbG9yOiAjZDk1MzRmO1xufVxuXG4uYnRuLWRhbmdlciAuYmFkZ2Uge1xuICBjb2xvcjogI2Q5NTM0ZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1saW5rIHtcbiAgY29sb3I6ICMzYTM5M2I7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5idG4tbGluayxcbi5idG4tbGluazphY3RpdmUsXG4uYnRuLWxpbmsuYWN0aXZlLFxuLmJ0bi1saW5rW2Rpc2FibGVkXSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxpbmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uYnRuLWxpbmssXG4uYnRuLWxpbms6aG92ZXIsXG4uYnRuLWxpbms6Zm9jdXMsXG4uYnRuLWxpbms6YWN0aXZlIHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmJ0bi1saW5rOmhvdmVyLFxuLmJ0bi1saW5rOmZvY3VzIHtcbiAgY29sb3I6ICMxNDEzMTQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmJ0bi1saW5rW2Rpc2FibGVkXTpob3Zlcixcbi5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1saW5rOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbGluazpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5idG4tbGcsIC5idG4tZ3JvdXAtbGcgPiAuYnRuIHtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjMzMzMzMzM7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmJ0bi1zbSwgLmJ0bi1ncm91cC1zbSA+IC5idG4ge1xuICBwYWRkaW5nOiA1cHggMTBweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5idG4teHMsIC5idG4tZ3JvdXAteHMgPiAuYnRuIHtcbiAgcGFkZGluZzogMXB4IDVweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5idG4tYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5idG4tYmxvY2sgKyAuYnRuLWJsb2NrIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG5pbnB1dFt0eXBlPVwic3VibWl0XCJdLmJ0bi1ibG9jayxcbmlucHV0W3R5cGU9XCJyZXNldFwiXS5idG4tYmxvY2ssXG5pbnB1dFt0eXBlPVwiYnV0dG9uXCJdLmJ0bi1ibG9jayB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uZmFkZSB7XG4gIG9wYWNpdHk6IDA7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBsaW5lYXI7XG4gIC1vLXRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgbGluZWFyO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGxpbmVhcjtcbn1cblxuLmZhZGUuaW4ge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uY29sbGFwc2Uge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uY29sbGFwc2UuaW4ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxudHIuY29sbGFwc2UuaW4ge1xuICBkaXNwbGF5OiB0YWJsZS1yb3c7XG59XG5cbnRib2R5LmNvbGxhcHNlLmluIHtcbiAgZGlzcGxheTogdGFibGUtcm93LWdyb3VwO1xufVxuXG4uY29sbGFwc2luZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGhlaWdodCwgdmlzaWJpbGl0eTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogaGVpZ2h0LCB2aXNpYmlsaXR5O1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMzVzO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjM1cztcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7XG59XG5cbi5jYXJldCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDA7XG4gIGhlaWdodDogMDtcbiAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcbiAgYm9yZGVyLXRvcDogNHB4IHNvbGlkIFxcOTtcbiAgYm9yZGVyLXJpZ2h0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi5kcm9wdXAsXG4uZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4uZHJvcGRvd24tbWVudSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBub25lO1xuICBmbG9hdDogbGVmdDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIG1hcmdpbjogMnB4IDAgMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjO1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCA2cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTc1KTtcbiAgYm94LXNoYWRvdzogMCA2cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTc1KTtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbn1cblxuLmRyb3Bkb3duLW1lbnUucHVsbC1yaWdodCB7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiBhdXRvO1xufVxuXG4uZHJvcGRvd24tbWVudSAuZGl2aWRlciB7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IDlweCAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xufVxuXG4uZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAzcHggMjBweDtcbiAgY2xlYXI6IGJvdGg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICMyMjI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjMTUxNTE1O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuXG4uZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhLFxuLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYTpob3Zlcixcbi5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBvdXRsaW5lOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGEsXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICBjb2xvcjogIzk5OTtcbn1cblxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZCA9IGZhbHNlKTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLm9wZW4gPiAuZHJvcGRvd24tbWVudSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ub3BlbiA+IGEge1xuICBvdXRsaW5lOiAwO1xufVxuXG4uZHJvcGRvd24tbWVudS1yaWdodCB7XG4gIGxlZnQ6IGF1dG87XG4gIHJpZ2h0OiAwO1xufVxuXG4uZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IGF1dG87XG59XG5cbi5kcm9wZG93bi1oZWFkZXIge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogM3B4IDIwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBjb2xvcjogIzk5OTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmRyb3Bkb3duLWJhY2tkcm9wIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICB0b3A6IDA7XG4gIHotaW5kZXg6IDk5MDtcbn1cblxuLnB1bGwtcmlnaHQgPiAuZHJvcGRvd24tbWVudSB7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiBhdXRvO1xufVxuXG4uZHJvcHVwIC5jYXJldCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuY2FyZXQge1xuICBib3JkZXItdG9wOiAwO1xuICBib3JkZXItYm90dG9tOiA0cHggZGFzaGVkO1xuICBib3JkZXItYm90dG9tOiA0cHggc29saWQgXFw5O1xuICBjb250ZW50OiBcIlwiO1xufVxuXG4uZHJvcHVwIC5kcm9wZG93bi1tZW51LFxuLm5hdmJhci1maXhlZC1ib3R0b20gLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IHtcbiAgdG9wOiBhdXRvO1xuICBib3R0b206IDEwMCU7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItcmlnaHQgLmRyb3Bkb3duLW1lbnUge1xuICAgIHJpZ2h0OiAwO1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cbiAgLm5hdmJhci1yaWdodCAuZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiBhdXRvO1xuICB9XG59XG5cbi5idG4tZ3JvdXAsXG4uYnRuLWdyb3VwLXZlcnRpY2FsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bjpob3Zlcixcbi5idG4tZ3JvdXAgPiAuYnRuOmZvY3VzLFxuLmJ0bi1ncm91cCA+IC5idG46YWN0aXZlLFxuLmJ0bi1ncm91cCA+IC5idG4uYWN0aXZlLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46aG92ZXIsXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjpmb2N1cyxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuOmFjdGl2ZSxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLmFjdGl2ZSB7XG4gIHotaW5kZXg6IDI7XG59XG5cbi5idG4tZ3JvdXAgLmJ0biArIC5idG4sXG4uYnRuLWdyb3VwIC5idG4gKyAuYnRuLWdyb3VwLFxuLmJ0bi1ncm91cCAuYnRuLWdyb3VwICsgLmJ0bixcbi5idG4tZ3JvdXAgLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLmJ0bi10b29sYmFyIHtcbiAgbWFyZ2luLWxlZnQ6IC01cHg7XG59XG5cbi5idG4tdG9vbGJhcjpiZWZvcmUsXG4uYnRuLXRvb2xiYXI6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5idG4tdG9vbGJhcjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4uYnRuLXRvb2xiYXIgLmJ0bixcbi5idG4tdG9vbGJhciAuYnRuLWdyb3VwLFxuLmJ0bi10b29sYmFyIC5pbnB1dC1ncm91cCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4uYnRuLXRvb2xiYXIgPiAuYnRuLFxuLmJ0bi10b29sYmFyID4gLmJ0bi1ncm91cCxcbi5idG4tdG9vbGJhciA+IC5pbnB1dC1ncm91cCB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBtYXJnaW4tbGVmdDogMDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG46Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSkge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4uYnRuLWdyb3VwID4gLmRyb3Bkb3duLXRvZ2dsZTpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgPiAuYnRuIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSA+IC5idG46bGFzdC1jaGlsZCxcbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgPiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmJ0bjpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG5cbi5idG4tZ3JvdXAgLmRyb3Bkb3duLXRvZ2dsZTphY3RpdmUsXG4uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuICsgLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIHBhZGRpbmctbGVmdDogOHB4O1xuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuLWxnICsgLmRyb3Bkb3duLXRvZ2dsZSwgLmJ0bi1ncm91cC1sZy5idG4tZ3JvdXAgPiAuYnRuICsgLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIHBhZGRpbmctbGVmdDogMTJweDtcbiAgcGFkZGluZy1yaWdodDogMTJweDtcbn1cblxuLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgM3B4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTI1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMjUpO1xufVxuXG4uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5idG4tbGluayB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLmJ0biAuY2FyZXQge1xuICBtYXJnaW4tbGVmdDogMDtcbn1cblxuLmJ0bi1sZyAuY2FyZXQsIC5idG4tZ3JvdXAtbGcgPiAuYnRuIC5jYXJldCB7XG4gIGJvcmRlci13aWR0aDogNXB4IDVweCAwO1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xufVxuXG4uZHJvcHVwIC5idG4tbGcgLmNhcmV0LCAuZHJvcHVwIC5idG4tZ3JvdXAtbGcgPiAuYnRuIC5jYXJldCB7XG4gIGJvcmRlci13aWR0aDogMCA1cHggNXB4O1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bixcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXAgPiAuYnRuIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiBub25lO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpiZWZvcmUsXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXAgPiAuYnRuIHtcbiAgZmxvYXQ6IG5vbmU7XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuICsgLmJ0bixcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuICsgLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwICsgLmJ0bixcbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwICsgLmJ0bi1ncm91cCB7XG4gIG1hcmdpbi10b3A6IC0xcHg7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG46Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpID4gLmJ0bjpsYXN0LWNoaWxkLFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSA+IC5kcm9wZG93bi10b2dnbGUge1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cblxuLmJ0bi1ncm91cC1qdXN0aWZpZWQge1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgd2lkdGg6IDEwMCU7XG4gIHRhYmxlLWxheW91dDogZml4ZWQ7XG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG59XG5cbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bixcbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bi1ncm91cCB7XG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB3aWR0aDogMSU7XG59XG5cbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bi1ncm91cCAuYnRuIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5idG4tZ3JvdXAtanVzdGlmaWVkID4gLmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gIGxlZnQ6IGF1dG87XG59XG5cbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0gPiAuYnRuIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0gPiAuYnRuIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSxcbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0gPiAuYnRuLWdyb3VwID4gLmJ0biBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5bZGF0YS10b2dnbGU9XCJidXR0b25zXCJdID4gLmJ0bi1ncm91cCA+IC5idG4gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBjbGlwOiByZWN0KDAsIDAsIDAsIDApO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmlucHV0LWdyb3VwIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbn1cblxuLmlucHV0LWdyb3VwW2NsYXNzKj1cImNvbC1cIl0ge1xuICBmbG9hdDogbm9uZTtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBwYWRkaW5nLXJpZ2h0OiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuLFxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2wge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb246bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSxcbi5pbnB1dC1ncm91cC1idG46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSxcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgd2lkdGg6IDElO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBwYWRkaW5nOiA2cHggMTJweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICM0NDQ7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24uaW5wdXQtc20sIC5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1zbSA+IC5pbnB1dC1ncm91cC1idG4gPiAuaW5wdXQtZ3JvdXAtYWRkb24uYnRuIHtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb24uaW5wdXQtbGcsIC5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1hZGRvbixcbi5pbnB1dC1ncm91cC1sZyA+IC5pbnB1dC1ncm91cC1idG4gPiAuaW5wdXQtZ3JvdXAtYWRkb24uYnRuIHtcbiAgcGFkZGluZzogMTBweCAxNnB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbi5pbnB1dC1ncm91cC1hZGRvbiBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpmaXJzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXAgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5kcm9wZG93bi10b2dnbGUsXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bi1ncm91cDpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbn1cblxuLmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpsYXN0LWNoaWxkLFxuLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bi1ncm91cCA+IC5idG4sXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG46bm90KDpmaXJzdC1jaGlsZCksXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmb250LXNpemU6IDA7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5pbnB1dC1ncm91cC1idG4gPiAuYnRuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biArIC5idG4ge1xuICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLmlucHV0LWdyb3VwLWJ0biA+IC5idG46aG92ZXIsXG4uaW5wdXQtZ3JvdXAtYnRuID4gLmJ0bjpmb2N1cyxcbi5pbnB1dC1ncm91cC1idG4gPiAuYnRuOmFjdGl2ZSB7XG4gIHotaW5kZXg6IDI7XG59XG5cbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXAge1xuICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG59XG5cbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4sXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuLWdyb3VwIHtcbiAgei1pbmRleDogMjtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5uYXYge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5uYXY6YmVmb3JlLFxuLm5hdjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLm5hdjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4ubmF2ID4gbGkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ubmF2ID4gbGkgPiBhIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMTBweCAxNXB4O1xufVxuXG4ubmF2ID4gbGkgPiBhOmhvdmVyLFxuLm5hdiA+IGxpID4gYTpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLm5hdiA+IGxpLmRpc2FibGVkID4gYSB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4ubmF2ID4gbGkuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLm5hdiA+IGxpLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4ubmF2IC5vcGVuID4gYSxcbi5uYXYgLm9wZW4gPiBhOmhvdmVyLFxuLm5hdiAub3BlbiA+IGE6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItY29sb3I6ICMzYTM5M2I7XG59XG5cbi5uYXYgLm5hdi1kaXZpZGVyIHtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogOXB4IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7XG59XG5cbi5uYXYgPiBsaSA+IGEgPiBpbWcge1xuICBtYXgtd2lkdGg6IG5vbmU7XG59XG5cbi5uYXYtdGFicyB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ubmF2LXRhYnMgPiBsaSB7XG4gIGZsb2F0OiBsZWZ0O1xuICBtYXJnaW4tYm90dG9tOiAtMXB4O1xufVxuXG4ubmF2LXRhYnMgPiBsaSA+IGEge1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7XG59XG5cbi5uYXYtdGFicyA+IGxpID4gYTpob3ZlciB7XG4gIGJvcmRlci1jb2xvcjogI2ZmZiAjZmZmICNkZGQ7XG59XG5cbi5uYXYtdGFicyA+IGxpLmFjdGl2ZSA+IGEsXG4ubmF2LXRhYnMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLFxuLm5hdi10YWJzID4gbGkuYWN0aXZlID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjNDQ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4ubmF2LXBpbGxzID4gbGkge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLm5hdi1waWxscyA+IGxpID4gYSB7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLm5hdi1waWxscyA+IGxpICsgbGkge1xuICBtYXJnaW4tbGVmdDogMnB4O1xufVxuXG4ubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYSxcbi5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLFxuLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLm5hdi1zdGFja2VkID4gbGkge1xuICBmbG9hdDogbm9uZTtcbn1cblxuLm5hdi1zdGFja2VkID4gbGkgKyBsaSB7XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5uYXYtanVzdGlmaWVkLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4ubmF2LWp1c3RpZmllZCA+IGxpLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpIHtcbiAgZmxvYXQ6IG5vbmU7XG59XG5cbi5uYXYtanVzdGlmaWVkID4gbGkgPiBhLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpID4gYSB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4ubmF2LWp1c3RpZmllZCA+IC5kcm9wZG93biAuZHJvcGRvd24tbWVudSB7XG4gIHRvcDogYXV0bztcbiAgbGVmdDogYXV0bztcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXYtanVzdGlmaWVkID4gbGksIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gbGkge1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgd2lkdGg6IDElO1xuICB9XG4gIC5uYXYtanVzdGlmaWVkID4gbGkgPiBhLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpID4gYSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG4ubmF2LXRhYnMtanVzdGlmaWVkLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG59XG5cbi5uYXYtdGFicy1qdXN0aWZpZWQgPiBsaSA+IGEsIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gbGkgPiBhIHtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYSxcbi5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGEsIC5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpob3Zlcixcbi5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cywgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2LXRhYnMtanVzdGlmaWVkID4gbGkgPiBhLCAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IGxpID4gYSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7XG4gIH1cbiAgLm5hdi10YWJzLWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhLFxuICAubmF2LXRhYnMubmF2LWp1c3RpZmllZCA+IC5hY3RpdmUgPiBhLCAubmF2LXRhYnMtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4gIC5uYXYtdGFicy5uYXYtanVzdGlmaWVkID4gLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtdGFicy1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cywgLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2ZmZjtcbiAgfVxufVxuXG4udGFiLWNvbnRlbnQgPiAudGFiLXBhbmUge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4udGFiLWNvbnRlbnQgPiAuYWN0aXZlIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5uYXYtdGFicyAuZHJvcGRvd24tbWVudSB7XG4gIG1hcmdpbi10b3A6IC0xcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4ubmF2YmFyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiA0MHB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBib3JkZXI6IDA7XG59XG5cbi5uYXZiYXI6YmVmb3JlLFxuLm5hdmJhcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLm5hdmJhcjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm5hdmJhciB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4ubmF2YmFyLWhlYWRlcjpiZWZvcmUsXG4ubmF2YmFyLWhlYWRlcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLm5hdmJhci1oZWFkZXI6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItaGVhZGVyIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxufVxuXG4ubmF2YmFyLWNvbGxhcHNlIHtcbiAgb3ZlcmZsb3cteDogdmlzaWJsZTtcbiAgcGFkZGluZy1yaWdodDogMDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO1xuICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG59XG5cbi5uYXZiYXItY29sbGFwc2U6YmVmb3JlLFxuLm5hdmJhci1jb2xsYXBzZTphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLm5hdmJhci1jb2xsYXBzZTphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4ubmF2YmFyLWNvbGxhcHNlLmluIHtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItY29sbGFwc2Uge1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGJvcmRlci10b3A6IDA7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAubmF2YmFyLWNvbGxhcHNlLmNvbGxhcHNlIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm5hdmJhci1jb2xsYXBzZS5pbiB7XG4gICAgb3ZlcmZsb3cteTogdmlzaWJsZTtcbiAgfVxuICAubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNlLFxuICAubmF2YmFyLXN0YXRpYy10b3AgLm5hdmJhci1jb2xsYXBzZSxcbiAgLm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cbn1cblxuLm5hdmJhci1maXhlZC10b3AgLm5hdmJhci1jb2xsYXBzZSxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItY29sbGFwc2Uge1xuICBtYXgtaGVpZ2h0OiAzNDBweDtcbn1cblxuQG1lZGlhIChtYXgtZGV2aWNlLXdpZHRoOiA0ODBweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSB7XG4gIC5uYXZiYXItZml4ZWQtdG9wIC5uYXZiYXItY29sbGFwc2UsXG4gIC5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItY29sbGFwc2Uge1xuICAgIG1heC1oZWlnaHQ6IDIwMHB4O1xuICB9XG59XG5cbi5jb250YWluZXIgPiAubmF2YmFyLWhlYWRlcixcbi5jb250YWluZXIgPiAubmF2YmFyLWNvbGxhcHNlLFxuLmNvbnRhaW5lci1mbHVpZCA+IC5uYXZiYXItaGVhZGVyLFxuLmNvbnRhaW5lci1mbHVpZCA+IC5uYXZiYXItY29sbGFwc2Uge1xuICBtYXJnaW4tcmlnaHQ6IDA7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmNvbnRhaW5lciA+IC5uYXZiYXItaGVhZGVyLFxuICAuY29udGFpbmVyID4gLm5hdmJhci1jb2xsYXBzZSxcbiAgLmNvbnRhaW5lci1mbHVpZCA+IC5uYXZiYXItaGVhZGVyLFxuICAuY29udGFpbmVyLWZsdWlkID4gLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi5uYXZiYXItc3RhdGljLXRvcCB7XG4gIHotaW5kZXg6IDEwMDA7XG4gIGJvcmRlci13aWR0aDogMCAwIDFweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItc3RhdGljLXRvcCB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4ubmF2YmFyLWZpeGVkLXRvcCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICByaWdodDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTAzMDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItZml4ZWQtdG9wLFxuICAubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4ubmF2YmFyLWZpeGVkLXRvcCB7XG4gIHRvcDogMDtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4O1xufVxuXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gIGJvdHRvbTogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgYm9yZGVyLXdpZHRoOiAxcHggMCAwO1xufVxuXG4ubmF2YmFyLWJyYW5kIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMCAwIDAgLTgwcHg7XG4gIHBhZGRpbmc6IDAgMCAwIDgwcHg7XG4gIGhlaWdodDogNTVweDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKFwiLi4vaW1hZ2VzL3RoZW1lLWRlZmF1bHQvbG9nby13aGl0ZS5wbmdcIikgbm8tcmVwZWF0IDI0cHggM3B4O1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhTmV1ZUJvbGRcIiwgXCJIZWx2ZXRpY2FOZXVlLUJvbGRcIiwgXCJIZWx2ZXRpY2FOZXVlIEJvbGRcIiwgXCJIZWx2ZXRpY2EgTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogNjAwO1xuICBmb250LXNpemU6IDEuNTcxZW07XG4gIGxpbmUtaGVpZ2h0OiA1NXB4O1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4ubmF2YmFyLWJyYW5kOmhvdmVyLFxuLm5hdmJhci1icmFuZDpmb2N1cyB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLm5hdmJhci1icmFuZCA+IGltZyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm5hdmJhciA+IC5jb250YWluZXIgLm5hdmJhci1icmFuZCxcbiAgLm5hdmJhciA+IC5jb250YWluZXItZmx1aWQgLm5hdmJhci1icmFuZCB7XG4gICAgbWFyZ2luLWxlZnQ6IC04MHB4O1xuICB9XG59XG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbG9hdDogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogMDtcbiAgcGFkZGluZzogOXB4IDEwcHg7XG4gIG1hcmdpbi10b3A6IDNweDtcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLm5hdmJhci10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4ubmF2YmFyLXRvZ2dsZSAuaWNvbi1iYXIge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDIycHg7XG4gIGhlaWdodDogMnB4O1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG59XG5cbi5uYXZiYXItdG9nZ2xlIC5pY29uLWJhciArIC5pY29uLWJhciB7XG4gIG1hcmdpbi10b3A6IDRweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItdG9nZ2xlIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi5uYXZiYXItbmF2IHtcbiAgbWFyZ2luOiA1cHggMDtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IGEge1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDQwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2EgTmV1ZSBMVCBXMUcgNTUgUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZSBMVCBXMUdcIiwgXCJIZWx2ZXRpY2FOZXVlIFJvbWFuXCIsIFwiSGVsdmV0aWNhTmV1ZS1Sb21hblwiLCBcIkhlbHZldGljYSBOZXVlIFJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEzcHQ7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiBhID4gLmZhIHtcbiAgZm9udC1zaXplOiAyNnB4O1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gYS5kcm9wZG93bi10b2dnbGUge1xuICBwYWRkaW5nLXJpZ2h0OiAyMnB4O1xuICBwYWRkaW5nLWxlZnQ6IDIycHg7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xuICAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSB7XG4gICAgcG9zaXRpb246IHN0YXRpYztcbiAgICBmbG9hdDogbm9uZTtcbiAgICB3aWR0aDogYXV0bztcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogMDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG4gIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhLFxuICAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taGVhZGVyIHtcbiAgICBwYWRkaW5nOiA1cHggMTVweCA1cHggMjVweDtcbiAgfVxuICAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIH1cbiAgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6aG92ZXIsXG4gIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLW5hdiB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luOiAwO1xuICB9XG4gIC5uYXZiYXItbmF2ID4gbGkge1xuICAgIGZsb2F0OiBsZWZ0O1xuICB9XG4gIC5uYXZiYXItbmF2ID4gbGkgPiBhIHtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbiAgfVxufVxuXG4ubmF2YmFyLWZvcm0ge1xuICBtYXJnaW4tbGVmdDogMDtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xuICBwYWRkaW5nOiAxMHB4IDA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO1xuICBtYXJnaW4tdG9wOiAzcHg7XG4gIG1hcmdpbi1ib3R0b206IDNweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItZm9ybSAuZm9ybS1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuICAubmF2YmFyLWZvcm0gLmZvcm0tY29udHJvbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCB7XG4gICAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYWRkb24sXG4gIC5uYXZiYXItZm9ybSAuaW5wdXQtZ3JvdXAgLmlucHV0LWdyb3VwLWJ0bixcbiAgLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgICB3aWR0aDogYXV0bztcbiAgfVxuICAubmF2YmFyLWZvcm0gLmlucHV0LWdyb3VwID4gLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5jb250cm9sLWxhYmVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cbiAgLm5hdmJhci1mb3JtIC5yYWRpbyxcbiAgLm5hdmJhci1mb3JtIC5jaGVja2JveCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG4gIC5uYXZiYXItZm9ybSAucmFkaW8gbGFiZWwsXG4gIC5uYXZiYXItZm9ybSAuY2hlY2tib3ggbGFiZWwge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgfVxuICAubmF2YmFyLWZvcm0gLnJhZGlvIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgLm5hdmJhci1mb3JtIC5jaGVja2JveCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxuICAubmF2YmFyLWZvcm0gLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC5uYXZiYXItZm9ybSAuZm9ybS1ncm91cCB7XG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICB9XG4gIC5uYXZiYXItZm9ybSAuZm9ybS1ncm91cDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLWZvcm0ge1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgcGFkZGluZy10b3A6IDA7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IGEuZHJvcGRvd24tdG9nZ2xlID4gLmNhcmV0IHtcbiAgYm9yZGVyLXRvcDogMDtcbiAgYm9yZGVyLWxlZnQ6IDA7XG4gIGJvcmRlci1yaWdodDogMDtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIHdpZHRoOiA0MHB4O1xuICBoZWlnaHQ6IDM5cHg7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiBhLmRyb3Bkb3duLXRvZ2dsZSA+IC5jYXJldDpiZWZvcmUge1xuICBjb250ZW50OiAnXFxmMDc4JztcbiAgZm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgMTRweC8xIEZvbnRBd2Vzb21lO1xuICBmb250LXNpemU6IDEzcHg7XG4gIHRleHQtcmVuZGVyaW5nOiBhdXRvO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgY29sb3I6ICNmZmY7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAyNHB4O1xuICBtYXJnaW4tbGVmdDogMTRweDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkuZHJvcGRvd24ub3BlbiA+IGEgPiAuY2FyZXQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpLmRyb3Bkb3duLm9wZW4gPiBhID4gLmNhcmV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICdcXGYwNzcnO1xufVxuXG4ubmF2YmFyLXJpZ2h0ID4gbGkgPiBhIHtcbiAgaGVpZ2h0OiA0OXB4O1xufVxuXG4ubmF2YmFyLXJpZ2h0ID4gbGkgPiBhIC5mYSB7XG4gIG1hcmdpbi1yaWdodDogMTVweDtcbn1cblxuLm5hdmJhci1yaWdodCA+IGxpID4gYSAudG9wYmFyLXRleHQsIC5uYXZiYXItcmlnaHQgPiBsaSA+IGEgLmNhcmV0LCAubmF2YmFyLXJpZ2h0ID4gbGkgPiBhIC5mYSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbi10b3A6IDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAvKiBUcmFjayAqL1xuICAvKiBIYW5kbGUgKi9cbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhLFxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51ID4gbGkgPiBzcGFuIHtcbiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhTmV1ZU1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWUtTWVkaXVtXCIsIFwiSGVsdmV0aWNhIE5ldWUgTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEzcHQ7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBwYWRkaW5nOiA3cHggMzBweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgIzJlMmUyZTtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCAwcHggIzQwNDA0MjtcbiAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDFweCAwcHggMHB4ICM0MDQwNDI7XG4gIGNsZWFyOiBib3RoO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6aG92ZXIsXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6Zm9jdXMsXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IHNwYW46aG92ZXIsXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IHNwYW46Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEgPiAuZmEge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBmb250LXNpemU6IDI2cHg7XG4gIG1hcmdpbi1yaWdodDogMTVweDtcbiAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUgPiBsaS5jcml0aWNhbCA+IGEge1xuICBiYWNrZ3JvdW5kOiAjZDkxODJkO1xufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnU6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDEycHg7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCA2cHggcmdiYSgwLCAwLCAwLCAwLjMpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDAgNnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbn1cblxuLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYmFja2dyb3VuZDogIzc5Nzk3OTtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjQjNCM0IzO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDZweCAxcHggNnB4ICM5ZTllOWU7XG4gIGJveC1zaGFkb3c6IGluc2V0IDZweCAxcHggNnB4ICM5ZTllOWU7XG59XG5cbi5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbn1cblxuLm5hdmJhci1idG4ge1xuICBtYXJnaW4tdG9wOiAzcHg7XG4gIG1hcmdpbi1ib3R0b206IDNweDtcbn1cblxuLm5hdmJhci1idG4uYnRuLXNtLCAuYnRuLWdyb3VwLXNtID4gLm5hdmJhci1idG4uYnRuIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5uYXZiYXItYnRuLmJ0bi14cywgLmJ0bi1ncm91cC14cyA+IC5uYXZiYXItYnRuLmJ0biB7XG4gIG1hcmdpbi10b3A6IDlweDtcbiAgbWFyZ2luLWJvdHRvbTogOXB4O1xufVxuXG4ubmF2YmFyLXRleHQge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm5hdmJhci10ZXh0IHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5uYXZiYXItbGVmdCB7XG4gICAgZmxvYXQ6IGxlZnQgIWltcG9ydGFudDtcbiAgfVxuICAubmF2YmFyLXJpZ2h0IHtcbiAgICBmbG9hdDogcmlnaHQgIWltcG9ydGFudDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gIH1cbiAgLm5hdmJhci1yaWdodCB+IC5uYXZiYXItcmlnaHQge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG4ubmF2YmFyLWRlZmF1bHQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xuICBib3JkZXItY29sb3I6ICMzYTM5M2I7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItYnJhbmQ6Zm9jdXMge1xuICBjb2xvcjogI2U2ZTZlNjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRleHQge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gbGkgPiBhIHtcbiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gIGZvbnQtc2l6ZTogMTNwdDtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhTmV1ZUJvbGRcIiwgXCJIZWx2ZXRpY2FOZXVlLUJvbGRcIiwgXCJIZWx2ZXRpY2FOZXVlIEJvbGRcIiwgXCJIZWx2ZXRpY2EgTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBtaW4td2lkdGg6IDE5MHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGhlaWdodDogNDBweDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gbGkgPiBhOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gbGkgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiBsaSA+IGEgLmRpZ2l0LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIG1hcmdpbi10b3A6IC0ycHg7XG4gIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gIGJhY2tncm91bmQ6ICM1NTU7XG4gIGJvcmRlcjogMnB4IHNvbGlkICM1NTU7XG4gIGNvbG9yOiAjZmZmO1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2FOZXVlTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZS1NZWRpdW1cIiwgXCJIZWx2ZXRpY2EgTmV1ZSBNZWRpdW1cIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCA4cHg7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEgLmRpZ2l0LWNvbnRhaW5lciB7XG4gIGJvcmRlci1jb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5kaXNhYmxlZCA+IGEsXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgY29sb3I6ICM5OTk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuZGlzYWJsZWQgPiBhIC5kaWdpdC1jb250YWluZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5ob3N0LFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEuaG9zdDpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLmhvc3Q6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA4YWJmICFpbXBvcnRhbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLmd1ZXN0cyxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLmd1ZXN0czpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLmd1ZXN0czpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM4Y2M2M2YgIWltcG9ydGFudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEudGVtcGxhdGVzLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEudGVtcGxhdGVzOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEudGVtcGxhdGVzOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwYTZhMCAhaW1wb3J0YW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5zdG9yYWdlLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEuc3RvcmFnZTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLnN0b3JhZ2U6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmViODEzICFpbXBvcnRhbnQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLm5ldHdvcmssXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5uZXR3b3JrOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEubmV0d29yazpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM3ZjFjN2QgIWltcG9ydGFudDtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGEuYWRtaW5pc3RyYXRpb24sXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYS5hZG1pbmlzdHJhdGlvbjpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhLmFkbWluaXN0cmF0aW9uOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5MTgyZCAhaW1wb3J0YW50O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuaG9zdG5hbWUge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDhweCAwO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICB3aWR0aDogMTgwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDI0cHg7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgPiAuaG9zdG5hbWUgLmhvc3QtbG9jYXRpb24ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhIE5ldWUgTFQgVzFHIDU1IFJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWUgTFQgVzFHXCIsIFwiSGVsdmV0aWNhTmV1ZSBSb21hblwiLCBcIkhlbHZldGljYU5ldWUtUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZSBSb21hblwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTNwdDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGUge1xuICBib3JkZXItY29sb3I6ICNkZGQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRvZ2dsZTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRvZ2dsZTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRvZ2dsZSAuaWNvbi1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4O1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1jb2xsYXBzZSxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWZvcm0ge1xuICBib3JkZXItY29sb3I6ICMzYTM5M2I7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5vcGVuID4gYSxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5vcGVuID4gYTpob3Zlcixcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiA+IC5vcGVuID4gYTpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogI2ZmZjtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gICAgY29sb3I6ICNmZmY7XG4gIH1cbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmhvdmVyLFxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhLFxuICAubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYTpob3ZlcixcbiAgLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGEsXG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsXG4gIC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjOTk5O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG59XG5cbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWxpbmsge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbGluazpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbms6aG92ZXIsXG4ubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbmtbZGlzYWJsZWRdOmhvdmVyLFxuLm5hdmJhci1kZWZhdWx0IC5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLm5hdmJhci1kZWZhdWx0IC5idG4tbGluazpob3ZlcixcbmZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmZvY3VzIHtcbiAgY29sb3I6ICM5OTk7XG59XG5cbi5uYXZiYXItaW52ZXJzZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMjI7XG4gIGJvcmRlci1jb2xvcjogIzIyMjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItYnJhbmQge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItYnJhbmQ6aG92ZXIsXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1icmFuZDpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdGV4dCB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiBsaSA+IGEge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gbGkgPiBhOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gbGkgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiAuYWN0aXZlID4gYSxcbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiA+IC5kaXNhYmxlZCA+IGEsXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlIHtcbiAgYm9yZGVyLWNvbG9yOiAjMzMzO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGU6aG92ZXIsXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGU6Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlIC5pY29uLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWNvbGxhcHNlLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItZm9ybSB7XG4gIGJvcmRlci1jb2xvcjogIzEwMTAxMDtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLm9wZW4gPiBhLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLm9wZW4gPiBhOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2ID4gLm9wZW4gPiBhOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAjMjIyO1xuICB9XG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSAuZGl2aWRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzIyMjtcbiAgfVxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICAgIGNvbG9yOiAjZmZmO1xuICB9XG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IGxpID4gYTpob3ZlcixcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSxcbiAgLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4gIC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhLFxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuICAubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHtcbiAgICBjb2xvcjogIzk5OTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxufVxuXG4ubmF2YmFyLWludmVyc2UgLm5hdmJhci1saW5rIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWxpbms6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLm5hdmJhci1pbnZlcnNlIC5idG4tbGluayB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rOmhvdmVyLFxuLm5hdmJhci1pbnZlcnNlIC5idG4tbGluazpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rW2Rpc2FibGVkXTpob3Zlcixcbi5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbmtbZGlzYWJsZWRdOmZvY3VzLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6aG92ZXIsXG5maWVsZHNldFtkaXNhYmxlZF0gLm5hdmJhci1pbnZlcnNlIC5idG4tbGluazpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4uYnJlYWRjcnVtYiB7XG4gIHBhZGRpbmc6IDhweCAxNXB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5icmVhZGNydW1iID4gbGkge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5icmVhZGNydW1iID4gbGkgKyBsaTpiZWZvcmUge1xuICBjb250ZW50OiBcIi9cXFxcMDBhMFwiO1xuICBwYWRkaW5nOiAwIDVweDtcbiAgY29sb3I6ICNjY2M7XG59XG5cbi5icmVhZGNydW1iID4gLmFjdGl2ZSB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4ucGFnaW5hdGlvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBtYXJnaW46IDIwcHggMDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4ucGFnaW5hdGlvbiA+IGxpIHtcbiAgZGlzcGxheTogaW5saW5lO1xufVxuXG4ucGFnaW5hdGlvbiA+IGxpID4gYSxcbi5wYWdpbmF0aW9uID4gbGkgPiBzcGFuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbG9hdDogbGVmdDtcbiAgcGFkZGluZzogNnB4IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzNhMzkzYjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5wYWdpbmF0aW9uID4gbGk6Zmlyc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24gPiBsaTpmaXJzdC1jaGlsZCA+IHNwYW4ge1xuICBtYXJnaW4tbGVmdDogMDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYWdpbmF0aW9uID4gbGk6bGFzdC1jaGlsZCA+IGEsXG4ucGFnaW5hdGlvbiA+IGxpOmxhc3QtY2hpbGQgPiBzcGFuIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDNweDtcbn1cblxuLnBhZ2luYXRpb24gPiBsaSA+IGE6aG92ZXIsXG4ucGFnaW5hdGlvbiA+IGxpID4gYTpmb2N1cyxcbi5wYWdpbmF0aW9uID4gbGkgPiBzcGFuOmhvdmVyLFxuLnBhZ2luYXRpb24gPiBsaSA+IHNwYW46Zm9jdXMge1xuICB6LWluZGV4OiAzO1xuICBjb2xvcjogIzE0MTMxNDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xufVxuXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBhLFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gYTpob3Zlcixcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IGE6Zm9jdXMsXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBzcGFuLFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gc3Bhbjpob3Zlcixcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IHNwYW46Zm9jdXMge1xuICB6LWluZGV4OiAyO1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5wYWdpbmF0aW9uID4gLmRpc2FibGVkID4gc3Bhbixcbi5wYWdpbmF0aW9uID4gLmRpc2FibGVkID4gc3Bhbjpob3Zlcixcbi5wYWdpbmF0aW9uID4gLmRpc2FibGVkID4gc3Bhbjpmb2N1cyxcbi5wYWdpbmF0aW9uID4gLmRpc2FibGVkID4gYSxcbi5wYWdpbmF0aW9uID4gLmRpc2FibGVkID4gYTpob3Zlcixcbi5wYWdpbmF0aW9uID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItY29sb3I6ICNkZGQ7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5wYWdpbmF0aW9uLWxnID4gbGkgPiBhLFxuLnBhZ2luYXRpb24tbGcgPiBsaSA+IHNwYW4ge1xuICBwYWRkaW5nOiAxMHB4IDE2cHg7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDEuMzMzMzMzMztcbn1cblxuLnBhZ2luYXRpb24tbGcgPiBsaTpmaXJzdC1jaGlsZCA+IGEsXG4ucGFnaW5hdGlvbi1sZyA+IGxpOmZpcnN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG4ucGFnaW5hdGlvbi1sZyA+IGxpOmxhc3QtY2hpbGQgPiBhLFxuLnBhZ2luYXRpb24tbGcgPiBsaTpsYXN0LWNoaWxkID4gc3BhbiB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYWdpbmF0aW9uLXNtID4gbGkgPiBhLFxuLnBhZ2luYXRpb24tc20gPiBsaSA+IHNwYW4ge1xuICBwYWRkaW5nOiA1cHggMTBweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xufVxuXG4ucGFnaW5hdGlvbi1zbSA+IGxpOmZpcnN0LWNoaWxkID4gYSxcbi5wYWdpbmF0aW9uLXNtID4gbGk6Zmlyc3QtY2hpbGQgPiBzcGFuIHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7XG59XG5cbi5wYWdpbmF0aW9uLXNtID4gbGk6bGFzdC1jaGlsZCA+IGEsXG4ucGFnaW5hdGlvbi1zbSA+IGxpOmxhc3QtY2hpbGQgPiBzcGFuIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDNweDtcbn1cblxuLnBhZ2VyIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBtYXJnaW46IDIwcHggMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4ucGFnZXI6YmVmb3JlLFxuLnBhZ2VyOmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4ucGFnZXI6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLnBhZ2VyIGxpIHtcbiAgZGlzcGxheTogaW5saW5lO1xufVxuXG4ucGFnZXIgbGkgPiBhLFxuLnBhZ2VyIGxpID4gc3BhbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZzogNXB4IDE0cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDE1cHg7XG59XG5cbi5wYWdlciBsaSA+IGE6aG92ZXIsXG4ucGFnZXIgbGkgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4ucGFnZXIgLm5leHQgPiBhLFxuLnBhZ2VyIC5uZXh0ID4gc3BhbiB7XG4gIGZsb2F0OiByaWdodDtcbn1cblxuLnBhZ2VyIC5wcmV2aW91cyA+IGEsXG4ucGFnZXIgLnByZXZpb3VzID4gc3BhbiB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4ucGFnZXIgLmRpc2FibGVkID4gYSxcbi5wYWdlciAuZGlzYWJsZWQgPiBhOmhvdmVyLFxuLnBhZ2VyIC5kaXNhYmxlZCA+IGE6Zm9jdXMsXG4ucGFnZXIgLmRpc2FibGVkID4gc3BhbiB7XG4gIGNvbG9yOiAjOTk5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4ubGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmU7XG4gIHBhZGRpbmc6IDAuMmVtIDAuNmVtIDAuM2VtO1xuICBmb250LXNpemU6IDc1JTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIGJvcmRlci1yYWRpdXM6IC4yNWVtO1xufVxuXG4ubGFiZWw6ZW1wdHkge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uYnRuIC5sYWJlbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMXB4O1xufVxuXG5hLmxhYmVsOmhvdmVyLFxuYS5sYWJlbDpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmxhYmVsLWRlZmF1bHQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5O1xufVxuXG4ubGFiZWwtZGVmYXVsdFtocmVmXTpob3Zlcixcbi5sYWJlbC1kZWZhdWx0W2hyZWZdOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcbn1cblxuLmxhYmVsLXByaW1hcnkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ubGFiZWwtcHJpbWFyeVtocmVmXTpob3Zlcixcbi5sYWJlbC1wcmltYXJ5W2hyZWZdOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxMjAyMTtcbn1cblxuLmxhYmVsLXN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWNiODVjO1xufVxuXG4ubGFiZWwtc3VjY2Vzc1tocmVmXTpob3Zlcixcbi5sYWJlbC1zdWNjZXNzW2hyZWZdOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0OWQ0NDtcbn1cblxuLmxhYmVsLWluZm8ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWJjMGRlO1xufVxuXG4ubGFiZWwtaW5mb1tocmVmXTpob3Zlcixcbi5sYWJlbC1pbmZvW2hyZWZdOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMxYjBkNTtcbn1cblxuLmxhYmVsLXdhcm5pbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBhZDRlO1xufVxuXG4ubGFiZWwtd2FybmluZ1tocmVmXTpob3Zlcixcbi5sYWJlbC13YXJuaW5nW2hyZWZdOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjOTcxZjtcbn1cblxuLmxhYmVsLWRhbmdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7XG59XG5cbi5sYWJlbC1kYW5nZXJbaHJlZl06aG92ZXIsXG4ubGFiZWwtZGFuZ2VyW2hyZWZdOmZvY3VzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M5MzAyYztcbn1cblxuLmJhZGdlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtaW4td2lkdGg6IDEwcHg7XG4gIHBhZGRpbmc6IDNweCA3cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmO1xuICBsaW5lLWhlaWdodDogMTtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5O1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xufVxuXG4uYmFkZ2U6ZW1wdHkge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uYnRuIC5iYWRnZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMXB4O1xufVxuXG4uYnRuLXhzIC5iYWRnZSxcbi5idG4tZ3JvdXAteHMgPiAuYnRuIC5iYWRnZSxcbi5idG4tZ3JvdXAteHMgPiAuYnRuIC5iYWRnZSB7XG4gIHRvcDogMDtcbiAgcGFkZGluZzogMXB4IDVweDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgPiAuYmFkZ2UsXG4ubmF2LXBpbGxzID4gLmFjdGl2ZSA+IGEgPiAuYmFkZ2Uge1xuICBjb2xvcjogIzNhMzkzYjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSA+IC5iYWRnZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSA+IC5iYWRnZSArIC5iYWRnZSB7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxuXG4ubmF2LXBpbGxzID4gbGkgPiBhID4gLmJhZGdlIHtcbiAgbWFyZ2luLWxlZnQ6IDNweDtcbn1cblxuYS5iYWRnZTpob3ZlcixcbmEuYmFkZ2U6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5qdW1ib3Ryb24ge1xuICBwYWRkaW5nLXRvcDogMzBweDtcbiAgcGFkZGluZy1ib3R0b206IDMwcHg7XG4gIG1hcmdpbi1ib3R0b206IDMwcHg7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4uanVtYm90cm9uIGgxLFxuLmp1bWJvdHJvbiAuaDEge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmp1bWJvdHJvbiBwIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbiAgZm9udC1zaXplOiAyMXB4O1xuICBmb250LXdlaWdodDogMjAwO1xufVxuXG4uanVtYm90cm9uID4gaHIge1xuICBib3JkZXItdG9wLWNvbG9yOiAjZTZlNmU2O1xufVxuXG4uY29udGFpbmVyIC5qdW1ib3Ryb24sXG4uY29udGFpbmVyLWZsdWlkIC5qdW1ib3Ryb24ge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5qdW1ib3Ryb24gLmNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmp1bWJvdHJvbiB7XG4gICAgcGFkZGluZy10b3A6IDQ4cHg7XG4gICAgcGFkZGluZy1ib3R0b206IDQ4cHg7XG4gIH1cbiAgLmNvbnRhaW5lciAuanVtYm90cm9uLFxuICAuY29udGFpbmVyLWZsdWlkIC5qdW1ib3Ryb24ge1xuICAgIHBhZGRpbmctbGVmdDogNjBweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA2MHB4O1xuICB9XG4gIC5qdW1ib3Ryb24gaDEsXG4gIC5qdW1ib3Ryb24gLmgxIHtcbiAgICBmb250LXNpemU6IDYzcHg7XG4gIH1cbn1cblxuLnRodW1ibmFpbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiA0cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LXRyYW5zaXRpb246IGJvcmRlciAwLjJzIGVhc2UtaW4tb3V0O1xuICAtby10cmFuc2l0aW9uOiBib3JkZXIgMC4ycyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogYm9yZGVyIDAuMnMgZWFzZS1pbi1vdXQ7XG59XG5cbi50aHVtYm5haWwgPiBpbWcsXG4udGh1bWJuYWlsIGEgPiBpbWcge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG5cbi50aHVtYm5haWwgLmNhcHRpb24ge1xuICBwYWRkaW5nOiA5cHg7XG4gIGNvbG9yOiAjMjIyO1xufVxuXG5hLnRodW1ibmFpbDpob3ZlcixcbmEudGh1bWJuYWlsOmZvY3VzLFxuYS50aHVtYm5haWwuYWN0aXZlIHtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4uYWxlcnQge1xuICBwYWRkaW5nOiA4cHggMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5hbGVydCBoNCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uYWxlcnQgLmFsZXJ0LWxpbmsge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmFsZXJ0ID4gcCxcbi5hbGVydCA+IHVsIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmFsZXJ0ID4gcCArIHAge1xuICBtYXJnaW4tdG9wOiA1cHg7XG59XG5cbi5hbGVydC1kaXNtaXNzYWJsZSwgLmFsZXJ0LWRpc21pc3NpYmxlIHtcbiAgcGFkZGluZy1yaWdodDogOHB4IDE1cHgyMDtcbn1cblxuLmFsZXJ0LWRpc21pc3NhYmxlIC5jbG9zZSwgLmFsZXJ0LWRpc21pc3NpYmxlIC5jbG9zZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMnB4O1xuICByaWdodDogLTIxcHg7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uYWxlcnQtc3VjY2VzcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWU2Y2I7XG4gIGJvcmRlci1jb2xvcjogIzhjYzYzZjtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbi5hbGVydC1zdWNjZXNzIGhyIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogIzdmYjYzNjtcbn1cblxuLmFsZXJ0LXN1Y2Nlc3MgLmFsZXJ0LWxpbmsge1xuICBjb2xvcjogIzUyNTI1Mjtcbn1cblxuLmFsZXJ0LWluZm8ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xuICBib3JkZXItY29sb3I6ICMwMDhhYmY7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG4uYWxlcnQtaW5mbyBociB7XG4gIGJvcmRlci10b3AtY29sb3I6ICMwMDc4YTY7XG59XG5cbi5hbGVydC1pbmZvIC5hbGVydC1saW5rIHtcbiAgY29sb3I6ICM1MjUyNTI7XG59XG5cbi5hbGVydC13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZTNjMjtcbiAgYm9yZGVyLWNvbG9yOiAjZmRiODEzO1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuLmFsZXJ0LXdhcm5pbmcgaHIge1xuICBib3JkZXItdG9wLWNvbG9yOiAjZjRhZDAyO1xufVxuXG4uYWxlcnQtd2FybmluZyAuYWxlcnQtbGluayB7XG4gIGNvbG9yOiAjNTI1MjUyO1xufVxuXG4uYWxlcnQtZGFuZ2VyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VhYzNjNztcbiAgYm9yZGVyLWNvbG9yOiAjZDkxODJkO1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuLmFsZXJ0LWRhbmdlciBociB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNjMjE1Mjg7XG59XG5cbi5hbGVydC1kYW5nZXIgLmFsZXJ0LWxpbmsge1xuICBjb2xvcjogIzUyNTI1Mjtcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVzIHtcbiAgZnJvbSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogNDBweCAwO1xuICB9XG4gIHRvIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlcyB7XG4gIGZyb20ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDtcbiAgfVxuICB0byB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwO1xuICB9XG59XG5cbi5wcm9ncmVzcyB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGhlaWdodDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG59XG5cbi5wcm9ncmVzcy1iYXIge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAwLjZzIGVhc2U7XG4gIC1vLXRyYW5zaXRpb246IHdpZHRoIDAuNnMgZWFzZTtcbiAgdHJhbnNpdGlvbjogd2lkdGggMC42cyBlYXNlO1xufVxuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLFxuLnByb2dyZXNzLWJhci1zdHJpcGVkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDQwcHggNDBweDtcbn1cblxuLnByb2dyZXNzLmFjdGl2ZSAucHJvZ3Jlc3MtYmFyLFxuLnByb2dyZXNzLWJhci5hY3RpdmUge1xuICAtd2Via2l0LWFuaW1hdGlvbjogcHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlO1xuICAtby1hbmltYXRpb246IHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTtcbiAgYW5pbWF0aW9uOiBwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGU7XG59XG5cbi5wcm9ncmVzcy1iYXItc3VjY2VzcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1Y2I4NWM7XG59XG5cbi5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItc3VjY2VzcyB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbn1cblxuLnByb2dyZXNzLWJhci1pbmZvIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzViYzBkZTtcbn1cblxuLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci1pbmZvIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLXdhcm5pbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBhZDRlO1xufVxuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLXdhcm5pbmcge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG59XG5cbi5wcm9ncmVzcy1iYXItZGFuZ2VyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5NTM0Zjtcbn1cblxuLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci1kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG59XG5cbi5tZWRpYSB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG59XG5cbi5tZWRpYTpmaXJzdC1jaGlsZCB7XG4gIG1hcmdpbi10b3A6IDA7XG59XG5cbi5tZWRpYSxcbi5tZWRpYS1ib2R5IHtcbiAgem9vbTogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLm1lZGlhLWJvZHkge1xuICB3aWR0aDogMTAwMDBweDtcbn1cblxuLm1lZGlhLW9iamVjdCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ubWVkaWEtb2JqZWN0LmltZy10aHVtYm5haWwge1xuICBtYXgtd2lkdGg6IG5vbmU7XG59XG5cbi5tZWRpYS1yaWdodCxcbi5tZWRpYSA+IC5wdWxsLXJpZ2h0IHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYSA+IC5wdWxsLWxlZnQge1xuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYS1yaWdodCxcbi5tZWRpYS1ib2R5IHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxuLm1lZGlhLW1pZGRsZSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5tZWRpYS1ib3R0b20ge1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4ubWVkaWEtaGVhZGluZyB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLm1lZGlhLWxpc3Qge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5saXN0LWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMTBweCAxNXB4O1xuICBtYXJnaW4tYm90dG9tOiAtMXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDNweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4O1xufVxuXG4ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGQge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIGNvbG9yOiAjNTU1O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbSAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIGNvbG9yOiAjMzMzO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbTpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbTpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW06Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuXG5idXR0b24ubGlzdC1ncm91cC1pdGVtIHtcbiAgd2lkdGg6IDEwMCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQsXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmhvdmVyLFxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpmb2N1cyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiAjOTk5O1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpmb2N1cyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZCAubGlzdC1ncm91cC1pdGVtLXRleHQsXG4ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCxcbi5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgY29sb3I6ICM5OTk7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyB7XG4gIHotaW5kZXg6IDI7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzOTNiO1xuICBib3JkZXItY29sb3I6ICMzYTM5M2I7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nID4gLnNtYWxsLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nID4gc21hbGwsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcgPiAuc21hbGwsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcgPiBzbWFsbCxcbi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSAubGlzdC1ncm91cC1pdGVtLXRleHQsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLXRleHQsXG4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyAubGlzdC1ncm91cC1pdGVtLXRleHQge1xuICBjb2xvcjogI2EwOWVhMjtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWU2Y2I7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3Mge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2VzcyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3M6aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzOmZvY3VzIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjZWRlYmE7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlLFxuYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmUsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlOmhvdmVyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmM2YzZjO1xuICBib3JkZXItY29sb3I6ICM2YzZjNmM7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0taW5mbyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvIHtcbiAgY29sb3I6ICM2YzZjNmM7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWluZm8gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0taW5mbzpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mbzpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mbzpmb2N1cyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzRlM2YzO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZSxcbmEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmU6Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZTpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmU6Zm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNmM2YztcbiAgYm9yZGVyLWNvbG9yOiAjNmM2YzZjO1xufVxuXG4ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZTNjMjtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZzpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6Zm9jdXMge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZDlhZDtcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmUsXG5hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpob3ZlcixcbmEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlOmZvY3VzLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZSxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmU6aG92ZXIsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICM2YzZjNmM7XG4gIGJvcmRlci1jb2xvcjogIzZjNmM2Yztcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VhYzNjNztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLFxuYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIge1xuICBjb2xvcjogIzZjNmM2Yztcbn1cblxuYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG5hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6aG92ZXIsXG5hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6Zm9jdXMsXG5idXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyOmZvY3VzIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlM2IwYjU7XG59XG5cbmEubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmUsXG5hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlOmhvdmVyLFxuYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZTpmb2N1cyxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZSxcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZTpob3ZlcixcbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZTpmb2N1cyB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmM2YzZjO1xuICBib3JkZXItY29sb3I6ICM2YzZjNmM7XG59XG5cbi5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbn1cblxuLnBhbmVsIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG59XG5cbi5wYW5lbC1ib2R5IHtcbiAgcGFkZGluZzogMTVweDtcbn1cblxuLnBhbmVsLWJvZHk6YmVmb3JlLFxuLnBhbmVsLWJvZHk6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5wYW5lbC1ib2R5OmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG59XG5cbi5wYW5lbC1oZWFkaW5nIHtcbiAgcGFkZGluZzogMTBweCAxNXB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDtcbn1cblxuLnBhbmVsLWhlYWRpbmcgPiAuZHJvcGRvd24gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4ucGFuZWwtdGl0bGUge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4ucGFuZWwtdGl0bGUgPiBhLFxuLnBhbmVsLXRpdGxlID4gc21hbGwsXG4ucGFuZWwtdGl0bGUgPiAuc21hbGwsXG4ucGFuZWwtdGl0bGUgPiBzbWFsbCA+IGEsXG4ucGFuZWwtdGl0bGUgPiAuc21hbGwgPiBhIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5wYW5lbC1mb290ZXIge1xuICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7XG59XG5cbi5wYW5lbCA+IC5saXN0LWdyb3VwLFxuLnBhbmVsID4gLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucGFuZWwgPiAubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVtLFxuLnBhbmVsID4gLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIGJvcmRlci13aWR0aDogMXB4IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi5wYW5lbCA+IC5saXN0LWdyb3VwOmZpcnN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cDpmaXJzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcDogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAubGlzdC1ncm91cDpsYXN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC5wYW5lbC1jb2xsYXBzZSA+IC5saXN0LWdyb3VwOmxhc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cblxuLnBhbmVsLWhlYWRpbmcgKyAubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbn1cblxuLmxpc3QtZ3JvdXAgKyAucGFuZWwtZm9vdGVyIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUsXG4ucGFuZWwgPiAucGFuZWwtY29sbGFwc2UgPiAudGFibGUge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUgY2FwdGlvbixcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlIGNhcHRpb24sXG4ucGFuZWwgPiAucGFuZWwtY29sbGFwc2UgPiAudGFibGUgY2FwdGlvbiB7XG4gIHBhZGRpbmctbGVmdDogMTVweDtcbiAgcGFkZGluZy1yaWdodDogMTVweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0aGVhZDpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRoZWFkOmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkID4gdGhlYWQ6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQgPiAudGFibGU6Zmlyc3QtY2hpbGQgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZCA+IC50YWJsZTpmaXJzdC1jaGlsZCA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4O1xufVxuXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7XG59XG5cbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDtcbn1cblxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Ym9keTpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGJvZHk6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCA+IHRib2R5Omxhc3QtY2hpbGQgPiB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQgPiB0Zm9vdDpsYXN0LWNoaWxkID4gdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZCA+IC50YWJsZTpsYXN0LWNoaWxkID4gdGZvb3Q6bGFzdC1jaGlsZCA+IHRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7XG59XG5cbi5wYW5lbCA+IC5wYW5lbC1ib2R5ICsgLnRhYmxlLFxuLnBhbmVsID4gLnBhbmVsLWJvZHkgKyAudGFibGUtcmVzcG9uc2l2ZSxcbi5wYW5lbCA+IC50YWJsZSArIC5wYW5lbC1ib2R5LFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgKyAucGFuZWwtYm9keSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ucGFuZWwgPiAudGFibGUgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRoLFxuLnBhbmVsID4gLnRhYmxlID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZCB7XG4gIGJvcmRlci10b3A6IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgYm9yZGVyOiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHIgPiB0aDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRkOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGg6Zmlyc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRoOmZpcnN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGQ6Zmlyc3QtY2hpbGQge1xuICBib3JkZXItbGVmdDogMDtcbn1cblxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0ciA+IHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyID4gdGg6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0ciA+IHRkOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHIgPiB0aDpsYXN0LWNoaWxkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyID4gdGQ6bGFzdC1jaGlsZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGZvb3QgPiB0ciA+IHRoOmxhc3QtY2hpbGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHIgPiB0ZDpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xufVxuXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkID4gdGgsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmZpcnN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmZpcnN0LWNoaWxkID4gdGgsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCA+IHRoLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmZpcnN0LWNoaWxkID4gdGQsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6Zmlyc3QtY2hpbGQgPiB0aCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGgsXG4ucGFuZWwgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyOmxhc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHI6bGFzdC1jaGlsZCA+IHRoLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Ym9keSA+IHRyOmxhc3QtY2hpbGQgPiB0ZCxcbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGgsXG4ucGFuZWwgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCA+IHRmb290ID4gdHI6bGFzdC1jaGlsZCA+IHRkLFxuLnBhbmVsID4gLnRhYmxlLXJlc3BvbnNpdmUgPiAudGFibGUtYm9yZGVyZWQgPiB0Zm9vdCA+IHRyOmxhc3QtY2hpbGQgPiB0aCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG59XG5cbi5wYW5lbCA+IC50YWJsZS1yZXNwb25zaXZlIHtcbiAgYm9yZGVyOiAwO1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucGFuZWwtZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4ucGFuZWwtZ3JvdXAgLnBhbmVsIHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4ucGFuZWwtZ3JvdXAgLnBhbmVsICsgLnBhbmVsIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4ucGFuZWwtZ3JvdXAgLnBhbmVsLWhlYWRpbmcge1xuICBib3JkZXItYm90dG9tOiAwO1xufVxuXG4ucGFuZWwtZ3JvdXAgLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSxcbi5wYW5lbC1ncm91cCAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5saXN0LWdyb3VwIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi5wYW5lbC1ncm91cCAucGFuZWwtZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMDtcbn1cblxuLnBhbmVsLWdyb3VwIC5wYW5lbC1mb290ZXIgKyAucGFuZWwtY29sbGFwc2UgLnBhbmVsLWJvZHkge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbn1cblxuLnBhbmVsLWRlZmF1bHQge1xuICBib3JkZXItY29sb3I6ICNkZGQ7XG59XG5cbi5wYW5lbC1kZWZhdWx0ID4gLnBhbmVsLWhlYWRpbmcge1xuICBjb2xvcjogIzIyMjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xufVxuXG4ucGFuZWwtZGVmYXVsdCA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItdG9wLWNvbG9yOiAjZGRkO1xufVxuXG4ucGFuZWwtZGVmYXVsdCA+IC5wYW5lbC1oZWFkaW5nIC5iYWRnZSB7XG4gIGNvbG9yOiAjZjVmNWY1O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyO1xufVxuXG4ucGFuZWwtZGVmYXVsdCA+IC5wYW5lbC1mb290ZXIgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNkZGQ7XG59XG5cbi5wYW5lbC1wcmltYXJ5IHtcbiAgYm9yZGVyLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ucGFuZWwtcHJpbWFyeSA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG4gIGJvcmRlci1jb2xvcjogIzNhMzkzYjtcbn1cblxuLnBhbmVsLXByaW1hcnkgPiAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLnBhbmVsLXByaW1hcnkgPiAucGFuZWwtaGVhZGluZyAuYmFkZ2Uge1xuICBjb2xvcjogIzNhMzkzYjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLnBhbmVsLXByaW1hcnkgPiAucGFuZWwtZm9vdGVyICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjM2EzOTNiO1xufVxuXG4ucGFuZWwtc3VjY2VzcyB7XG4gIGJvcmRlci1jb2xvcjogIzhjYzYzZjtcbn1cblxuLnBhbmVsLXN1Y2Nlc3MgPiAucGFuZWwtaGVhZGluZyB7XG4gIGNvbG9yOiAjNmM2YzZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFlNmNiO1xuICBib3JkZXItY29sb3I6ICM4Y2M2M2Y7XG59XG5cbi5wYW5lbC1zdWNjZXNzID4gLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci10b3AtY29sb3I6ICM4Y2M2M2Y7XG59XG5cbi5wYW5lbC1zdWNjZXNzID4gLnBhbmVsLWhlYWRpbmcgLmJhZGdlIHtcbiAgY29sb3I6ICNkYWU2Y2I7XG4gIGJhY2tncm91bmQtY29sb3I6ICM2YzZjNmM7XG59XG5cbi5wYW5lbC1zdWNjZXNzID4gLnBhbmVsLWZvb3RlciArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzhjYzYzZjtcbn1cblxuLnBhbmVsLWluZm8ge1xuICBib3JkZXItY29sb3I6ICMwMDhhYmY7XG59XG5cbi5wYW5lbC1pbmZvID4gLnBhbmVsLWhlYWRpbmcge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNztcbiAgYm9yZGVyLWNvbG9yOiAjMDA4YWJmO1xufVxuXG4ucGFuZWwtaW5mbyA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItdG9wLWNvbG9yOiAjMDA4YWJmO1xufVxuXG4ucGFuZWwtaW5mbyA+IC5wYW5lbC1oZWFkaW5nIC5iYWRnZSB7XG4gIGNvbG9yOiAjZDllZGY3O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmM2YzZjO1xufVxuXG4ucGFuZWwtaW5mbyA+IC5wYW5lbC1mb290ZXIgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDhhYmY7XG59XG5cbi5wYW5lbC13YXJuaW5nIHtcbiAgYm9yZGVyLWNvbG9yOiAjZmRiODEzO1xufVxuXG4ucGFuZWwtd2FybmluZyA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgY29sb3I6ICM2YzZjNmM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMWUzYzI7XG4gIGJvcmRlci1jb2xvcjogI2ZkYjgxMztcbn1cblxuLnBhbmVsLXdhcm5pbmcgPiAucGFuZWwtaGVhZGluZyArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2ZkYjgxMztcbn1cblxuLnBhbmVsLXdhcm5pbmcgPiAucGFuZWwtaGVhZGluZyAuYmFkZ2Uge1xuICBjb2xvcjogI2YxZTNjMjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNmM2Yztcbn1cblxuLnBhbmVsLXdhcm5pbmcgPiAucGFuZWwtZm9vdGVyICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmRiODEzO1xufVxuXG4ucGFuZWwtZGFuZ2VyIHtcbiAgYm9yZGVyLWNvbG9yOiAjZDkxODJkO1xufVxuXG4ucGFuZWwtZGFuZ2VyID4gLnBhbmVsLWhlYWRpbmcge1xuICBjb2xvcjogIzZjNmM2YztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VhYzNjNztcbiAgYm9yZGVyLWNvbG9yOiAjZDkxODJkO1xufVxuXG4ucGFuZWwtZGFuZ2VyID4gLnBhbmVsLWhlYWRpbmcgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNkOTE4MmQ7XG59XG5cbi5wYW5lbC1kYW5nZXIgPiAucGFuZWwtaGVhZGluZyAuYmFkZ2Uge1xuICBjb2xvcjogI2VhYzNjNztcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNmM2Yztcbn1cblxuLnBhbmVsLWRhbmdlciA+IC5wYW5lbC1mb290ZXIgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNkOTE4MmQ7XG59XG5cbi5lbWJlZC1yZXNwb25zaXZlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZW1iZWQtcmVzcG9uc2l2ZSAuZW1iZWQtcmVzcG9uc2l2ZS1pdGVtLFxuLmVtYmVkLXJlc3BvbnNpdmUgaWZyYW1lLFxuLmVtYmVkLXJlc3BvbnNpdmUgZW1iZWQsXG4uZW1iZWQtcmVzcG9uc2l2ZSBvYmplY3QsXG4uZW1iZWQtcmVzcG9uc2l2ZSB2aWRlbyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlcjogMDtcbn1cblxuLmVtYmVkLXJlc3BvbnNpdmUtMTZieTkge1xuICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xufVxuXG4uZW1iZWQtcmVzcG9uc2l2ZS00YnkzIHtcbiAgcGFkZGluZy1ib3R0b206IDc1JTtcbn1cblxuLndlbGwge1xuICBtaW4taGVpZ2h0OiAyMHB4O1xuICBwYWRkaW5nOiAxOXB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTNlM2UzO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xufVxuXG4ud2VsbCBibG9ja3F1b3RlIHtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG5cbi53ZWxsLWxnIHtcbiAgcGFkZGluZzogMjRweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4ud2VsbC1zbSB7XG4gIHBhZGRpbmc6IDlweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uY2xvc2Uge1xuICBmbG9hdDogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogMjFweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogIzAwMDtcbiAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjtcbiAgb3BhY2l0eTogMC4yO1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MjApO1xufVxuXG4uY2xvc2U6aG92ZXIsXG4uY2xvc2U6Zm9jdXMge1xuICBjb2xvcjogIzAwMDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIG9wYWNpdHk6IDAuNTtcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUwKTtcbn1cblxuYnV0dG9uLmNsb3NlIHtcbiAgcGFkZGluZzogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG5cbi8qXG4qIFByb2plY3QgS2ltY2hpXG4qXG4qIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMTVcbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG4ubW9kYWwtb3BlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5tb2RhbCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDUwO1xuICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5tb2RhbC5mYWRlIC5tb2RhbC1kaWFsb2cge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0yNSUpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTI1JSk7XG4gIC1vLXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0yNSUpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjUlKTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0O1xuICAtbW96LXRyYW5zaXRpb246IC1tb3otdHJhbnNmb3JtIDAuM3MgZWFzZS1vdXQ7XG4gIC1vLXRyYW5zaXRpb246IC1vLXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0O1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcyBlYXNlLW91dDtcbn1cblxuLm1vZGFsLmluIC5tb2RhbC1kaWFsb2cge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gIC1vLXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbn1cblxuLm1vZGFsLW9wZW4gLm1vZGFsIHtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4ubW9kYWwtZGlhbG9nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogYXV0bztcbiAgbWFyZ2luOiAxMHB4O1xuICBib3JkZXI6IDZweCBzb2xpZCAjYWFhO1xuICBib3JkZXI6IDZweCBzb2xpZCByZ2JhKDE3MCwgMTcwLCAxNzAsIDAuMyk7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbn1cblxuLm1vZGFsLWNvbnRlbnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIGJvcmRlcjogM3B4IHNvbGlkICM5OTk7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5tb2RhbC1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDQwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4ubW9kYWwtYmFja2Ryb3AuZmFkZSB7XG4gIG9wYWNpdHk6IDA7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0wKTtcbn1cblxuLm1vZGFsLWJhY2tkcm9wLmluIHtcbiAgb3BhY2l0eTogMC41O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xufVxuXG4ubW9kYWwtaGVhZGVyIHtcbiAgcGFkZGluZzogMjdweCAxNHB4IDE0cHggMzBweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBtaW4taGVpZ2h0OiAyN3B4IDE0cHggMTRweCAzMHB4MjNweDtcbn1cblxuLm1vZGFsLWhlYWRlciAuY2xvc2Uge1xuICBtYXJnaW4tdG9wOiAtMnB4O1xufVxuXG4ubW9kYWwtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGxpbmUtaGVpZ2h0OiAyM3B4O1xuICBmb250LXNpemU6IDI3cHg7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVMaWdodFwiLCBcIkhlbHZldGljYU5ldWUtTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlIExpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiAzMDAgIWltcG9ydGFudDtcbn1cblxuLm1vZGFsLWJvZHkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHBhZGRpbmc6IDIwcHggMzBweDtcbn1cblxuLm1vZGFsLWZvb3RlciB7XG4gIHBhZGRpbmc6IDIwcHggMzBweDtcbiAgdGV4dC1hbGlnbjogbGVmdCAhaW1wb3J0YW50O1xuICBib3JkZXItdG9wOiAwO1xuICBtYXJnaW4tdG9wOiAyMHB4O1xufVxuXG4ubW9kYWwtZm9vdGVyOmJlZm9yZSxcbi5tb2RhbC1mb290ZXI6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5tb2RhbC1mb290ZXI6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbn1cblxuLm1vZGFsLWZvb3RlciAuYnRuIHtcbiAgcGFkZGluZzogNnB4IDEycHg7XG4gIG1pbi13aWR0aDogNzVweDtcbn1cblxuLm1vZGFsLWZvb3RlciAuYnRuICsgLmJ0biB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5tb2RhbC1mb290ZXIgLmJ0bi1ncm91cCAuYnRuICsgLmJ0biB7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ubW9kYWwtZm9vdGVyIC5idG4tYmxvY2sgKyAuYnRuLWJsb2NrIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5tb2RhbC1zY3JvbGxiYXItbWVhc3VyZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtOTk5OXB4O1xuICB3aWR0aDogNTBweDtcbiAgaGVpZ2h0OiA1MHB4O1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLm1vZGFsLWRpYWxvZyB7XG4gICAgd2lkdGg6IDgyNHB4O1xuICAgIG1hcmdpbjogMzBweCBhdXRvO1xuICB9XG4gIC5tb2RhbC1jb250ZW50IHtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgNXB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgIGJveC1zaGFkb3c6IDAgNXB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xuICB9XG4gIC5tb2RhbC1zbSB7XG4gICAgd2lkdGg6IDUyNHB4O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcbiAgLm1vZGFsLWxnIHtcbiAgICB3aWR0aDogMTEyNHB4O1xuICB9XG59XG5cbi5tb2RhbCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLm1vZGFsOmJlZm9yZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgY29udGVudDogXCIgXCI7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG59XG5cbi5tb2RhbC1kaWFsb2cge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbiNob3N0LXJvb3QtY29udGFpbmVyIC5tb2RhbC1mb290ZXIge1xuICBiYWNrZ3JvdW5kOiAjMDA4YWJmICFpbXBvcnRhbnQ7XG59XG5cbiNndWVzdHMtcm9vdC1jb250YWluZXIgLm1vZGFsLWZvb3RlciB7XG4gIGJhY2tncm91bmQ6ICM4Y2M2M2YgIWltcG9ydGFudDtcbn1cblxuI3RlbXBsYXRlcy1yb290LWNvbnRhaW5lciAubW9kYWwtZm9vdGVyIHtcbiAgYmFja2dyb3VuZDogIzAwYTZhMCAhaW1wb3J0YW50O1xufVxuXG4jc3RvcmFnZS1yb290LWNvbnRhaW5lciAubW9kYWwtZm9vdGVyIHtcbiAgYmFja2dyb3VuZDogI2ZlYjgxMyAhaW1wb3J0YW50O1xufVxuXG4jbmV0d29yay1yb290LWNvbnRhaW5lciAubW9kYWwtZm9vdGVyIHtcbiAgYmFja2dyb3VuZDogIzdmMWM3ZCAhaW1wb3J0YW50O1xufVxuXG4jYWRtaW5pc3RyYXRpb24tcm9vdC1jb250YWluZXIgLm1vZGFsLWZvb3RlciB7XG4gIGJhY2tncm91bmQ6ICNkOTE4MmQgIWltcG9ydGFudDtcbn1cblxuLnRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwNzA7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2FOZXVlTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZS1NZWRpdW1cIiwgXCJIZWx2ZXRpY2EgTmV1ZSBNZWRpdW1cIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgbGluZS1icmVhazogYXV0bztcbiAgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDI5O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIHdvcmQtYnJlYWs6IG5vcm1hbDtcbiAgd29yZC1zcGFjaW5nOiBub3JtYWw7XG4gIHdvcmQtd3JhcDogbm9ybWFsO1xuICBmb250LXNpemU6IDEycHg7XG4gIG9wYWNpdHk6IDA7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0wKTtcbn1cblxuLnRvb2x0aXAuaW4ge1xuICBvcGFjaXR5OiAwLjk7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT05MCk7XG59XG5cbi50b29sdGlwLnRvcCB7XG4gIG1hcmdpbi10b3A6IC0zcHg7XG4gIHBhZGRpbmc6IDVweCAwO1xufVxuXG4udG9vbHRpcC5yaWdodCB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xufVxuXG4udG9vbHRpcC5ib3R0b20ge1xuICBtYXJnaW4tdG9wOiAzcHg7XG4gIHBhZGRpbmc6IDVweCAwO1xufVxuXG4udG9vbHRpcC5sZWZ0IHtcbiAgbWFyZ2luLWxlZnQ6IC0zcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xufVxuXG4udG9vbHRpcC1pbm5lciB7XG4gIG1heC13aWR0aDogMjAwcHg7XG4gIHBhZGRpbmc6IDNweCA4cHg7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLnRvb2x0aXAtYXJyb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG59XG5cbi50b29sdGlwLnRvcCAudG9vbHRpcC1hcnJvdyB7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiA1cHggNXB4IDA7XG4gIGJvcmRlci10b3AtY29sb3I6ICMwMDA7XG59XG5cbi50b29sdGlwLnRvcC1sZWZ0IC50b29sdGlwLWFycm93IHtcbiAgYm90dG9tOiAwO1xuICByaWdodDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDVweCA1cHggMDtcbiAgYm9yZGVyLXRvcC1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAudG9wLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IC01cHg7XG4gIGJvcmRlci13aWR0aDogNXB4IDVweCAwO1xuICBib3JkZXItdG9wLWNvbG9yOiAjMDAwO1xufVxuXG4udG9vbHRpcC5yaWdodCAudG9vbHRpcC1hcnJvdyB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAwO1xuICBtYXJnaW4tdG9wOiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDVweCA1cHggNXB4IDA7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAubGVmdCAudG9vbHRpcC1hcnJvdyB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMDtcbiAgbWFyZ2luLXRvcDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiA1cHggMCA1cHggNXB4O1xuICBib3JkZXItbGVmdC1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAuYm90dG9tIC50b29sdGlwLWFycm93IHtcbiAgdG9wOiAwO1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4O1xuICBib3JkZXItd2lkdGg6IDAgNXB4IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDtcbn1cblxuLnRvb2x0aXAuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICB0b3A6IDA7XG4gIHJpZ2h0OiA1cHg7XG4gIG1hcmdpbi10b3A6IC01cHg7XG4gIGJvcmRlci13aWR0aDogMCA1cHggNXB4O1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwO1xufVxuXG4udG9vbHRpcC5ib3R0b20tcmlnaHQgLnRvb2x0aXAtYXJyb3cge1xuICB0b3A6IDA7XG4gIGxlZnQ6IDVweDtcbiAgbWFyZ2luLXRvcDogLTVweDtcbiAgYm9yZGVyLXdpZHRoOiAwIDVweCA1cHg7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDA7XG59XG5cbi5wb3BvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwNjA7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1heC13aWR0aDogMjc2cHg7XG4gIHBhZGRpbmc6IDFweDtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhTmV1ZU1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWUtTWVkaXVtXCIsIFwiSGVsdmV0aWNhIE5ldWUgTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gIGxpbmUtYnJlYWs6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgdGV4dC1hbGlnbjogc3RhcnQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gIHdvcmQtc3BhY2luZzogbm9ybWFsO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XG59XG5cbi5wb3BvdmVyLnRvcCB7XG4gIG1hcmdpbi10b3A6IC0xMHB4O1xufVxuXG4ucG9wb3Zlci5yaWdodCB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4ucG9wb3Zlci5ib3R0b20ge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4ucG9wb3Zlci5sZWZ0IHtcbiAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xufVxuXG4ucG9wb3Zlci10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogOHB4IDE0cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlYmViZWI7XG4gIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xufVxuXG4ucG9wb3Zlci1jb250ZW50IHtcbiAgcGFkZGluZzogOXB4IDE0cHg7XG59XG5cbi5wb3BvdmVyID4gLmFycm93LFxuLnBvcG92ZXIgPiAuYXJyb3c6YWZ0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xufVxuXG4ucG9wb3ZlciA+IC5hcnJvdyB7XG4gIGJvcmRlci13aWR0aDogMTFweDtcbn1cblxuLnBvcG92ZXIgPiAuYXJyb3c6YWZ0ZXIge1xuICBib3JkZXItd2lkdGg6IDEwcHg7XG4gIGNvbnRlbnQ6IFwiXCI7XG59XG5cbi5wb3BvdmVyLnRvcCA+IC5hcnJvdyB7XG4gIGxlZnQ6IDUwJTtcbiAgbWFyZ2luLWxlZnQ6IC0xMXB4O1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuICBib3JkZXItdG9wLWNvbG9yOiAjOTk5OTk5O1xuICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICBib3R0b206IC0xMXB4O1xufVxuXG4ucG9wb3Zlci50b3AgPiAuYXJyb3c6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgYm90dG9tOiAxcHg7XG4gIG1hcmdpbi1sZWZ0OiAtMTBweDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2ZmZjtcbn1cblxuLnBvcG92ZXIucmlnaHQgPiAuYXJyb3cge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogLTExcHg7XG4gIG1hcmdpbi10b3A6IC0xMXB4O1xuICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjOTk5OTk5O1xuICBib3JkZXItcmlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG59XG5cbi5wb3BvdmVyLnJpZ2h0ID4gLmFycm93OmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIGxlZnQ6IDFweDtcbiAgYm90dG9tOiAtMTBweDtcbiAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogI2ZmZjtcbn1cblxuLnBvcG92ZXIuYm90dG9tID4gLmFycm93IHtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTExcHg7XG4gIGJvcmRlci10b3Atd2lkdGg6IDA7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICM5OTk5OTk7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIHRvcDogLTExcHg7XG59XG5cbi5wb3BvdmVyLmJvdHRvbSA+IC5hcnJvdzphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICB0b3A6IDFweDtcbiAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmZmO1xufVxuXG4ucG9wb3Zlci5sZWZ0ID4gLmFycm93IHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAtMTFweDtcbiAgbWFyZ2luLXRvcDogLTExcHg7XG4gIGJvcmRlci1yaWdodC13aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICM5OTk5OTk7XG4gIGJvcmRlci1sZWZ0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xufVxuXG4ucG9wb3Zlci5sZWZ0ID4gLmFycm93OmFmdGVyIHtcbiAgY29udGVudDogXCIgXCI7XG4gIHJpZ2h0OiAxcHg7XG4gIGJvcmRlci1yaWdodC13aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICNmZmY7XG4gIGJvdHRvbTogLTEwcHg7XG59XG5cbi5jYXJvdXNlbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNhcm91c2VsLWlubmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLml0ZW0ge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogMC42cyBlYXNlLWluLW91dCBsZWZ0O1xuICAtby10cmFuc2l0aW9uOiAwLjZzIGVhc2UtaW4tb3V0IGxlZnQ7XG4gIHRyYW5zaXRpb246IDAuNnMgZWFzZS1pbi1vdXQgbGVmdDtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLml0ZW0gPiBpbWcsXG4uY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbSA+IGEgPiBpbWcge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG5AbWVkaWEgYWxsIGFuZCAodHJhbnNmb3JtLTNkKSwgKC13ZWJraXQtdHJhbnNmb3JtLTNkKSB7XG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtIHtcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuNnMgZWFzZS1pbi1vdXQ7XG4gICAgLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSAwLjZzIGVhc2UtaW4tb3V0O1xuICAgIC1vLXRyYW5zaXRpb246IC1vLXRyYW5zZm9ybSAwLjZzIGVhc2UtaW4tb3V0O1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjZzIGVhc2UtaW4tb3V0O1xuICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAtd2Via2l0LXBlcnNwZWN0aXZlOiAxMDAwcHg7XG4gICAgLW1vei1wZXJzcGVjdGl2ZTogMTAwMHB4O1xuICAgIHBlcnNwZWN0aXZlOiAxMDAwcHg7XG4gIH1cbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0ubmV4dCxcbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0uYWN0aXZlLnJpZ2h0IHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKTtcbiAgICBsZWZ0OiAwO1xuICB9XG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtLnByZXYsXG4gIC5jYXJvdXNlbC1pbm5lciA+IC5pdGVtLmFjdGl2ZS5sZWZ0IHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgIGxlZnQ6IDA7XG4gIH1cbiAgLmNhcm91c2VsLWlubmVyID4gLml0ZW0ubmV4dC5sZWZ0LFxuICAuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbS5wcmV2LnJpZ2h0LFxuICAuY2Fyb3VzZWwtaW5uZXIgPiAuaXRlbS5hY3RpdmUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIGxlZnQ6IDA7XG4gIH1cbn1cblxuLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZSxcbi5jYXJvdXNlbC1pbm5lciA+IC5uZXh0LFxuLmNhcm91c2VsLWlubmVyID4gLnByZXYge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZSB7XG4gIGxlZnQ6IDA7XG59XG5cbi5jYXJvdXNlbC1pbm5lciA+IC5uZXh0LFxuLmNhcm91c2VsLWlubmVyID4gLnByZXYge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5jYXJvdXNlbC1pbm5lciA+IC5uZXh0IHtcbiAgbGVmdDogMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLnByZXYge1xuICBsZWZ0OiAtMTAwJTtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLm5leHQubGVmdCxcbi5jYXJvdXNlbC1pbm5lciA+IC5wcmV2LnJpZ2h0IHtcbiAgbGVmdDogMDtcbn1cblxuLmNhcm91c2VsLWlubmVyID4gLmFjdGl2ZS5sZWZ0IHtcbiAgbGVmdDogLTEwMCU7XG59XG5cbi5jYXJvdXNlbC1pbm5lciA+IC5hY3RpdmUucmlnaHQge1xuICBsZWZ0OiAxMDAlO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxNSU7XG4gIG9wYWNpdHk6IDAuNTtcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUwKTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC42KTtcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wubGVmdCB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoMCwgMCwgMCwgMC41KSAwJSwgcmdiYSgwLCAwLCAwLCAwLjAwMDEpIDEwMCUpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLCAwLCAwLCAwLjUpIDAlLCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMTAwJSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjUpIDAlLCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMTAwJSk7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzgwMDAwMDAwJywgZW5kQ29sb3JzdHI9JyMwMDAwMDAwMCcsIEdyYWRpZW50VHlwZT0xKTtcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wucmlnaHQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogMDtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLCAwLCAwLCAwLjAwMDEpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNSkgMTAwJSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMCUsIHJnYmEoMCwgMCwgMCwgMC41KSAxMDAlKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuMDAwMSkgMCUsIHJnYmEoMCwgMCwgMCwgMC41KSAxMDAlKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDAwMDAwMDAnLCBlbmRDb2xvcnN0cj0nIzgwMDAwMDAwJywgR3JhZGllbnRUeXBlPTEpO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbDpob3Zlcixcbi5jYXJvdXNlbC1jb250cm9sOmZvY3VzIHtcbiAgb3V0bGluZTogMDtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3BhY2l0eTogMC45O1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9OTApO1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LFxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dCxcbi5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbWFyZ2luLXRvcDogLTEwcHg7XG4gIHotaW5kZXg6IDU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tcHJldixcbi5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0IHtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTEwcHg7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQsXG4uY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQge1xuICByaWdodDogNTAlO1xuICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xufVxuXG4uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LFxuLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dCB7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBmb250LWZhbWlseTogc2VyaWY7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXY6YmVmb3JlIHtcbiAgY29udGVudDogJ1xcMjAzOSc7XG59XG5cbi5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQ6YmVmb3JlIHtcbiAgY29udGVudDogJ1xcMjAzYSc7XG59XG5cbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIHdpZHRoOiA2MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmNhcm91c2VsLWluZGljYXRvcnMgbGkge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIG1hcmdpbjogMXB4O1xuICB0ZXh0LWluZGVudDogLTk5OXB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZmZmO1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDAgXFw5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmNhcm91c2VsLWluZGljYXRvcnMgLmFjdGl2ZSB7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEycHg7XG4gIGhlaWdodDogMTJweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLmNhcm91c2VsLWNhcHRpb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDE1JTtcbiAgcmlnaHQ6IDE1JTtcbiAgYm90dG9tOiAyMHB4O1xuICB6LWluZGV4OiAxMDtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAyMHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC42KTtcbn1cblxuLmNhcm91c2VsLWNhcHRpb24gLmJ0biB7XG4gIHRleHQtc2hhZG93OiBub25lO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tbGVmdCxcbiAgLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0IHtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgbWFyZ2luLXRvcDogLTE1cHg7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG4gIC5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2IHtcbiAgICBtYXJnaW4tbGVmdDogLTE1cHg7XG4gIH1cbiAgLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LFxuICAuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xuICB9XG4gIC5jYXJvdXNlbC1jYXB0aW9uIHtcbiAgICBsZWZ0OiAyMCU7XG4gICAgcmlnaHQ6IDIwJTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMzBweDtcbiAgfVxuICAuY2Fyb3VzZWwtaW5kaWNhdG9ycyB7XG4gICAgYm90dG9tOiAyMHB4O1xuICB9XG59XG5cbi5jbGVhcmZpeDpiZWZvcmUsXG4uY2xlYXJmaXg6YWZ0ZXIge1xuICBjb250ZW50OiBcIiBcIjtcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5jbGVhcmZpeDphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4uY2VudGVyLWJsb2NrIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG5cbi5wdWxsLXJpZ2h0IHtcbiAgZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnQ7XG59XG5cbi5wdWxsLWxlZnQge1xuICBmbG9hdDogbGVmdCAhaW1wb3J0YW50O1xufVxuXG4uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLnNob3cge1xuICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG4uaW52aXNpYmxlIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xufVxuXG4udGV4dC1oaWRlIHtcbiAgZm9udDogMC8wIGE7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDA7XG59XG5cbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi5hZmZpeCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cblxuQC1tcy12aWV3cG9ydCB7XG4gIHdpZHRoOiBkZXZpY2Utd2lkdGg7XG59XG5cbi52aXNpYmxlLXhzIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4udmlzaWJsZS1zbSB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLnZpc2libGUtbWQge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi52aXNpYmxlLWxnIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4udmlzaWJsZS14cy1ibG9jayxcbi52aXNpYmxlLXhzLWlubGluZSxcbi52aXNpYmxlLXhzLWlubGluZS1ibG9jayxcbi52aXNpYmxlLXNtLWJsb2NrLFxuLnZpc2libGUtc20taW5saW5lLFxuLnZpc2libGUtc20taW5saW5lLWJsb2NrLFxuLnZpc2libGUtbWQtYmxvY2ssXG4udmlzaWJsZS1tZC1pbmxpbmUsXG4udmlzaWJsZS1tZC1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1sZy1ibG9jayxcbi52aXNpYmxlLWxnLWlubGluZSxcbi52aXNpYmxlLWxnLWlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC52aXNpYmxlLXhzIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUteHMge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS14cyB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS14cyxcbiAgdGQudmlzaWJsZS14cyB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xuICAudmlzaWJsZS14cy1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLnZpc2libGUteHMtaW5saW5lIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcbiAgLnZpc2libGUteHMtaW5saW5lLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpIHtcbiAgLnZpc2libGUtc20ge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGFibGUudmlzaWJsZS1zbSB7XG4gICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDtcbiAgfVxuICB0ci52aXNpYmxlLXNtIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDtcbiAgfVxuICB0aC52aXNpYmxlLXNtLFxuICB0ZC52aXNpYmxlLXNtIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSBhbmQgKG1heC13aWR0aDogMTE5OXB4KSB7XG4gIC52aXNpYmxlLXNtLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgYW5kIChtYXgtd2lkdGg6IDExOTlweCkge1xuICAudmlzaWJsZS1zbS1pbmxpbmUge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgYW5kIChtYXgtd2lkdGg6IDExOTlweCkge1xuICAudmlzaWJsZS1zbS1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC52aXNpYmxlLW1kIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUtbWQge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS1tZCB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS1tZCxcbiAgdGQudmlzaWJsZS1tZCB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC52aXNpYmxlLW1kLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC52aXNpYmxlLW1kLWlubGluZSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgYW5kIChtYXgtd2lkdGg6IDE2NzkpIHtcbiAgLnZpc2libGUtbWQtaW5saW5lLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAudmlzaWJsZS1sZyB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxuICB0YWJsZS52aXNpYmxlLWxnIHtcbiAgICBkaXNwbGF5OiB0YWJsZSAhaW1wb3J0YW50O1xuICB9XG4gIHRyLnZpc2libGUtbGcge1xuICAgIGRpc3BsYXk6IHRhYmxlLXJvdyAhaW1wb3J0YW50O1xuICB9XG4gIHRoLnZpc2libGUtbGcsXG4gIHRkLnZpc2libGUtbGcge1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAudmlzaWJsZS1sZy1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAudmlzaWJsZS1sZy1pbmxpbmUge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxNjgwKSB7XG4gIC52aXNpYmxlLWxnLWlubGluZS1ibG9jayB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XG4gIC5oaWRkZW4teHMge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpIHtcbiAgLmhpZGRlbi1zbSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxNjc5KSB7XG4gIC5oaWRkZW4tbWQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTY4MCkge1xuICAuaGlkZGVuLWxnIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtcHJpbnQge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC52aXNpYmxlLXByaW50IHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG4gIHRhYmxlLnZpc2libGUtcHJpbnQge1xuICAgIGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7XG4gIH1cbiAgdHIudmlzaWJsZS1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XG4gIH1cbiAgdGgudmlzaWJsZS1wcmludCxcbiAgdGQudmlzaWJsZS1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xuICB9XG59XG5cbi52aXNpYmxlLXByaW50LWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5AbWVkaWEgcHJpbnQge1xuICAudmlzaWJsZS1wcmludC1ibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG4udmlzaWJsZS1wcmludC1pbmxpbmUge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC52aXNpYmxlLXByaW50LWlubGluZSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtcHJpbnQtaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG5AbWVkaWEgcHJpbnQge1xuICAudmlzaWJsZS1wcmludC1pbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIC5oaWRkZW4tcHJpbnQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG4vKiBcblRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG5Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBib290c3RyYXAtc2VsZWN0XG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS4gKi9cbi5ib290c3RyYXAtc2VsZWN0IHtcbiAgLyp3aWR0aDogMjIwcHhcXDk7IElFOCBhbmQgYmVsb3cqL1xuICB3aWR0aDogMjIwcHggXFwwO1xuICAvKklFOSBhbmQgYmVsb3cqL1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdCA+IC5idG4ge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAyNXB4O1xufVxuXG4uZXJyb3IgLmJvb3RzdHJhcC1zZWxlY3QgLmJ0biB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNiOTRhNDg7XG59XG5cbi5jb250cm9sLWdyb3VwLmVycm9yIC5ib290c3RyYXAtc2VsZWN0IC5kcm9wZG93bi10b2dnbGUge1xuICBib3JkZXItY29sb3I6ICNiOTRhNDg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmZpdC13aWR0aCB7XG4gIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0Om5vdChbY2xhc3MqPVwiY29sLVwiXSk6bm90KFtjbGFzcyo9XCJmb3JtLWNvbnRyb2xcIl0pOm5vdCguaW5wdXQtZ3JvdXAtYnRuKSB7XG4gIHdpZHRoOiAyMjBweDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QgLmJ0bjpmb2N1cyB7XG4gIG91dGxpbmU6IHRoaW4gZG90dGVkICMzMzMzMzMgIWltcG9ydGFudDtcbiAgb3V0bGluZTogNXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yICFpbXBvcnRhbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5mb3JtLWNvbnRyb2wge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmZvcm0tY29udHJvbDpub3QoW2NsYXNzKj1cImNvbC1cIl0pIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cDpub3QoLmlucHV0LWdyb3VwLWJ0biksXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXBbY2xhc3MqPVwiY29sLVwiXSB7XG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAuZHJvcGRvd24tbWVudS1yaWdodCxcbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cFtjbGFzcyo9XCJjb2wtXCJdLmRyb3Bkb3duLW1lbnUtcmlnaHQsXG4ucm93LWZsdWlkIC5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cFtjbGFzcyo9XCJjb2wtXCJdLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5mb3JtLXNlYXJjaCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAsXG4uZm9ybS1pbmxpbmUgLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLFxuLmZvcm0taG9yaXpvbnRhbCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAsXG4uZm9ybS1ncm91cCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uZm9ybS1ncm91cC1sZyAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAuZm9ybS1jb250cm9sLFxuLmZvcm0tZ3JvdXAtc20gLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLmZvcm0tY29udHJvbCB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi5mb3JtLWlubGluZSAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmZvcm0tY29udHJvbCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uaW5wdXQtYXBwZW5kIC5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCB7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4uaW5wdXQtcHJlcGVuZCAuYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAge1xuICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCA+IC5kaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCA+IC5kaXNhYmxlZDpmb2N1cyB7XG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5idG4gLmZpbHRlci1vcHRpb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdpZHRoOiAxMDAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmJ0biAuY2FyZXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDQwcHg7XG4gIG1hcmdpbi10b3A6IDA7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjO1xuICBoZWlnaHQ6IDM4cHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuYnRuIC5jYXJldDpiZWZvcmUge1xuICBjb250ZW50OiAnXFxmMDc4JztcbiAgZm9udC1mYW1pbHk6IFwiRm9udEF3ZXNvbWVcIjtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBjb2xvcjogIzY2NjY2NjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAxMnB4O1xuICB0b3A6IDlweDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuYnRuOmhvdmVyIC5jYXJldCB7XG4gIGJvcmRlci1jb2xvcjogI2FkYWRhZDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5idG46Zm9jdXMgLmNhcmV0IHtcbiAgYm9yZGVyLWNvbG9yOiAjOGM4YzhjO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXBbY2xhc3MqPVwiY29sLVwiXSAuYnRuIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gIG1pbi13aWR0aDogMTAwJTtcbiAgei1pbmRleDogMTAzNTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5kcm9wZG93bi1tZW51LmlubmVyIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwIC5kcm9wZG93bi1tZW51IGxpOm5vdCguZGlzYWJsZWQpIGE6aG92ZXIgc21hbGwsXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGk6bm90KC5kaXNhYmxlZCkgYTpmb2N1cyBzbWFsbCxcbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaS5hY3RpdmU6bm90KC5kaXNhYmxlZCkgYSBzbWFsbCB7XG4gIGNvbG9yOiAjNjRiMWQ4O1xuICBjb2xvcjogZmFkZSgjNjRiMWQ4LCA0MCUpO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkuZGlzYWJsZWQgYSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaSBhIHtcbiAgb3V0bGluZTogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkgYS5vcHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHBhZGRpbmctbGVmdDogMi4yNWVtO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkgYSBzcGFuLmNoZWNrLW1hcmsge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnUgbGkgYSBzcGFuLnRleHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSBsaSBzbWFsbCB7XG4gIHBhZGRpbmctbGVmdDogMC41ZW07XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSAubm90aWZ5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDVweDtcbiAgd2lkdGg6IDk2JTtcbiAgbWFyZ2luOiAwIDIlO1xuICBtaW4taGVpZ2h0OiAyNnB4O1xuICBwYWRkaW5nOiAzcHggNXB4O1xuICBiYWNrZ3JvdW5kOiB3aGl0ZXNtb2tlO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTNlM2UzO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggZmFkZShibGFjaywgNSUpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3BhY2l0eTogMC45O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5idG4tZ3JvdXAgLm5vLXJlc3VsdHMge1xuICBwYWRkaW5nOiAzcHg7XG4gIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gIG1hcmdpbjogMCA1cHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5maXQtd2lkdGggLmJ0biAuZmlsdGVyLW9wdGlvbiB7XG4gIHBvc2l0aW9uOiBzdGF0aWM7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5maXQtd2lkdGggLmJ0biAuY2FyZXQge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICB0b3A6IGF1dG87XG4gIG1hcmdpbi10b3A6IC0xcHg7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5zaG93LXRpY2sgLmRyb3Bkb3duLW1lbnUgbGkuc2VsZWN0ZWQgYSBzcGFuLmNoZWNrLW1hcmsge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcmlnaHQ6IDE1cHg7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLnNob3ctdGljayAuZHJvcGRvd24tbWVudSBsaSBhIHNwYW4udGV4dCB7XG4gIG1hcmdpbi1yaWdodDogMzRweDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93Lm9wZW4gPiAuYnRuIHtcbiAgei1pbmRleDogMTAzNjtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93IC5kcm9wZG93bi10b2dnbGU6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGJvcmRlci1sZWZ0OiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yaWdodDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItYm90dG9tLXdpZHRoOiA3cHg7XG4gIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjY2NjY2NjO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiBmYWRlKCNjY2NjY2MsIDIwJSk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAtNHB4O1xuICBsZWZ0OiA5cHg7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LnNob3ctbWVudS1hcnJvdyAuZHJvcGRvd24tdG9nZ2xlOmFmdGVyIHtcbiAgY29udGVudDogJyc7XG4gIGJvcmRlci1sZWZ0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yaWdodDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItYm90dG9tOiA2cHggc29saWQgd2hpdGU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAtNHB4O1xuICBsZWZ0OiAxMHB4O1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5zaG93LW1lbnUtYXJyb3cuZHJvcHVwIC5kcm9wZG93bi10b2dnbGU6YmVmb3JlIHtcbiAgYm90dG9tOiBhdXRvO1xuICB0b3A6IC0zcHg7XG4gIGJvcmRlci1ib3R0b206IDA7XG4gIGJvcmRlci10b3Atd2lkdGg6IDdweDtcbiAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci10b3AtY29sb3I6ICNjY2NjY2M7XG4gIGJvcmRlci10b3AtY29sb3I6IGZhZGUoI2NjY2NjYywgMjAlKTtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93LmRyb3B1cCAuZHJvcGRvd24tdG9nZ2xlOmFmdGVyIHtcbiAgYm90dG9tOiBhdXRvO1xuICB0b3A6IC0zcHg7XG4gIGJvcmRlci10b3A6IDZweCBzb2xpZCB3aGl0ZTtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93LnB1bGwtcmlnaHQgLmRyb3Bkb3duLXRvZ2dsZTpiZWZvcmUge1xuICByaWdodDogMTJweDtcbiAgbGVmdDogYXV0bztcbn1cblxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93LnB1bGwtcmlnaHQgLmRyb3Bkb3duLXRvZ2dsZTphZnRlciB7XG4gIHJpZ2h0OiAxM3B4O1xuICBsZWZ0OiBhdXRvO1xufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5zaG93LW1lbnUtYXJyb3cub3BlbiA+IC5kcm9wZG93bi10b2dnbGU6YmVmb3JlLFxuLmJvb3RzdHJhcC1zZWxlY3Quc2hvdy1tZW51LWFycm93Lm9wZW4gPiAuZHJvcGRvd24tdG9nZ2xlOmFmdGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5vcGVuIC5idG4gLmNhcmV0IHtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICNhZGFkYWQ7XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cC5vcGVuIC5idG46aG92ZXIgLmNhcmV0IHtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICM4YzhjOGM7XG59XG5cbi5icy1zZWFyY2hib3gsXG4uYnMtYWN0aW9uc2JveCB7XG4gIHBhZGRpbmc6IDRweCA4cHg7XG59XG5cbi5icy1hY3Rpb25zYm94IHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uYnMtYWN0aW9uc2JveCAuYnRuLWdyb3VwIGJ1dHRvbiB7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi5icy1zZWFyY2hib3ggKyAuYnMtYWN0aW9uc2JveCB7XG4gIHBhZGRpbmc6IDAgOHB4IDRweDtcbn1cblxuLmJzLXNlYXJjaGJveCBpbnB1dC5mb3JtLWNvbnRyb2wge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLm1vYmlsZS1kZXZpY2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xuICBvcGFjaXR5OiAwO1xufVxuXG4uY29udGFpbmVyIHtcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiA4MHB4ICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmctcmlnaHQ6IDYwcHggIWltcG9ydGFudDtcbn1cblxuLmFsZXJ0IHtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMCA1cHg7XG59XG5cbi5oaWRlLWNvbnRlbnQge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi5sb2dpbi1hcmVhIHtcbiAgbWFyZ2luOiA5MHB4IGF1dG8gMDtcbiAgd2lkdGg6IDMwMHB4O1xufVxuXG4ubG9naW4tYXJlYSAuYnRuLWxvZ2luIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBzdGF0aWM7XG4gIGZsb2F0OiBub25lO1xuICBtYXJnaW4tYm90dG9tOiA1MHB4O1xufVxuXG4ubG9naW4tYXJlYSAuY29sLW1kLTEyLCAubG9naW4tYXJlYSAuY29sLWxnLTEyIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5sb2dpbi1hcmVhIC5ib290c3RyYXAtc2VsZWN0LFxuLmxvZ2luLWFyZWEgLnNlbGVjdHBpY2tlciB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVMaWdodFwiLCBcIkhlbHZldGljYU5ldWUtTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlIExpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTNwdDtcbn1cblxuLmxvZ2luLWFyZWEgLmRyb3Bkb3duLXRvZ2dsZS5zZWxlY3RwaWNrZXIge1xuICBoZWlnaHQ6IDQwcHg7XG59XG5cbi5sb2dpbi1hcmVhIC5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLmxvZ2luLWFyZWEgLmZvcm0tZ3JvdXA6bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi50b29sYmFyIHtcbiAgaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQ6ICMzYTM5M2I7XG59XG5cbi50b29sYmFyIC50b29scyB7XG4gIGhlaWdodDogNDBweDtcbn1cblxuLnRvb2xiYXIgYSB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYSBOZXVlIExUIFcxRyA1NSBSb21hblwiLCBcIkhlbHZldGljYSBOZXVlIExUIFcxR1wiLCBcIkhlbHZldGljYU5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2FOZXVlLVJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgZm9udC1zaXplOiAxM3B0O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBwYWRkaW5nOiA2cHggMDtcbiAgbWFyZ2luLWxlZnQ6IDUwcHg7XG59XG5cbi50b29sYmFyIHNwYW4sIC50b29sYmFyIC5mYSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLnRvb2xiYXIgLmZhIHtcbiAgZm9udC1zaXplOiAyNHB4O1xuICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG59XG5cbiNob3N0LXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwOGFiZiAhaW1wb3J0YW50O1xufVxuXG4jZ3Vlc3RzLXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzhjYzYzZiAhaW1wb3J0YW50O1xufVxuXG4jdGVtcGxhdGVzLXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwYTZhMCAhaW1wb3J0YW50O1xufVxuXG4jc3RvcmFnZS1yb290LWNvbnRhaW5lciAudG9vbGJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZWI4MTMgIWltcG9ydGFudDtcbn1cblxuI25ldHdvcmstcm9vdC1jb250YWluZXIgLnRvb2xiYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2YxYzdkICFpbXBvcnRhbnQ7XG59XG5cbiNhZG1pbmlzdHJhdGlvbi1yb290LWNvbnRhaW5lciAudG9vbGJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTE4MmQgIWltcG9ydGFudDtcbn1cblxuLmJ0biB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVNZWRpdW1cIiwgXCJIZWx2ZXRpY2FOZXVlLU1lZGl1bVwiLCBcIkhlbHZldGljYSBOZXVlIE1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWVcIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxM3B0O1xufVxuXG4uYnRuLWxvZ2luIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDhhYmY7XG4gIGJvcmRlci1jb2xvcjogIzAwOGFiZjtcbn1cblxuLmJ0bi1sb2dpbjpmb2N1cyxcbi5idG4tbG9naW4uZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjU4YztcbiAgYm9yZGVyLWNvbG9yOiAjMDAyZTQwO1xufVxuXG4uYnRuLWxvZ2luOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDY1OGM7XG4gIGJvcmRlci1jb2xvcjogIzAwNWU4Mjtcbn1cblxuLmJ0bi1sb2dpbjphY3RpdmUsXG4uYnRuLWxvZ2luLmFjdGl2ZSxcbi5vcGVuID4gLmJ0bi1sb2dpbi5kcm9wZG93bi10b2dnbGUge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjU4YztcbiAgYm9yZGVyLWNvbG9yOiAjMDA1ZTgyO1xufVxuXG4uYnRuLWxvZ2luOmFjdGl2ZTpob3Zlcixcbi5idG4tbG9naW46YWN0aXZlOmZvY3VzLFxuLmJ0bi1sb2dpbjphY3RpdmUuZm9jdXMsXG4uYnRuLWxvZ2luLmFjdGl2ZTpob3Zlcixcbi5idG4tbG9naW4uYWN0aXZlOmZvY3VzLFxuLmJ0bi1sb2dpbi5hY3RpdmUuZm9jdXMsXG4ub3BlbiA+IC5idG4tbG9naW4uZHJvcGRvd24tdG9nZ2xlOmhvdmVyLFxuLm9wZW4gPiAuYnRuLWxvZ2luLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyxcbi5vcGVuID4gLmJ0bi1sb2dpbi5kcm9wZG93bi10b2dnbGUuZm9jdXMge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNGI2ODtcbiAgYm9yZGVyLWNvbG9yOiAjMDAyZTQwO1xufVxuXG4uYnRuLWxvZ2luOmFjdGl2ZSxcbi5idG4tbG9naW4uYWN0aXZlLFxuLm9wZW4gPiAuYnRuLWxvZ2luLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5idG4tbG9naW4uZGlzYWJsZWQsXG4uYnRuLWxvZ2luLmRpc2FibGVkOmhvdmVyLFxuLmJ0bi1sb2dpbi5kaXNhYmxlZDpmb2N1cyxcbi5idG4tbG9naW4uZGlzYWJsZWQuZm9jdXMsXG4uYnRuLWxvZ2luLmRpc2FibGVkOmFjdGl2ZSxcbi5idG4tbG9naW4uZGlzYWJsZWQuYWN0aXZlLFxuLmJ0bi1sb2dpbltkaXNhYmxlZF0sXG4uYnRuLWxvZ2luW2Rpc2FibGVkXTpob3Zlcixcbi5idG4tbG9naW5bZGlzYWJsZWRdOmZvY3VzLFxuLmJ0bi1sb2dpbltkaXNhYmxlZF0uZm9jdXMsXG4uYnRuLWxvZ2luW2Rpc2FibGVkXTphY3RpdmUsXG4uYnRuLWxvZ2luW2Rpc2FibGVkXS5hY3RpdmUsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1sb2dpbixcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxvZ2luOmhvdmVyLFxuZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbG9naW46Zm9jdXMsXG5maWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1sb2dpbi5mb2N1cyxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxvZ2luOmFjdGl2ZSxcbmZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxvZ2luLmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDhhYmY7XG4gIGJvcmRlci1jb2xvcjogIzAwOGFiZjtcbn1cblxuLmJ0bi1sb2dpbiAuYmFkZ2Uge1xuICBjb2xvcjogIzAwOGFiZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cbi5kaWFsb2ctYm9yZGVyLWdyZXkge1xuICBiYWNrZ3JvdW5kLWNsaXA6IGJvcmRlci1ib3g7XG4gIGJvcmRlcjogNnB4IHNvbGlkIHJnYmEoMTcwLCAxNzAsIDE3MCwgMC4zKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgdG9wOiAwO1xuICBib3R0b206IDA7XG4gIG1hcmdpbjogYXV0bztcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciB7XG4gIGJvcmRlcjogM3B4IHNvbGlkICM5OTk5OTk7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLXRpdGxlIHtcbiAgaGVpZ2h0OiA2MHB4O1xuICBwYWRkaW5nOiAyMHB4IDAgMjBweCAyMHB4O1xuICBtYXJnaW46IDA7XG4gIGZsb2F0OiBsZWZ0O1xuICBmb250LXNpemU6IDI3cHg7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVMaWdodFwiLCBcIkhlbHZldGljYU5ldWUtTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlIExpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiAzMDAgIWltcG9ydGFudDtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWZvb3RlciB7XG4gIGhlaWdodDogNTBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwOEFCRjtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1mb290ZXIgLmRpYWxvZy1idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICB3aWR0aDogNzVweDtcbiAgaGVpZ2h0OiAzMHB4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tbGVmdDogMTBweDtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWZvb3RlciAuZGlhbG9nLWJ1dHRvbjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNFRUVFRUU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cbi5tZW51LWZsYXQgLmJ0biB7XG4gIGJhY2tncm91bmQ6ICM0ZDRjNGUgIWltcG9ydGFudDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYU5ldWVCb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZS1Cb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWUgQm9sZFwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxMy41cHQ7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiA0cHggNDVweCA1cHggMzhweDtcbn1cblxuLm1lbnUtZmxhdCAuYnRuID4gaSB7XG4gIGZvbnQtc2l6ZTogMjJweDtcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgd2lkdGg6IDI2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiA2cHg7XG59XG5cbi5tZW51LWZsYXQgLmJ0biA+IGk6YmVmb3JlIHtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG59XG5cbi5tZW51LWZsYXQgLmNhcmV0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlci10b3A6IDA7XG4gIGJvcmRlci10b3A6IDAgXFw5O1xuICBib3JkZXItcmlnaHQ6IDA7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuXG4ubWVudS1mbGF0IC5jYXJldDpiZWZvcmUge1xuICBmb250LWZhbWlseTogXCJmb250ZWxsb1wiO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgc3BlYWs6IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xuICB3aWR0aDogMS4yZW07XG4gIGhlaWdodDogMS4yZW07XG4gIG1hcmdpbjogLjVlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXZhcmlhbnQ6IG5vcm1hbDtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIGxpbmUtaGVpZ2h0OiAyZW07XG4gIGNvbnRlbnQ6ICdcXGU4NjEnO1xufVxuXG4ubWVudS1mbGF0LmRyb3B1cCxcbi5tZW51LWZsYXQuZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyB7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTAwJTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTAwMDtcbiAgZGlzcGxheTogbm9uZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1pbi13aWR0aDogMTYwcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgZm9udC1zaXplOiAxMy41cHQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzYTM5M2I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudS5wdWxsLXJpZ2h0IHtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IGF1dG87XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXIge1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiA5cHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQwNDA0Mjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMmUyZTJlO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDBweCAxcHggMHB4IDBweCAjNDA0MDQyO1xuICBib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCAwcHggIzQwNDA0Mjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpOmZpcnN0LWNoaWxkID4gYSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjM2EzOTNiO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiBsaS5jcml0aWNhbDpsYXN0LWNoaWxkID4gYSB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiA0cHggNnB4O1xuICBjbGVhcjogYm90aDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDMxcHg7XG4gIGNvbG9yOiAjZmZmO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhID4gaSB7XG4gIGZvbnQtc2l6ZTogMjJweDtcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICB3aWR0aDogMjZweDtcbiAgaGVpZ2h0OiAyNnB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGE6aG92ZXIsXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gbGkgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhLFxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3V0bGluZTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNhMzkzYjtcbn1cblxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IGxpLmNyaXRpY2FsID4gYSB7XG4gIGJhY2tncm91bmQ6ICNkOTE4MmQ7XG59XG5cbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhLFxuLm1lbnUtZmxhdCAuZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGE6aG92ZXIsXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpmb2N1cyB7XG4gIGNvbG9yOiAjOTk5O1xufVxuXG4ubWVudS1mbGF0IC5kcm9wZG93bi1tZW51ID4gLmRpc2FibGVkID4gYTpob3Zlcixcbi5tZW51LWZsYXQgLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZCA9IGZhbHNlKTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLm1lbnUtZmxhdC5vcGVuIC5idG4ge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG59XG5cbi5tZW51LWZsYXQub3BlbiA+IC5kcm9wZG93bi1tZW51IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5tZW51LWZsYXQub3BlbiAuY2FyZXQge1xuICBiYWNrZ3JvdW5kOiAjM2EzOTNiO1xufVxuXG4ubWVudS1mbGF0Lm9wZW4gLmNhcmV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICdcXGU4NjQnO1xufVxuXG4ubWVudS1mbGF0Lm9wZW4gPiBhIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogMDtcbn1cblxuLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiBhdXRvO1xufVxuXG4uZHJvcGRvd24taGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDNweCAyMHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQyOTtcbiAgY29sb3I6ICM5OTk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5kcm9wZG93bi1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiA5OTA7XG59XG5cbi5wdWxsLXJpZ2h0ID4gLmRyb3Bkb3duLW1lbnUge1xuICByaWdodDogMDtcbiAgbGVmdDogYXV0bztcbn1cblxuLmRyb3B1cCAuY2FyZXQsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24gLmNhcmV0IHtcbiAgYm9yZGVyLXRvcDogMDtcbiAgYm9yZGVyLWJvdHRvbTogNHB4IGRhc2hlZDtcbiAgYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIFxcOTtcbiAgY29udGVudDogXCJcIjtcbn1cblxuLmRyb3B1cCAuZHJvcGRvd24tbWVudSxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuZHJvcGRvd24tbWVudSB7XG4gIHRvcDogYXV0bztcbiAgYm90dG9tOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAubmF2YmFyLXJpZ2h0IC5kcm9wZG93bi1tZW51IHtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG4gIC5uYXZiYXItcmlnaHQgLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogYXV0bztcbiAgfVxufVxuXG5wcmUge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkge1xuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTU0MHB4O1xuICB9XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDE2ODBweCkge1xuICAuY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTU0MHB4O1xuICB9XG59XG4iLCIvKiEgU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaDVicC9odG1sNS1ib2lsZXJwbGF0ZS9ibG9iL21hc3Rlci9zcmMvY3NzL21haW4uY3NzICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcmludCBzdHlsZXMuXG4vLyBJbmxpbmVkIHRvIGF2b2lkIHRoZSBhZGRpdGlvbmFsIEhUVFAgcmVxdWVzdDogaDVicC5jb20vclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQG1lZGlhIHByaW50IHtcbiAgICAqLFxuICAgICo6YmVmb3JlLFxuICAgICo6YWZ0ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogIzAwMCAhaW1wb3J0YW50OyAvLyBCbGFjayBwcmludHMgZmFzdGVyOiBoNWJwLmNvbS9zXG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICBhLFxuICAgIGE6dmlzaXRlZCB7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIH1cblxuICAgIGFbaHJlZl06YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiBcIiAoXCIgYXR0cihocmVmKSBcIilcIjtcbiAgICB9XG5cbiAgICBhYmJyW3RpdGxlXTphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiIChcIiBhdHRyKHRpdGxlKSBcIilcIjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCBzaG93IGxpbmtzIHRoYXQgYXJlIGZyYWdtZW50IGlkZW50aWZpZXJzLFxuICAgIC8vIG9yIHVzZSB0aGUgYGphdmFzY3JpcHQ6YCBwc2V1ZG8gcHJvdG9jb2xcbiAgICBhW2hyZWZePVwiI1wiXTphZnRlcixcbiAgICBhW2hyZWZePVwiamF2YXNjcmlwdDpcIl06YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiBcIlwiO1xuICAgIH1cblxuICAgIHByZSxcbiAgICBibG9ja3F1b3RlIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcbiAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgIH1cblxuICAgIHRoZWFkIHtcbiAgICAgICAgZGlzcGxheTogdGFibGUtaGVhZGVyLWdyb3VwOyAvLyBoNWJwLmNvbS90XG4gICAgfVxuXG4gICAgdHIsXG4gICAgaW1nIHtcbiAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgIH1cblxuICAgIGltZyB7XG4gICAgICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIHAsXG4gICAgaDIsXG4gICAgaDMge1xuICAgICAgICBvcnBoYW5zOiAzO1xuICAgICAgICB3aWRvd3M6IDM7XG4gICAgfVxuXG4gICAgaDIsXG4gICAgaDMge1xuICAgICAgICBwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDtcbiAgICB9XG5cbiAgICAvLyBCb290c3RyYXAgc3BlY2lmaWMgY2hhbmdlcyBzdGFydFxuXG4gICAgLy8gQm9vdHN0cmFwIGNvbXBvbmVudHNcbiAgICAubmF2YmFyIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLmJ0bixcbiAgICAuZHJvcHVwID4gLmJ0biB7XG4gICAgICAgID4gLmNhcmV0IHtcbiAgICAgICAgICAgIGJvcmRlci10b3AtY29sb3I6ICMwMDAgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubGFiZWwge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xuICAgIH1cblxuICAgIC50YWJsZSB7XG4gICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDtcblxuICAgICAgICB0ZCxcbiAgICAgICAgdGgge1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIC50YWJsZS1ib3JkZXJlZCB7XG4gICAgICAgIHRoLFxuICAgICAgICB0ZCB7XG4gICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb290c3RyYXAgc3BlY2lmaWMgY2hhbmdlcyBlbmRcbn1cbiIsIi8vXG4vLyBTY2FmZm9sZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBSZXNldCB0aGUgYm94LXNpemluZ1xuLy9cbi8vIEhlYWRzIHVwISBUaGlzIHJlc2V0IG1heSBjYXVzZSBjb25mbGljdHMgd2l0aCBzb21lIHRoaXJkLXBhcnR5IHdpZGdldHMuXG4vLyBGb3IgcmVjb21tZW5kYXRpb25zIG9uIHJlc29sdmluZyBzdWNoIGNvbmZsaWN0cywgc2VlXG4vLyBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9nZXR0aW5nLXN0YXJ0ZWQvI3RoaXJkLWJveC1zaXppbmdcbioge1xuICBAaW5jbHVkZSBib3gtc2l6aW5nKGJvcmRlci1ib3gpO1xufVxuKjpiZWZvcmUsXG4qOmFmdGVyIHtcbiAgQGluY2x1ZGUgYm94LXNpemluZyhib3JkZXItYm94KTtcbn1cblxuXG4vLyBCb2R5IHJlc2V0XG5cbmh0bWwge1xuICBmb250LXNpemU6IDEwcHg7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLDAsMCwwKTtcbn1cblxuYm9keSB7XG4gIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktYmFzZTtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICR0ZXh0LWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iZztcbn1cblxuLy8gUmVzZXQgZm9udHMgZm9yIHJlbGV2YW50IGVsZW1lbnRzXG5pbnB1dCxcbmJ1dHRvbixcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG5cblxuLy8gTGlua3NcblxuYSB7XG4gIGNvbG9yOiAkbGluay1jb2xvcjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246ICRsaW5rLWhvdmVyLWRlY29yYXRpb247XG4gIH1cblxuICAmOmZvY3VzIHtcbiAgICBAaW5jbHVkZSB0YWItZm9jdXM7XG4gIH1cbn1cblxuXG4vLyBGaWd1cmVzXG4vL1xuLy8gV2UgcmVzZXQgdGhpcyBoZXJlIGJlY2F1c2UgcHJldmlvdXNseSBOb3JtYWxpemUgaGFkIG5vIGBmaWd1cmVgIG1hcmdpbnMuIFRoaXNcbi8vIGVuc3VyZXMgd2UgZG9uJ3QgYnJlYWsgYW55b25lJ3MgdXNlIG9mIHRoZSBlbGVtZW50LlxuXG5maWd1cmUge1xuICBtYXJnaW46IDA7XG59XG5cblxuLy8gSW1hZ2VzXG5cbmltZyB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi8vIFJlc3BvbnNpdmUgaW1hZ2VzIChlbnN1cmUgaW1hZ2VzIGRvbid0IHNjYWxlIGJleW9uZCB0aGVpciBwYXJlbnRzKVxuLmltZy1yZXNwb25zaXZlIHtcbiAgQGluY2x1ZGUgaW1nLXJlc3BvbnNpdmU7XG59XG5cbi8vIFJvdW5kZWQgY29ybmVyc1xuLmltZy1yb3VuZGVkIHtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7XG59XG5cbi8vIEltYWdlIHRodW1ibmFpbHNcbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyBpcyBtaXhpbi1lZCBpbnRvIHRodW1ibmFpbHMubGVzcyBmb3IgYC50aHVtYm5haWxgLlxuLmltZy10aHVtYm5haWwge1xuICBwYWRkaW5nOiAkdGh1bWJuYWlsLXBhZGRpbmc7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHRodW1ibmFpbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJHRodW1ibmFpbC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICR0aHVtYm5haWwtYm9yZGVyLXJhZGl1cztcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihhbGwgLjJzIGVhc2UtaW4tb3V0KTtcblxuICAvLyBLZWVwIHRoZW0gYXQgbW9zdCAxMDAlIHdpZGVcbiAgQGluY2x1ZGUgaW1nLXJlc3BvbnNpdmUoaW5saW5lLWJsb2NrKTtcbn1cblxuLy8gUGVyZmVjdCBjaXJjbGVcbi5pbWctY2lyY2xlIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlOyAvLyBzZXQgcmFkaXVzIGluIHBlcmNlbnRzXG59XG5cblxuLy8gSG9yaXpvbnRhbCBydWxlc1xuXG5ociB7XG4gIG1hcmdpbi10b3A6ICAgICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAkaHItYm9yZGVyO1xufVxuXG5cbi8vIE9ubHkgZGlzcGxheSBjb250ZW50IHRvIHNjcmVlbiByZWFkZXJzXG4vL1xuLy8gU2VlOiBodHRwOi8vYTExeXByb2plY3QuY29tL3Bvc3RzL2hvdy10by1oaWRlLWNvbnRlbnQvXG5cbi5zci1vbmx5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiAtMXB4O1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjbGlwOiByZWN0KDAsMCwwLDApO1xuICBib3JkZXI6IDA7XG59XG5cbi8vIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIC5zci1vbmx5IHRvIG9ubHkgZGlzcGxheSBjb250ZW50IHdoZW4gaXQncyBmb2N1c2VkLlxuLy8gVXNlZnVsIGZvciBcIlNraXAgdG8gbWFpbiBjb250ZW50XCIgbGlua3M7IHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL05PVEUtV0NBRzIwLVRFQ0hTLTIwMTMwOTA1L0cxXG4vLyBDcmVkaXQ6IEhUTUw1IEJvaWxlcnBsYXRlXG5cbi5zci1vbmx5LWZvY3VzYWJsZSB7XG4gICY6YWN0aXZlLFxuICAmOmZvY3VzIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBtYXJnaW46IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgY2xpcDogYXV0bztcbiAgfVxufVxuXG5cbi8vIGlPUyBcImNsaWNrYWJsZSBlbGVtZW50c1wiIGZpeCBmb3Igcm9sZT1cImJ1dHRvblwiXG4vL1xuLy8gRml4ZXMgXCJjbGlja2FiaWxpdHlcIiBpc3N1ZSAoYW5kIG1vcmUgZ2VuZXJhbGx5LCB0aGUgZmlyaW5nIG9mIGV2ZW50cyBzdWNoIGFzIGZvY3VzIGFzIHdlbGwpXG4vLyBmb3IgdHJhZGl0aW9uYWxseSBub24tZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGggcm9sZT1cImJ1dHRvblwiXG4vLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2NsaWNrI1NhZmFyaV9Nb2JpbGVcblxuW3JvbGU9XCJidXR0b25cIl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4iLCIvLyBWZW5kb3IgUHJlZml4ZXNcbi8vXG4vLyBBbGwgdmVuZG9yIG1peGlucyBhcmUgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgZHVlIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Zcbi8vIEF1dG9wcmVmaXhlciBpbiBvdXIgR3J1bnRmaWxlLiBUaGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC5cblxuLy8gLSBBbmltYXRpb25zXG4vLyAtIEJhY2tmYWNlIHZpc2liaWxpdHlcbi8vIC0gQm94IHNoYWRvd1xuLy8gLSBCb3ggc2l6aW5nXG4vLyAtIENvbnRlbnQgY29sdW1uc1xuLy8gLSBIeXBoZW5zXG4vLyAtIFBsYWNlaG9sZGVyIHRleHRcbi8vIC0gVHJhbnNmb3JtYXRpb25zXG4vLyAtIFRyYW5zaXRpb25zXG4vLyAtIFVzZXIgU2VsZWN0XG5cblxuLy8gQW5pbWF0aW9uc1xuQG1peGluIGFuaW1hdGlvbigkYW5pbWF0aW9uKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiAkYW5pbWF0aW9uO1xuICAgICAgIC1vLWFuaW1hdGlvbjogJGFuaW1hdGlvbjtcbiAgICAgICAgICBhbmltYXRpb246ICRhbmltYXRpb247XG59XG5AbWl4aW4gYW5pbWF0aW9uLW5hbWUoJG5hbWUpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogJG5hbWU7XG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6ICRuYW1lO1xufVxuQG1peGluIGFuaW1hdGlvbi1kdXJhdGlvbigkZHVyYXRpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246ICRkdXJhdGlvbjtcbiAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246ICRkdXJhdGlvbjtcbn1cbkBtaXhpbiBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uKCR0aW1pbmctZnVuY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdGltaW5nLWZ1bmN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ICR0aW1pbmctZnVuY3Rpb247XG59XG5AbWl4aW4gYW5pbWF0aW9uLWRlbGF5KCRkZWxheSkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogJGRlbGF5O1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogJGRlbGF5O1xufVxuQG1peGluIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQoJGl0ZXJhdGlvbi1jb3VudCkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6ICRpdGVyYXRpb24tY291bnQ7XG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogJGl0ZXJhdGlvbi1jb3VudDtcbn1cbkBtaXhpbiBhbmltYXRpb24tZGlyZWN0aW9uKCRkaXJlY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiAkZGlyZWN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi1kaXJlY3Rpb246ICRkaXJlY3Rpb247XG59XG5AbWl4aW4gYW5pbWF0aW9uLWZpbGwtbW9kZSgkZmlsbC1tb2RlKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogJGZpbGwtbW9kZTtcbiAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiAkZmlsbC1tb2RlO1xufVxuXG4vLyBCYWNrZmFjZSB2aXNpYmlsaXR5XG4vLyBQcmV2ZW50IGJyb3dzZXJzIGZyb20gZmxpY2tlcmluZyB3aGVuIHVzaW5nIENTUyAzRCB0cmFuc2Zvcm1zLlxuLy8gRGVmYXVsdCB2YWx1ZSBpcyBgdmlzaWJsZWAsIGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBgaGlkZGVuYFxuXG5AbWl4aW4gYmFja2ZhY2UtdmlzaWJpbGl0eSgkdmlzaWJpbGl0eSl7XG4gIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogJHZpc2liaWxpdHk7XG4gICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogJHZpc2liaWxpdHk7XG4gICAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogJHZpc2liaWxpdHk7XG59XG5cbi8vIERyb3Agc2hhZG93c1xuLy9cbi8vIE5vdGU6IERlcHJlY2F0ZWQgYC5ib3gtc2hhZG93KClgIGFzIG9mIHYzLjEuMCBzaW5jZSBhbGwgb2YgQm9vdHN0cmFwJ3Ncbi8vIHN1cHBvcnRlZCBicm93c2VycyB0aGF0IGhhdmUgYm94IHNoYWRvdyBjYXBhYmlsaXRpZXMgbm93IHN1cHBvcnQgaXQuXG5cbkBtaXhpbiBib3gtc2hhZG93KCRzaGFkb3cuLi4pIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAkc2hhZG93OyAvLyBpT1MgPDQuMyAmIEFuZHJvaWQgPDQuMVxuICAgICAgICAgIGJveC1zaGFkb3c6ICRzaGFkb3c7XG59XG5cbi8vIEJveCBzaXppbmdcbkBtaXhpbiBib3gtc2l6aW5nKCRib3htb2RlbCkge1xuICAtd2Via2l0LWJveC1zaXppbmc6ICRib3htb2RlbDtcbiAgICAgLW1vei1ib3gtc2l6aW5nOiAkYm94bW9kZWw7XG4gICAgICAgICAgYm94LXNpemluZzogJGJveG1vZGVsO1xufVxuXG4vLyBDU1MzIENvbnRlbnQgQ29sdW1uc1xuQG1peGluIGNvbnRlbnQtY29sdW1ucygkY29sdW1uLWNvdW50LCAkY29sdW1uLWdhcDogJGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIC13ZWJraXQtY29sdW1uLWNvdW50OiAkY29sdW1uLWNvdW50O1xuICAgICAtbW96LWNvbHVtbi1jb3VudDogJGNvbHVtbi1jb3VudDtcbiAgICAgICAgICBjb2x1bW4tY291bnQ6ICRjb2x1bW4tY291bnQ7XG4gIC13ZWJraXQtY29sdW1uLWdhcDogJGNvbHVtbi1nYXA7XG4gICAgIC1tb3otY29sdW1uLWdhcDogJGNvbHVtbi1nYXA7XG4gICAgICAgICAgY29sdW1uLWdhcDogJGNvbHVtbi1nYXA7XG59XG5cbi8vIE9wdGlvbmFsIGh5cGhlbmF0aW9uXG5AbWl4aW4gaHlwaGVucygkbW9kZTogYXV0bykge1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIC13ZWJraXQtaHlwaGVuczogJG1vZGU7XG4gICAgIC1tb3otaHlwaGVuczogJG1vZGU7XG4gICAgICAtbXMtaHlwaGVuczogJG1vZGU7IC8vIElFMTArXG4gICAgICAgLW8taHlwaGVuczogJG1vZGU7XG4gICAgICAgICAgaHlwaGVuczogJG1vZGU7XG59XG5cbi8vIFBsYWNlaG9sZGVyIHRleHRcbkBtaXhpbiBwbGFjZWhvbGRlcigkY29sb3I6ICRpbnB1dC1jb2xvci1wbGFjZWhvbGRlcikge1xuICAvLyBGaXJlZm94XG4gICY6Oi1tb3otcGxhY2Vob2xkZXIge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgb3BhY2l0eTogMTsgLy8gT3ZlcnJpZGUgRmlyZWZveCdzIHVudXN1YWwgZGVmYXVsdCBvcGFjaXR5OyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTE1MjZcbiAgfVxuICAmOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7IGNvbG9yOiAkY29sb3I7IH0gLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTArXG4gICY6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgIHsgY29sb3I6ICRjb2xvcjsgfSAvLyBTYWZhcmkgYW5kIENocm9tZVxufVxuXG4vLyBUcmFuc2Zvcm1hdGlvbnNcbkBtaXhpbiBzY2FsZSgkcmF0aW8uLi4pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKCRyYXRpbyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgkcmF0aW8pOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogc2NhbGUoJHJhdGlvKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKCRyYXRpbyk7XG59XG5cbkBtaXhpbiBzY2FsZVgoJHJhdGlvKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoJHJhdGlvKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlWCgkcmF0aW8pOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogc2NhbGVYKCRyYXRpbyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoJHJhdGlvKTtcbn1cbkBtaXhpbiBzY2FsZVkoJHJhdGlvKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVkoJHJhdGlvKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlWSgkcmF0aW8pOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogc2NhbGVZKCRyYXRpbyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoJHJhdGlvKTtcbn1cbkBtaXhpbiBza2V3KCR4LCAkeSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goJHgpIHNrZXdZKCR5KTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNrZXdYKCR4KSBza2V3WSgkeSk7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzQ4ODU7IElFOStcbiAgICAgICAtby10cmFuc2Zvcm06IHNrZXdYKCR4KSBza2V3WSgkeSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgkeCkgc2tld1koJHkpO1xufVxuQG1peGluIHRyYW5zbGF0ZSgkeCwgJHkpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgkeCwgJHkpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKCR4LCAkeSk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiB0cmFuc2xhdGUoJHgsICR5KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgkeCwgJHkpO1xufVxuQG1peGluIHRyYW5zbGF0ZTNkKCR4LCAkeSwgJHopIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCR4LCAkeSwgJHopO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoJHgsICR5LCAkeik7XG59XG5AbWl4aW4gcm90YXRlKCRkZWdyZWVzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoJGRlZ3JlZXMpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKCRkZWdyZWVzKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHJvdGF0ZSgkZGVncmVlcyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoJGRlZ3JlZXMpO1xufVxuQG1peGluIHJvdGF0ZVgoJGRlZ3JlZXMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVgoJGRlZ3JlZXMpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlWCgkZGVncmVlcyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiByb3RhdGVYKCRkZWdyZWVzKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoJGRlZ3JlZXMpO1xufVxuQG1peGluIHJvdGF0ZVkoJGRlZ3JlZXMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVkoJGRlZ3JlZXMpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlWSgkZGVncmVlcyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiByb3RhdGVZKCRkZWdyZWVzKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVkoJGRlZ3JlZXMpO1xufVxuQG1peGluIHBlcnNwZWN0aXZlKCRwZXJzcGVjdGl2ZSkge1xuICAtd2Via2l0LXBlcnNwZWN0aXZlOiAkcGVyc3BlY3RpdmU7XG4gICAgIC1tb3otcGVyc3BlY3RpdmU6ICRwZXJzcGVjdGl2ZTtcbiAgICAgICAgICBwZXJzcGVjdGl2ZTogJHBlcnNwZWN0aXZlO1xufVxuQG1peGluIHBlcnNwZWN0aXZlLW9yaWdpbigkcGVyc3BlY3RpdmUpIHtcbiAgLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW46ICRwZXJzcGVjdGl2ZTtcbiAgICAgLW1vei1wZXJzcGVjdGl2ZS1vcmlnaW46ICRwZXJzcGVjdGl2ZTtcbiAgICAgICAgICBwZXJzcGVjdGl2ZS1vcmlnaW46ICRwZXJzcGVjdGl2ZTtcbn1cbkBtaXhpbiB0cmFuc2Zvcm0tb3JpZ2luKCRvcmlnaW4pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAkb3JpZ2luO1xuICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46ICRvcmlnaW47XG4gICAgICAtbXMtdHJhbnNmb3JtLW9yaWdpbjogJG9yaWdpbjsgLy8gSUU5IG9ubHlcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiAkb3JpZ2luO1xufVxuXG5cbi8vIFRyYW5zaXRpb25zXG5cbkBtaXhpbiB0cmFuc2l0aW9uKCR0cmFuc2l0aW9uLi4uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogJHRyYW5zaXRpb247XG4gICAgICAgLW8tdHJhbnNpdGlvbjogJHRyYW5zaXRpb247XG4gICAgICAgICAgdHJhbnNpdGlvbjogJHRyYW5zaXRpb247XG59XG5AbWl4aW4gdHJhbnNpdGlvbi1wcm9wZXJ0eSgkdHJhbnNpdGlvbi1wcm9wZXJ0eS4uLikge1xuICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6ICR0cmFuc2l0aW9uLXByb3BlcnR5O1xuICAgICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6ICR0cmFuc2l0aW9uLXByb3BlcnR5O1xufVxuQG1peGluIHRyYW5zaXRpb24tZGVsYXkoJHRyYW5zaXRpb24tZGVsYXkpIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiAkdHJhbnNpdGlvbi1kZWxheTtcbiAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiAkdHJhbnNpdGlvbi1kZWxheTtcbn1cbkBtaXhpbiB0cmFuc2l0aW9uLWR1cmF0aW9uKCR0cmFuc2l0aW9uLWR1cmF0aW9uLi4uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogJHRyYW5zaXRpb24tZHVyYXRpb247XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogJHRyYW5zaXRpb24tZHVyYXRpb247XG59XG5AbWl4aW4gdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24oJHRpbWluZy1mdW5jdGlvbikge1xuICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdGltaW5nLWZ1bmN0aW9uO1xuICAgICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdGltaW5nLWZ1bmN0aW9uO1xufVxuQG1peGluIHRyYW5zaXRpb24tdHJhbnNmb3JtKCR0cmFuc2l0aW9uLi4uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gJHRyYW5zaXRpb247XG4gICAgIC1tb3otdHJhbnNpdGlvbjogLW1vei10cmFuc2Zvcm0gJHRyYW5zaXRpb247XG4gICAgICAgLW8tdHJhbnNpdGlvbjogLW8tdHJhbnNmb3JtICR0cmFuc2l0aW9uO1xuICAgICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAkdHJhbnNpdGlvbjtcbn1cblxuXG4vLyBVc2VyIHNlbGVjdFxuLy8gRm9yIHNlbGVjdGluZyB0ZXh0IG9uIHRoZSBwYWdlXG5cbkBtaXhpbiB1c2VyLXNlbGVjdCgkc2VsZWN0KSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6ICRzZWxlY3Q7XG4gICAgIC1tb3otdXNlci1zZWxlY3Q6ICRzZWxlY3Q7XG4gICAgICAtbXMtdXNlci1zZWxlY3Q6ICRzZWxlY3Q7IC8vIElFMTArXG4gICAgICAgICAgdXNlci1zZWxlY3Q6ICRzZWxlY3Q7XG59XG4iLCIkYm9vdHN0cmFwLXNhc3MtYXNzZXQtaGVscGVyOiBmYWxzZSAhZGVmYXVsdDtcbi8vXG4vLyBWYXJpYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiRraW1jaGktbG9nbzogXCIuLi9pbWFnZXMvdGhlbWUtZGVmYXVsdC9sb2dvLXdoaXRlLnBuZ1wiO1xuJGljb24tZm9udC1wYXRoOiAnLi4vZm9udHMvZm9udGF3ZXNvbWUnO1xuXG4vLz09IENvbG9yc1xuLy9cbi8vIyMgR3JheSBhbmQgYnJhbmQgY29sb3JzIGZvciB1c2UgYWNyb3NzIEJvb3RzdHJhcC5cblxuJGdyYXktYmFzZTogICAgICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4kZ3JheS1kYXJrZXI6ICAgICAgICAgICAgIzIyMiAhZGVmYXVsdDtcbiRncmF5LWRhcms6ICAgICAgICAgICAgICAgJGdyYXktZGFya2VyICFkZWZhdWx0O1xuJGdyYXk6ICAgICAgICAgICAgICAgICAgICAgICM0NDQgIWRlZmF1bHQ7XG4kZ3JheS1saWdodDogICAgICAgICAgICAgICAjOTk5ICFkZWZhdWx0O1xuJGdyYXktbGlnaHRlcjogICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuXG4kYnJhbmQtcHJpbWFyeTogICAgICAgICAjM2EzOTNiICFkZWZhdWx0OyAvLyAjM2EzOTNiXG4kYnJhbmQtc3VjY2VzczogICAgICAgICAjNWNiODVjICFkZWZhdWx0O1xuJGJyYW5kLWluZm86ICAgICAgICAgICAgIzViYzBkZSAhZGVmYXVsdDtcbiRicmFuZC13YXJuaW5nOiAgICAgICAgICNmMGFkNGUgIWRlZmF1bHQ7XG4kYnJhbmQtZGFuZ2VyOiAgICAgICAgICAjZDk1MzRmICFkZWZhdWx0O1xuJGtpbWNoaS1kcm9wZG93bjogICAgICAjNGQ0YzRlICFkZWZhdWx0O1xuXG5cbi8vIyMgS2ltY2hpIGRlZmF1bHQgY29sb3JzIC0gVE9ETyByZW1vdmUgdGhlc2UgcmVmZXJlbmNlcyBhbmQgbGluayBkbyBTYXNzIE1hcHMgYmVsb3dcblxuJGhvc3RzLWNvbG9yOiAgICAgICAgICAgICAgICAjMDA4YWJmICFkZWZhdWx0O1xuJGd1ZXN0cy1jb2xvcjogICAgICAgICAgICAgICM4Y2M2M2YgIWRlZmF1bHQ7XG4kdGVtcGxhdGVzLWNvbG9yOiAgICAgICAgICMwMGE2YTAgIWRlZmF1bHQ7XG4kc3RvcmFnZS1jb2xvcjogICAgICAgICAgICAgI2ZlYjgxMyAhZGVmYXVsdDtcbiRuZXR3b3Jrcy1jb2xvcjogICAgICAgICAgICM3ZjFjN2QgIWRlZmF1bHQ7XG4kYWRtaW5pc3RyYXRpb24tY29sb3I6ICAgICNkOTE4MmQgIWRlZmF1bHQ7XG5cbiRjb2xvcnM6IChcbiAgICBob3N0OiAgICAgICAgICAgICAgICAjMDA4YWJmLFxuICAgIGd1ZXN0czogICAgICAgICAgICAgICM4Y2M2M2YsXG4gICAgdGVtcGxhdGVzOiAgICAgICAgICMwMGE2YTAsIFxuICAgIHN0b3JhZ2U6ICAgICAgICAgICAgICNmZWI4MTMsXG4gICAgbmV0d29yazogICAgICAgICAgICM3ZjFjN2QsXG4gICAgYWRtaW5pc3RyYXRpb246ICAgICNkOTE4MmRcbik7XG5cblxuLy89PSBTY2FmZm9sZGluZ1xuLy9cbi8vIyMgU2V0dGluZ3MgZm9yIHNvbWUgb2YgdGhlIG1vc3QgZ2xvYmFsIHN0eWxlcy5cblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciBgPGJvZHk+YC5cbiRib2R5LWJnOiAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIEdsb2JhbCB0ZXh0IGNvbG9yIG9uIGA8Ym9keT5gLlxuJHRleHQtY29sb3I6ICAgICAgICAgICAgJGdyYXktZGFya2VyICFkZWZhdWx0O1xuJGhpZ2hsaWdodHMtY29sb3I6ICAgICAjZmZmICFkZWZhdWx0O1xuJGRpc2FibGVkLWNvbG9yOiAgICAgICAjOTk5ICFkZWZhdWx0O1xuXG4vLyoqIEdsb2JhbCB0ZXh0dWFsIGxpbmsgY29sb3IuXG4kbGluay1jb2xvcjogICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogTGluayBob3ZlciBjb2xvciBzZXQgdmlhIGBkYXJrZW4oKWAgZnVuY3Rpb24uXG4kbGluay1ob3Zlci1jb2xvcjogICAgICBkYXJrZW4oJGxpbmstY29sb3IsIDE1JSkgIWRlZmF1bHQ7XG4vLyoqIExpbmsgaG92ZXIgZGVjb3JhdGlvbi5cbiRsaW5rLWhvdmVyLWRlY29yYXRpb246IHVuZGVybGluZSAhZGVmYXVsdDtcblxuXG4vLz09IFR5cG9ncmFwaHlcbi8vXG4vLyMjIEZvbnQsIGxpbmUtaGVpZ2h0LCBhbmQgY29sb3IgZm9yIGJvZHkgdGV4dCwgaGVhZGluZ3MsIGFuZCBtb3JlLlxuXG4kZm9udC1mYW1pbHktc2Fucy1zZXJpZjogIFwiSGVsdmV0aWNhTmV1ZU1lZGl1bVwiLCBcIkhlbHZldGljYU5ldWUtTWVkaXVtXCIsIFwiSGVsdmV0aWNhIE5ldWUgTWVkaXVtXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmICFkZWZhdWx0O1xuJGZvbnQtZmFtaWx5LXNlcmlmOiAgICAgICBHZW9yZ2lhLCBcIlRpbWVzIE5ldyBSb21hblwiLCBUaW1lcywgc2VyaWYgIWRlZmF1bHQ7XG4vLyoqIERlZmF1bHQgbW9ub3NwYWNlIGZvbnRzIGZvciBgPGNvZGU+YCwgYDxrYmQ+YCwgYW5kIGA8cHJlPmAuXG4kZm9udC1mYW1pbHktbW9ub3NwYWNlOiAgIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZSAhZGVmYXVsdDtcbiRmb250LWZhbWlseS1iYXNlOiAgICAgICAgJGZvbnQtZmFtaWx5LXNhbnMtc2VyaWYgIWRlZmF1bHQ7XG4kZm9udC1mYW1pbHktbGlnaHQ6ICAgIFwiSGVsdmV0aWNhTmV1ZUxpZ2h0XCIsIFwiSGVsdmV0aWNhTmV1ZS1MaWdodFwiLCBcIkhlbHZldGljYU5ldWUgTGlnaHRcIiwgXCJIZWx2ZXRpY2FOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZiAhZGVmYXVsdDtcbiRmb250LWZhbWlseS1ib2xkOiAgICBcIkhlbHZldGljYU5ldWVCb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZS1Cb2xkXCIsIFwiSGVsdmV0aWNhTmV1ZSBCb2xkXCIsIFwiSGVsdmV0aWNhIE5ldWUgQm9sZFwiLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiSGVsdmV0aWNhTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZiAhZGVmYXVsdDtcbiRmb250LWZhbWlseS1hbHRlcm5hdGU6ICBcIkhlbHZldGljYSBOZXVlIExUIFcxRyA1NSBSb21hblwiLCBcIkhlbHZldGljYSBOZXVlIExUIFcxR1wiLCBcIkhlbHZldGljYU5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2FOZXVlLVJvbWFuXCIsIFwiSGVsdmV0aWNhIE5ldWUgUm9tYW5cIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWYgIWRlZmF1bHQ7XG5cblxuJGZvbnQtc2l6ZS1iYXNlOiAgICAgICAgICAxNHB4ICFkZWZhdWx0O1xuJGZvbnQtc2l6ZS1sYXJnZTogICAgICAgICBjZWlsKCgkZm9udC1zaXplLWJhc2UgKiAxLjI1KSkgIWRlZmF1bHQ7IC8vIH4xOHB4XG4kZm9udC1zaXplLXNtYWxsOiAgICAgICAgIGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDAuODUpKSAhZGVmYXVsdDsgLy8gfjEycHhcbiRmb250LXNpemUtYnRuOiAgICAgICAgICAgICAxMy41cHQ7XG5cbiRmb250LXNpemUtaDE6ICAgICAgICAgICAgMS41NzFlbSAhZGVmYXVsdDtcbiRmb250LXNpemUtaDI6ICAgICAgICAgICAgMjJweCAhZGVmYXVsdDtcbiRmb250LXNpemUtaDM6ICAgICAgICAgICAgMTdweCAhZGVmYXVsdDtcbiRmb250LXNpemUtaDQ6ICAgICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICFkZWZhdWx0O1xuJGZvbnQtc2l6ZS1oNTogICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgIWRlZmF1bHQ7XG4kZm9udC1zaXplLWg2OiAgICAgICAgICAgICRmb250LXNpemUtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBVbml0LWxlc3MgYGxpbmUtaGVpZ2h0YCBmb3IgdXNlIGluIGNvbXBvbmVudHMgbGlrZSBidXR0b25zLlxuJGxpbmUtaGVpZ2h0LWJhc2U6ICAgICAgICAxLjQyODU3MTQyOSAhZGVmYXVsdDsgLy8gMjAvMTRcbi8vKiogQ29tcHV0ZWQgXCJsaW5lLWhlaWdodFwiIChgZm9udC1zaXplYCAqIGBsaW5lLWhlaWdodGApIGZvciB1c2Ugd2l0aCBgbWFyZ2luYCwgYHBhZGRpbmdgLCBldGMuXG4kbGluZS1oZWlnaHQtY29tcHV0ZWQ6ICAgIGZsb29yKCgkZm9udC1zaXplLWJhc2UgKiAkbGluZS1oZWlnaHQtYmFzZSkpICFkZWZhdWx0OyAvLyB+MjBweFxuXG4vLyoqIEJ5IGRlZmF1bHQsIHRoaXMgaW5oZXJpdHMgZnJvbSB0aGUgYDxib2R5PmAuXG4kaGVhZGluZ3MtZm9udC1mYW1pbHk6ICAgIGluaGVyaXQgIWRlZmF1bHQ7XG4kaGVhZGluZ3MtZm9udC13ZWlnaHQ6ICAgIDUwMCAhZGVmYXVsdDtcbiRoZWFkaW5ncy1saW5lLWhlaWdodDogICAgMS4xICFkZWZhdWx0O1xuJGhlYWRpbmdzLWNvbG9yOiAgICAgICAgICBpbmhlcml0ICFkZWZhdWx0O1xuXG5cbi8vPT0gSWNvbm9ncmFwaHlcbi8vXG4vLyMjIFNwZWNpZnkgY3VzdG9tIGxvY2F0aW9uIGFuZCBmaWxlbmFtZSBvZiB0aGUgaW5jbHVkZWQgR2x5cGhpY29ucyBpY29uIGZvbnQuIFVzZWZ1bCBmb3IgdGhvc2UgaW5jbHVkaW5nIEJvb3RzdHJhcCB2aWEgQm93ZXIuXG5cbi8vKiogTG9hZCBmb250cyBmcm9tIHRoaXMgZGlyZWN0b3J5LlxuXG4vLyBbY29udmVydGVyXSBJZiAkYm9vdHN0cmFwLXNhc3MtYXNzZXQtaGVscGVyIGlmIHVzZWQsIHByb3ZpZGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgYXNzZXRzIGxvYWQgcGF0aC5cbi8vIFtjb252ZXJ0ZXJdIFRoaXMgaXMgYmVjYXVzZSBzb21lIGFzc2V0IGhlbHBlcnMsIHN1Y2ggYXMgU3Byb2NrZXRzLCBkbyBub3Qgd29yayB3aXRoIGZpbGUtcmVsYXRpdmUgcGF0aHMuXG4vLyAkaWNvbi1mb250LXBhdGg6IGlmKCRib290c3RyYXAtc2Fzcy1hc3NldC1oZWxwZXIsIFwiYm9vdHN0cmFwL1wiLCBcIi4uL2ZvbnRzL2Jvb3RzdHJhcC9cIikgIWRlZmF1bHQ7XG5cbi8vKiogRmlsZSBuYW1lIGZvciBhbGwgZm9udCBmaWxlcy5cbi8vICRpY29uLWZvbnQtbmFtZTogICAgICAgICAgXCJnbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyXCIgIWRlZmF1bHQ7XG4vLyoqIEVsZW1lbnQgSUQgd2l0aGluIFNWRyBpY29uIGZpbGUuXG4vLyAkaWNvbi1mb250LXN2Zy1pZDogICAgICAgIFwiZ2x5cGhpY29uc19oYWxmbGluZ3NyZWd1bGFyXCIgIWRlZmF1bHQ7XG5cblxuLy89PSBDb21wb25lbnRzXG4vL1xuLy8jIyBEZWZpbmUgY29tbW9uIHBhZGRpbmcgYW5kIGJvcmRlciByYWRpdXMgc2l6ZXMgYW5kIG1vcmUuIFZhbHVlcyBiYXNlZCBvbiAxNHB4IHRleHQgYW5kIDEuNDI4IGxpbmUtaGVpZ2h0ICh+MjBweCB0byBzdGFydCkuXG5cbiRwYWRkaW5nLWJhc2UtdmVydGljYWw6ICAgICA2cHggIWRlZmF1bHQ7XG4kcGFkZGluZy1iYXNlLWhvcml6b250YWw6ICAgMTJweCAhZGVmYXVsdDtcblxuJHBhZGRpbmctbGFyZ2UtdmVydGljYWw6ICAgIDEwcHggIWRlZmF1bHQ7XG4kcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsOiAgMTZweCAhZGVmYXVsdDtcblxuJHBhZGRpbmctc21hbGwtdmVydGljYWw6ICAgIDVweCAhZGVmYXVsdDtcbiRwYWRkaW5nLXNtYWxsLWhvcml6b250YWw6ICAxMHB4ICFkZWZhdWx0O1xuXG4kcGFkZGluZy14cy12ZXJ0aWNhbDogICAgICAgMXB4ICFkZWZhdWx0O1xuJHBhZGRpbmcteHMtaG9yaXpvbnRhbDogICAgIDVweCAhZGVmYXVsdDtcblxuJGxpbmUtaGVpZ2h0LWxhcmdlOiAgICAgICAgIDEuMzMzMzMzMyAhZGVmYXVsdDsgLy8gZXh0cmEgZGVjaW1hbHMgZm9yIFdpbiA4LjEgQ2hyb21lXG4kbGluZS1oZWlnaHQtc21hbGw6ICAgICAgICAgMS41ICFkZWZhdWx0O1xuXG4kYm9yZGVyLXJhZGl1cy1iYXNlOiAgICAgICAgM3B4ICFkZWZhdWx0O1xuJGJvcmRlci1yYWRpdXMtbGFyZ2U6ICAgICAgIDNweCAhZGVmYXVsdDtcbiRib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICAzcHggIWRlZmF1bHQ7XG5cbi8vKiogR2xvYmFsIGNvbG9yIGZvciBhY3RpdmUgaXRlbXMgKGUuZy4sIG5hdnMgb3IgZHJvcGRvd25zKS5cbiRjb21wb25lbnQtYWN0aXZlLWNvbG9yOiAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBHbG9iYWwgYmFja2dyb3VuZCBjb2xvciBmb3IgYWN0aXZlIGl0ZW1zIChlLmcuLCBuYXZzIG9yIGRyb3Bkb3ducykuXG4kY29tcG9uZW50LWFjdGl2ZS1iZzogICAgICAgJGJyYW5kLXByaW1hcnkgIWRlZmF1bHQ7XG5cbi8vKiogV2lkdGggb2YgdGhlIGBib3JkZXJgIGZvciBnZW5lcmF0aW5nIGNhcmV0cyB0aGF0IGluZGljYXRvciBkcm9wZG93bnMuXG4kY2FyZXQtd2lkdGgtYmFzZTogICAgICAgICAgNHB4ICFkZWZhdWx0O1xuLy8qKiBDYXJldHMgaW5jcmVhc2Ugc2xpZ2h0bHkgaW4gc2l6ZSBmb3IgbGFyZ2VyIGNvbXBvbmVudHMuXG4kY2FyZXQtd2lkdGgtbGFyZ2U6ICAgICAgICAgNXB4ICFkZWZhdWx0O1xuXG5cbi8vPT0gVGFibGVzXG4vL1xuLy8jIyBDdXN0b21pemVzIHRoZSBgLnRhYmxlYCBjb21wb25lbnQgd2l0aCBiYXNpYyB2YWx1ZXMsIGVhY2ggdXNlZCBhY3Jvc3MgYWxsIHRhYmxlIHZhcmlhdGlvbnMuXG5cbi8vKiogUGFkZGluZyBmb3IgYDx0aD5gcyBhbmQgYDx0ZD5gcy5cbiR0YWJsZS1jZWxsLXBhZGRpbmc6ICAgICAgICAgICAgOHB4ICFkZWZhdWx0O1xuLy8qKiBQYWRkaW5nIGZvciBjZWxscyBpbiBgLnRhYmxlLWNvbmRlbnNlZGAuXG4kdGFibGUtY29uZGVuc2VkLWNlbGwtcGFkZGluZzogIDVweCAhZGVmYXVsdDtcblxuLy8qKiBEZWZhdWx0IGJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgYWxsIHRhYmxlcy5cbiR0YWJsZS1iZzogICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgYC50YWJsZS1zdHJpcGVkYC5cbiR0YWJsZS1iZy1hY2NlbnQ6ICAgICAgICAgICAgICAgI2Y5ZjlmOSAhZGVmYXVsdDtcbi8vKiogQmFja2dyb3VuZCBjb2xvciB1c2VkIGZvciBgLnRhYmxlLWhvdmVyYC5cbiR0YWJsZS1iZy1ob3ZlcjogICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbiR0YWJsZS1iZy1hY3RpdmU6ICAgICAgICAgICAgICAgJHRhYmxlLWJnLWhvdmVyICFkZWZhdWx0O1xuXG4vLyoqIEJvcmRlciBjb2xvciBmb3IgdGFibGUgYW5kIGNlbGwgYm9yZGVycy5cbiR0YWJsZS1ib3JkZXItY29sb3I6ICAgICAgICAgICAgI2RkZCAhZGVmYXVsdDtcblxuXG4vLz09IEJ1dHRvbnNcbi8vXG4vLyMjIEZvciBlYWNoIG9mIEJvb3RzdHJhcCdzIGJ1dHRvbnMsIGRlZmluZSB0ZXh0LCBiYWNrZ3JvdW5kIGFuZCBib3JkZXIgY29sb3IuXG5cbiRidG4tZm9udC13ZWlnaHQ6ICAgICAgICAgICAgICAgIG5vcm1hbCAhZGVmYXVsdDtcblxuJGJ0bi1kZWZhdWx0LWNvbG9yOiAgICAgICAgICAgICAgIzQ0NCAhZGVmYXVsdDtcbiRidG4tZGVmYXVsdC1iZzogICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kYnRuLWRlZmF1bHQtYm9yZGVyOiAgICAgICAgICAgICAjY2NjICFkZWZhdWx0O1xuXG4kYnRuLXByaW1hcnktY29sb3I6ICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuJGJ0bi1wcmltYXJ5LWJnOiAgICAgICAgICAgICAgICAgJGJyYW5kLXByaW1hcnkgIWRlZmF1bHQ7XG4kYnRuLXByaW1hcnktYm9yZGVyOiAgICAgICAgICAgJGJ0bi1wcmltYXJ5LWJnICFkZWZhdWx0O1xuXG4kYnRuLWxvZ2luLWNvbG9yOiAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRidG4tbG9naW4tYmc6ICAgICAgICAgICAgICAgICAjMDA4YWJmICFkZWZhdWx0O1xuJGJ0bi1sb2dpbi1ib3JkZXI6ICAgICAgICAgICAgICRidG4tbG9naW4tYmcgIWRlZmF1bHQ7XG5cbiRidG4tc3VjY2Vzcy1jb2xvcjogICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kYnRuLXN1Y2Nlc3MtYmc6ICAgICAgICAgICAgICAgICAkYnJhbmQtc3VjY2VzcyAhZGVmYXVsdDtcbiRidG4tc3VjY2Vzcy1ib3JkZXI6ICAgICAgICAgICAkYnRuLXN1Y2Nlc3MtYmcgIWRlZmF1bHQ7XG5cbiRidG4taW5mby1jb2xvcjogICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kYnRuLWluZm8tYmc6ICAgICAgICAgICAgICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcbiRidG4taW5mby1ib3JkZXI6ICAgICAgICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcblxuJGJ0bi13YXJuaW5nLWNvbG9yOiAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRidG4td2FybmluZy1iZzogICAgICAgICAgICAgICAgICRicmFuZC13YXJuaW5nICFkZWZhdWx0O1xuJGJ0bi13YXJuaW5nLWJvcmRlcjogICAgICAgICAgICRicmFuZC13YXJuaW5nICFkZWZhdWx0O1xuXG4kYnRuLWRhbmdlci1jb2xvcjogICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuJGJ0bi1kYW5nZXItYmc6ICAgICAgICAgICAgICAgICAgJGJyYW5kLWRhbmdlciAhZGVmYXVsdDtcbiRidG4tZGFuZ2VyLWJvcmRlcjogICAgICAgICAgICAkYnJhbmQtZGFuZ2VyICFkZWZhdWx0O1xuXG4kYnRuLWxpbmstZGlzYWJsZWQtY29sb3I6ICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcblxuLy8gQWxsb3dzIGZvciBjdXN0b21pemluZyBidXR0b24gcmFkaXVzIGluZGVwZW5kZW50bHkgZnJvbSBnbG9iYWwgYm9yZGVyIHJhZGl1c1xuJGJ0bi1ib3JkZXItcmFkaXVzLWJhc2U6ICAgICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcbiRidG4tYm9yZGVyLXJhZGl1cy1sYXJnZTogICAgICAgICRib3JkZXItcmFkaXVzLWxhcmdlICFkZWZhdWx0O1xuJGJ0bi1ib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICAgJGJvcmRlci1yYWRpdXMtc21hbGwgIWRlZmF1bHQ7XG5cblxuLy89PSBGb3Jtc1xuLy9cbi8vIyNcblxuLy8qKiBgPGlucHV0PmAgYmFja2dyb3VuZCBjb2xvclxuJGlucHV0LWJnOiAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogYDxpbnB1dCBkaXNhYmxlZD5gIGJhY2tncm91bmQgY29sb3JcbiRpbnB1dC1iZy1kaXNhYmxlZDogICAgICAgICAgICAgICRncmF5LWxpZ2h0ZXIgIWRlZmF1bHQ7XG5cbi8vKiogVGV4dCBjb2xvciBmb3IgYDxpbnB1dD5gc1xuJGlucHV0LWNvbG9yOiAgICAgICAgICAgICAgICAgICAgJGdyYXkgIWRlZmF1bHQ7XG4vLyoqIGA8aW5wdXQ+YCBib3JkZXIgY29sb3JcbiRpbnB1dC1ib3JkZXI6ICAgICAgICAgICAgICAgICAgICNjY2MgIWRlZmF1bHQ7XG5cbi8vIFRPRE86IFJlbmFtZSBgJGlucHV0LWJvcmRlci1yYWRpdXNgIHRvIGAkaW5wdXQtYm9yZGVyLXJhZGl1cy1iYXNlYCBpbiB2NFxuLy8qKiBEZWZhdWx0IGAuZm9ybS1jb250cm9sYCBib3JkZXIgcmFkaXVzXG4vLyBUaGlzIGhhcyBubyBlZmZlY3Qgb24gYDxzZWxlY3Q+YHMgaW4gc29tZSBicm93c2VycywgZHVlIHRvIHRoZSBsaW1pdGVkIHN0eWxhYmlsaXR5IG9mIGA8c2VsZWN0PmBzIGluIENTUy5cbiRpbnB1dC1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgICRib3JkZXItcmFkaXVzLWJhc2UgIWRlZmF1bHQ7XG4vLyoqIExhcmdlIGAuZm9ybS1jb250cm9sYCBib3JkZXIgcmFkaXVzXG4kaW5wdXQtYm9yZGVyLXJhZGl1cy1sYXJnZTogICAgICAkYm9yZGVyLXJhZGl1cy1sYXJnZSAhZGVmYXVsdDtcbi8vKiogU21hbGwgYC5mb3JtLWNvbnRyb2xgIGJvcmRlciByYWRpdXNcbiRpbnB1dC1ib3JkZXItcmFkaXVzLXNtYWxsOiAgICAgICRib3JkZXItcmFkaXVzLXNtYWxsICFkZWZhdWx0O1xuXG4vLyoqIEJvcmRlciBjb2xvciBmb3IgaW5wdXRzIG9uIGZvY3VzXG4kaW5wdXQtYm9yZGVyLWZvY3VzOiAgICAgICAgICAgICAjNjZhZmU5ICFkZWZhdWx0O1xuXG4vLyoqIFBsYWNlaG9sZGVyIHRleHQgY29sb3JcbiRpbnB1dC1jb2xvci1wbGFjZWhvbGRlcjogICAgICAgICM5OTkgIWRlZmF1bHQ7XG5cbi8vKiogRGVmYXVsdCBgLmZvcm0tY29udHJvbGAgaGVpZ2h0XG4kaW5wdXQtaGVpZ2h0LWJhc2U6ICAgICAgICAgICAgICAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICsgKCRwYWRkaW5nLWJhc2UtdmVydGljYWwgKiAyKSArIDIpICFkZWZhdWx0O1xuLy8qKiBMYXJnZSBgLmZvcm0tY29udHJvbGAgaGVpZ2h0XG4kaW5wdXQtaGVpZ2h0LWxhcmdlOiAgICAgICAgICAgICAoY2VpbCgkZm9udC1zaXplLWxhcmdlICogJGxpbmUtaGVpZ2h0LWxhcmdlKSArICgkcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCAqIDIpICsgMikgIWRlZmF1bHQ7XG4vLyoqIFNtYWxsIGAuZm9ybS1jb250cm9sYCBoZWlnaHRcbiRpbnB1dC1oZWlnaHQtc21hbGw6ICAgICAgICAgICAgIChmbG9vcigkZm9udC1zaXplLXNtYWxsICogJGxpbmUtaGVpZ2h0LXNtYWxsKSArICgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCAqIDIpICsgMikgIWRlZmF1bHQ7XG5cbi8vKiogYC5mb3JtLWdyb3VwYCBtYXJnaW5cbiRmb3JtLWdyb3VwLW1hcmdpbi1ib3R0b206ICAgICAgIDE1cHggIWRlZmF1bHQ7XG5cbiRsZWdlbmQtY29sb3I6ICAgICAgICAgICAgICAgICAgICRncmF5LWRhcmsgIWRlZmF1bHQ7XG4kbGVnZW5kLWJvcmRlci1jb2xvcjogICAgICAgICAgICAjZTVlNWU1ICFkZWZhdWx0O1xuXG4vLyoqIEJhY2tncm91bmQgY29sb3IgZm9yIHRleHR1YWwgaW5wdXQgYWRkb25zXG4kaW5wdXQtZ3JvdXAtYWRkb24tYmc6ICAgICAgICAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuLy8qKiBCb3JkZXIgY29sb3IgZm9yIHRleHR1YWwgaW5wdXQgYWRkb25zXG4kaW5wdXQtZ3JvdXAtYWRkb24tYm9yZGVyLWNvbG9yOiAkaW5wdXQtYm9yZGVyICFkZWZhdWx0O1xuXG4vLyoqIERpc2FibGVkIGN1cnNvciBmb3IgZm9ybSBjb250cm9scyBhbmQgYnV0dG9ucy5cbiRjdXJzb3ItZGlzYWJsZWQ6ICAgICAgICAgICAgICAgIG5vdC1hbGxvd2VkICFkZWZhdWx0O1xuXG5cbi8vPT0gRHJvcGRvd25zXG4vL1xuLy8jIyBEcm9wZG93biBtZW51IGNvbnRhaW5lciBhbmQgY29udGVudHMuXG5cbi8vKiogQmFja2dyb3VuZCBmb3IgdGhlIGRyb3Bkb3duIG1lbnUuXG4kZHJvcGRvd24tYmc6ICAgICAgICAgICAgICAgICAgICAjZmNmY2ZjICFkZWZhdWx0O1xuLy8qKiBEcm9wZG93biBtZW51IGBib3JkZXItY29sb3JgLlxuJGRyb3Bkb3duLWJvcmRlcjogICAgICAgICAgICAgICAgI2NjYyAhZGVmYXVsdDtcbi8vKiogRHJvcGRvd24gbWVudSBgYm9yZGVyLWNvbG9yYCAqKmZvciBJRTgqKi5cbiRkcm9wZG93bi1mYWxsYmFjay1ib3JkZXI6ICAgICAgICNjY2MgIWRlZmF1bHQ7XG4vLyoqIERpdmlkZXIgY29sb3IgZm9yIGJldHdlZW4gZHJvcGRvd24gaXRlbXMuXG4kZHJvcGRvd24tZGl2aWRlci1iZzogICAgICAgICAgICAjZWVlICFkZWZhdWx0O1xuXG4vLyoqIERyb3Bkb3duIGxpbmsgdGV4dCBjb2xvci5cbiRkcm9wZG93bi1saW5rLWNvbG9yOiAgICAgICAgICAgICRncmF5LWRhcmsgIWRlZmF1bHQ7XG4vLyoqIEhvdmVyIGNvbG9yIGZvciBkcm9wZG93biBsaW5rcy5cbiRkcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiAgICAgIGRhcmtlbigkZ3JheS1kYXJrLCA1JSkgIWRlZmF1bHQ7XG4vLyoqIEhvdmVyIGJhY2tncm91bmQgZm9yIGRyb3Bkb3duIGxpbmtzLlxuJGRyb3Bkb3duLWxpbmstaG92ZXItYmc6ICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcblxuLy8qKiBBY3RpdmUgZHJvcGRvd24gbWVudSBpdGVtIHRleHQgY29sb3IuXG4kZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3I6ICAgICAkY29tcG9uZW50LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcbi8vKiogQWN0aXZlIGRyb3Bkb3duIG1lbnUgaXRlbSBiYWNrZ3JvdW5kIGNvbG9yLlxuJGRyb3Bkb3duLWxpbmstYWN0aXZlLWJnOiAgICAgICAgJGNvbXBvbmVudC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG5cbi8vKiogRGlzYWJsZWQgZHJvcGRvd24gbWVudSBpdGVtIGJhY2tncm91bmQgY29sb3IuXG4kZHJvcGRvd24tbGluay1kaXNhYmxlZC1jb2xvcjogICAkZ3JheS1saWdodCAhZGVmYXVsdDtcblxuLy8qKiBUZXh0IGNvbG9yIGZvciBoZWFkZXJzIHdpdGhpbiBkcm9wZG93biBtZW51cy5cbiRkcm9wZG93bi1oZWFkZXItY29sb3I6ICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuXG4vLyoqIERlcHJlY2F0ZWQgYCRkcm9wZG93bi1jYXJldC1jb2xvcmAgYXMgb2YgdjMuMS4wXG4kZHJvcGRvd24tY2FyZXQtY29sb3I6ICAgICAgICAgICAjMDAwICFkZWZhdWx0O1xuXG5cbi8vPT0gTWVudS1GbGF0IERyb3Bkb3duc1xuLy9cbi8vIyMgTWVudS1GbGF0IERyb3Bkb3duIG1lbnUgY29udGFpbmVyIGFuZCBjb250ZW50cy5cblxuJG1lbnUtZmxhdC10ZXh0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kbWVudS1mbGF0LWRyb3Bkb3duLWJnOiAgICAgICAgICAgICAgICAgICAgICAgIzNhMzkzYiAhZGVmYXVsdDtcbiRsaW5lLWhlaWdodC1tZW51LWZsYXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMXB4O1xuLy8qKiBNZW51LUZsYXQgRHJvcGRvd24gbWVudSBgYm9yZGVyLWNvbG9yYC5cbiRtZW51LWZsYXQtZHJvcGRvd24tYm9yZGVyOiAgICAgICAgICAgICAgICAgIzJlMmUyZSAhZGVmYXVsdDtcbiRtZW51LWZsYXQtZHJvcGRvd24tZGl2aWRlci1iZzogICAgICAgICAgICAgIzQwNDA0MiAhZGVmYXVsdDtcbiRtZW51LWZsYXQtZHJvcGRvd24tY3JpdGljYWwtYmc6ICAgICAgICAgICAgICNkOTE4MmQgIWRlZmF1bHQ7XG4vLyoqIERyb3Bkb3duIGxpbmsgdGV4dCBjb2xvci5cbiRtZW51LWZsYXQtZHJvcGRvd24tbGluay1jb2xvcjogICAgICAgICAgICAgICRtZW51LWZsYXQtdGV4dCAhZGVmYXVsdDtcbi8vKiogSG92ZXIgY29sb3IgZm9yIGRyb3Bkb3duIGxpbmtzLlxuJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiAgICAgJG1lbnUtZmxhdC10ZXh0ICFkZWZhdWx0O1xuLy8qKiBIb3ZlciBiYWNrZ3JvdW5kIGZvciBkcm9wZG93biBsaW5rcy5cbiRtZW51LWZsYXQtZHJvcGRvd24tbGluay1ob3Zlci1iZzogICAgICAgICAkbWVudS1mbGF0LWRyb3Bkb3duLWJnICFkZWZhdWx0O1xuLy8qKiBBY3RpdmUgZHJvcGRvd24gbWVudSBpdGVtIHRleHQgY29sb3IuXG4kbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstYWN0aXZlLWNvbG9yOiAgICAgJG1lbnUtZmxhdC10ZXh0ICFkZWZhdWx0O1xuLy8qKiBBY3RpdmUgZHJvcGRvd24gbWVudSBpdGVtIGJhY2tncm91bmQgY29sb3IuXG4kbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstYWN0aXZlLWJnOiAgICAgICAgJG1lbnUtZmxhdC1kcm9wZG93bi1iZyAhZGVmYXVsdDtcblxuXG4vLy0tIFotaW5kZXggbWFzdGVyIGxpc3Rcbi8vXG4vLyBXYXJuaW5nOiBBdm9pZCBjdXN0b21pemluZyB0aGVzZSB2YWx1ZXMuIFRoZXkncmUgdXNlZCBmb3IgYSBiaXJkJ3MgZXllIHZpZXdcbi8vIG9mIGNvbXBvbmVudHMgZGVwZW5kZW50IG9uIHRoZSB6LWF4aXMgYW5kIGFyZSBkZXNpZ25lZCB0byBhbGwgd29yayB0b2dldGhlci5cbi8vXG4vLyBOb3RlOiBUaGVzZSB2YXJpYWJsZXMgYXJlIG5vdCBnZW5lcmF0ZWQgaW50byB0aGUgQ3VzdG9taXplci5cblxuJHppbmRleC1uYXZiYXI6ICAgICAgICAgICAgMTAwMCAhZGVmYXVsdDtcbiR6aW5kZXgtZHJvcGRvd246ICAgICAgICAgIDEwMDAgIWRlZmF1bHQ7XG4kemluZGV4LXBvcG92ZXI6ICAgICAgICAgICAxMDYwICFkZWZhdWx0O1xuJHppbmRleC10b29sdGlwOiAgICAgICAgICAgMTA3MCAhZGVmYXVsdDtcbiR6aW5kZXgtbmF2YmFyLWZpeGVkOiAgICAgIDEwMzAgIWRlZmF1bHQ7XG4kemluZGV4LW1vZGFsLWJhY2tncm91bmQ6ICAxMDQwICFkZWZhdWx0O1xuJHppbmRleC1tb2RhbDogICAgICAgICAgICAgMTA1MCAhZGVmYXVsdDtcblxuLy89PSBNZWRpYSBxdWVyaWVzIGJyZWFrcG9pbnRzXG4vL1xuLy8jIyBEZWZpbmUgdGhlIGJyZWFrcG9pbnRzIGF0IHdoaWNoIHlvdXIgbGF5b3V0IHdpbGwgY2hhbmdlLCBhZGFwdGluZyB0byBkaWZmZXJlbnQgc2NyZWVuIHNpemVzLlxuXG4vLyBFeHRyYSBzbWFsbCBzY3JlZW4gLyBwaG9uZVxuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLXhzYCBhcyBvZiB2My4wLjFcbiRzY3JlZW4teHM6ICAgICAgICAgICAgICAgICAgNDgwcHggIWRlZmF1bHQ7XG4vLyoqIERlcHJlY2F0ZWQgYCRzY3JlZW4teHMtbWluYCBhcyBvZiB2My4yLjBcbiRzY3JlZW4teHMtbWluOiAgICAgICAgICAgICAgJHNjcmVlbi14cyAhZGVmYXVsdDtcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1waG9uZWAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXBob25lOiAgICAgICAgICAgICAgICRzY3JlZW4teHMtbWluICFkZWZhdWx0O1xuXG4vLyBTbWFsbCBzY3JlZW4gLyB0YWJsZXRcbi8vKiogRGVwcmVjYXRlZCBgJHNjcmVlbi1zbWAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXNtOiAgICAgICAgICAgICAgICAgIDk5MnB4ICFkZWZhdWx0O1xuJHNjcmVlbi1zbS1taW46ICAgICAgICAgICAgICAkc2NyZWVuLXNtICFkZWZhdWx0O1xuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLXRhYmxldGAgYXMgb2YgdjMuMC4xXG4kc2NyZWVuLXRhYmxldDogICAgICAgICAgICAgICRzY3JlZW4tc20tbWluICFkZWZhdWx0O1xuXG4vLyBNZWRpdW0gc2NyZWVuIC8gZGVza3RvcFxuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLW1kYCBhcyBvZiB2My4wLjFcbiRzY3JlZW4tbWQ6ICAgICAgICAgICAgICAgICAgMTIwMHB4ICFkZWZhdWx0O1xuJHNjcmVlbi1tZC1taW46ICAgICAgICAgICAgICAkc2NyZWVuLW1kICFkZWZhdWx0O1xuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLWRlc2t0b3BgIGFzIG9mIHYzLjAuMVxuJHNjcmVlbi1kZXNrdG9wOiAgICAgICAgICAgICAkc2NyZWVuLW1kLW1pbiAhZGVmYXVsdDtcblxuLy8gTGFyZ2Ugc2NyZWVuIC8gd2lkZSBkZXNrdG9wXG4vLyoqIERlcHJlY2F0ZWQgYCRzY3JlZW4tbGdgIGFzIG9mIHYzLjAuMVxuJHNjcmVlbi1sZzogICAgICAgICAgICAgICAgICAxNjgwICFkZWZhdWx0O1xuJHNjcmVlbi1sZy1taW46ICAgICAgICAgICAgICAkc2NyZWVuLWxnICFkZWZhdWx0O1xuLy8qKiBEZXByZWNhdGVkIGAkc2NyZWVuLWxnLWRlc2t0b3BgIGFzIG9mIHYzLjAuMVxuJHNjcmVlbi1sZy1kZXNrdG9wOiAgICAgICAgICAkc2NyZWVuLWxnLW1pbiAhZGVmYXVsdDtcblxuLy8gU28gbWVkaWEgcXVlcmllcyBkb24ndCBvdmVybGFwIHdoZW4gcmVxdWlyZWQsIHByb3ZpZGUgYSBtYXhpbXVtXG4kc2NyZWVuLXhzLW1heDogICAgICAgICAgICAgICgkc2NyZWVuLXNtLW1pbiAtIDEpICFkZWZhdWx0O1xuJHNjcmVlbi1zbS1tYXg6ICAgICAgICAgICAgICAoJHNjcmVlbi1tZC1taW4gLSAxKSAhZGVmYXVsdDtcbiRzY3JlZW4tbWQtbWF4OiAgICAgICAgICAgICAgKCRzY3JlZW4tbGctbWluIC0gMSkgIWRlZmF1bHQ7XG5cblxuLy89PSBHcmlkIHN5c3RlbVxuLy9cbi8vIyMgRGVmaW5lIHlvdXIgY3VzdG9tIHJlc3BvbnNpdmUgZ3JpZC5cblxuLy8qKiBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC5cbiRncmlkLWNvbHVtbnM6ICAgICAgICAgICAgICAxMiAhZGVmYXVsdDtcbi8vKiogUGFkZGluZyBiZXR3ZWVuIGNvbHVtbnMuIEdldHMgZGl2aWRlZCBpbiBoYWxmIGZvciB0aGUgbGVmdCBhbmQgcmlnaHQuXG4kZ3JpZC1ndXR0ZXItd2lkdGg6ICAgICAgICAgMCAhZGVmYXVsdDtcbi8vIE5hdmJhciBjb2xsYXBzZVxuLy8qKiBQb2ludCBhdCB3aGljaCB0aGUgbmF2YmFyIGJlY29tZXMgdW5jb2xsYXBzZWQuXG4kZ3JpZC1mbG9hdC1icmVha3BvaW50OiAgICAgJHNjcmVlbi1zbS1taW4gIWRlZmF1bHQ7XG4vLyoqIFBvaW50IGF0IHdoaWNoIHRoZSBuYXZiYXIgYmVnaW5zIGNvbGxhcHNpbmcuXG4kZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heDogKCRncmlkLWZsb2F0LWJyZWFrcG9pbnQgLSAxKSAhZGVmYXVsdDtcblxuXG4vLz09IENvbnRhaW5lciBzaXplc1xuLy9cbi8vIyMgRGVmaW5lIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGAuY29udGFpbmVyYCBmb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcy5cblxuLy8gU21hbGwgc2NyZWVuIC8gdGFibGV0XG4kY29udGFpbmVyLXRhYmxldDogICAgICAgICAgICAgKDk0MHB4ICsgJGdyaWQtZ3V0dGVyLXdpZHRoKSAhZGVmYXVsdDtcbi8vKiogRm9yIGAkc2NyZWVuLXNtLW1pbmAgYW5kIHVwLlxuJGNvbnRhaW5lci1zbTogICAgICAgICAgICAgICAgICRjb250YWluZXItdGFibGV0ICFkZWZhdWx0O1xuXG4vLyBNZWRpdW0gc2NyZWVuIC8gZGVza3RvcFxuJGNvbnRhaW5lci1kZXNrdG9wOiAgICAgICAgICAgICgxMTQwcHggKyAkZ3JpZC1ndXR0ZXItd2lkdGgpICFkZWZhdWx0O1xuLy8qKiBGb3IgYCRzY3JlZW4tbWQtbWluYCBhbmQgdXAuXG4kY29udGFpbmVyLW1kOiAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci1kZXNrdG9wICFkZWZhdWx0O1xuXG4vLyBMYXJnZSBzY3JlZW4gLyB3aWRlIGRlc2t0b3BcbiRjb250YWluZXItbGFyZ2UtZGVza3RvcDogICAgICAoMTU0MHB4ICsgJGdyaWQtZ3V0dGVyLXdpZHRoKSAhZGVmYXVsdDtcbi8vKiogRm9yIGAkc2NyZWVuLWxnLW1pbmAgYW5kIHVwLlxuJGNvbnRhaW5lci1sZzogICAgICAgICAgICAgICAgICRjb250YWluZXItbGFyZ2UtZGVza3RvcCAhZGVmYXVsdDtcblxuXG4vLz09IE5hdmJhclxuLy9cbi8vIyNcblxuLy8gQmFzaWNzIG9mIGEgbmF2YmFyXG4kbmF2YmFyLWhlaWdodDogICAgICAgICAgICAgICAgICAgIDQwcHggIWRlZmF1bHQ7XG4kbmF2YmFyLW1hcmdpbi1ib3R0b206ICAgICAgICAgIDAgIWRlZmF1bHQ7XG4kbmF2YmFyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgIDAgIWRlZmF1bHQ7XG4kbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDogICAgICAgIGZsb29yKCgkZ3JpZC1ndXR0ZXItd2lkdGggLyAyKSkgIWRlZmF1bHQ7XG4kbmF2YmFyLXBhZGRpbmctdmVydGljYWw6ICAgICAgICAgICgoJG5hdmJhci1oZWlnaHQgLSAkbGluZS1oZWlnaHQtY29tcHV0ZWQpIC8gMikgIWRlZmF1bHQ7XG4kbmF2YmFyLWNvbGxhcHNlLW1heC1oZWlnaHQ6ICAgICAgIDM0MHB4ICFkZWZhdWx0O1xuXG4kbmF2YmFyLWRlZmF1bHQtY29sb3I6ICAgICAgICAgICAgICRoaWdobGlnaHRzLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWJnOiAgICAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1ib3JkZXI6ICAgICAgICAgICAgJG5hdmJhci1kZWZhdWx0LWJnICFkZWZhdWx0O1xuXG4vLyBOYXZiYXIgbGlua3NcbiRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICAkbmF2YmFyLWRlZmF1bHQtY29sb3IgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgJG5hdmJhci1kZWZhdWx0LWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItYmc6ICAgICAgICAgICAgIHRyYW5zcGFyZW50ICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWNvbG9yOiAgICAgICAgICRuYXZiYXItZGVmYXVsdC1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZzogICAgICAgICAgICB0cmFuc3BhcmVudCAhZGVmYXVsdDtcbiRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yOiAgICAgICAkZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZzogICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIE5hdmJhciBicmFuZCBsYWJlbFxuJG5hdmJhci1kZWZhdWx0LWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LWJyYW5kLWhvdmVyLWNvbG9yOiAgICAgICAgIGRhcmtlbigkbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3IsIDEwJSkgIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc6ICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIE5hdmJhciB0b2dnbGVcbiRuYXZiYXItZGVmYXVsdC10b2dnbGUtaG92ZXItYmc6ICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuJG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1pY29uLWJhci1iZzogICAgICAgICM4ODggIWRlZmF1bHQ7XG4kbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWJvcmRlci1jb2xvcjogICAgICAgI2RkZCAhZGVmYXVsdDtcblxuXG4vLz09PSBJbnZlcnRlZCBuYXZiYXJcbi8vIFJlc2V0IGludmVydGVkIG5hdmJhciBiYXNpY3NcbiRuYXZiYXItaW52ZXJzZS1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgJGhpZ2hsaWdodHMtY29sb3IgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtYmc6ICAgICAgICAgICAgICAgICAgICAgICAgICMyMjIgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtYm9yZGVyOiAgICAgICAgICAgICAgICAgICAgICRuYXZiYXItaW52ZXJzZS1iZyAhZGVmYXVsdDtcblxuLy8gSW52ZXJ0ZWQgbmF2YmFyIGxpbmtzXG4kbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjogICAgICAgICAgICAgICAgICAgICRoaWdobGlnaHRzLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICAkbmF2YmFyLWludmVyc2UtbGluay1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG4kbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtY29sb3I6ICAgICAgICAgICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnOiAgICAgICAgICAgICAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1iZyAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yOiAgICAgICAgIzk5OSAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWJnOiAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XG5cbi8vIEludmVydGVkIG5hdmJhciBicmFuZCBsYWJlbFxuJG5hdmJhci1pbnZlcnNlLWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgICAkaGlnaGxpZ2h0cy1jb2xvciAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1jb2xvcjogICAgICAgICAgJG5hdmJhci1pbnZlcnNlLWJyYW5kLWNvbG9yICFkZWZhdWx0O1xuJG5hdmJhci1pbnZlcnNlLWJyYW5kLWhvdmVyLWJnOiAgICAgICAgICAgICB0cmFuc3BhcmVudCAhZGVmYXVsdDtcblxuLy8gSW52ZXJ0ZWQgbmF2YmFyIHRvZ2dsZVxuJG5hdmJhci1pbnZlcnNlLXRvZ2dsZS1ob3Zlci1iZzogICAgICAgICAgICB0cmFuc3BhcmVudCAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS10b2dnbGUtaWNvbi1iYXItYmc6ICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRuYXZiYXItaW52ZXJzZS10b2dnbGUtYm9yZGVyLWNvbG9yOiAgICAgICAgIzMzMyAhZGVmYXVsdDtcblxuXG4vLz09IE5hdnNcbi8vXG4vLyMjXG5cbi8vPT09IFNoYXJlZCBuYXYgc3R5bGVzXG4kbmF2LWxpbmstcGFkZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgIDEwcHggMTVweCAhZGVmYXVsdDtcbiRuYXYtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcblxuJG5hdi1kaXNhYmxlZC1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbiRuYXYtZGlzYWJsZWQtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG5cbi8vPT0gVGFic1xuJG5hdi10YWJzLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuXG4kbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3I6ICAgICAgICAgICRncmF5LWxpZ2h0ZXIgIWRlZmF1bHQ7XG5cbiRuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgJGJvZHktYmcgIWRlZmF1bHQ7XG4kbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICRncmF5ICFkZWZhdWx0O1xuJG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjogICAjZGRkICFkZWZhdWx0O1xuXG4kbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG4kbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjogICAgICRib2R5LWJnICFkZWZhdWx0O1xuXG4vLz09IFBpbGxzXG4kbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgICRib3JkZXItcmFkaXVzLWJhc2UgIWRlZmF1bHQ7XG4kbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xuJG5hdi1waWxscy1hY3RpdmUtbGluay1ob3Zlci1jb2xvcjogICAgICAgICAkY29tcG9uZW50LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcblxuXG4vLz09IFBhZ2luYXRpb25cbi8vXG4vLyMjXG5cbiRwYWdpbmF0aW9uLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICRsaW5rLWNvbG9yICFkZWZhdWx0O1xuJHBhZ2luYXRpb24tYmc6ICAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG5cbiRwYWdpbmF0aW9uLWhvdmVyLWNvbG9yOiAgICAgICAgICAgICAgICRsaW5rLWhvdmVyLWNvbG9yICFkZWZhdWx0O1xuJHBhZ2luYXRpb24taG92ZXItYmc6ICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWhvdmVyLWJvcmRlcjogICAgICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG5cbiRwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjogICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFnaW5hdGlvbi1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWFjdGl2ZS1ib3JkZXI6ICAgICAgICAgICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuXG4kcGFnaW5hdGlvbi1kaXNhYmxlZC1jb2xvcjogICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbiRwYWdpbmF0aW9uLWRpc2FibGVkLWJnOiAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFnaW5hdGlvbi1kaXNhYmxlZC1ib3JkZXI6ICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuXG5cbi8vPT0gUGFnZXJcbi8vXG4vLyMjXG5cbiRwYWdlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWJnICFkZWZhdWx0O1xuJHBhZ2VyLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24tYm9yZGVyICFkZWZhdWx0O1xuJHBhZ2VyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgMTVweCAhZGVmYXVsdDtcblxuJHBhZ2VyLWhvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24taG92ZXItYmcgIWRlZmF1bHQ7XG5cbiRwYWdlci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWFjdGl2ZS1iZyAhZGVmYXVsdDtcbiRwYWdlci1hY3RpdmUtY29sb3I6ICAgICAgICAgICAgICAgICAgICRwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcblxuJHBhZ2VyLWRpc2FibGVkLWNvbG9yOiAgICAgICAgICAgICAgICAgJHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG5cblxuLy89PSBKdW1ib3Ryb25cbi8vXG4vLyMjXG5cbiRqdW1ib3Ryb24tcGFkZGluZzogICAgICAgICAgICAgIDMwcHggIWRlZmF1bHQ7XG4kanVtYm90cm9uLWNvbG9yOiAgICAgICAgICAgICAgICBpbmhlcml0ICFkZWZhdWx0O1xuJGp1bWJvdHJvbi1iZzogICAgICAgICAgICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbiRqdW1ib3Ryb24taGVhZGluZy1jb2xvcjogICAgICAgIGluaGVyaXQgIWRlZmF1bHQ7XG4kanVtYm90cm9uLWZvbnQtc2l6ZTogICAgICAgICAgICBjZWlsKCgkZm9udC1zaXplLWJhc2UgKiAxLjUpKSAhZGVmYXVsdDtcbiRqdW1ib3Ryb24taGVhZGluZy1mb250LXNpemU6ICAgIGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDQuNSkpICFkZWZhdWx0O1xuXG5cbi8vPT0gRm9ybSBzdGF0ZXMgYW5kIGFsZXJ0c1xuLy9cbi8vIyMgRGVmaW5lIGNvbG9ycyBmb3IgZm9ybSBmZWVkYmFjayBzdGF0ZXMgYW5kLCBieSBkZWZhdWx0LCBhbGVydHMuXG5cbiRzdGF0ZS1zdWNjZXNzLXRleHQ6ICAgICAgICAgICAgICM2YzZjNmMgIWRlZmF1bHQ7XG4kc3RhdGUtc3VjY2Vzcy1iZzogICAgICAgICAgICAgICAjZGFlNmNiICFkZWZhdWx0O1xuJHN0YXRlLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgICAgIzhjYzYzZiAhZGVmYXVsdDtcblxuJHN0YXRlLWluZm8tdGV4dDogICAgICAgICAgICAgICAgIzZjNmM2YyAhZGVmYXVsdDtcbiRzdGF0ZS1pbmZvLWJnOiAgICAgICAgICAgICAgICAgICNkOWVkZjcgIWRlZmF1bHQ7XG4kc3RhdGUtaW5mby1ib3JkZXI6ICAgICAgICAgICAgICAjMDA4YWJmICFkZWZhdWx0O1xuXG4kc3RhdGUtd2FybmluZy10ZXh0OiAgICAgICAgICAgICAjNmM2YzZjICFkZWZhdWx0O1xuJHN0YXRlLXdhcm5pbmctYmc6ICAgICAgICAgICAgICAgI2YxZTNjMiAhZGVmYXVsdDtcbiRzdGF0ZS13YXJuaW5nLWJvcmRlcjogICAgICAgICAgICNmZGI4MTMgIWRlZmF1bHQ7XG5cbiRzdGF0ZS1kYW5nZXItdGV4dDogICAgICAgICAgICAgICM2YzZjNmMgIWRlZmF1bHQ7XG4kc3RhdGUtZGFuZ2VyLWJnOiAgICAgICAgICAgICAgICAgI2VhYzNjNyAhZGVmYXVsdDtcbiRzdGF0ZS1kYW5nZXItYm9yZGVyOiAgICAgICAgICAgI2Q5MTgyZCAhZGVmYXVsdDtcblxuXG4vLz09IFRvb2x0aXBzXG4vL1xuLy8jI1xuXG4vLyoqIFRvb2x0aXAgbWF4IHdpZHRoXG4kdG9vbHRpcC1tYXgtd2lkdGg6ICAgICAgICAgICAyMDBweCAhZGVmYXVsdDtcbi8vKiogVG9vbHRpcCB0ZXh0IGNvbG9yXG4kdG9vbHRpcC1jb2xvcjogICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBUb29sdGlwIGJhY2tncm91bmQgY29sb3JcbiR0b29sdGlwLWJnOiAgICAgICAgICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4kdG9vbHRpcC1vcGFjaXR5OiAgICAgICAgICAgICAuOSAhZGVmYXVsdDtcblxuLy8qKiBUb29sdGlwIGFycm93IHdpZHRoXG4kdG9vbHRpcC1hcnJvdy13aWR0aDogICAgICAgICA1cHggIWRlZmF1bHQ7XG4vLyoqIFRvb2x0aXAgYXJyb3cgY29sb3JcbiR0b29sdGlwLWFycm93LWNvbG9yOiAgICAgICAgICR0b29sdGlwLWJnICFkZWZhdWx0O1xuXG5cbi8vPT0gUG9wb3ZlcnNcbi8vXG4vLyMjXG5cbi8vKiogUG9wb3ZlciBib2R5IGJhY2tncm91bmQgY29sb3JcbiRwb3BvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogUG9wb3ZlciBtYXhpbXVtIHdpZHRoXG4kcG9wb3Zlci1tYXgtd2lkdGg6ICAgICAgICAgICAgICAgICAgIDI3NnB4ICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIGJvcmRlciBjb2xvclxuJHBvcG92ZXItYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4yKSAhZGVmYXVsdDtcbi8vKiogUG9wb3ZlciBmYWxsYmFjayBib3JkZXIgY29sb3JcbiRwb3BvdmVyLWZhbGxiYWNrLWJvcmRlci1jb2xvcjogICAgICAgI2NjYyAhZGVmYXVsdDtcblxuLy8qKiBQb3BvdmVyIHRpdGxlIGJhY2tncm91bmQgY29sb3JcbiRwb3BvdmVyLXRpdGxlLWJnOiAgICAgICAgICAgICAgICAgICAgZGFya2VuKCRwb3BvdmVyLWJnLCAzJSkgIWRlZmF1bHQ7XG5cbi8vKiogUG9wb3ZlciBhcnJvdyB3aWR0aFxuJHBvcG92ZXItYXJyb3ctd2lkdGg6ICAgICAgICAgICAgICAgICAxMHB4ICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIGFycm93IGNvbG9yXG4kcG9wb3Zlci1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICAgICRwb3BvdmVyLWJnICFkZWZhdWx0O1xuXG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgd2lkdGhcbiRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoOiAgICAgICAgICAgKCRwb3BvdmVyLWFycm93LXdpZHRoICsgMSkgIWRlZmF1bHQ7XG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgY29sb3JcbiRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yOiAgICAgICAgICAgZmFkZV9pbigkcG9wb3Zlci1ib3JkZXItY29sb3IsIDAuMDUpICFkZWZhdWx0O1xuLy8qKiBQb3BvdmVyIG91dGVyIGFycm93IGZhbGxiYWNrIGNvbG9yXG4kcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjogIGRhcmtlbigkcG9wb3Zlci1mYWxsYmFjay1ib3JkZXItY29sb3IsIDIwJSkgIWRlZmF1bHQ7XG5cblxuLy89PSBMYWJlbHNcbi8vXG4vLyMjXG5cbi8vKiogRGVmYXVsdCBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtZGVmYXVsdC1iZzogICAgICAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbi8vKiogUHJpbWFyeSBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtcHJpbWFyeS1iZzogICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogU3VjY2VzcyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtc3VjY2Vzcy1iZzogICAgICAgICAgICAkYnJhbmQtc3VjY2VzcyAhZGVmYXVsdDtcbi8vKiogSW5mbyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtaW5mby1iZzogICAgICAgICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcbi8vKiogV2FybmluZyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG4kbGFiZWwtd2FybmluZy1iZzogICAgICAgICAgICAkYnJhbmQtd2FybmluZyAhZGVmYXVsdDtcbi8vKiogRGFuZ2VyIGxhYmVsIGJhY2tncm91bmQgY29sb3JcbiRsYWJlbC1kYW5nZXItYmc6ICAgICAgICAgICAgICRicmFuZC1kYW5nZXIgIWRlZmF1bHQ7XG5cbi8vKiogRGVmYXVsdCBsYWJlbCB0ZXh0IGNvbG9yXG4kbGFiZWwtY29sb3I6ICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBEZWZhdWx0IHRleHQgY29sb3Igb2YgYSBsaW5rZWQgbGFiZWxcbiRsYWJlbC1saW5rLWhvdmVyLWNvbG9yOiAgICAgICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBNb2RhbHNcbi8vXG4vLyMjXG5cbi8vKiogUGFkZGluZyBhcHBsaWVkIHRvIHRoZSBtb2RhbCBib2R5XG4kbW9kYWwtaW5uZXItcGFkZGluZzogICAgICAgICAyMHB4IDMwcHggIWRlZmF1bHQ7XG5cbi8vKiogUGFkZGluZyBhcHBsaWVkIHRvIHRoZSBtb2RhbCB0aXRsZVxuJG1vZGFsLXRpdGxlLXBhZGRpbmc6ICAgICAgICAgMjdweCAxNHB4IDE0cHggMzBweCAhZGVmYXVsdDtcbi8vKiogTW9kYWwgdGl0bGUgbGluZS1oZWlnaHRcbiRtb2RhbC10aXRsZS1saW5lLWhlaWdodDogICAgIDIzcHggIWRlZmF1bHQ7XG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvZiBtb2RhbCBjb250ZW50IGFyZWFcbiRtb2RhbC1jb250ZW50LWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogTW9kYWwgY29udGVudCBib3JkZXIgY29sb3JcbiRtb2RhbC1jb250ZW50LWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgICAgcmdiYSgxNzAsMTcwLDE3MCwuMykgIWRlZmF1bHQ7XG4vLyoqIE1vZGFsIGNvbnRlbnQgYm9yZGVyIGNvbG9yICoqZm9yIElFOCoqXG4kbW9kYWwtY29udGVudC1mYWxsYmFjay1ib3JkZXItY29sb3I6ICAgICAgICAgICNhYWEgIWRlZmF1bHQ7XG5cbi8vKiogTW9kYWwgYmFja2Ryb3AgYmFja2dyb3VuZCBjb2xvclxuJG1vZGFsLWJhY2tkcm9wLWJnOiAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogTW9kYWwgYmFja2Ryb3Agb3BhY2l0eVxuJG1vZGFsLWJhY2tkcm9wLW9wYWNpdHk6ICAgICAgLjUgIWRlZmF1bHQ7XG4vLyoqIE1vZGFsIGhlYWRlciBib3JkZXIgY29sb3JcbiRtb2RhbC1oZWFkZXItYm9yZGVyLWNvbG9yOiAgIHRyYW5zcGFyZW50ICFkZWZhdWx0O1xuLy8qKiBNb2RhbCBmb290ZXIgYm9yZGVyIGNvbG9yXG4kbW9kYWwtZm9vdGVyLWJvcmRlci1jb2xvcjogICAkbW9kYWwtaGVhZGVyLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcblxuJG1vZGFsLWxnOiAgICAgICAgICAgICAgICAgICAgMTEyNHB4ICFkZWZhdWx0O1xuJG1vZGFsLW1kOiAgICAgICAgICAgICAgICAgICAgODI0cHggIWRlZmF1bHQ7XG4kbW9kYWwtc206ICAgICAgICAgICAgICAgICAgICA1MjRweCAhZGVmYXVsdDtcblxuXG4vLz09IEFsZXJ0c1xuLy9cbi8vIyMgRGVmaW5lIGFsZXJ0IGNvbG9ycywgYm9yZGVyIHJhZGl1cywgYW5kIHBhZGRpbmcuXG5cbiRhbGVydC1wYWRkaW5nOiAgICAgICAgICAgICAgIDhweCAxNXB4ICFkZWZhdWx0O1xuJGFsZXJ0LWJvcmRlci1yYWRpdXM6ICAgICAgICAgMCAhZGVmYXVsdDtcbiRhbGVydC1saW5rLWZvbnQtd2VpZ2h0OiAgICAgIGJvbGQgIWRlZmF1bHQ7XG4kYWxlcnQtYm9yZGVyLXdpZHRoOiAgICAgICAgICAwIDAgMCA1cHggIWRlZmF1bHQ7XG4kYWxlcnQtZm9udC1zaXplOiAgICAgICAgICAgICAgICAxMC41cHQgIWRlZmF1bHQ7IFxuXG4kYWxlcnQtc3VjY2Vzcy1iZzogICAgICAgICAgICAkc3RhdGUtc3VjY2Vzcy1iZyAhZGVmYXVsdDtcbiRhbGVydC1zdWNjZXNzLXRleHQ6ICAgICAgICAgICRzdGF0ZS1zdWNjZXNzLXRleHQgIWRlZmF1bHQ7XG4kYWxlcnQtc3VjY2Vzcy1ib3JkZXI6ICAgICAgICAkc3RhdGUtc3VjY2Vzcy1ib3JkZXIgIWRlZmF1bHQ7XG5cbiRhbGVydC1pbmZvLWJnOiAgICAgICAgICAgICAgICRzdGF0ZS1pbmZvLWJnICFkZWZhdWx0O1xuJGFsZXJ0LWluZm8tdGV4dDogICAgICAgICAgICAgJHN0YXRlLWluZm8tdGV4dCAhZGVmYXVsdDtcbiRhbGVydC1pbmZvLWJvcmRlcjogICAgICAgICAgICRzdGF0ZS1pbmZvLWJvcmRlciAhZGVmYXVsdDtcblxuJGFsZXJ0LXdhcm5pbmctYmc6ICAgICAgICAgICAgJHN0YXRlLXdhcm5pbmctYmcgIWRlZmF1bHQ7XG4kYWxlcnQtd2FybmluZy10ZXh0OiAgICAgICAgICAkc3RhdGUtd2FybmluZy10ZXh0ICFkZWZhdWx0O1xuJGFsZXJ0LXdhcm5pbmctYm9yZGVyOiAgICAgICAgJHN0YXRlLXdhcm5pbmctYm9yZGVyICFkZWZhdWx0O1xuXG4kYWxlcnQtZGFuZ2VyLWJnOiAgICAgICAgICAgICAkc3RhdGUtZGFuZ2VyLWJnICFkZWZhdWx0O1xuJGFsZXJ0LWRhbmdlci10ZXh0OiAgICAgICAgICAgJHN0YXRlLWRhbmdlci10ZXh0ICFkZWZhdWx0O1xuJGFsZXJ0LWRhbmdlci1ib3JkZXI6ICAgICAgICAgJHN0YXRlLWRhbmdlci1ib3JkZXIgIWRlZmF1bHQ7XG5cblxuLy89PSBQcm9ncmVzcyBiYXJzXG4vL1xuLy8jI1xuXG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIHdob2xlIHByb2dyZXNzIGNvbXBvbmVudFxuJHByb2dyZXNzLWJnOiAgICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbi8vKiogUHJvZ3Jlc3MgYmFyIHRleHQgY29sb3JcbiRwcm9ncmVzcy1iYXItY29sb3I6ICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4vLyoqIFZhcmlhYmxlIGZvciBzZXR0aW5nIHJvdW5kZWQgY29ybmVycyBvbiBwcm9ncmVzcyBiYXIuXG4kcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogICAgICAkYm9yZGVyLXJhZGl1cy1iYXNlICFkZWZhdWx0O1xuXG4vLyoqIERlZmF1bHQgcHJvZ3Jlc3MgYmFyIGNvbG9yXG4kcHJvZ3Jlc3MtYmFyLWJnOiAgICAgICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbi8vKiogU3VjY2VzcyBwcm9ncmVzcyBiYXIgY29sb3JcbiRwcm9ncmVzcy1iYXItc3VjY2Vzcy1iZzogICAgICRicmFuZC1zdWNjZXNzICFkZWZhdWx0O1xuLy8qKiBXYXJuaW5nIHByb2dyZXNzIGJhciBjb2xvclxuJHByb2dyZXNzLWJhci13YXJuaW5nLWJnOiAgICAgJGJyYW5kLXdhcm5pbmcgIWRlZmF1bHQ7XG4vLyoqIERhbmdlciBwcm9ncmVzcyBiYXIgY29sb3JcbiRwcm9ncmVzcy1iYXItZGFuZ2VyLWJnOiAgICAgICRicmFuZC1kYW5nZXIgIWRlZmF1bHQ7XG4vLyoqIEluZm8gcHJvZ3Jlc3MgYmFyIGNvbG9yXG4kcHJvZ3Jlc3MtYmFyLWluZm8tYmc6ICAgICAgICAkYnJhbmQtaW5mbyAhZGVmYXVsdDtcblxuXG4vLz09IExpc3QgZ3JvdXBcbi8vXG4vLyMjXG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvbiBgLmxpc3QtZ3JvdXAtaXRlbWBcbiRsaXN0LWdyb3VwLWJnOiAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbi8vKiogYC5saXN0LWdyb3VwLWl0ZW1gIGJvcmRlciBjb2xvclxuJGxpc3QtZ3JvdXAtYm9yZGVyOiAgICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuLy8qKiBMaXN0IGdyb3VwIGJvcmRlciByYWRpdXNcbiRsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXM6ICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHNpbmdsZSBsaXN0IGl0ZW1zIG9uIGhvdmVyXG4kbGlzdC1ncm91cC1ob3Zlci1iZzogICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4vLyoqIFRleHQgY29sb3Igb2YgYWN0aXZlIGxpc3QgaXRlbXNcbiRsaXN0LWdyb3VwLWFjdGl2ZS1jb2xvcjogICAgICAgJGNvbXBvbmVudC1hY3RpdmUtY29sb3IgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgYWN0aXZlIGxpc3QgaXRlbXNcbiRsaXN0LWdyb3VwLWFjdGl2ZS1iZzogICAgICAgICAgJGNvbXBvbmVudC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG4vLyoqIEJvcmRlciBjb2xvciBvZiBhY3RpdmUgbGlzdCBlbGVtZW50c1xuJGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjogICAgICAkbGlzdC1ncm91cC1hY3RpdmUtYmcgIWRlZmF1bHQ7XG4vLyoqIFRleHQgY29sb3IgZm9yIGNvbnRlbnQgd2l0aGluIGFjdGl2ZSBsaXN0IGl0ZW1zXG4kbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjogIGxpZ2h0ZW4oJGxpc3QtZ3JvdXAtYWN0aXZlLWJnLCA0MCUpICFkZWZhdWx0O1xuXG4vLyoqIFRleHQgY29sb3Igb2YgZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtY29sb3I6ICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG4vLyoqIEJhY2tncm91bmQgY29sb3Igb2YgZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtYmc6ICAgICAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbi8vKiogVGV4dCBjb2xvciBmb3IgY29udGVudCB3aXRoaW4gZGlzYWJsZWQgbGlzdCBpdGVtc1xuJGxpc3QtZ3JvdXAtZGlzYWJsZWQtdGV4dC1jb2xvcjogJGxpc3QtZ3JvdXAtZGlzYWJsZWQtY29sb3IgIWRlZmF1bHQ7XG5cbiRsaXN0LWdyb3VwLWxpbmstY29sb3I6ICAgICAgICAgIzU1NSAhZGVmYXVsdDtcbiRsaXN0LWdyb3VwLWxpbmstaG92ZXItY29sb3I6ICAgJGxpc3QtZ3JvdXAtbGluay1jb2xvciAhZGVmYXVsdDtcbiRsaXN0LWdyb3VwLWxpbmstaGVhZGluZy1jb2xvcjogIzMzMyAhZGVmYXVsdDtcblxuXG4vLz09IFBhbmVsc1xuLy9cbi8vIyNcblxuJHBhbmVsLWJnOiAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRwYW5lbC1ib2R5LXBhZGRpbmc6ICAgICAgICAgIDE1cHggIWRlZmF1bHQ7XG4kcGFuZWwtaGVhZGluZy1wYWRkaW5nOiAgICAgICAxMHB4IDE1cHggIWRlZmF1bHQ7XG4kcGFuZWwtZm9vdGVyLXBhZGRpbmc6ICAgICAgICAkcGFuZWwtaGVhZGluZy1wYWRkaW5nICFkZWZhdWx0O1xuJHBhbmVsLWJvcmRlci1yYWRpdXM6ICAgICAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBCb3JkZXIgY29sb3IgZm9yIGVsZW1lbnRzIHdpdGhpbiBwYW5lbHNcbiRwYW5lbC1pbm5lci1ib3JkZXI6ICAgICAgICAgICNkZGQgIWRlZmF1bHQ7XG4kcGFuZWwtZm9vdGVyLWJnOiAgICAgICAgICAgICAjZjVmNWY1ICFkZWZhdWx0O1xuXG4kcGFuZWwtZGVmYXVsdC10ZXh0OiAgICAgICAgICAkZ3JheS1kYXJrICFkZWZhdWx0O1xuJHBhbmVsLWRlZmF1bHQtYm9yZGVyOiAgICAgICAgI2RkZCAhZGVmYXVsdDtcbiRwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmc6ICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG5cbiRwYW5lbC1wcmltYXJ5LXRleHQ6ICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kcGFuZWwtcHJpbWFyeS1ib3JkZXI6ICAgICAgICAkYnJhbmQtcHJpbWFyeSAhZGVmYXVsdDtcbiRwYW5lbC1wcmltYXJ5LWhlYWRpbmctYmc6ICAgICRicmFuZC1wcmltYXJ5ICFkZWZhdWx0O1xuXG4kcGFuZWwtc3VjY2Vzcy10ZXh0OiAgICAgICAgICAkc3RhdGUtc3VjY2Vzcy10ZXh0ICFkZWZhdWx0O1xuJHBhbmVsLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgJHN0YXRlLXN1Y2Nlc3MtYm9yZGVyICFkZWZhdWx0O1xuJHBhbmVsLXN1Y2Nlc3MtaGVhZGluZy1iZzogICAgJHN0YXRlLXN1Y2Nlc3MtYmcgIWRlZmF1bHQ7XG5cbiRwYW5lbC1pbmZvLXRleHQ6ICAgICAgICAgICAgICRzdGF0ZS1pbmZvLXRleHQgIWRlZmF1bHQ7XG4kcGFuZWwtaW5mby1ib3JkZXI6ICAgICAgICAgICAkc3RhdGUtaW5mby1ib3JkZXIgIWRlZmF1bHQ7XG4kcGFuZWwtaW5mby1oZWFkaW5nLWJnOiAgICAgICAkc3RhdGUtaW5mby1iZyAhZGVmYXVsdDtcblxuJHBhbmVsLXdhcm5pbmctdGV4dDogICAgICAgICAgJHN0YXRlLXdhcm5pbmctdGV4dCAhZGVmYXVsdDtcbiRwYW5lbC13YXJuaW5nLWJvcmRlcjogICAgICAgICRzdGF0ZS13YXJuaW5nLWJvcmRlciAhZGVmYXVsdDtcbiRwYW5lbC13YXJuaW5nLWhlYWRpbmctYmc6ICAgICRzdGF0ZS13YXJuaW5nLWJnICFkZWZhdWx0O1xuXG4kcGFuZWwtZGFuZ2VyLXRleHQ6ICAgICAgICAgICAkc3RhdGUtZGFuZ2VyLXRleHQgIWRlZmF1bHQ7XG4kcGFuZWwtZGFuZ2VyLWJvcmRlcjogICAgICAgICAkc3RhdGUtZGFuZ2VyLWJvcmRlciAhZGVmYXVsdDtcbiRwYW5lbC1kYW5nZXItaGVhZGluZy1iZzogICAgICRzdGF0ZS1kYW5nZXItYmcgIWRlZmF1bHQ7XG5cblxuLy89PSBUaHVtYm5haWxzXG4vL1xuLy8jI1xuXG4vLyoqIFBhZGRpbmcgYXJvdW5kIHRoZSB0aHVtYm5haWwgaW1hZ2VcbiR0aHVtYm5haWwtcGFkZGluZzogICAgICAgICAgIDRweCAhZGVmYXVsdDtcbi8vKiogVGh1bWJuYWlsIGJhY2tncm91bmQgY29sb3JcbiR0aHVtYm5haWwtYmc6ICAgICAgICAgICAgICAgICRib2R5LWJnICFkZWZhdWx0O1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIGNvbG9yXG4kdGh1bWJuYWlsLWJvcmRlcjogICAgICAgICAgICAjZGRkICFkZWZhdWx0O1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIHJhZGl1c1xuJHRodW1ibmFpbC1ib3JkZXItcmFkaXVzOiAgICAgJGJvcmRlci1yYWRpdXMtYmFzZSAhZGVmYXVsdDtcblxuLy8qKiBDdXN0b20gdGV4dCBjb2xvciBmb3IgdGh1bWJuYWlsIGNhcHRpb25zXG4kdGh1bWJuYWlsLWNhcHRpb24tY29sb3I6ICAgICAkdGV4dC1jb2xvciAhZGVmYXVsdDtcbi8vKiogUGFkZGluZyBhcm91bmQgdGhlIHRodW1ibmFpbCBjYXB0aW9uXG4kdGh1bWJuYWlsLWNhcHRpb24tcGFkZGluZzogICA5cHggIWRlZmF1bHQ7XG5cblxuLy89PSBXZWxsc1xuLy9cbi8vIyNcblxuJHdlbGwtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y1ZjVmNSAhZGVmYXVsdDtcbiR3ZWxsLWJvcmRlcjogICAgICAgICAgICAgICAgIGRhcmtlbigkd2VsbC1iZywgNyUpICFkZWZhdWx0O1xuXG5cbi8vPT0gQmFkZ2VzXG4vL1xuLy8jI1xuXG4kYmFkZ2UtY29sb3I6ICAgICAgICAgICAgICAgICAjZmZmICFkZWZhdWx0O1xuLy8qKiBMaW5rZWQgYmFkZ2UgdGV4dCBjb2xvciBvbiBob3ZlclxuJGJhZGdlLWxpbmstaG92ZXItY29sb3I6ICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRiYWRnZS1iZzogICAgICAgICAgICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuXG4vLyoqIEJhZGdlIHRleHQgY29sb3IgaW4gYWN0aXZlIG5hdiBsaW5rXG4kYmFkZ2UtYWN0aXZlLWNvbG9yOiAgICAgICAgICAkbGluay1jb2xvciAhZGVmYXVsdDtcbi8vKiogQmFkZ2UgYmFja2dyb3VuZCBjb2xvciBpbiBhY3RpdmUgbmF2IGxpbmtcbiRiYWRnZS1hY3RpdmUtYmc6ICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG5cbiRiYWRnZS1mb250LXdlaWdodDogICAgICAgICAgIGJvbGQgIWRlZmF1bHQ7XG4kYmFkZ2UtbGluZS1oZWlnaHQ6ICAgICAgICAgICAxICFkZWZhdWx0O1xuJGJhZGdlLWJvcmRlci1yYWRpdXM6ICAgICAgICAgMTBweCAhZGVmYXVsdDtcblxuXG4vLz09IEJyZWFkY3J1bWJzXG4vL1xuLy8jI1xuXG4kYnJlYWRjcnVtYi1wYWRkaW5nLXZlcnRpY2FsOiAgIDhweCAhZGVmYXVsdDtcbiRicmVhZGNydW1iLXBhZGRpbmctaG9yaXpvbnRhbDogMTVweCAhZGVmYXVsdDtcbi8vKiogQnJlYWRjcnVtYiBiYWNrZ3JvdW5kIGNvbG9yXG4kYnJlYWRjcnVtYi1iZzogICAgICAgICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4vLyoqIEJyZWFkY3J1bWIgdGV4dCBjb2xvclxuJGJyZWFkY3J1bWItY29sb3I6ICAgICAgICAgICAgICAjY2NjICFkZWZhdWx0O1xuLy8qKiBUZXh0IGNvbG9yIG9mIGN1cnJlbnQgcGFnZSBpbiB0aGUgYnJlYWRjcnVtYlxuJGJyZWFkY3J1bWItYWN0aXZlLWNvbG9yOiAgICAgICAkZ3JheS1saWdodCAhZGVmYXVsdDtcbi8vKiogVGV4dHVhbCBzZXBhcmF0b3IgZm9yIGJldHdlZW4gYnJlYWRjcnVtYiBlbGVtZW50c1xuJGJyZWFkY3J1bWItc2VwYXJhdG9yOiAgICAgICAgICBcIi9cIiAhZGVmYXVsdDtcblxuXG4vLz09IENhcm91c2VsXG4vL1xuLy8jI1xuXG4kY2Fyb3VzZWwtdGV4dC1zaGFkb3c6ICAgICAgICAgICAgICAgICAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjYpICFkZWZhdWx0O1xuXG4kY2Fyb3VzZWwtY29udHJvbC1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRjYXJvdXNlbC1jb250cm9sLXdpZHRoOiAgICAgICAgICAgICAgICAgICAgICAxNSUgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtY29udHJvbC1vcGFjaXR5OiAgICAgICAgICAgICAgICAgICAgLjUgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtY29udHJvbC1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgMjBweCAhZGVmYXVsdDtcblxuJGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG4kY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcblxuJGNhcm91c2VsLWNhcHRpb24tY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBDbG9zZVxuLy9cbi8vIyNcblxuJGNsb3NlLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgYm9sZCAhZGVmYXVsdDtcbiRjbG9zZS1jb2xvcjogICAgICAgICAgICAgICAgICMwMDAgIWRlZmF1bHQ7XG4kY2xvc2UtdGV4dC1zaGFkb3c6ICAgICAgICAgICAwIDFweCAwICNmZmYgIWRlZmF1bHQ7XG5cblxuLy89PSBDb2RlXG4vL1xuLy8jI1xuXG4kY29kZS1jb2xvcjogICAgICAgICAgICAgICAgICAjYzcyNTRlICFkZWZhdWx0O1xuJGNvZGUtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y5ZjJmNCAhZGVmYXVsdDtcblxuJGtiZC1jb2xvcjogICAgICAgICAgICAgICAgICAgI2ZmZiAhZGVmYXVsdDtcbiRrYmQtYmc6ICAgICAgICAgICAgICAgICAgICAgICMzMzMgIWRlZmF1bHQ7XG5cbiRwcmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICNmNWY1ZjUgIWRlZmF1bHQ7XG4kcHJlLWNvbG9yOiAgICAgICAgICAgICAgICAgICAkZ3JheS1kYXJrICFkZWZhdWx0O1xuJHByZS1ib3JkZXItY29sb3I6ICAgICAgICAgICAgI2NjYyAhZGVmYXVsdDtcbiRwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0OiAgIDM0MHB4ICFkZWZhdWx0O1xuXG5cbi8vPT0gVHlwZVxuLy9cbi8vIyNcblxuLy8qKiBIb3Jpem9udGFsIG9mZnNldCBmb3IgZm9ybXMgYW5kIGxpc3RzLlxuJGNvbXBvbmVudC1vZmZzZXQtaG9yaXpvbnRhbDogMTgwcHggIWRlZmF1bHQ7XG4vLyoqIFRleHQgbXV0ZWQgY29sb3JcbiR0ZXh0LW11dGVkOiAgICAgICAgICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBBYmJyZXZpYXRpb25zIGFuZCBhY3JvbnltcyBib3JkZXIgY29sb3JcbiRhYmJyLWJvcmRlci1jb2xvcjogICAgICAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBIZWFkaW5ncyBzbWFsbCBjb2xvclxuJGhlYWRpbmdzLXNtYWxsLWNvbG9yOiAgICAgICAgJGdyYXktbGlnaHQgIWRlZmF1bHQ7XG4vLyoqIEJsb2NrcXVvdGUgc21hbGwgY29sb3JcbiRibG9ja3F1b3RlLXNtYWxsLWNvbG9yOiAgICAgICRncmF5LWxpZ2h0ICFkZWZhdWx0O1xuLy8qKiBCbG9ja3F1b3RlIGZvbnQgc2l6ZVxuJGJsb2NrcXVvdGUtZm9udC1zaXplOiAgICAgICAgKCRmb250LXNpemUtYmFzZSAqIDEuMjUpICFkZWZhdWx0O1xuLy8qKiBCbG9ja3F1b3RlIGJvcmRlciBjb2xvclxuJGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yOiAgICAgJGdyYXktbGlnaHRlciAhZGVmYXVsdDtcbi8vKiogUGFnZSBoZWFkZXIgYm9yZGVyIGNvbG9yXG4kcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yOiAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuLy8qKiBXaWR0aCBvZiBob3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3QgdGl0bGVzXG4kZGwtaG9yaXpvbnRhbC1vZmZzZXQ6ICAgICAgICAkY29tcG9uZW50LW9mZnNldC1ob3Jpem9udGFsICFkZWZhdWx0O1xuLy8qKiBIb3Jpem9udGFsIGxpbmUgY29sb3IuXG4kaHItYm9yZGVyOiAgICAgICAgICAgICAgICAgICAkZ3JheS1saWdodGVyICFkZWZhdWx0O1xuXG4vLyogXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcblxuLy8gQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgYm9vdHN0cmFwLXNlbGVjdFxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuICovXG5cbiRjb2xvci1yZWQtZXJyb3I6IHJnYigxODUsIDc0LCA3Mik7XG4kY29sb3ItYmx1ZS1ob3ZlcjogcmdiKDEwMCwgMTc3LCAyMTYpO1xuJGNvbG9yLWdyZXktYXJyb3c6IHJnYigyMDQsIDIwNCwgMjA0KTtcblxuJHdpZHRoLWRlZmF1bHQ6IDIyMHB4O1xuXG4kemluZGV4LXNlbGVjdC1kcm9wZG93bjogMTAzNSAhZGVmYXVsdDsgIiwiLy8gV2ViS2l0LXN0eWxlIGZvY3VzXG5cbkBtaXhpbiB0YWItZm9jdXMoKSB7XG4gIC8vIERlZmF1bHRcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIC8vIFdlYktpdFxuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuIiwiLy8gSW1hZ2UgTWl4aW5zXG4vLyAtIFJlc3BvbnNpdmUgaW1hZ2Vcbi8vIC0gUmV0aW5hIGltYWdlXG5cblxuLy8gUmVzcG9uc2l2ZSBpbWFnZVxuLy9cbi8vIEtlZXAgaW1hZ2VzIGZyb20gc2NhbGluZyBiZXlvbmQgdGhlIHdpZHRoIG9mIHRoZWlyIHBhcmVudHMuXG5AbWl4aW4gaW1nLXJlc3BvbnNpdmUoJGRpc3BsYXk6IGJsb2NrKSB7XG4gIGRpc3BsYXk6ICRkaXNwbGF5O1xuICBtYXgtd2lkdGg6IDEwMCU7IC8vIFBhcnQgMTogU2V0IGEgbWF4aW11bSByZWxhdGl2ZSB0byB0aGUgcGFyZW50XG4gIGhlaWdodDogYXV0bzsgLy8gUGFydCAyOiBTY2FsZSB0aGUgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgd2lkdGgsIG90aGVyd2lzZSB5b3UgZ2V0IHN0cmV0Y2hpbmdcbn1cblxuXG4vLyBSZXRpbmEgaW1hZ2Vcbi8vXG4vLyBTaG9ydCByZXRpbmEgbWl4aW4gZm9yIHNldHRpbmcgYmFja2dyb3VuZC1pbWFnZSBhbmQgLXNpemUuIE5vdGUgdGhhdCB0aGVcbi8vIHNwZWxsaW5nIG9mIGBtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW9gIGlzIGludGVudGlvbmFsLlxuQG1peGluIGltZy1yZXRpbmEoJGZpbGUtMXgsICRmaWxlLTJ4LCAkd2lkdGgtMXgsICRoZWlnaHQtMXgpIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGlmKCRib290c3RyYXAtc2Fzcy1hc3NldC1oZWxwZXIsIHR3YnMtaW1hZ2UtcGF0aChcIiN7JGZpbGUtMXh9XCIpLCBcIiN7JGZpbGUtMXh9XCIpKTtcblxuICBAbWVkaWFcbiAgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgIG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyLzEpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAgICAgICAgICAgIG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLFxuICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgICAgICAgICBtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWYoJGJvb3RzdHJhcC1zYXNzLWFzc2V0LWhlbHBlciwgdHdicy1pbWFnZS1wYXRoKFwiI3skZmlsZS0yeH1cIiksIFwiI3skZmlsZS0yeH1cIikpO1xuICAgIGJhY2tncm91bmQtc2l6ZTogJHdpZHRoLTF4ICRoZWlnaHQtMXg7XG4gIH1cbn1cbiIsIi8vXG4vLyBUeXBvZ3JhcGh5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEhlYWRpbmdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsXG4uaDEsIC5oMiwgLmgzLCAuaDQsIC5oNSwgLmg2IHtcbiAgZm9udC1mYW1pbHk6ICRoZWFkaW5ncy1mb250LWZhbWlseTtcbiAgZm9udC13ZWlnaHQ6ICRoZWFkaW5ncy1mb250LXdlaWdodDtcbiAgbGluZS1oZWlnaHQ6ICRoZWFkaW5ncy1saW5lLWhlaWdodDtcbiAgY29sb3I6ICRoZWFkaW5ncy1jb2xvcjtcblxuICBzbWFsbCxcbiAgLnNtYWxsIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIGNvbG9yOiAkaGVhZGluZ3Mtc21hbGwtY29sb3I7XG4gIH1cbn1cblxuaDEsIC5oMSxcbmgyLCAuaDIsXG5oMywgLmgzIHtcbiAgbWFyZ2luLXRvcDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW4tYm90dG9tOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMik7XG5cbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgZm9udC1zaXplOiA2NSU7XG4gIH1cbn1cbmg0LCAuaDQsXG5oNSwgLmg1LFxuaDYsIC5oNiB7XG4gIG1hcmdpbi10b3A6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgbWFyZ2luLWJvdHRvbTogKCRsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGZvbnQtc2l6ZTogNzUlO1xuICB9XG59XG5cbmgxLCAuaDEgeyBmb250LXNpemU6ICRmb250LXNpemUtaDE7IH1cbmgyLCAuaDIgeyBmb250LXNpemU6ICRmb250LXNpemUtaDI7IH1cbmgzLCAuaDMgeyBmb250LXNpemU6ICRmb250LXNpemUtaDM7IH1cbmg0LCAuaDQgeyBmb250LXNpemU6ICRmb250LXNpemUtaDQ7IH1cbmg1LCAuaDUgeyBmb250LXNpemU6ICRmb250LXNpemUtaDU7IH1cbmg2LCAuaDYgeyBmb250LXNpemU6ICRmb250LXNpemUtaDY7IH1cblxuXG4vLyBCb2R5IHRleHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucCB7XG4gIG1hcmdpbjogMCAwICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbn1cblxuLmxlYWQge1xuICBtYXJnaW4tYm90dG9tOiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGZvbnQtc2l6ZTogZmxvb3IoKCRmb250LXNpemUtYmFzZSAqIDEuMTUpKTtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBmb250LXNpemU6ICgkZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICB9XG59XG5cblxuLy8gRW1waGFzaXMgJiBtaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEV4OiAoMTJweCBzbWFsbCBmb250IC8gMTRweCBiYXNlIGZvbnQpICogMTAwJSA9IGFib3V0IDg1JVxuc21hbGwsXG4uc21hbGwge1xuICBmb250LXNpemU6IGZsb29yKCgxMDAlICogJGZvbnQtc2l6ZS1zbWFsbCAvICRmb250LXNpemUtYmFzZSkpO1xufVxuXG5tYXJrLFxuLm1hcmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkc3RhdGUtd2FybmluZy1iZztcbiAgcGFkZGluZzogLjJlbTtcbn1cblxuLy8gQWxpZ25tZW50XG4udGV4dC1sZWZ0ICAgICAgICAgICB7IHRleHQtYWxpZ246IGxlZnQ7IH1cbi50ZXh0LXJpZ2h0ICAgICAgICAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50ZXh0LWNlbnRlciAgICAgICAgIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9XG4udGV4dC1qdXN0aWZ5ICAgICAgICB7IHRleHQtYWxpZ246IGp1c3RpZnk7IH1cbi50ZXh0LW5vd3JhcCAgICAgICAgIHsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfVxuXG4vLyBUcmFuc2Zvcm1hdGlvblxuLnRleHQtbG93ZXJjYXNlICAgICAgeyB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlOyB9XG4udGV4dC11cHBlcmNhc2UgICAgICB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH1cbi50ZXh0LWNhcGl0YWxpemUgICAgIHsgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7IH1cblxuLy8gQ29udGV4dHVhbCBjb2xvcnNcbi50ZXh0LW11dGVkIHtcbiAgY29sb3I6ICR0ZXh0LW11dGVkO1xufVxuXG5AaW5jbHVkZSB0ZXh0LWVtcGhhc2lzLXZhcmlhbnQoJy50ZXh0LXByaW1hcnknLCAkYnJhbmQtcHJpbWFyeSk7XG5cbkBpbmNsdWRlIHRleHQtZW1waGFzaXMtdmFyaWFudCgnLnRleHQtc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLXRleHQpO1xuXG5AaW5jbHVkZSB0ZXh0LWVtcGhhc2lzLXZhcmlhbnQoJy50ZXh0LWluZm8nLCAkc3RhdGUtaW5mby10ZXh0KTtcblxuQGluY2x1ZGUgdGV4dC1lbXBoYXNpcy12YXJpYW50KCcudGV4dC13YXJuaW5nJywgJHN0YXRlLXdhcm5pbmctdGV4dCk7XG5cbkBpbmNsdWRlIHRleHQtZW1waGFzaXMtdmFyaWFudCgnLnRleHQtZGFuZ2VyJywgJHN0YXRlLWRhbmdlci10ZXh0KTtcblxuLy8gQ29udGV4dHVhbCBiYWNrZ3JvdW5kc1xuLy8gRm9yIG5vdyB3ZSdsbCBsZWF2ZSB0aGVzZSBhbG9uZ3NpZGUgdGhlIHRleHQgY2xhc3NlcyB1bnRpbCB2NCB3aGVuIHdlIGNhblxuLy8gc2FmZWx5IHNoaWZ0IHRoaW5ncyBhcm91bmQgKHBlciBTZW1WZXIgcnVsZXMpLlxuLmJnLXByaW1hcnkge1xuICAvLyBHaXZlbiB0aGUgY29udHJhc3QgaGVyZSwgdGhpcyBpcyB0aGUgb25seSBjbGFzcyB0byBoYXZlIGl0cyBjb2xvciBpbnZlcnRlZFxuICAvLyBhdXRvbWF0aWNhbGx5LlxuICBjb2xvcjogI2ZmZjtcbn1cbkBpbmNsdWRlIGJnLXZhcmlhbnQoJy5iZy1wcmltYXJ5JywgJGJyYW5kLXByaW1hcnkpO1xuXG5AaW5jbHVkZSBiZy12YXJpYW50KCcuYmctc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLWJnKTtcblxuQGluY2x1ZGUgYmctdmFyaWFudCgnLmJnLWluZm8nLCAkc3RhdGUtaW5mby1iZyk7XG5cbkBpbmNsdWRlIGJnLXZhcmlhbnQoJy5iZy13YXJuaW5nJywgJHN0YXRlLXdhcm5pbmctYmcpO1xuXG5AaW5jbHVkZSBiZy12YXJpYW50KCcuYmctZGFuZ2VyJywgJHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUGFnZSBoZWFkZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnBhZ2UtaGVhZGVyIHtcbiAgcGFkZGluZy1ib3R0b206ICgoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMikgLSAxKTtcbiAgbWFyZ2luOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMikgMCAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yO1xufVxuXG5cbi8vIExpc3RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFVub3JkZXJlZCBhbmQgT3JkZXJlZCBsaXN0c1xudWwsXG5vbCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgdWwsXG4gIG9sIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIExpc3Qgb3B0aW9uc1xuXG4vLyBbY29udmVydGVyXSBleHRyYWN0ZWQgZnJvbSBgLmxpc3QtdW5zdHlsZWRgIGZvciBsaWJzYXNzIGNvbXBhdGliaWxpdHlcbkBtaXhpbiBsaXN0LXVuc3R5bGVkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGFzIGBAbWl4aW4gbGlzdC11bnN0eWxlZGAgZm9yIGxpYnNhc3MgY29tcGF0aWJpbGl0eVxuLmxpc3QtdW5zdHlsZWQge1xuICBAaW5jbHVkZSBsaXN0LXVuc3R5bGVkO1xufVxuXG5cbi8vIElubGluZSB0dXJucyBsaXN0IGl0ZW1zIGludG8gaW5saW5lLWJsb2NrXG4ubGlzdC1pbmxpbmUge1xuICBAaW5jbHVkZSBsaXN0LXVuc3R5bGVkO1xuICBtYXJnaW4tbGVmdDogLTVweDtcblxuICA+IGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xuICB9XG59XG5cbi8vIERlc2NyaXB0aW9uIExpc3RzXG5kbCB7XG4gIG1hcmdpbi10b3A6IDA7IC8vIFJlbW92ZSBicm93c2VyIGRlZmF1bHRcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xufVxuZHQsXG5kZCB7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbn1cbmR0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5kZCB7XG4gIG1hcmdpbi1sZWZ0OiAwOyAvLyBVbmRvIGJyb3dzZXIgZGVmYXVsdFxufVxuXG4vLyBIb3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3RzXG4vL1xuLy8gRGVmYXVsdHMgdG8gYmVpbmcgc3RhY2tlZCB3aXRob3V0IGFueSBvZiB0aGUgYmVsb3cgc3R5bGVzIGFwcGxpZWQsIHVudGlsIHRoZVxuLy8gZ3JpZCBicmVha3BvaW50IGlzIHJlYWNoZWQgKGRlZmF1bHQgb2Ygfjc2OHB4KS5cblxuLmRsLWhvcml6b250YWwge1xuICBkZCB7XG4gICAgQGluY2x1ZGUgY2xlYXJmaXg7IC8vIENsZWFyIHRoZSBmbG9hdGVkIGBkdGAgaWYgYW4gZW1wdHkgYGRkYCBpcyBwcmVzZW50XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGR0IHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgd2lkdGg6ICgkZGwtaG9yaXpvbnRhbC1vZmZzZXQgLSAyMCk7XG4gICAgICBjbGVhcjogbGVmdDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgQGluY2x1ZGUgdGV4dC1vdmVyZmxvdztcbiAgICB9XG4gICAgZGQge1xuICAgICAgbWFyZ2luLWxlZnQ6ICRkbC1ob3Jpem9udGFsLW9mZnNldDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBNaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEFiYnJldmlhdGlvbnMgYW5kIGFjcm9ueW1zXG5hYmJyW3RpdGxlXSxcbi8vIEFkZCBkYXRhLSogYXR0cmlidXRlIHRvIGhlbHAgb3V0IG91ciB0b29sdGlwIHBsdWdpbiwgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNTI1N1xuYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSB7XG4gIGN1cnNvcjogaGVscDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAkYWJici1ib3JkZXItY29sb3I7XG59XG4uaW5pdGlhbGlzbSB7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBAZXh0ZW5kIC50ZXh0LXVwcGVyY2FzZTtcbn1cblxuLy8gQmxvY2txdW90ZXNcbmJsb2NrcXVvdGUge1xuICBwYWRkaW5nOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMikgJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW46IDAgMCAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGZvbnQtc2l6ZTogJGJsb2NrcXVvdGUtZm9udC1zaXplO1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICRibG9ja3F1b3RlLWJvcmRlci1jb2xvcjtcblxuICBwLFxuICB1bCxcbiAgb2wge1xuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdGU6IERlcHJlY2F0ZWQgc21hbGwgYW5kIC5zbWFsbCBhcyBvZiB2My4xLjBcbiAgLy8gQ29udGV4dDogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTY2MFxuICBmb290ZXIsXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGZvbnQtc2l6ZTogODAlOyAvLyBiYWNrIHRvIGRlZmF1bHQgZm9udC1zaXplXG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICAgIGNvbG9yOiAkYmxvY2txdW90ZS1zbWFsbC1jb2xvcjtcblxuICAgICY6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6ICdcXDIwMTQgXFwwMEEwJzsgLy8gZW0gZGFzaCwgbmJzcFxuICAgIH1cbiAgfVxufVxuXG4vLyBPcHBvc2l0ZSBhbGlnbm1lbnQgb2YgYmxvY2txdW90ZVxuLy9cbi8vIEhlYWRzIHVwOiBgYmxvY2txdW90ZS5wdWxsLXJpZ2h0YCBoYXMgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHYzLjEuMC5cbi5ibG9ja3F1b3RlLXJldmVyc2UsXG5ibG9ja3F1b3RlLnB1bGwtcmlnaHQge1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGJvcmRlci1yaWdodDogNXB4IHNvbGlkICRibG9ja3F1b3RlLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLWxlZnQ6IDA7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuXG4gIC8vIEFjY291bnQgZm9yIGNpdGF0aW9uXG4gIGZvb3RlcixcbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgJjpiZWZvcmUgeyBjb250ZW50OiAnJzsgfVxuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJ1xcMDBBMCBcXDIwMTQnOyAvLyBuYnNwLCBlbSBkYXNoXG4gICAgfVxuICB9XG59XG5cbi8vIEFkZHJlc3Nlc1xuYWRkcmVzcyB7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG59XG4iLCIvLyBUeXBvZ3JhcGh5XG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIHRleHQtZW1waGFzaXMtdmFyaWFudCgkcGFyZW50LCAkY29sb3IpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgY29sb3I6ICRjb2xvcjtcbiAgfVxuICBhI3skcGFyZW50fTpob3ZlcixcbiAgYSN7JHBhcmVudH06Zm9jdXMge1xuICAgIGNvbG9yOiBkYXJrZW4oJGNvbG9yLCAxMCUpO1xuICB9XG59XG4iLCIvLyBDb250ZXh0dWFsIGJhY2tncm91bmRzXG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIGJnLXZhcmlhbnQoJHBhcmVudCwgJGNvbG9yKSB7XG4gICN7JHBhcmVudH0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbiAgfVxuICBhI3skcGFyZW50fTpob3ZlcixcbiAgYSN7JHBhcmVudH06Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vIENsZWFyZml4XG4vL1xuLy8gRm9yIG1vZGVybiBicm93c2Vyc1xuLy8gMS4gVGhlIHNwYWNlIGNvbnRlbnQgaXMgb25lIHdheSB0byBhdm9pZCBhbiBPcGVyYSBidWcgd2hlbiB0aGVcbi8vICAgIGNvbnRlbnRlZGl0YWJsZSBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgYW55d2hlcmUgZWxzZSBpbiB0aGUgZG9jdW1lbnQuXG4vLyAgICBPdGhlcndpc2UgaXQgY2F1c2VzIHNwYWNlIHRvIGFwcGVhciBhdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgZWxlbWVudHNcbi8vICAgIHRoYXQgYXJlIGNsZWFyZml4ZWQuXG4vLyAyLiBUaGUgdXNlIG9mIGB0YWJsZWAgcmF0aGVyIHRoYW4gYGJsb2NrYCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB1c2luZ1xuLy8gICAgYDpiZWZvcmVgIHRvIGNvbnRhaW4gdGhlIHRvcC1tYXJnaW5zIG9mIGNoaWxkIGVsZW1lbnRzLlxuLy9cbi8vIFNvdXJjZTogaHR0cDovL25pY29sYXNnYWxsYWdoZXIuY29tL21pY3JvLWNsZWFyZml4LWhhY2svXG5cbkBtaXhpbiBjbGVhcmZpeCgpIHtcbiAgJjpiZWZvcmUsXG4gICY6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIFwiOyAvLyAxXG4gICAgZGlzcGxheTogdGFibGU7IC8vIDJcbiAgfVxuICAmOmFmdGVyIHtcbiAgICBjbGVhcjogYm90aDtcbiAgfVxufVxuIiwiLy8gVGV4dCBvdmVyZmxvd1xuLy8gUmVxdWlyZXMgaW5saW5lLWJsb2NrIG9yIGJsb2NrIGZvciBwcm9wZXIgc3R5bGluZ1xuXG5AbWl4aW4gdGV4dC1vdmVyZmxvdygpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4iLCIvL1xuLy8gQ29kZSAoaW5saW5lIGFuZCBibG9jaylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gSW5saW5lIGFuZCBibG9jayBjb2RlIHN0eWxlc1xuY29kZSxcbmtiZCxcbnByZSxcbnNhbXAge1xuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm9zcGFjZTtcbn1cblxuLy8gSW5saW5lIGNvZGVcbmNvZGUge1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBmb250LXNpemU6IDkwJTtcbiAgY29sb3I6ICRjb2RlLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29kZS1iZztcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtYmFzZTtcbn1cblxuLy8gVXNlciBpbnB1dCB0eXBpY2FsbHkgZW50ZXJlZCB2aWEga2V5Ym9hcmRcbmtiZCB7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBjb2xvcjogJGtiZC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGtiZC1iZztcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjI1KTtcblxuICBrYmQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC1zaXplOiAxMDAlO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbn1cblxuLy8gQmxvY2tzIG9mIGNvZGVcbnByZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAoKCRsaW5lLWhlaWdodC1jb21wdXRlZCAtIDEpIC8gMik7XG4gIG1hcmdpbjogMCAwICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcbiAgZm9udC1zaXplOiAoJGZvbnQtc2l6ZS1iYXNlIC0gMSk7IC8vIDE0cHggdG8gMTNweFxuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBjb2xvcjogJHByZS1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHByZS1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJHByZS1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgLy8gQWNjb3VudCBmb3Igc29tZSBjb2RlIG91dHB1dHMgdGhhdCBwbGFjZSBjb2RlIHRhZ3MgaW4gcHJlIHRhZ3NcbiAgY29kZSB7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLy8gRW5hYmxlIHNjcm9sbGFibGUgYmxvY2tzIG9mIGNvZGVcbi5wcmUtc2Nyb2xsYWJsZSB7XG4gIG1heC1oZWlnaHQ6ICRwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4iLCIvL1xuLy8gR3JpZCBzeXN0ZW1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQ29udGFpbmVyIHdpZHRoc1xuLy9cbi8vIFNldCB0aGUgY29udGFpbmVyIHdpZHRoLCBhbmQgb3ZlcnJpZGUgaXQgZm9yIGZpeGVkIG5hdmJhcnMgaW4gbWVkaWEgcXVlcmllcy5cblxuLmNvbnRhaW5lciB7XG4gIEBpbmNsdWRlIGNvbnRhaW5lci1maXhlZDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1zbTtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1tZDtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICB3aWR0aDogJGNvbnRhaW5lci1sZztcbiAgfVxufVxuXG5cbi8vIEZsdWlkIGNvbnRhaW5lclxuLy9cbi8vIFV0aWxpemVzIHRoZSBtaXhpbiBtZWFudCBmb3IgZml4ZWQgd2lkdGggY29udGFpbmVycywgYnV0IHdpdGhvdXQgYW55IGRlZmluZWRcbi8vIHdpZHRoIGZvciBmbHVpZCwgZnVsbCB3aWR0aCBsYXlvdXRzLlxuXG4uY29udGFpbmVyLWZsdWlkIHtcbiAgQGluY2x1ZGUgY29udGFpbmVyLWZpeGVkO1xufVxuXG5cbi8vIFJvd1xuLy9cbi8vIFJvd3MgY29udGFpbiBhbmQgY2xlYXIgdGhlIGZsb2F0cyBvZiB5b3VyIGNvbHVtbnMuXG5cbi5yb3cge1xuICBAaW5jbHVkZSBtYWtlLXJvdztcbn1cblxuXG4vLyBDb2x1bW5zXG4vL1xuLy8gQ29tbW9uIHN0eWxlcyBmb3Igc21hbGwgYW5kIGxhcmdlIGdyaWQgY29sdW1uc1xuXG5AaW5jbHVkZSBtYWtlLWdyaWQtY29sdW1ucztcblxuXG4vLyBFeHRyYSBzbWFsbCBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIGV4dHJhIHNtYWxsIGRldmljZXMgbGlrZVxuLy8gc21hcnRwaG9uZXMuXG5cbkBpbmNsdWRlIG1ha2UtZ3JpZCh4cyk7XG5cblxuLy8gU21hbGwgZ3JpZFxuLy9cbi8vIENvbHVtbnMsIG9mZnNldHMsIHB1c2hlcywgYW5kIHB1bGxzIGZvciB0aGUgc21hbGwgZGV2aWNlIHJhbmdlLCBmcm9tIHBob25lc1xuLy8gdG8gdGFibGV0cy5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gIEBpbmNsdWRlIG1ha2UtZ3JpZChzbSk7XG59XG5cblxuLy8gTWVkaXVtIGdyaWRcbi8vXG4vLyBDb2x1bW5zLCBvZmZzZXRzLCBwdXNoZXMsIGFuZCBwdWxscyBmb3IgdGhlIGRlc2t0b3AgZGV2aWNlIHJhbmdlLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIHtcbiAgQGluY2x1ZGUgbWFrZS1ncmlkKG1kKTtcbn1cblxuXG4vLyBMYXJnZSBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIHRoZSBsYXJnZSBkZXNrdG9wIGRldmljZSByYW5nZS5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gIEBpbmNsdWRlIG1ha2UtZ3JpZChsZyk7XG59XG4iLCIvLyBHcmlkIHN5c3RlbVxuLy9cbi8vIEdlbmVyYXRlIHNlbWFudGljIGdyaWQgY29sdW1ucyB3aXRoIHRoZXNlIG1peGlucy5cblxuLy8gQ2VudGVyZWQgY29udGFpbmVyIGVsZW1lbnRcbkBtaXhpbiBjb250YWluZXItZml4ZWQoJGd1dHRlcjogJGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xufVxuXG4vLyBDcmVhdGVzIGEgd3JhcHBlciBmb3IgYSBzZXJpZXMgb2YgY29sdW1uc1xuQG1peGluIG1ha2Utcm93KCRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBtYXJnaW4tbGVmdDogIGNlaWwoKCRndXR0ZXIgLyAtMikpO1xuICBtYXJnaW4tcmlnaHQ6IGZsb29yKCgkZ3V0dGVyIC8gLTIpKTtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBleHRyYSBzbWFsbCBjb2x1bW5zXG5AbWl4aW4gbWFrZS14cy1jb2x1bW4oJGNvbHVtbnMsICRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKCRndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKCRndXR0ZXIgLyAyKTtcbn1cbkBtaXhpbiBtYWtlLXhzLWNvbHVtbi1vZmZzZXQoJGNvbHVtbnMpIHtcbiAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xufVxuQG1peGluIG1ha2UteHMtY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG59XG5AbWl4aW4gbWFrZS14cy1jb2x1bW4tcHVsbCgkY29sdW1ucykge1xuICByaWdodDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBzbWFsbCBjb2x1bW5zXG5AbWl4aW4gbWFrZS1zbS1jb2x1bW4oJGNvbHVtbnMsICRndXR0ZXI6ICRncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKCRndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKCRndXR0ZXIgLyAyKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLXNtLWNvbHVtbi1vZmZzZXQoJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1zbS1jb2x1bW4tcHVzaCgkY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2Utc20tY29sdW1uLXB1bGwoJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgcmlnaHQ6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBtZWRpdW0gY29sdW1uc1xuQG1peGluIG1ha2UtbWQtY29sdW1uKCRjb2x1bW5zLCAkZ3V0dGVyOiAkZ3JpZC1ndXR0ZXItd2lkdGgpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1tZC1jb2x1bW4tb2Zmc2V0KCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikge1xuICAgIG1hcmdpbi1sZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2UtbWQtY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gICAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLW1kLWNvbHVtbi1wdWxsKCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikge1xuICAgIHJpZ2h0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuXG4vLyBHZW5lcmF0ZSB0aGUgbGFyZ2UgY29sdW1uc1xuQG1peGluIG1ha2UtbGctY29sdW1uKCRjb2x1bW5zLCAkZ3V0dGVyOiAkZ3JpZC1ndXR0ZXItd2lkdGgpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmctbGVmdDogICgkZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6ICgkZ3V0dGVyIC8gMik7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoKCRjb2x1bW5zIC8gJGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5AbWl4aW4gbWFrZS1sZy1jb2x1bW4tb2Zmc2V0KCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICAgIG1hcmdpbi1sZWZ0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuQG1peGluIG1ha2UtbGctY29sdW1uLXB1c2goJGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgbGVmdDogcGVyY2VudGFnZSgoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbkBtaXhpbiBtYWtlLWxnLWNvbHVtbi1wdWxsKCRjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICAgIHJpZ2h0OiBwZXJjZW50YWdlKCgkY29sdW1ucyAvICRncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuIiwiLy8gRnJhbWV3b3JrIGdyaWQgZ2VuZXJhdGlvblxuLy9cbi8vIFVzZWQgb25seSBieSBCb290c3RyYXAgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGdyaWQgY2xhc3NlcyBnaXZlblxuLy8gYW55IHZhbHVlIG9mIGAkZ3JpZC1jb2x1bW5zYC5cblxuLy8gW2NvbnZlcnRlcl0gVGhpcyBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGluIExFU1MsIGJ1dCBTYXNzIHN1cHBvcnRzIHJlYWwgbG9vcHNcbkBtaXhpbiBtYWtlLWdyaWQtY29sdW1ucygkaTogMSwgJGxpc3Q6IFwiLmNvbC14cy0jeyRpfSwgLmNvbC1zbS0jeyRpfSwgLmNvbC1tZC0jeyRpfSwgLmNvbC1sZy0jeyRpfVwiKSB7XG4gIEBmb3IgJGkgZnJvbSAoMSArIDEpIHRocm91Z2ggJGdyaWQtY29sdW1ucyB7XG4gICAgJGxpc3Q6IFwiI3skbGlzdH0sIC5jb2wteHMtI3skaX0sIC5jb2wtc20tI3skaX0sIC5jb2wtbWQtI3skaX0sIC5jb2wtbGctI3skaX1cIjtcbiAgfVxuICAjeyRsaXN0fSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC8vIFByZXZlbnQgY29sdW1ucyBmcm9tIGNvbGxhcHNpbmcgd2hlbiBlbXB0eVxuICAgIG1pbi1oZWlnaHQ6IDFweDtcbiAgICAvLyBJbm5lciBndXR0ZXIgdmlhIHBhZGRpbmdcbiAgICBwYWRkaW5nLWxlZnQ6ICBjZWlsKCgkZ3JpZC1ndXR0ZXItd2lkdGggLyAyKSk7XG4gICAgcGFkZGluZy1yaWdodDogZmxvb3IoKCRncmlkLWd1dHRlci13aWR0aCAvIDIpKTtcbiAgfVxufVxuXG5cbi8vIFtjb252ZXJ0ZXJdIFRoaXMgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBpbiBMRVNTLCBidXQgU2FzcyBzdXBwb3J0cyByZWFsIGxvb3BzXG5AbWl4aW4gZmxvYXQtZ3JpZC1jb2x1bW5zKCRjbGFzcywgJGk6IDEsICRsaXN0OiBcIi5jb2wtI3skY2xhc3N9LSN7JGl9XCIpIHtcbiAgQGZvciAkaSBmcm9tICgxICsgMSkgdGhyb3VnaCAkZ3JpZC1jb2x1bW5zIHtcbiAgICAkbGlzdDogXCIjeyRsaXN0fSwgLmNvbC0jeyRjbGFzc30tI3skaX1cIjtcbiAgfVxuICAjeyRsaXN0fSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuXG5AbWl4aW4gY2FsYy1ncmlkLWNvbHVtbigkaW5kZXgsICRjbGFzcywgJHR5cGUpIHtcbiAgQGlmICgkdHlwZSA9PSB3aWR0aCkgYW5kICgkaW5kZXggPiAwKSB7XG4gICAgLmNvbC0jeyRjbGFzc30tI3skaW5kZXh9IHtcbiAgICAgIHdpZHRoOiBwZXJjZW50YWdlKCgkaW5kZXggLyAkZ3JpZC1jb2x1bW5zKSk7XG4gICAgfVxuICB9XG4gIEBpZiAoJHR5cGUgPT0gcHVzaCkgYW5kICgkaW5kZXggPiAwKSB7XG4gICAgLmNvbC0jeyRjbGFzc30tcHVzaC0jeyRpbmRleH0ge1xuICAgICAgbGVmdDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxuICBAaWYgKCR0eXBlID09IHB1c2gpIGFuZCAoJGluZGV4ID09IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdXNoLTAge1xuICAgICAgbGVmdDogYXV0bztcbiAgICB9XG4gIH1cbiAgQGlmICgkdHlwZSA9PSBwdWxsKSBhbmQgKCRpbmRleCA+IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdWxsLSN7JGluZGV4fSB7XG4gICAgICByaWdodDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxuICBAaWYgKCR0eXBlID09IHB1bGwpIGFuZCAoJGluZGV4ID09IDApIHtcbiAgICAuY29sLSN7JGNsYXNzfS1wdWxsLTAge1xuICAgICAgcmlnaHQ6IGF1dG87XG4gICAgfVxuICB9XG4gIEBpZiAoJHR5cGUgPT0gb2Zmc2V0KSB7XG4gICAgLmNvbC0jeyRjbGFzc30tb2Zmc2V0LSN7JGluZGV4fSB7XG4gICAgICBtYXJnaW4tbGVmdDogcGVyY2VudGFnZSgoJGluZGV4IC8gJGdyaWQtY29sdW1ucykpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBbY29udmVydGVyXSBUaGlzIGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgaW4gTEVTUywgYnV0IFNhc3Mgc3VwcG9ydHMgcmVhbCBsb29wc1xuQG1peGluIGxvb3AtZ3JpZC1jb2x1bW5zKCRjb2x1bW5zLCAkY2xhc3MsICR0eXBlKSB7XG4gIEBmb3IgJGkgZnJvbSAwIHRocm91Z2ggJGNvbHVtbnMge1xuICAgIEBpbmNsdWRlIGNhbGMtZ3JpZC1jb2x1bW4oJGksICRjbGFzcywgJHR5cGUpO1xuICB9XG59XG5cblxuLy8gQ3JlYXRlIGdyaWQgZm9yIHNwZWNpZmljIGNsYXNzXG5AbWl4aW4gbWFrZS1ncmlkKCRjbGFzcykge1xuICBAaW5jbHVkZSBmbG9hdC1ncmlkLWNvbHVtbnMoJGNsYXNzKTtcbiAgQGluY2x1ZGUgbG9vcC1ncmlkLWNvbHVtbnMoJGdyaWQtY29sdW1ucywgJGNsYXNzLCB3aWR0aCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgcHVsbCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgcHVzaCk7XG4gIEBpbmNsdWRlIGxvb3AtZ3JpZC1jb2x1bW5zKCRncmlkLWNvbHVtbnMsICRjbGFzcywgb2Zmc2V0KTtcbn1cbiIsIi8vXG4vLyBUYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxudGFibGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdGFibGUtYmc7XG59XG5jYXB0aW9uIHtcbiAgcGFkZGluZy10b3A6ICR0YWJsZS1jZWxsLXBhZGRpbmc7XG4gIHBhZGRpbmctYm90dG9tOiAkdGFibGUtY2VsbC1wYWRkaW5nO1xuICBjb2xvcjogJHRleHQtbXV0ZWQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG50aCB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cblxuLy8gQmFzZWxpbmUgc3R5bGVzXG5cbi50YWJsZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgLy8gQ2VsbHNcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIHBhZGRpbmc6ICR0YWJsZS1jZWxsLXBhZGRpbmc7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEJvdHRvbSBhbGlnbiBmb3IgY29sdW1uIGhlYWRpbmdzXG4gID4gdGhlYWQgPiB0ciA+IHRoIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAkdGFibGUtYm9yZGVyLWNvbG9yO1xuICB9XG4gIC8vIFJlbW92ZSB0b3AgYm9yZGVyIGZyb20gdGhlYWQgYnkgZGVmYXVsdFxuICA+IGNhcHRpb24gKyB0aGVhZCxcbiAgPiBjb2xncm91cCArIHRoZWFkLFxuICA+IHRoZWFkOmZpcnN0LWNoaWxkIHtcbiAgICA+IHRyOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gdGgsXG4gICAgICA+IHRkIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gQWNjb3VudCBmb3IgbXVsdGlwbGUgdGJvZHkgaW5zdGFuY2VzXG4gID4gdGJvZHkgKyB0Ym9keSB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gIH1cblxuICAvLyBOZXN0aW5nXG4gIC50YWJsZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmc7XG4gIH1cbn1cblxuXG4vLyBDb25kZW5zZWQgdGFibGUgdy8gaGFsZiBwYWRkaW5nXG5cbi50YWJsZS1jb25kZW5zZWQge1xuICA+IHRoZWFkLFxuICA+IHRib2R5LFxuICA+IHRmb290IHtcbiAgICA+IHRyIHtcbiAgICAgID4gdGgsXG4gICAgICA+IHRkIHtcbiAgICAgICAgcGFkZGluZzogJHRhYmxlLWNvbmRlbnNlZC1jZWxsLXBhZGRpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gQm9yZGVyZWQgdmVyc2lvblxuLy9cbi8vIEFkZCBib3JkZXJzIGFsbCBhcm91bmQgdGhlIHRhYmxlIGFuZCBiZXR3ZWVuIGFsbCB0aGUgY29sdW1ucy5cblxuLnRhYmxlLWJvcmRlcmVkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgJHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gdGhlYWQgPiB0ciB7XG4gICAgPiB0aCxcbiAgICA+IHRkIHtcbiAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDJweDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBaZWJyYS1zdHJpcGluZ1xuLy9cbi8vIERlZmF1bHQgemVicmEtc3RyaXBlIHN0eWxlcyAoYWx0ZXJuYXRpbmcgZ3JheSBhbmQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZHMpXG5cbi50YWJsZS1zdHJpcGVkIHtcbiAgPiB0Ym9keSA+IHRyOm50aC1vZi10eXBlKG9kZCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR0YWJsZS1iZy1hY2NlbnQ7XG4gIH1cbn1cblxuXG4vLyBIb3ZlciBlZmZlY3Rcbi8vXG4vLyBQbGFjZWQgaGVyZSBzaW5jZSBpdCBoYXMgdG8gY29tZSBhZnRlciB0aGUgcG90ZW50aWFsIHplYnJhIHN0cmlwaW5nXG5cbi50YWJsZS1ob3ZlciB7XG4gID4gdGJvZHkgPiB0cjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHRhYmxlLWJnLWhvdmVyO1xuICB9XG59XG5cblxuLy8gVGFibGUgY2VsbCBzaXppbmdcbi8vXG4vLyBSZXNldCBkZWZhdWx0IHRhYmxlIGJlaGF2aW9yXG5cbnRhYmxlIGNvbFtjbGFzcyo9XCJjb2wtXCJdIHtcbiAgcG9zaXRpb246IHN0YXRpYzsgLy8gUHJldmVudCBib3JkZXIgaGlkaW5nIGluIEZpcmVmb3ggYW5kIElFOS0xMSAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE2MjMpXG4gIGZsb2F0OiBub25lO1xuICBkaXNwbGF5OiB0YWJsZS1jb2x1bW47XG59XG50YWJsZSB7XG4gIHRkLFxuICB0aCB7XG4gICAgJltjbGFzcyo9XCJjb2wtXCJdIHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0aWM7IC8vIFByZXZlbnQgYm9yZGVyIGhpZGluZyBpbiBGaXJlZm94IGFuZCBJRTktMTEgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjIzKVxuICAgICAgZmxvYXQ6IG5vbmU7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIFRhYmxlIGJhY2tncm91bmRzXG4vL1xuLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbi8vIGluaGVyaXRhbmNlIHRvIG5lc3RlZCB0YWJsZXMuXG5cbi8vIEdlbmVyYXRlIHRoZSBjb250ZXh0dWFsIHZhcmlhbnRzXG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnYWN0aXZlJywgJHRhYmxlLWJnLWFjdGl2ZSk7XG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnc3VjY2VzcycsICRzdGF0ZS1zdWNjZXNzLWJnKTtcbkBpbmNsdWRlIHRhYmxlLXJvdy12YXJpYW50KCdpbmZvJywgJHN0YXRlLWluZm8tYmcpO1xuQGluY2x1ZGUgdGFibGUtcm93LXZhcmlhbnQoJ3dhcm5pbmcnLCAkc3RhdGUtd2FybmluZy1iZyk7XG5AaW5jbHVkZSB0YWJsZS1yb3ctdmFyaWFudCgnZGFuZ2VyJywgJHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUmVzcG9uc2l2ZSB0YWJsZXNcbi8vXG4vLyBXcmFwIHlvdXIgdGFibGVzIGluIGAudGFibGUtcmVzcG9uc2l2ZWAgYW5kIHdlJ2xsIG1ha2UgdGhlbSBtb2JpbGUgZnJpZW5kbHlcbi8vIGJ5IGVuYWJsaW5nIGhvcml6b250YWwgc2Nyb2xsaW5nLiBPbmx5IGFwcGxpZXMgPDc2OHB4LiBFdmVyeXRoaW5nIGFib3ZlIHRoYXRcbi8vIHdpbGwgZGlzcGxheSBub3JtYWxseS5cblxuLnRhYmxlLXJlc3BvbnNpdmUge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBtaW4taGVpZ2h0OiAwLjAxJTsgLy8gV29ya2Fyb3VuZCBmb3IgSUU5IGJ1ZyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTQ4MzcpXG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJHNjcmVlbi14cy1tYXgpIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAoJGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMC43NSk7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogLW1zLWF1dG9oaWRpbmctc2Nyb2xsYmFyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR0YWJsZS1ib3JkZXItY29sb3I7XG5cbiAgICAvLyBUaWdodGVuIHVwIHNwYWNpbmdcbiAgICA+IC50YWJsZSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGNvbnRlbnQgZG9lc24ndCB3cmFwXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoLFxuICAgICAgICAgID4gdGQge1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIG92ZXJyaWRlcyBmb3IgdGhlIGJvcmRlcmVkIHRhYmxlc1xuICAgID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICAgIGJvcmRlcjogMDtcblxuICAgICAgLy8gTnVrZSB0aGUgYXBwcm9wcmlhdGUgYm9yZGVycyBzbyB0aGF0IHRoZSBwYXJlbnQgY2FuIGhhbmRsZSB0aGVtXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICAgID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgID4gdGg6bGFzdC1jaGlsZCxcbiAgICAgICAgICA+IHRkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IG51a2UgdGhlIGxhc3Qgcm93J3MgYm90dG9tLWJvcmRlciBpbiBgdGJvZHlgIGFuZCBgdGZvb3RgIHNpbmNlXG4gICAgICAvLyBjaGFuY2VzIGFyZSB0aGVyZSB3aWxsIGJlIG9ubHkgb25lIGB0cmAgaW4gYSBgdGhlYWRgIGFuZCB0aGF0IHdvdWxkXG4gICAgICAvLyByZW1vdmUgdGhlIGJvcmRlciBhbHRvZ2V0aGVyLlxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICAgID4gdGgsXG4gICAgICAgICAgPiB0ZCB7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICB9XG59XG4iLCIvLyBUYWJsZXNcblxuQG1peGluIHRhYmxlLXJvdy12YXJpYW50KCRzdGF0ZSwgJGJhY2tncm91bmQpIHtcbiAgLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbiAgLy8gaW5oZXJpdGFuY2UgdG8gbmVzdGVkIHRhYmxlcy5cbiAgLnRhYmxlID4gdGhlYWQgPiB0cixcbiAgLnRhYmxlID4gdGJvZHkgPiB0cixcbiAgLnRhYmxlID4gdGZvb3QgPiB0ciB7XG4gICAgPiB0ZC4jeyRzdGF0ZX0sXG4gICAgPiB0aC4jeyRzdGF0ZX0sXG4gICAgJi4jeyRzdGF0ZX0gPiB0ZCxcbiAgICAmLiN7JHN0YXRlfSA+IHRoIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhvdmVyIHN0YXRlcyBmb3IgYC50YWJsZS1ob3ZlcmBcbiAgLy8gTm90ZTogdGhpcyBpcyBub3QgYXZhaWxhYmxlIGZvciBjZWxscyBvciByb3dzIHdpdGhpbiBgdGhlYWRgIG9yIGB0Zm9vdGAuXG4gIC50YWJsZS1ob3ZlciA+IHRib2R5ID4gdHIge1xuICAgID4gdGQuI3skc3RhdGV9OmhvdmVyLFxuICAgID4gdGguI3skc3RhdGV9OmhvdmVyLFxuICAgICYuI3skc3RhdGV9OmhvdmVyID4gdGQsXG4gICAgJjpob3ZlciA+IC4jeyRzdGF0ZX0sXG4gICAgJi4jeyRzdGF0ZX06aG92ZXIgPiB0aCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oJGJhY2tncm91bmQsIDUlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBGb3Jtc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBOb3JtYWxpemUgbm9uLWNvbnRyb2xzXG4vL1xuLy8gUmVzdHlsZSBhbmQgYmFzZWxpbmUgbm9uLWNvbnRyb2wgZm9ybSBlbGVtZW50cy5cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlcjogMDtcbiAgLy8gQ2hyb21lIGFuZCBGaXJlZm94IHNldCBhIGBtaW4td2lkdGg6IG1pbi1jb250ZW50O2Agb24gZmllbGRzZXRzLFxuICAvLyBzbyB3ZSByZXNldCB0aGF0IHRvIGVuc3VyZSBpdCBiZWhhdmVzIG1vcmUgbGlrZSBhIHN0YW5kYXJkIGJsb2NrIGVsZW1lbnQuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEyMzU5LlxuICBtaW4td2lkdGg6IDA7XG59XG5cbmxlZ2VuZCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBmb250LXNpemU6ICgkZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgY29sb3I6ICRsZWdlbmQtY29sb3I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRsZWdlbmQtYm9yZGVyLWNvbG9yO1xufVxuXG5sYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlOyAvLyBGb3JjZSBJRTggdG8gd3JhcCBsb25nIGNvbnRlbnQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEzMTQxKVxuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5cbi8vIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2xzXG4vL1xuLy8gV2hpbGUgbW9zdCBvZiBvdXIgZm9ybSBzdHlsZXMgcmVxdWlyZSBleHRyYSBjbGFzc2VzLCBzb21lIGJhc2ljIG5vcm1hbGl6YXRpb25cbi8vIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSBvcHRpbXVtIGRpc3BsYXkgd2l0aCBvciB3aXRob3V0IHRob3NlIGNsYXNzZXMgdG8gYmV0dGVyXG4vLyBhZGRyZXNzIGJyb3dzZXIgaW5jb25zaXN0ZW5jaWVzLlxuXG4vLyBPdmVycmlkZSBjb250ZW50LWJveCBpbiBOb3JtYWxpemUgKCogaXNuJ3Qgc3BlY2lmaWMgZW5vdWdoKVxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIEBpbmNsdWRlIGJveC1zaXppbmcoYm9yZGVyLWJveCk7XG59XG5cbi8vIFBvc2l0aW9uIHJhZGlvcyBhbmQgY2hlY2tib3hlcyBiZXR0ZXJcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIG1hcmdpbjogNHB4IDAgMDtcbiAgbWFyZ2luLXRvcDogMXB4IFxcOTsgLy8gSUU4LTlcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuaW5wdXRbdHlwZT1cImZpbGVcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLy8gTWFrZSByYW5nZSBpbnB1dHMgYmVoYXZlIGxpa2UgdGV4dHVhbCBmb3JtIGNvbnRyb2xzXG5pbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi8vIE1ha2UgbXVsdGlwbGUgc2VsZWN0IGVsZW1lbnRzIGhlaWdodCBub3QgZml4ZWRcbnNlbGVjdFttdWx0aXBsZV0sXG5zZWxlY3Rbc2l6ZV0ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8vIEZvY3VzIGZvciBmaWxlLCByYWRpbywgYW5kIGNoZWNrYm94XG5pbnB1dFt0eXBlPVwiZmlsZVwiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cyxcbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpmb2N1cyB7XG4gIEBpbmNsdWRlIHRhYi1mb2N1cztcbn1cblxuLy8gQWRqdXN0IG91dHB1dCBlbGVtZW50XG5vdXRwdXQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7XG4gIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1iYXNlO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiAkaW5wdXQtY29sb3I7XG59XG5cblxuLy8gQ29tbW9uIGZvcm0gY29udHJvbHNcbi8vXG4vLyBTaGFyZWQgc2l6ZSBhbmQgdHlwZSByZXNldHMgZm9yIGZvcm0gY29udHJvbHMuIEFwcGx5IGAuZm9ybS1jb250cm9sYCB0byBhbnlcbi8vIG9mIHRoZSBmb2xsb3dpbmcgZm9ybSBjb250cm9sczpcbi8vXG4vLyBzZWxlY3Rcbi8vIHRleHRhcmVhXG4vLyBpbnB1dFt0eXBlPVwidGV4dFwiXVxuLy8gaW5wdXRbdHlwZT1cInBhc3N3b3JkXCJdXG4vLyBpbnB1dFt0eXBlPVwiZGF0ZXRpbWVcIl1cbi8vIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXVxuLy8gaW5wdXRbdHlwZT1cImRhdGVcIl1cbi8vIGlucHV0W3R5cGU9XCJtb250aFwiXVxuLy8gaW5wdXRbdHlwZT1cInRpbWVcIl1cbi8vIGlucHV0W3R5cGU9XCJ3ZWVrXCJdXG4vLyBpbnB1dFt0eXBlPVwibnVtYmVyXCJdXG4vLyBpbnB1dFt0eXBlPVwiZW1haWxcIl1cbi8vIGlucHV0W3R5cGU9XCJ1cmxcIl1cbi8vIGlucHV0W3R5cGU9XCJzZWFyY2hcIl1cbi8vIGlucHV0W3R5cGU9XCJ0ZWxcIl1cbi8vIGlucHV0W3R5cGU9XCJjb2xvclwiXVxuXG4uZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtYmFzZTsgLy8gTWFrZSBpbnB1dHMgYXQgbGVhc3QgdGhlIGhlaWdodCBvZiB0aGVpciBidXR0b24gY291bnRlcnBhcnQgKGJhc2UgbGluZS1oZWlnaHQgKyBwYWRkaW5nICsgYm9yZGVyKVxuICBwYWRkaW5nOiAkcGFkZGluZy1iYXNlLXZlcnRpY2FsICRwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICRpbnB1dC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0LWJnO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkICRpbnB1dC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRpbnB1dC1ib3JkZXItcmFkaXVzOyAvLyBOb3RlOiBUaGlzIGhhcyBubyBlZmZlY3Qgb24gPHNlbGVjdD5zIGluIHNvbWUgYnJvd3NlcnMsIGR1ZSB0byB0aGUgbGltaXRlZCBzdHlsYWJpbGl0eSBvZiA8c2VsZWN0PnMgaW4gQ1NTLlxuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpKTtcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAuMTVzKTtcblxuICAvLyBDdXN0b21pemUgdGhlIGA6Zm9jdXNgIHN0YXRlIHRvIGltaXRhdGUgbmF0aXZlIFdlYktpdCBzdHlsZXMuXG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC1mb2N1cztcblxuICAvLyBQbGFjZWhvbGRlclxuICBAaW5jbHVkZSBwbGFjZWhvbGRlcjtcblxuICAvLyBEaXNhYmxlZCBhbmQgcmVhZC1vbmx5IGlucHV0c1xuICAvL1xuICAvLyBIVE1MNSBzYXlzIHRoYXQgY29udHJvbHMgdW5kZXIgYSBmaWVsZHNldCA+IGxlZ2VuZDpmaXJzdC1jaGlsZCB3b24ndCBiZVxuICAvLyBkaXNhYmxlZCBpZiB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQuIER1ZSB0byBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHR5LCB3ZVxuICAvLyBkb24ndCBob25vciB0aGF0IGVkZ2UgY2FzZTsgd2Ugc3R5bGUgdGhlbSBhcyBkaXNhYmxlZCBhbnl3YXkuXG4gICZbZGlzYWJsZWRdLFxuICAmW3JlYWRvbmx5XSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1iZy1kaXNhYmxlZDtcbiAgICBvcGFjaXR5OiAxOyAvLyBpT1MgZml4IGZvciB1bnJlYWRhYmxlIGRpc2FibGVkIGNvbnRlbnQ7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjU1XG4gIH1cblxuICAmW2Rpc2FibGVkXSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxuXG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCB0ZXh0YXJlYSYgdG8gdGV4dGFyZWEuZm9ybS1jb250cm9sXG59XG5cbi8vIFJlc2V0IGhlaWdodCBmb3IgYHRleHRhcmVhYHNcbnRleHRhcmVhLmZvcm0tY29udHJvbCB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuXG4vLyBTZWFyY2ggaW5wdXRzIGluIGlPU1xuLy9cbi8vIFRoaXMgb3ZlcnJpZGVzIHRoZSBleHRyYSByb3VuZGVkIGNvcm5lcnMgb24gc2VhcmNoIGlucHV0cyBpbiBpT1Mgc28gdGhhdCBvdXJcbi8vIGAuZm9ybS1jb250cm9sYCBjbGFzcyBjYW4gcHJvcGVybHkgc3R5bGUgdGhlbS4gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHNpbXBseVxuLy8gYmUgYWRkZWQgdG8gYC5mb3JtLWNvbnRyb2xgIGFzIGl0J3Mgbm90IHNwZWNpZmljIGVub3VnaC4gRm9yIGRldGFpbHMsIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTU4Ni5cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuXG4vLyBTcGVjaWFsIHN0eWxlcyBmb3IgaU9TIHRlbXBvcmFsIGlucHV0c1xuLy9cbi8vIEluIE1vYmlsZSBTYWZhcmksIHNldHRpbmcgYGRpc3BsYXk6IGJsb2NrYCBvbiB0ZW1wb3JhbCBpbnB1dHMgY2F1c2VzIHRoZVxuLy8gdGV4dCB3aXRoaW4gdGhlIGlucHV0IHRvIGJlY29tZSB2ZXJ0aWNhbGx5IG1pc2FsaWduZWQuIEFzIGEgd29ya2Fyb3VuZCwgd2Vcbi8vIHNldCBhIHBpeGVsIGxpbmUtaGVpZ2h0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaGVpZ2h0IG9mIHRoZSBpbnB1dCwgYnV0IG9ubHlcbi8vIGZvciBTYWZhcmkuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM5ODQ4XG4vL1xuLy8gTm90ZSB0aGF0IGFzIG9mIDguMywgaU9TIGRvZXNuJ3Qgc3VwcG9ydCBgZGF0ZXRpbWVgIG9yIGB3ZWVrYC5cblxuQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMCkge1xuICBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcbiAgaW5wdXRbdHlwZT1cInRpbWVcIl0sXG4gIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbiAgaW5wdXRbdHlwZT1cIm1vbnRoXCJdIHtcbiAgICAmLmZvcm0tY29udHJvbCB7XG4gICAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICAgIH1cblxuICAgICYuaW5wdXQtc20sXG4gICAgLmlucHV0LWdyb3VwLXNtICYge1xuICAgICAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQtc21hbGw7XG4gICAgfVxuXG4gICAgJi5pbnB1dC1sZyxcbiAgICAuaW5wdXQtZ3JvdXAtbGcgJiB7XG4gICAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1sYXJnZTtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBGb3JtIGdyb3Vwc1xuLy9cbi8vIERlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGUgb3JnYW5pemF0aW9uIGFuZCBzcGFjaW5nIG9mIHZlcnRpY2FsIGZvcm1zLiBGb3Jcbi8vIGhvcml6b250YWwgZm9ybXMsIHVzZSB0aGUgcHJlZGVmaW5lZCBncmlkIGNsYXNzZXMuXG5cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogJGZvcm0tZ3JvdXAtbWFyZ2luLWJvdHRvbTtcbn1cblxuXG4vLyBDaGVja2JveGVzIGFuZCByYWRpb3Ncbi8vXG4vLyBJbmRlbnQgdGhlIGxhYmVscyB0byBwb3NpdGlvbiByYWRpb3MvY2hlY2tib3hlcyBhcyBoYW5naW5nIGNvbnRyb2xzLlxuXG4ucmFkaW8sXG4uY2hlY2tib3gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuXG4gIGxhYmVsIHtcbiAgICBtaW4taGVpZ2h0OiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7IC8vIEVuc3VyZSB0aGUgaW5wdXQgZG9lc24ndCBqdW1wIHdoZW4gdGhlcmUgaXMgbm8gdGV4dFxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4ucmFkaW8gaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuLnJhZGlvLWlubGluZSBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4uY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi1sZWZ0OiAtMjBweDtcbiAgbWFyZ2luLXRvcDogNHB4IFxcOTtcbn1cblxuLnJhZGlvICsgLnJhZGlvLFxuLmNoZWNrYm94ICsgLmNoZWNrYm94IHtcbiAgbWFyZ2luLXRvcDogLTVweDsgLy8gTW92ZSB1cCBzaWJsaW5nIHJhZGlvcyBvciBjaGVja2JveGVzIGZvciB0aWdodGVyIHNwYWNpbmdcbn1cblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIG9uIHNhbWUgbGluZVxuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmFkaW8taW5saW5lICsgLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUgKyAuY2hlY2tib3gtaW5saW5lIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7IC8vIHNwYWNlIG91dCBjb25zZWN1dGl2ZSBpbmxpbmUgY29udHJvbHNcbn1cblxuLy8gQXBwbHkgc2FtZSBkaXNhYmxlZCBjdXJzb3IgdHdlYWsgYXMgZm9yIGlucHV0c1xuLy8gU29tZSBzcGVjaWFsIGNhcmUgaXMgbmVlZGVkIGJlY2F1c2UgPGxhYmVsPnMgZG9uJ3QgaW5oZXJpdCB0aGVpciBwYXJlbnQncyBgY3Vyc29yYC5cbi8vXG4vLyBOb3RlOiBOZWl0aGVyIHJhZGlvcyBub3IgY2hlY2tib3hlcyBjYW4gYmUgcmVhZG9ubHkuXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAmW2Rpc2FibGVkXSxcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuLy8gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBkaXJlY3RseSBvbiA8bGFiZWw+c1xuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICAmLmRpc2FibGVkLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgY3Vyc29yOiAkY3Vyc29yLWRpc2FibGVkO1xuICB9XG59XG4vLyBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIG9uIGVsZW1lbnRzIHdpdGggPGxhYmVsPiBkZXNjZW5kYW50c1xuLnJhZGlvLFxuLmNoZWNrYm94IHtcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGxhYmVsIHtcbiAgICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBTdGF0aWMgZm9ybSBjb250cm9sIHRleHRcbi8vXG4vLyBBcHBseSBjbGFzcyB0byBhIGBwYCBlbGVtZW50IHRvIG1ha2UgYW55IHN0cmluZyBvZiB0ZXh0IGFsaWduIHdpdGggbGFiZWxzIGluXG4vLyBhIGhvcml6b250YWwgZm9ybSBsYXlvdXQuXG5cbi5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgLy8gU2l6ZSBpdCBhcHByb3ByaWF0ZWx5IG5leHQgdG8gcmVhbCBmb3JtIGNvbnRyb2xzXG4gIHBhZGRpbmctdG9wOiAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpO1xuICBwYWRkaW5nLWJvdHRvbTogKCRwYWRkaW5nLWJhc2UtdmVydGljYWwgKyAxKTtcbiAgLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luIGZyb20gYHBgXG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLWJhc2UpO1xuXG4gICYuaW5wdXQtbGcsXG4gICYuaW5wdXQtc20ge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIEJ1aWxkIG9uIGAuZm9ybS1jb250cm9sYCB3aXRoIG1vZGlmaWVyIGNsYXNzZXMgdG8gZGVjcmVhc2Ugb3IgaW5jcmVhc2UgdGhlXG4vLyBoZWlnaHQgYW5kIGZvbnQtc2l6ZSBvZiBmb3JtIGNvbnRyb2xzLlxuLy9cbi8vIFRoZSBgLmZvcm0tZ3JvdXAtKiBmb3JtLWNvbnRyb2xgIHZhcmlhdGlvbnMgYXJlIHNhZGx5IGR1cGxpY2F0ZWQgdG8gYXZvaWQgdGhlXG4vLyBpc3N1ZSBkb2N1bWVudGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTUwNzQuXG5cbkBpbmNsdWRlIGlucHV0LXNpemUoJy5pbnB1dC1zbScsICRpbnB1dC1oZWlnaHQtc21hbGwsICRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsLCAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsLCAkZm9udC1zaXplLXNtYWxsLCAkbGluZS1oZWlnaHQtc21hbGwsICRpbnB1dC1ib3JkZXItcmFkaXVzLXNtYWxsKTtcbi5mb3JtLWdyb3VwLXNtIHtcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIHBhZGRpbmc6ICRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsICRwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogJGlucHV0LWJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICB9XG4gIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbiAgc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLXNtYWxsKTtcbiAgICBwYWRkaW5nOiAoJHBhZGRpbmctc21hbGwtdmVydGljYWwgKyAxKSAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LXNtYWxsO1xuICB9XG59XG5cbkBpbmNsdWRlIGlucHV0LXNpemUoJy5pbnB1dC1sZycsICRpbnB1dC1oZWlnaHQtbGFyZ2UsICRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsLCAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsLCAkZm9udC1zaXplLWxhcmdlLCAkbGluZS1oZWlnaHQtbGFyZ2UsICRpbnB1dC1ib3JkZXItcmFkaXVzLWxhcmdlKTtcbi5mb3JtLWdyb3VwLWxnIHtcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIHBhZGRpbmc6ICRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICRwYWRkaW5nLWxhcmdlLWhvcml6b250YWw7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLWxhcmdlO1xuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogJGlucHV0LWJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cbiAgc2VsZWN0LmZvcm0tY29udHJvbCB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICB9XG4gIHRleHRhcmVhLmZvcm0tY29udHJvbCxcbiAgc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wge1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAkZm9udC1zaXplLWxhcmdlKTtcbiAgICBwYWRkaW5nOiAoJHBhZGRpbmctbGFyZ2UtdmVydGljYWwgKyAxKSAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1sYXJnZTtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWxhcmdlO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIGZlZWRiYWNrIHN0YXRlc1xuLy9cbi8vIEFwcGx5IGNvbnRleHR1YWwgYW5kIHNlbWFudGljIHN0YXRlcyB0byBpbmRpdmlkdWFsIGZvcm0gY29udHJvbHMuXG5cbi5oYXMtZmVlZGJhY2sge1xuICAvLyBFbmFibGUgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC8vIEVuc3VyZSBpY29ucyBkb24ndCBvdmVybGFwIHRleHRcbiAgLmZvcm0tY29udHJvbCB7XG4gICAgcGFkZGluZy1yaWdodDogKCRpbnB1dC1oZWlnaHQtYmFzZSAqIDEuMjUpO1xuICB9XG59XG4vLyBGZWVkYmFjayBpY29uIChyZXF1aXJlcyAuZ2x5cGhpY29uIGNsYXNzZXMpXG4uZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICB6LWluZGV4OiAyOyAvLyBFbnN1cmUgaWNvbiBpcyBhYm92ZSBpbnB1dCBncm91cHNcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LWJhc2U7XG4gIGhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodC1iYXNlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLmlucHV0LWxnICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1sZyArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtbGFyZ2U7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxhcmdlO1xufVxuLmlucHV0LXNtICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayxcbi5pbnB1dC1ncm91cC1zbSArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssXG4uZm9ybS1ncm91cC1zbSAuZm9ybS1jb250cm9sICsgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHdpZHRoOiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtc21hbGw7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LXNtYWxsO1xufVxuXG4vLyBGZWVkYmFjayBzdGF0ZXNcbi5oYXMtc3VjY2VzcyB7XG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCRzdGF0ZS1zdWNjZXNzLXRleHQsICRzdGF0ZS1zdWNjZXNzLXRleHQsICRzdGF0ZS1zdWNjZXNzLWJnKTtcbn1cbi5oYXMtd2FybmluZyB7XG4gIEBpbmNsdWRlIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCRzdGF0ZS13YXJuaW5nLXRleHQsICRzdGF0ZS13YXJuaW5nLXRleHQsICRzdGF0ZS13YXJuaW5nLWJnKTtcbn1cbi5oYXMtZXJyb3Ige1xuICBAaW5jbHVkZSBmb3JtLWNvbnRyb2wtdmFsaWRhdGlvbigkc3RhdGUtZGFuZ2VyLXRleHQsICRzdGF0ZS1kYW5nZXItdGV4dCwgJHN0YXRlLWRhbmdlci1iZyk7XG59XG5cbi8vIFJlcG9zaXRpb24gZmVlZGJhY2sgaWNvbiBpZiBpbnB1dCBoYXMgdmlzaWJsZSBsYWJlbCBhYm92ZVxuLmhhcy1mZWVkYmFjayBsYWJlbCB7XG5cbiAgJiB+IC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICB0b3A6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyA1KTsgLy8gSGVpZ2h0IG9mIHRoZSBgbGFiZWxgIGFuZCBpdHMgbWFyZ2luXG4gIH1cbiAgJi5zci1vbmx5IH4gLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gICAgIHRvcDogMDtcbiAgfVxufVxuXG5cbi8vIEhlbHAgdGV4dFxuLy9cbi8vIEFwcGx5IHRvIGFueSBlbGVtZW50IHlvdSB3aXNoIHRvIGNyZWF0ZSBsaWdodCB0ZXh0IGZvciBwbGFjZW1lbnQgaW1tZWRpYXRlbHlcbi8vIGJlbG93IGEgZm9ybSBjb250cm9sLiBVc2UgZm9yIGdlbmVyYWwgaGVscCwgZm9ybWF0dGluZywgb3IgaW5zdHJ1Y3Rpb25hbCB0ZXh0LlxuXG4uaGVscC1ibG9jayB7XG4gIGRpc3BsYXk6IGJsb2NrOyAvLyBhY2NvdW50IGZvciBhbnkgZWxlbWVudCB1c2luZyBoZWxwLWJsb2NrXG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgY29sb3I6IGxpZ2h0ZW4oJHRleHQtY29sb3IsIDI1JSk7IC8vIGxpZ2h0ZW4gdGhlIHRleHQgc29tZSBmb3IgY29udHJhc3Rcbn1cblxuXG4vLyBJbmxpbmUgZm9ybXNcbi8vXG4vLyBNYWtlIGZvcm1zIGFwcGVhciBpbmxpbmUoLWJsb2NrKSBieSBhZGRpbmcgdGhlIGAuZm9ybS1pbmxpbmVgIGNsYXNzLiBJbmxpbmVcbi8vIGZvcm1zIGJlZ2luIHN0YWNrZWQgb24gZXh0cmEgc21hbGwgKG1vYmlsZSkgZGV2aWNlcyBhbmQgdGhlbiBnbyBpbmxpbmUgd2hlblxuLy8gdmlld3BvcnRzIHJlYWNoIDw3NjhweC5cbi8vXG4vLyBSZXF1aXJlcyB3cmFwcGluZyBpbnB1dHMgYW5kIGxhYmVscyB3aXRoIGAuZm9ybS1ncm91cGAgZm9yIHByb3BlciBkaXNwbGF5IG9mXG4vLyBkZWZhdWx0IEhUTUwgZm9ybSBjb250cm9scyBhbmQgb3VyIGN1c3RvbSBmb3JtIGNvbnRyb2xzIChlLmcuLCBpbnB1dCBncm91cHMpLlxuLy9cbi8vIEhlYWRzIHVwISBUaGlzIGlzIG1peGluLWVkIGludG8gYC5uYXZiYXItZm9ybWAgaW4gbmF2YmFycy5sZXNzLlxuXG4vLyBbY29udmVydGVyXSBleHRyYWN0ZWQgZnJvbSBgLmZvcm0taW5saW5lYCBmb3IgbGlic2FzcyBjb21wYXRpYmlsaXR5XG5AbWl4aW4gZm9ybS1pbmxpbmUge1xuXG4gIC8vIEtpY2sgaW4gdGhlIGlubGluZVxuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICAvLyBJbmxpbmUtYmxvY2sgYWxsIHRoZSB0aGluZ3MgZm9yIFwiaW5saW5lXCJcbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBJbiBuYXZiYXItZm9ybSwgYWxsb3cgZm9sa3MgdG8gKm5vdCogdXNlIGAuZm9ybS1ncm91cGBcbiAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiBhdXRvOyAvLyBQcmV2ZW50IGxhYmVscyBmcm9tIHN0YWNraW5nIGFib3ZlIGlucHV0cyBpbiBgLmZvcm0tZ3JvdXBgXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3RhdGljIGNvbnRyb2xzIGJlaGF2ZSBsaWtlIHJlZ3VsYXIgb25lc1xuICAgIC5mb3JtLWNvbnRyb2wtc3RhdGljIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG5cbiAgICAuaW5wdXQtZ3JvdXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgICAgLmlucHV0LWdyb3VwLWFkZG9uLFxuICAgICAgLmlucHV0LWdyb3VwLWJ0bixcbiAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnB1dCBncm91cHMgbmVlZCB0aGF0IDEwMCUgd2lkdGggdGhvdWdoXG4gICAgLmlucHV0LWdyb3VwID4gLmZvcm0tY29udHJvbCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuY29udHJvbC1sYWJlbCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZGVmYXVsdCBtYXJnaW4gb24gcmFkaW9zL2NoZWNrYm94ZXMgdGhhdCB3ZXJlIHVzZWQgZm9yIHN0YWNraW5nLCBhbmRcbiAgICAvLyB0aGVuIHVuZG8gdGhlIGZsb2F0aW5nIG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlcyB0byBtYXRjaC5cbiAgICAucmFkaW8sXG4gICAgLmNoZWNrYm94IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgICAgbGFiZWwge1xuICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuICAgIC5yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4gICAgLmNoZWNrYm94IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICB9XG5cbiAgICAvLyBSZS1vdmVycmlkZSB0aGUgZmVlZGJhY2sgaWNvbi5cbiAgICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICAgdG9wOiAwO1xuICAgIH1cbiAgfVxufVxuLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGFzIGBAbWl4aW4gZm9ybS1pbmxpbmVgIGZvciBsaWJzYXNzIGNvbXBhdGliaWxpdHlcbi5mb3JtLWlubGluZSB7XG4gIEBpbmNsdWRlIGZvcm0taW5saW5lO1xufVxuXG5cblxuLy8gSG9yaXpvbnRhbCBmb3Jtc1xuLy9cbi8vIEhvcml6b250YWwgZm9ybXMgYXJlIGJ1aWx0IG9uIGdyaWQgY2xhc3NlcyBhbmQgYWxsb3cgeW91IHRvIGNyZWF0ZSBmb3JtcyB3aXRoXG4vLyBsYWJlbHMgb24gdGhlIGxlZnQgYW5kIGlucHV0cyBvbiB0aGUgcmlnaHQuXG5cbi5mb3JtLWhvcml6b250YWwge1xuXG4gIC8vIENvbnNpc3RlbnQgdmVydGljYWwgYWxpZ25tZW50IG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlc1xuICAvL1xuICAvLyBMYWJlbHMgYWxzbyBnZXQgc29tZSByZXNldCBzdHlsZXMsIGJ1dCB0aGF0IGlzIHNjb3BlZCB0byBhIG1lZGlhIHF1ZXJ5IGJlbG93LlxuICAucmFkaW8sXG4gIC5jaGVja2JveCxcbiAgLnJhZGlvLWlubGluZSxcbiAgLmNoZWNrYm94LWlubGluZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHBhZGRpbmctdG9wOiAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpOyAvLyBEZWZhdWx0IHBhZGRpbmcgcGx1cyBhIGJvcmRlclxuICB9XG4gIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgd2UncmUgYWRkaW5nIHRvIGVuc3VyZSB0aGUgYWxpZ25tZW50IGFuZCBvZiBoZWxwIHRleHRcbiAgLy8gYW5kIG90aGVyIGNvbnRlbnQgYmVsb3cgaXRlbXNcbiAgLnJhZGlvLFxuICAuY2hlY2tib3gge1xuICAgIG1pbi1oZWlnaHQ6ICgkbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAoJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpKTtcbiAgfVxuXG4gIC8vIE1ha2UgZm9ybSBncm91cHMgYmVoYXZlIGxpa2Ugcm93c1xuICAuZm9ybS1ncm91cCB7XG4gICAgQGluY2x1ZGUgbWFrZS1yb3c7XG4gIH1cblxuICAvLyBSZXNldCBzcGFjaW5nIGFuZCByaWdodCBhbGlnbiBsYWJlbHMsIGJ1dCBzY29wZSB0byBtZWRpYSBxdWVyaWVzIHNvIHRoYXRcbiAgLy8gbGFiZWxzIG9uIG5hcnJvdyB2aWV3cG9ydHMgc3RhY2sgdGhlIHNhbWUgYXMgYSBkZWZhdWx0IGZvcm0gZXhhbXBsZS5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgLmNvbnRyb2wtbGFiZWwge1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7IC8vIERlZmF1bHQgcGFkZGluZyBwbHVzIGEgYm9yZGVyXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGlvbiBzdGF0ZXNcbiAgLy9cbiAgLy8gUmVwb3NpdGlvbiB0aGUgaWNvbiBiZWNhdXNlIGl0J3Mgbm93IHdpdGhpbiBhIGdyaWQgY29sdW1uIGFuZCBjb2x1bW5zIGhhdmVcbiAgLy8gYHBvc2l0aW9uOiByZWxhdGl2ZTtgIG9uIHRoZW0uIEFsc28gYWNjb3VudHMgZm9yIHRoZSBncmlkIGd1dHRlciBwYWRkaW5nLlxuICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIHJpZ2h0OiBmbG9vcigoJGdyaWQtZ3V0dGVyLXdpZHRoIC8gMikpO1xuICB9XG5cbiAgLy8gRm9ybSBncm91cCBzaXplc1xuICAvL1xuICAvLyBRdWljayB1dGlsaXR5IGNsYXNzIGZvciBhcHBseWluZyBgLmlucHV0LWxnYCBhbmQgYC5pbnB1dC1zbWAgc3R5bGVzIHRvIHRoZVxuICAvLyBpbnB1dHMgYW5kIGxhYmVscyB3aXRoaW4gYSBgLmZvcm0tZ3JvdXBgLlxuICAuZm9ybS1ncm91cC1sZyB7XG4gICAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgICAuY29udHJvbC1sYWJlbCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAoKCRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICogJGxpbmUtaGVpZ2h0LWxhcmdlKSArIDEpO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtbGFyZ2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC5mb3JtLWdyb3VwLXNtIHtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIHtcbiAgICAgIC5jb250cm9sLWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy10b3A6ICgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCArIDEpO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3JtIHZhbGlkYXRpb24gc3RhdGVzXG4vL1xuLy8gVXNlZCBpbiBmb3Jtcy5sZXNzIHRvIGdlbmVyYXRlIHRoZSBmb3JtIHZhbGlkYXRpb24gQ1NTIGZvciB3YXJuaW5ncywgZXJyb3JzLFxuLy8gYW5kIHN1Y2Nlc3Nlcy5cblxuQG1peGluIGZvcm0tY29udHJvbC12YWxpZGF0aW9uKCR0ZXh0LWNvbG9yOiAjNTU1LCAkYm9yZGVyLWNvbG9yOiAjY2NjLCAkYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNSkge1xuICAvLyBDb2xvciB0aGUgbGFiZWwgYW5kIGhlbHAgdGV4dFxuICAuaGVscC1ibG9jayxcbiAgLmNvbnRyb2wtbGFiZWwsXG4gIC5yYWRpbyxcbiAgLmNoZWNrYm94LFxuICAucmFkaW8taW5saW5lLFxuICAuY2hlY2tib3gtaW5saW5lLFxuICAmLnJhZGlvIGxhYmVsLFxuICAmLmNoZWNrYm94IGxhYmVsLFxuICAmLnJhZGlvLWlubGluZSBsYWJlbCxcbiAgJi5jaGVja2JveC1pbmxpbmUgbGFiZWwgIHtcbiAgICBjb2xvcjogJHRleHQtY29sb3I7XG4gIH1cbiAgLy8gU2V0IHRoZSBib3JkZXIgYW5kIGJveCBzaGFkb3cgb24gc3BlY2lmaWMgaW5wdXRzIHRvIG1hdGNoXG4gIC5mb3JtLWNvbnRyb2wge1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpKTsgLy8gUmVkZWNsYXJlIHNvIHRyYW5zaXRpb25zIHdvcmtcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogZGFya2VuKCRib3JkZXItY29sb3IsIDEwJSk7XG4gICAgICAkc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwgMCAwIDZweCBsaWdodGVuKCRib3JkZXItY29sb3IsIDIwJSk7XG4gICAgICBAaW5jbHVkZSBib3gtc2hhZG93KCRzaGFkb3cpO1xuICAgIH1cbiAgfVxuICAvLyBTZXQgdmFsaWRhdGlvbiBzdGF0ZXMgYWxzbyBmb3IgYWRkb25zXG4gIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gICAgY29sb3I6ICR0ZXh0LWNvbG9yO1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZC1jb2xvcjtcbiAgfVxuICAvLyBPcHRpb25hbCBmZWVkYmFjayBpY29uXG4gIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIGNvbG9yOiAkdGV4dC1jb2xvcjtcbiAgfVxufVxuXG5cbi8vIEZvcm0gY29udHJvbCBmb2N1cyBzdGF0ZVxuLy9cbi8vIEdlbmVyYXRlIGEgY3VzdG9taXplZCBmb2N1cyBzdGF0ZSBhbmQgZm9yIGFueSBpbnB1dCB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IsXG4vLyB3aGljaCBkZWZhdWx0cyB0byB0aGUgYCRpbnB1dC1ib3JkZXItZm9jdXNgIHZhcmlhYmxlLlxuLy9cbi8vIFdlIGhpZ2hseSBlbmNvdXJhZ2UgeW91IHRvIG5vdCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdmFsdWUsIGJ1dCBpbnN0ZWFkIHVzZVxuLy8gdGhpcyB0byB0d2VhayBjb2xvcnMgb24gYW4gYXMtbmVlZGVkIGJhc2lzLiBUaGlzIGFlc3RoZXRpYyBjaGFuZ2UgaXMgYmFzZWQgb25cbi8vIFdlYktpdCdzIGRlZmF1bHQgc3R5bGVzLCBidXQgYXBwbGljYWJsZSB0byBhIHdpZGVyIHJhbmdlIG9mIGJyb3dzZXJzLiBJdHNcbi8vIHVzYWJpbGl0eSBhbmQgYWNjZXNzaWJpbGl0eSBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IHdpdGggYW55IGNoYW5nZS5cbi8vXG4vLyBFeGFtcGxlIHVzYWdlOiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmx1ZSBib3JkZXIgYW5kIHNoYWRvdyB0byB3aGl0ZSBmb3IgYmV0dGVyXG4vLyBjb250cmFzdCBhZ2FpbnN0IGEgZGFyayBncmF5IGJhY2tncm91bmQuXG5AbWl4aW4gZm9ybS1jb250cm9sLWZvY3VzKCRjb2xvcjogJGlucHV0LWJvcmRlci1mb2N1cykge1xuICAkY29sb3ItcmdiYTogcmdiYShyZWQoJGNvbG9yKSwgZ3JlZW4oJGNvbG9yKSwgYmx1ZSgkY29sb3IpLCAuNik7XG4gICY6Zm9jdXMge1xuICAgIGJvcmRlci1jb2xvcjogJGNvbG9yO1xuICAgIG91dGxpbmU6IDA7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwgMCAwIDhweCAkY29sb3ItcmdiYSk7XG4gIH1cbn1cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIFJlbGF0aXZlIHRleHQgc2l6ZSwgcGFkZGluZywgYW5kIGJvcmRlci1yYWRpaSBjaGFuZ2VzIGZvciBmb3JtIGNvbnRyb2xzLiBGb3Jcbi8vIGhvcml6b250YWwgc2l6aW5nLCB3cmFwIGNvbnRyb2xzIGluIHRoZSBwcmVkZWZpbmVkIGdyaWQgY2xhc3Nlcy4gYDxzZWxlY3Q+YFxuLy8gZWxlbWVudCBnZXRzIHNwZWNpYWwgbG92ZSBiZWNhdXNlIGl0J3Mgc3BlY2lhbCwgYW5kIHRoYXQncyBhIGZhY3QhXG4vLyBbY29udmVydGVyXSAkcGFyZW50IGhhY2tcbkBtaXhpbiBpbnB1dC1zaXplKCRwYXJlbnQsICRpbnB1dC1oZWlnaHQsICRwYWRkaW5nLXZlcnRpY2FsLCAkcGFkZGluZy1ob3Jpem9udGFsLCAkZm9udC1zaXplLCAkbGluZS1oZWlnaHQsICRib3JkZXItcmFkaXVzKSB7XG4gICN7JHBhcmVudH0ge1xuICAgIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgICBwYWRkaW5nOiAkcGFkZGluZy12ZXJ0aWNhbCAkcGFkZGluZy1ob3Jpem9udGFsO1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZTtcbiAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICB9XG5cbiAgc2VsZWN0I3skcGFyZW50fSB7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICB9XG5cbiAgdGV4dGFyZWEjeyRwYXJlbnR9LFxuICBzZWxlY3RbbXVsdGlwbGVdI3skcGFyZW50fSB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICB9XG59XG4iLCIvL1xuLy8gQnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWJvdHRvbTogMDsgLy8gRm9yIGlucHV0LmJ0blxuICBmb250LXdlaWdodDogJGJ0bi1mb250LXdlaWdodDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBAaW5jbHVkZSBidXR0b24tc2l6ZSgkcGFkZGluZy1iYXNlLXZlcnRpY2FsLCAkcGFkZGluZy1iYXNlLWhvcml6b250YWwsICRmb250LXNpemUtYmFzZSwgJGxpbmUtaGVpZ2h0LWJhc2UsICRidG4tYm9yZGVyLXJhZGl1cy1iYXNlKTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJixcbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgQGluY2x1ZGUgdGFiLWZvY3VzO1xuICAgIH1cbiAgfVxuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICYuZm9jdXMge1xuICAgIGNvbG9yOiAkYnRuLWRlZmF1bHQtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG5cbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICBvdXRsaW5lOiAwO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhpbnNldCAwIDNweCA1cHggcmdiYSgwLDAsMCwuMTI1KSk7XG4gIH1cblxuICAmLmRpc2FibGVkLFxuICAmW2Rpc2FibGVkXSxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICBAaW5jbHVkZSBvcGFjaXR5KC42NSk7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgfVxuXG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCBhJiB0byBhLmJ0blxufVxuXG5hLmJ0biB7XG4gICYuZGlzYWJsZWQsXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgLy8gRnV0dXJlLXByb29mIGRpc2FibGluZyBvZiBjbGlja3Mgb24gYDxhPmAgZWxlbWVudHNcbiAgfVxufVxuXG5cbi8vIEFsdGVybmF0ZSBidXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWRlZmF1bHQge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWRlZmF1bHQtY29sb3IsICRidG4tZGVmYXVsdC1iZywgJGJ0bi1kZWZhdWx0LWJvcmRlcik7XG59XG4uYnRuLXByaW1hcnkge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLXByaW1hcnktY29sb3IsICRidG4tcHJpbWFyeS1iZywgJGJ0bi1wcmltYXJ5LWJvcmRlcik7XG59XG4vLyBTdWNjZXNzIGFwcGVhcnMgYXMgZ3JlZW5cbi5idG4tc3VjY2VzcyB7XG4gIEBpbmNsdWRlIGJ1dHRvbi12YXJpYW50KCRidG4tc3VjY2Vzcy1jb2xvciwgJGJ0bi1zdWNjZXNzLWJnLCAkYnRuLXN1Y2Nlc3MtYm9yZGVyKTtcbn1cbi8vIEluZm8gYXBwZWFycyBhcyBibHVlLWdyZWVuXG4uYnRuLWluZm8ge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWluZm8tY29sb3IsICRidG4taW5mby1iZywgJGJ0bi1pbmZvLWJvcmRlcik7XG59XG4vLyBXYXJuaW5nIGFwcGVhcnMgYXMgb3JhbmdlXG4uYnRuLXdhcm5pbmcge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLXdhcm5pbmctY29sb3IsICRidG4td2FybmluZy1iZywgJGJ0bi13YXJuaW5nLWJvcmRlcik7XG59XG4vLyBEYW5nZXIgYW5kIGVycm9yIGFwcGVhciBhcyByZWRcbi5idG4tZGFuZ2VyIHtcbiAgQGluY2x1ZGUgYnV0dG9uLXZhcmlhbnQoJGJ0bi1kYW5nZXItY29sb3IsICRidG4tZGFuZ2VyLWJnLCAkYnRuLWRhbmdlci1ib3JkZXIpO1xufVxuXG5cbi8vIExpbmsgYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBNYWtlIGEgYnV0dG9uIGxvb2sgYW5kIGJlaGF2ZSBsaWtlIGEgbGlua1xuLmJ0bi1saW5rIHtcbiAgY29sb3I6ICRsaW5rLWNvbG9yO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBib3JkZXItcmFkaXVzOiAwO1xuXG4gICYsXG4gICY6YWN0aXZlLFxuICAmLmFjdGl2ZSxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KG5vbmUpO1xuICB9XG4gICYsXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICY6YWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246ICRsaW5rLWhvdmVyLWRlY29yYXRpb247XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRidG4tbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBCdXR0b24gU2l6ZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tbGcge1xuICAvLyBsaW5lLWhlaWdodDogZW5zdXJlIGV2ZW4tbnVtYmVyZWQgaGVpZ2h0IG9mIGJ1dHRvbiBuZXh0IHRvIGxhcmdlIGlucHV0XG4gIEBpbmNsdWRlIGJ1dHRvbi1zaXplKCRwYWRkaW5nLWxhcmdlLXZlcnRpY2FsLCAkcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsLCAkZm9udC1zaXplLWxhcmdlLCAkbGluZS1oZWlnaHQtbGFyZ2UsICRidG4tYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG4uYnRuLXNtIHtcbiAgLy8gbGluZS1oZWlnaHQ6IGVuc3VyZSBwcm9wZXIgaGVpZ2h0IG9mIGJ1dHRvbiBuZXh0IHRvIHNtYWxsIGlucHV0XG4gIEBpbmNsdWRlIGJ1dHRvbi1zaXplKCRwYWRkaW5nLXNtYWxsLXZlcnRpY2FsLCAkcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsLCAkZm9udC1zaXplLXNtYWxsLCAkbGluZS1oZWlnaHQtc21hbGwsICRidG4tYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG4uYnRuLXhzIHtcbiAgQGluY2x1ZGUgYnV0dG9uLXNpemUoJHBhZGRpbmcteHMtdmVydGljYWwsICRwYWRkaW5nLXhzLWhvcml6b250YWwsICRmb250LXNpemUtc21hbGwsICRsaW5lLWhlaWdodC1zbWFsbCwgJGJ0bi1ib3JkZXItcmFkaXVzLXNtYWxsKTtcbn1cblxuXG4vLyBCbG9jayBidXR0b25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi8vIFZlcnRpY2FsbHkgc3BhY2Ugb3V0IG11bHRpcGxlIGJsb2NrIGJ1dHRvbnNcbi5idG4tYmxvY2sgKyAuYnRuLWJsb2NrIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4vLyBTcGVjaWZpY2l0eSBvdmVycmlkZXNcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl0sXG5pbnB1dFt0eXBlPVwicmVzZXRcIl0sXG5pbnB1dFt0eXBlPVwiYnV0dG9uXCJdIHtcbiAgJi5idG4tYmxvY2sge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG4iLCIvLyBCdXR0b24gdmFyaWFudHNcbi8vXG4vLyBFYXNpbHkgcHVtcCBvdXQgZGVmYXVsdCBzdHlsZXMsIGFzIHdlbGwgYXMgOmhvdmVyLCA6Zm9jdXMsIDphY3RpdmUsXG4vLyBhbmQgZGlzYWJsZWQgb3B0aW9ucyBmb3IgYWxsIGJ1dHRvbnNcblxuQG1peGluIGJ1dHRvbi12YXJpYW50KCRjb2xvciwgJGJhY2tncm91bmQsICRib3JkZXIpIHtcbiAgY29sb3I6ICRjb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQ7XG4gIGJvcmRlci1jb2xvcjogJGJvcmRlcjtcblxuICAmOmZvY3VzLFxuICAmLmZvY3VzIHtcbiAgICBjb2xvcjogJGNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTAlKTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJvcmRlciwgMjUlKTtcbiAgfVxuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogJGNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTAlKTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJvcmRlciwgMTIlKTtcbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gJi5kcm9wZG93bi10b2dnbGUge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogZGFya2VuKCRiYWNrZ3JvdW5kLCAxMCUpO1xuICAgICAgICBib3JkZXItY29sb3I6IGRhcmtlbigkYm9yZGVyLCAxMiUpO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgMTclKTtcbiAgICAgICAgICBib3JkZXItY29sb3I6IGRhcmtlbigkYm9yZGVyLCAyNSUpO1xuICAgIH1cbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gJi5kcm9wZG93bi10b2dnbGUge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIH1cbiAgJi5kaXNhYmxlZCxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmLmZvY3VzLFxuICAgICY6YWN0aXZlLFxuICAgICYuYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kO1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogJGJvcmRlcjtcbiAgICB9XG4gIH1cblxuICAuYmFkZ2Uge1xuICAgIGNvbG9yOiAkYmFja2dyb3VuZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3I7XG4gIH1cbn1cblxuLy8gQnV0dG9uIHNpemVzXG5AbWl4aW4gYnV0dG9uLXNpemUoJHBhZGRpbmctdmVydGljYWwsICRwYWRkaW5nLWhvcml6b250YWwsICRmb250LXNpemUsICRsaW5lLWhlaWdodCwgJGJvcmRlci1yYWRpdXMpIHtcbiAgcGFkZGluZzogJHBhZGRpbmctdmVydGljYWwgJHBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbn1cbiIsIi8vIE9wYWNpdHlcblxuQG1peGluIG9wYWNpdHkoJG9wYWNpdHkpIHtcbiAgb3BhY2l0eTogJG9wYWNpdHk7XG4gIC8vIElFOCBmaWx0ZXJcbiAgJG9wYWNpdHktaWU6ICgkb3BhY2l0eSAqIDEwMCk7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0kb3BhY2l0eS1pZSk7XG59XG4iLCIvL1xuLy8gQ29tcG9uZW50IGFuaW1hdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhlYWRzIHVwIVxuLy9cbi8vIFdlIGRvbid0IHVzZSB0aGUgYC5vcGFjaXR5KClgIG1peGluIGhlcmUgc2luY2UgaXQgY2F1c2VzIGEgYnVnIHdpdGggdGV4dFxuLy8gZmllbGRzIGluIElFNy04LiBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzM1NTIuXG5cbi5mYWRlIHtcbiAgb3BhY2l0eTogMDtcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbihvcGFjaXR5IC4xNXMgbGluZWFyKTtcbiAgJi5pbiB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuXG4uY29sbGFwc2Uge1xuICBkaXNwbGF5OiBub25lO1xuXG4gICYuaW4gICAgICB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gIC8vIFtjb252ZXJ0ZXJdIGV4dHJhY3RlZCB0ciYuaW4gdG8gdHIuY29sbGFwc2UuaW5cbiAgLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIHRib2R5Ji5pbiB0byB0Ym9keS5jb2xsYXBzZS5pblxufVxuXG50ci5jb2xsYXBzZS5pbiAgICB7IGRpc3BsYXk6IHRhYmxlLXJvdzsgfVxuXG50Ym9keS5jb2xsYXBzZS5pbiB7IGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cDsgfVxuXG4uY29sbGFwc2luZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBAaW5jbHVkZSB0cmFuc2l0aW9uLXByb3BlcnR5KGhlaWdodCwgdmlzaWJpbGl0eSk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tZHVyYXRpb24oLjM1cyk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uKGVhc2UpO1xufVxuIiwiLy9cbi8vIERyb3Bkb3duIG1lbnVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIERyb3Bkb3duIGFycm93L2NhcmV0XG4uY2FyZXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlci10b3A6ICAgJGNhcmV0LXdpZHRoLWJhc2UgZGFzaGVkO1xuICBib3JkZXItdG9wOiAgICRjYXJldC13aWR0aC1iYXNlIHNvbGlkIFxcOTsgLy8gSUU4XG4gIGJvcmRlci1yaWdodDogJGNhcmV0LXdpZHRoLWJhc2Ugc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiAgJGNhcmV0LXdpZHRoLWJhc2Ugc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi8vIFRoZSBkcm9wZG93biB3cmFwcGVyIChkaXYpXG4uZHJvcHVwLFxuLmRyb3Bkb3duIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4vLyBQcmV2ZW50IHRoZSBmb2N1cyBvbiB0aGUgZHJvcGRvd24gdG9nZ2xlIHdoZW4gY2xvc2luZyBkcm9wZG93bnNcbi5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBUaGUgZHJvcGRvd24gbWVudSAodWwpXG4uZHJvcGRvd24tbWVudSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LWRyb3Bkb3duO1xuICBkaXNwbGF5OiBub25lOyAvLyBub25lIGJ5IGRlZmF1bHQsIGJ1dCBibG9jayBvbiBcIm9wZW5cIiBvZiB0aGUgbWVudVxuICBmbG9hdDogbGVmdDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIG1hcmdpbjogMnB4IDAgMDsgLy8gb3ZlcnJpZGUgZGVmYXVsdCB1bFxuICBsaXN0LXN0eWxlOiBub25lO1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRW5zdXJlcyBwcm9wZXIgYWxpZ25tZW50IGlmIHBhcmVudCBoYXMgaXQgY2hhbmdlZCAoZS5nLiwgbW9kYWwgZm9vdGVyKVxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkZHJvcGRvd24tYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRkcm9wZG93bi1mYWxsYmFjay1ib3JkZXI7IC8vIElFOCBmYWxsYmFja1xuICBib3JkZXI6IDFweCBzb2xpZCAkZHJvcGRvd24tYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgNnB4IDEycHggcmdiYSgwLDAsMCwuMTc1KSk7XG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG5cbiAgLy8gQWxpZ25zIHRoZSBkcm9wZG93biBtZW51IHRvIHJpZ2h0XG4gIC8vXG4gIC8vIERlcHJlY2F0ZWQgYXMgb2YgMy4xLjAgaW4gZmF2b3Igb2YgYC5kcm9wZG93bi1tZW51LVtkaXJdYFxuICAmLnB1bGwtcmlnaHQge1xuICAgIHJpZ2h0OiAwO1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cblxuICAvLyBEaXZpZGVycyAoYmFzaWNhbGx5IGFuIGhyKSB3aXRoaW4gdGhlIGRyb3Bkb3duXG4gIC5kaXZpZGVyIHtcbiAgICBAaW5jbHVkZSBuYXYtZGl2aWRlcigkZHJvcGRvd24tZGl2aWRlci1iZyk7XG4gIH1cblxuICAvLyBMaW5rcyB3aXRoaW4gdGhlIGRyb3Bkb3duIG1lbnVcbiAgPiBsaSA+IGEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBhZGRpbmc6IDNweCAyMHB4O1xuICAgIGNsZWFyOiBib3RoO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1jb2xvcjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOyAvLyBwcmV2ZW50IGxpbmtzIGZyb20gcmFuZG9tbHkgYnJlYWtpbmcgb250byBuZXcgbGluZXNcbiAgfVxufVxuXG4vLyBIb3Zlci9Gb2N1cyBzdGF0ZVxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6ICRkcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRkcm9wZG93bi1saW5rLWhvdmVyLWJnO1xuICB9XG59XG5cbi8vIEFjdGl2ZSBzdGF0ZVxuLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSB7XG4gICYsXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIG91dGxpbmU6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGRyb3Bkb3duLWxpbmstYWN0aXZlLWJnO1xuICB9XG59XG5cbi8vIERpc2FibGVkIHN0YXRlXG4vL1xuLy8gR3JheSBvdXQgdGV4dCBhbmQgZW5zdXJlIHRoZSBob3Zlci9mb2N1cyBzdGF0ZSByZW1haW5zIGdyYXlcblxuLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhIHtcbiAgJixcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6ICRkcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yO1xuICB9XG5cbiAgLy8gTnVrZSBob3Zlci9mb2N1cyBlZmZlY3RzXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZW1vdmUgQ1NTIGdyYWRpZW50XG4gICAgQGluY2x1ZGUgcmVzZXQtZmlsdGVyO1xuICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuXG4vLyBPcGVuIHN0YXRlIGZvciB0aGUgZHJvcGRvd25cbi5vcGVuIHtcbiAgLy8gU2hvdyB0aGUgbWVudVxuICA+IC5kcm9wZG93bi1tZW51IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgb3V0bGluZSB3aGVuIDpmb2N1cyBpcyB0cmlnZ2VyZWRcbiAgPiBhIHtcbiAgICBvdXRsaW5lOiAwO1xuICB9XG59XG5cbi8vIE1lbnUgcG9zaXRpb25pbmdcbi8vXG4vLyBBZGQgZXh0cmEgY2xhc3MgdG8gYC5kcm9wZG93bi1tZW51YCB0byBmbGlwIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGRyb3Bkb3duXG4vLyBtZW51IHdpdGggdGhlIHBhcmVudC5cbi5kcm9wZG93bi1tZW51LXJpZ2h0IHtcbiAgbGVmdDogYXV0bzsgLy8gUmVzZXQgdGhlIGRlZmF1bHQgZnJvbSBgLmRyb3Bkb3duLW1lbnVgXG4gIHJpZ2h0OiAwO1xufVxuLy8gV2l0aCB2Mywgd2UgZW5hYmxlZCBhdXRvLWZsaXBwaW5nIGlmIHlvdSBoYXZlIGEgZHJvcGRvd24gd2l0aGluIGEgcmlnaHRcbi8vIGFsaWduZWQgbmF2IGNvbXBvbmVudC4gVG8gZW5hYmxlIHRoZSB1bmRvaW5nIG9mIHRoYXQsIHdlIHByb3ZpZGUgYW4gb3ZlcnJpZGVcbi8vIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgZHJvcGRvd24gbWVudSBhbGlnbm1lbnQuXG4vL1xuLy8gVGhpcyBpcyBvbmx5IGZvciBsZWZ0LWFsaWduaW5nIGEgZHJvcGRvd24gbWVudSB3aXRoaW4gYSBgLm5hdmJhci1yaWdodGAgb3Jcbi8vIGAucHVsbC1yaWdodGAgbmF2IGNvbXBvbmVudC5cbi5kcm9wZG93bi1tZW51LWxlZnQge1xuICBsZWZ0OiAwO1xuICByaWdodDogYXV0bztcbn1cblxuLy8gRHJvcGRvd24gc2VjdGlvbiBoZWFkZXJzXG4uZHJvcGRvd24taGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDNweCAyMHB4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6ICRkcm9wZG93bi1oZWFkZXItY29sb3I7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7IC8vIGFzIHdpdGggPiBsaSA+IGFcbn1cblxuLy8gQmFja2Ryb3AgdG8gY2F0Y2ggYm9keSBjbGlja3Mgb24gbW9iaWxlLCBldGMuXG4uZHJvcGRvd24tYmFja2Ryb3Age1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICBib3R0b206IDA7XG4gIHRvcDogMDtcbiAgei1pbmRleDogKCR6aW5kZXgtZHJvcGRvd24gLSAxMCk7XG59XG5cbi8vIFJpZ2h0IGFsaWduZWQgZHJvcGRvd25zXG4ucHVsbC1yaWdodCA+IC5kcm9wZG93bi1tZW51IHtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IGF1dG87XG59XG5cbi8vIEFsbG93IGZvciBkcm9wZG93bnMgdG8gZ28gYm90dG9tIHVwIChha2EsIGRyb3B1cC1tZW51KVxuLy9cbi8vIEp1c3QgYWRkIC5kcm9wdXAgYWZ0ZXIgdGhlIHN0YW5kYXJkIC5kcm9wZG93biBjbGFzcyBhbmQgeW91J3JlIHNldCwgYnJvLlxuLy8gVE9ETzogYWJzdHJhY3QgdGhpcyBzbyB0aGF0IHRoZSBuYXZiYXIgZml4ZWQgc3R5bGVzIGFyZSBub3QgcGxhY2VkIGhlcmU/XG5cbi5kcm9wdXAsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24ge1xuICAvLyBSZXZlcnNlIHRoZSBjYXJldFxuICAuY2FyZXQge1xuICAgIGJvcmRlci10b3A6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogJGNhcmV0LXdpZHRoLWJhc2UgZGFzaGVkO1xuICAgIGJvcmRlci1ib3R0b206ICRjYXJldC13aWR0aC1iYXNlIHNvbGlkIFxcOTsgLy8gSUU4XG4gICAgY29udGVudDogXCJcIjtcbiAgfVxuICAvLyBEaWZmZXJlbnQgcG9zaXRpb25pbmcgZm9yIGJvdHRvbSB1cCBtZW51XG4gIC5kcm9wZG93bi1tZW51IHtcbiAgICB0b3A6IGF1dG87XG4gICAgYm90dG9tOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgfVxufVxuXG5cbi8vIENvbXBvbmVudCBhbGlnbm1lbnRcbi8vXG4vLyBSZWl0ZXJhdGUgcGVyIG5hdmJhci5sZXNzIGFuZCB0aGUgbW9kaWZpZWQgY29tcG9uZW50IGFsaWdubWVudCB0aGVyZS5cblxuQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgLm5hdmJhci1yaWdodCB7XG4gICAgLmRyb3Bkb3duLW1lbnUge1xuICAgICAgcmlnaHQ6IDA7IGxlZnQ6IGF1dG87XG4gICAgfVxuICAgIC8vIE5lY2Vzc2FyeSBmb3Igb3ZlcnJpZGVzIG9mIHRoZSBkZWZhdWx0IHJpZ2h0IGFsaWduZWQgbWVudS5cbiAgICAvLyBXaWxsIHJlbW92ZSBjb21lIHY0IGluIGFsbCBsaWtlbGlob29kLlxuICAgIC5kcm9wZG93bi1tZW51LWxlZnQge1xuICAgICAgbGVmdDogMDsgcmlnaHQ6IGF1dG87XG4gICAgfVxuICB9XG59XG4iLCIvLyBIb3Jpem9udGFsIGRpdmlkZXJzXG4vL1xuLy8gRGl2aWRlcnMgKGJhc2ljYWxseSBhbiBocikgd2l0aGluIGRyb3Bkb3ducyBhbmQgbmF2IGxpc3RzXG5cbkBtaXhpbiBuYXYtZGl2aWRlcigkY29sb3I6ICNlNWU1ZTUpIHtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogKCgkbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKSAtIDEpIDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbn1cbiIsIi8vIFJlc2V0IGZpbHRlcnMgZm9yIElFXG4vL1xuLy8gV2hlbiB5b3UgbmVlZCB0byByZW1vdmUgYSBncmFkaWVudCBiYWNrZ3JvdW5kLCBkbyBub3QgZm9yZ2V0IHRvIHVzZSB0aGlzIHRvIHJlc2V0XG4vLyB0aGUgSUUgZmlsdGVyIGZvciBJRTkgYW5kIGJlbG93LlxuXG5AbWl4aW4gcmVzZXQtZmlsdGVyKCkge1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChlbmFibGVkID0gZmFsc2UpO1xufVxuIiwiLy9cbi8vIEJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE1ha2UgdGhlIGRpdiBiZWhhdmUgbGlrZSBhIGJ1dHRvblxuLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLy8gbWF0Y2ggLmJ0biBhbGlnbm1lbnQgZ2l2ZW4gZm9udC1zaXplIGhhY2sgYWJvdmVcbiAgPiAuYnRuIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gQnJpbmcgdGhlIFwiYWN0aXZlXCIgYnV0dG9uIHRvIHRoZSBmcm9udFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmOmFjdGl2ZSxcbiAgICAmLmFjdGl2ZSB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgIH1cbiAgfVxufVxuXG4vLyBQcmV2ZW50IGRvdWJsZSBib3JkZXJzIHdoZW4gYnV0dG9ucyBhcmUgbmV4dCB0byBlYWNoIG90aGVyXG4uYnRuLWdyb3VwIHtcbiAgLmJ0biArIC5idG4sXG4gIC5idG4gKyAuYnRuLWdyb3VwLFxuICAuYnRuLWdyb3VwICsgLmJ0bixcbiAgLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsOiBHcm91cCBtdWx0aXBsZSBidXR0b24gZ3JvdXBzIHRvZ2V0aGVyIGZvciBhIHRvb2xiYXJcbi5idG4tdG9vbGJhciB7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4OyAvLyBPZmZzZXQgdGhlIGZpcnN0IGNoaWxkJ3MgbWFyZ2luXG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gIC5idG4sXG4gIC5idG4tZ3JvdXAsXG4gIC5pbnB1dC1ncm91cCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAsXG4gID4gLmlucHV0LWdyb3VwIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLy8gU2V0IGNvcm5lcnMgaW5kaXZpZHVhbCBiZWNhdXNlIHNvbWV0aW1lcyBhIHNpbmdsZSBidXR0b24gY2FuIGJlIGluIGEgLmJ0bi1ncm91cCBhbmQgd2UgbmVlZCA6Zmlyc3QtY2hpbGQgYW5kIDpsYXN0LWNoaWxkIHRvIGJvdGggbWF0Y2hcbi5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gICY6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSkge1xuICAgIEBpbmNsdWRlIGJvcmRlci1yaWdodC1yYWRpdXMoMCk7XG4gIH1cbn1cbi8vIE5lZWQgLmRyb3Bkb3duLXRvZ2dsZSBzaW5jZSA6bGFzdC1jaGlsZCBkb2Vzbid0IGFwcGx5IGdpdmVuIGEgLmRyb3Bkb3duLW1lbnUgaW1tZWRpYXRlbHkgYWZ0ZXIgaXRcbi5idG4tZ3JvdXAgPiAuYnRuOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4uYnRuLWdyb3VwID4gLmRyb3Bkb3duLXRvZ2dsZTpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIEBpbmNsdWRlIGJvcmRlci1sZWZ0LXJhZGl1cygwKTtcbn1cblxuLy8gQ3VzdG9tIGVkaXRzIGZvciBpbmNsdWRpbmcgYnRuLWdyb3VwcyB3aXRoaW4gYnRuLWdyb3VwcyAodXNlZnVsIGZvciBpbmNsdWRpbmcgZHJvcGRvd24gYnV0dG9ucyB3aXRoaW4gYSBidG4tZ3JvdXApXG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuLmJ0bi1ncm91cCA+IC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gID4gLmJ0bjpsYXN0LWNoaWxkLFxuICA+IC5kcm9wZG93bi10b2dnbGUge1xuICAgIEBpbmNsdWRlIGJvcmRlci1yaWdodC1yYWRpdXMoMCk7XG4gIH1cbn1cbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgQGluY2x1ZGUgYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuXG4vLyBPbiBhY3RpdmUgYW5kIG9wZW4sIGRvbid0IHNob3cgb3V0bGluZVxuLmJ0bi1ncm91cCAuZHJvcGRvd24tdG9nZ2xlOmFjdGl2ZSxcbi5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgb3V0bGluZTogMDtcbn1cblxuXG4vLyBTaXppbmdcbi8vXG4vLyBSZW1peCB0aGUgZGVmYXVsdCBidXR0b24gc2l6aW5nIGNsYXNzZXMgaW50byBuZXcgb25lcyBmb3IgZWFzaWVyIG1hbmlwdWxhdGlvbi5cblxuLmJ0bi1ncm91cC14cyA+IC5idG4geyBAZXh0ZW5kIC5idG4teHM7IH1cbi5idG4tZ3JvdXAtc20gPiAuYnRuIHsgQGV4dGVuZCAuYnRuLXNtOyB9XG4uYnRuLWdyb3VwLWxnID4gLmJ0biB7IEBleHRlbmQgLmJ0bi1sZzsgfVxuXG5cbi8vIFNwbGl0IGJ1dHRvbiBkcm9wZG93bnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gR2l2ZSB0aGUgbGluZSBiZXR3ZWVuIGJ1dHRvbnMgc29tZSBkZXB0aFxuLmJ0bi1ncm91cCA+IC5idG4gKyAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcbn1cbi5idG4tZ3JvdXAgPiAuYnRuLWxnICsgLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIHBhZGRpbmctbGVmdDogMTJweDtcbiAgcGFkZGluZy1yaWdodDogMTJweDtcbn1cblxuLy8gVGhlIGNsaWNrYWJsZSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBtZW51XG4vLyBSZW1vdmUgdGhlIGdyYWRpZW50IGFuZCBzZXQgdGhlIHNhbWUgaW5zZXQgc2hhZG93IGFzIHRoZSA6YWN0aXZlIHN0YXRlXG4uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSkpO1xuXG4gIC8vIFNob3cgbm8gc2hhZG93IGZvciBgLmJ0bi1saW5rYCBzaW5jZSBpdCBoYXMgbm8gb3RoZXIgYnV0dG9uIHN0eWxlcy5cbiAgJi5idG4tbGluayB7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgfVxufVxuXG5cbi8vIFJlcG9zaXRpb24gdGhlIGNhcmV0XG4uYnRuIC5jYXJldCB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuLy8gQ2FyZXRzIGluIG90aGVyIGJ1dHRvbiBzaXplc1xuLmJ0bi1sZyAuY2FyZXQge1xuICBib3JkZXItd2lkdGg6ICRjYXJldC13aWR0aC1sYXJnZSAkY2FyZXQtd2lkdGgtbGFyZ2UgMDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbn1cbi8vIFVwc2lkZSBkb3duIGNhcmV0cyBmb3IgLmRyb3B1cFxuLmRyb3B1cCAuYnRuLWxnIC5jYXJldCB7XG4gIGJvcmRlci13aWR0aDogMCAkY2FyZXQtd2lkdGgtbGFyZ2UgJGNhcmV0LXdpZHRoLWxhcmdlO1xufVxuXG5cbi8vIFZlcnRpY2FsIGJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0bi1ncm91cC12ZXJ0aWNhbCB7XG4gID4gLmJ0bixcbiAgPiAuYnRuLWdyb3VwLFxuICA+IC5idG4tZ3JvdXAgPiAuYnRuIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBmbG9hdDogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICAvLyBDbGVhciBmbG9hdHMgc28gZHJvcGRvd24gbWVudXMgY2FuIGJlIHByb3Blcmx5IHBsYWNlZFxuICA+IC5idG4tZ3JvdXAge1xuICAgIEBpbmNsdWRlIGNsZWFyZml4O1xuICAgID4gLmJ0biB7XG4gICAgICBmbG9hdDogbm9uZTtcbiAgICB9XG4gIH1cblxuICA+IC5idG4gKyAuYnRuLFxuICA+IC5idG4gKyAuYnRuLWdyb3VwLFxuICA+IC5idG4tZ3JvdXAgKyAuYnRuLFxuICA+IC5idG4tZ3JvdXAgKyAuYnRuLWdyb3VwIHtcbiAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuIHtcbiAgJjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICB9XG4gICY6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRidG4tYm9yZGVyLXJhZGl1cy1iYXNlO1xuICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xuICB9XG4gICY6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJGJ0bi1ib3JkZXItcmFkaXVzLWJhc2U7XG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG4gIH1cbn1cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgPiAuYnRuIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cbi5idG4tZ3JvdXAtdmVydGljYWwgPiAuYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkge1xuICA+IC5idG46bGFzdC1jaGlsZCxcbiAgPiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cygwKTtcbiAgfVxufVxuLmJ0bi1ncm91cC12ZXJ0aWNhbCA+IC5idG4tZ3JvdXA6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG46Zmlyc3QtY2hpbGQge1xuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cblxuXG4vLyBKdXN0aWZpZWQgYnV0dG9uIGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCB7XG4gIGRpc3BsYXk6IHRhYmxlO1xuICB3aWR0aDogMTAwJTtcbiAgdGFibGUtbGF5b3V0OiBmaXhlZDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAge1xuICAgIGZsb2F0OiBub25lO1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgd2lkdGg6IDElO1xuICB9XG4gID4gLmJ0bi1ncm91cCAuYnRuIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gID4gLmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxufVxuXG5cbi8vIENoZWNrYm94IGFuZCByYWRpbyBvcHRpb25zXG4vL1xuLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgYnJvd3NlcidzIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjaywgcG93ZXJlZCBieSB0aGVcbi8vIGByZXF1aXJlZGAgYXR0cmlidXRlLCB3ZSBoYXZlIHRvIFwiaGlkZVwiIHRoZSBpbnB1dHMgdmlhIGBjbGlwYC4gV2UgY2Fubm90IHVzZVxuLy8gYGRpc3BsYXk6IG5vbmU7YCBvciBgdmlzaWJpbGl0eTogaGlkZGVuO2AgYXMgdGhhdCBhbHNvIGhpZGVzIHRoZSBwb3BvdmVyLlxuLy8gU2ltcGx5IHZpc3VhbGx5IGhpZGluZyB0aGUgaW5wdXRzIHZpYSBgb3BhY2l0eWAgd291bGQgbGVhdmUgdGhlbSBjbGlja2FibGUgaW5cbi8vIGNlcnRhaW4gY2FzZXMgd2hpY2ggaXMgcHJldmVudGVkIGJ5IHVzaW5nIGBjbGlwYCBhbmQgYHBvaW50ZXItZXZlbnRzYC5cbi8vIFRoaXMgd2F5LCB3ZSBlbnN1cmUgYSBET00gZWxlbWVudCBpcyB2aXNpYmxlIHRvIHBvc2l0aW9uIHRoZSBwb3BvdmVyIGZyb20uXG4vL1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEyNzk0IGFuZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTQ1NTkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0ge1xuICA+IC5idG4sXG4gID4gLmJ0bi1ncm91cCA+IC5idG4ge1xuICAgIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY2xpcDogcmVjdCgwLDAsMCwwKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gU2luZ2xlIHNpZGUgYm9yZGVyLXJhZGl1c1xuXG5AbWl4aW4gYm9yZGVyLXRvcC1yYWRpdXMoJHJhZGl1cykge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHJhZGl1cztcbiAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICRyYWRpdXM7XG59XG5AbWl4aW4gYm9yZGVyLXJpZ2h0LXJhZGl1cygkcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkcmFkaXVzO1xuICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHJhZGl1cztcbn1cbkBtaXhpbiBib3JkZXItYm90dG9tLXJhZGl1cygkcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkcmFkaXVzO1xuICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJHJhZGl1cztcbn1cbkBtaXhpbiBib3JkZXItbGVmdC1yYWRpdXMoJHJhZGl1cykge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAkcmFkaXVzO1xuICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkcmFkaXVzO1xufVxuIiwiLy9cbi8vIElucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQmFzZSBzdHlsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5pbnB1dC1ncm91cCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLy8gRm9yIGRyb3Bkb3duc1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLy8gcHJldmVudCBpbnB1dCBncm91cHMgZnJvbSBpbmhlcml0aW5nIGJvcmRlciBzdHlsZXMgZnJvbSB0YWJsZSBjZWxscyB3aGVuIHBsYWNlZCB3aXRoaW4gYSB0YWJsZVxuXG4gIC8vIFVuZG8gcGFkZGluZyBhbmQgZmxvYXQgb2YgZ3JpZCBjbGFzc2VzXG4gICZbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cblxuICAuZm9ybS1jb250cm9sIHtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGFib3ZlIHRoZSAqYXBwZW5kZWQqIGFkZG9uIGJ1dHRvbiBmb3JcbiAgICAvLyBwcm9wZXIgYm9yZGVyIGNvbG9ycy5cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMjtcblxuICAgIC8vIElFOSBmdWJhcnMgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZSBpbiB0ZXh0IGlucHV0cyBhbmQgdGhlIGFycm93cyBvblxuICAgIC8vIHNlbGVjdCBlbGVtZW50cyBpbiBpbnB1dCBncm91cHMuIFRvIGZpeCBpdCwgd2UgZmxvYXQgdGhlIGlucHV0LiBEZXRhaWxzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE1NjEjaXNzdWVjb21tZW50LTI4OTM2ODU1XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIFNpemluZyBvcHRpb25zXG4vL1xuLy8gUmVtaXggdGhlIGRlZmF1bHQgZm9ybSBjb250cm9sIHNpemluZyBjbGFzc2VzIGludG8gbmV3IG9uZXMgZm9yIGVhc2llclxuLy8gbWFuaXB1bGF0aW9uLlxuXG4uaW5wdXQtZ3JvdXAtbGcgPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICBAZXh0ZW5kIC5pbnB1dC1sZztcbn1cbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIEBleHRlbmQgLmlucHV0LXNtO1xufVxuXG5cbi8vIERpc3BsYXkgYXMgdGFibGUtY2VsbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWJ0bixcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcblxuICAmOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cbi8vIEFkZG9uIGFuZCBhZGRvbiB3cmFwcGVyIGZvciBidXR0b25zXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgd2lkdGg6IDElO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvLyBNYXRjaCB0aGUgaW5wdXRzXG59XG5cbi8vIFRleHQgaW5wdXQgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBwYWRkaW5nOiAkcGFkZGluZy1iYXNlLXZlcnRpY2FsICRwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLWJhc2U7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGlucHV0LWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1ncm91cC1hZGRvbi1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgJGlucHV0LWdyb3VwLWFkZG9uLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtYmFzZTtcblxuICAvLyBTaXppbmdcbiAgJi5pbnB1dC1zbSB7XG4gICAgcGFkZGluZzogJHBhZGRpbmctc21hbGwtdmVydGljYWwgJHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgJi5pbnB1dC1sZyB7XG4gICAgcGFkZGluZzogJHBhZGRpbmctbGFyZ2UtdmVydGljYWwgJHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cblxuICAvLyBOdWtlIGRlZmF1bHQgbWFyZ2lucyBmcm9tIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyB0byB2ZXJ0aWNhbGx5IGNlbnRlciB3aXRoaW4uXG4gIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi8vIFJlc2V0IHJvdW5kZWQgY29ybmVyc1xuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICBAaW5jbHVkZSBib3JkZXItcmlnaHQtcmFkaXVzKDApO1xufVxuLmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xufVxuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6bGFzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1hZGRvbjpsYXN0LWNoaWxkLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXAgPiAuYnRuLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmRyb3Bkb3duLXRvZ2dsZSxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpLFxuLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCkgPiAuYnRuIHtcbiAgQGluY2x1ZGUgYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQge1xuICBib3JkZXItbGVmdDogMDtcbn1cblxuLy8gQnV0dG9uIGlucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWJ0biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gSmFua2lseSBwcmV2ZW50IGlucHV0IGJ1dHRvbiBncm91cHMgZnJvbSB3cmFwcGluZyB3aXRoIGB3aGl0ZS1zcGFjZWAgYW5kXG4gIC8vIGBmb250LXNpemVgIGluIGNvbWJpbmF0aW9uIHdpdGggYGlubGluZS1ibG9ja2Agb24gYnV0dG9ucy5cbiAgZm9udC1zaXplOiAwO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gIC8vIE5lZ2F0aXZlIG1hcmdpbiBmb3Igc3BhY2luZywgcG9zaXRpb24gZm9yIGJyaW5naW5nIGhvdmVyZWQvZm9jdXNlZC9hY3RpdmVkXG4gIC8vIGVsZW1lbnQgYWJvdmUgdGhlIHNpYmxpbmdzLlxuICA+IC5idG4ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICArIC5idG4ge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfVxuICAgIC8vIEJyaW5nIHRoZSBcImFjdGl2ZVwiIGJ1dHRvbiB0byB0aGUgZnJvbnRcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMsXG4gICAgJjphY3RpdmUge1xuICAgICAgei1pbmRleDogMjtcbiAgICB9XG4gIH1cblxuICAvLyBOZWdhdGl2ZSBtYXJnaW4gdG8gb25seSBoYXZlIGEgMXB4IGJvcmRlciBiZXR3ZWVuIHRoZSB0d29cbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgPiAuYnRuLFxuICAgID4gLmJ0bi1ncm91cCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG4gICAgfVxuICB9XG4gICY6bGFzdC1jaGlsZCB7XG4gICAgPiAuYnRuLFxuICAgID4gLmJ0bi1ncm91cCB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gTmF2c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubmF2IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgcGFkZGluZy1sZWZ0OiAwOyAvLyBPdmVycmlkZSBkZWZhdWx0IHVsL29sXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gID4gbGkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcblxuICAgID4gYSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBhZGRpbmc6ICRuYXYtbGluay1wYWRkaW5nO1xuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtbGluay1ob3Zlci1iZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlZCBzdGF0ZSBzZXRzIHRleHQgdG8gZ3JheSBhbmQgbnVrZXMgaG92ZXIvdGFiIGVmZmVjdHNcbiAgICAmLmRpc2FibGVkID4gYSB7XG4gICAgICBjb2xvcjogJG5hdi1kaXNhYmxlZC1saW5rLWNvbG9yO1xuXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2LWRpc2FibGVkLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjogJGN1cnNvci1kaXNhYmxlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBPcGVuIGRyb3Bkb3duc1xuICAub3BlbiA+IGEge1xuICAgICYsXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtbGluay1ob3Zlci1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJGxpbmstY29sb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gTmF2IGRpdmlkZXJzIChkZXByZWNhdGVkIHdpdGggdjMuMC4xKVxuICAvL1xuICAvLyBUaGlzIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBpbiB2MyB3aXRoIHRoZSBkcm9wcGluZyBvZiBgLm5hdi1saXN0YCwgYnV0XG4gIC8vIHdlIG1pc3NlZCBpdC4gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBhbnl3aGVyZSwgYnV0IGluIHRoZSBpbnRlcmVzdFxuICAvLyBvZiBtYWludGFpbmluZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGluIGNhc2UgeW91IHVzZSBpdCwgaXQncyBkZXByZWNhdGVkLlxuICAubmF2LWRpdmlkZXIge1xuICAgIEBpbmNsdWRlIG5hdi1kaXZpZGVyO1xuICB9XG5cbiAgLy8gUHJldmVudCBJRTggZnJvbSBtaXNwbGFjaW5nIGltZ3NcbiAgLy9cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2lzc3Vlcy85ODQjaXNzdWVjb21tZW50LTM5ODU5ODlcbiAgPiBsaSA+IGEgPiBpbWcge1xuICAgIG1heC13aWR0aDogbm9uZTtcbiAgfVxufVxuXG5cbi8vIFRhYnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gR2l2ZSB0aGUgdGFicyBzb21ldGhpbmcgdG8gc2l0IG9uXG4ubmF2LXRhYnMge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJG5hdi10YWJzLWJvcmRlci1jb2xvcjtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gTWFrZSB0aGUgbGlzdC1pdGVtcyBvdmVybGF5IHRoZSBib3R0b20gYm9yZGVyXG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDtcblxuICAgIC8vIEFjdHVhbCB0YWJzIChhcyBsaW5rcylcbiAgICA+IGEge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2UgJGJvcmRlci1yYWRpdXMtYmFzZSAwIDA7XG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3IgJG5hdi10YWJzLWxpbmstaG92ZXItYm9yZGVyLWNvbG9yICRuYXYtdGFicy1ib3JkZXItY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIHN0YXRlLCBhbmQgaXRzIDpob3ZlciB0byBvdmVycmlkZSBub3JtYWwgOmhvdmVyXG4gICAgJi5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZztcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gcHVsbGluZyB0aGlzIGluIG1haW5seSBmb3IgbGVzcyBzaG9ydGhhbmRcbiAgJi5uYXYtanVzdGlmaWVkIHtcbiAgICBAZXh0ZW5kIC5uYXYtanVzdGlmaWVkO1xuICAgIEBleHRlbmQgLm5hdi10YWJzLWp1c3RpZmllZDtcbiAgfVxufVxuXG5cbi8vIFBpbGxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4ubmF2LXBpbGxzIHtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICAvLyBMaW5rcyByZW5kZXJlZCBhcyBwaWxsc1xuICAgID4gYSB7XG4gICAgICBib3JkZXItcmFkaXVzOiAkbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM7XG4gICAgfVxuICAgICsgbGkge1xuICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmUgc3RhdGVcbiAgICAmLmFjdGl2ZSA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXYtcGlsbHMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXYtcGlsbHMtYWN0aXZlLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gU3RhY2tlZCBwaWxsc1xuLm5hdi1zdGFja2VkIHtcbiAgPiBsaSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgKyBsaSB7XG4gICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICBtYXJnaW4tbGVmdDogMDsgLy8gbm8gbmVlZCBmb3IgdGhpcyBnYXAgYmV0d2VlbiBuYXYgaXRlbXNcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBOYXYgdmFyaWF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSnVzdGlmaWVkIG5hdiBsaW5rc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubmF2LWp1c3RpZmllZCB7XG4gIHdpZHRoOiAxMDAlO1xuXG4gID4gbGkge1xuICAgIGZsb2F0OiBub25lO1xuICAgID4gYSB7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gICAgfVxuICB9XG5cbiAgPiAuZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUge1xuICAgIHRvcDogYXV0bztcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgPiBsaSB7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgICAgd2lkdGg6IDElO1xuICAgICAgPiBhIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gTW92ZSBib3JkZXJzIHRvIGFuY2hvcnMgaW5zdGVhZCBvZiBib3R0b20gb2YgbGlzdFxuLy9cbi8vIE1peGluIGZvciBhZGRpbmcgb24gdG9wIHRoZSBzaGFyZWQgYC5uYXYtanVzdGlmaWVkYCBzdHlsZXMgZm9yIG91ciB0YWJzXG4ubmF2LXRhYnMtanVzdGlmaWVkIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcblxuICA+IGxpID4gYSB7XG4gICAgLy8gT3ZlcnJpZGUgbWFyZ2luIGZyb20gLm5hdi10YWJzXG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG4gIH1cblxuICA+IC5hY3RpdmUgPiBhLFxuICA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuICA+IC5hY3RpdmUgPiBhOmZvY3VzIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gICAgPiBsaSA+IGEge1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRuYXYtdGFicy1qdXN0aWZpZWQtbGluay1ib3JkZXItY29sb3I7XG4gICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlICRib3JkZXItcmFkaXVzLWJhc2UgMCAwO1xuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhLFxuICAgID4gLmFjdGl2ZSA+IGE6aG92ZXIsXG4gICAgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBUYWJiYWJsZSB0YWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhpZGUgdGFiYmFibGUgcGFuZXMgdG8gc3RhcnQsIHNob3cgdGhlbSB3aGVuIGAuYWN0aXZlYFxuLnRhYi1jb250ZW50IHtcbiAgPiAudGFiLXBhbmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgPiAuYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxufVxuXG5cbi8vIERyb3Bkb3duc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBTcGVjaWZpYyBkcm9wZG93bnNcbi5uYXYtdGFicyAuZHJvcGRvd24tbWVudSB7XG4gIC8vIG1ha2UgZHJvcGRvd24gYm9yZGVyIG92ZXJsYXAgdGFiIGJvcmRlclxuICBtYXJnaW4tdG9wOiAtMXB4O1xuICAvLyBSZW1vdmUgdGhlIHRvcCByb3VuZGVkIGNvcm5lcnMgaGVyZSBzaW5jZSB0aGVyZSBpcyBhIGhhcmQgZWRnZSBhYm92ZSB0aGUgbWVudVxuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cbiIsIi8vIGJvd2VyOnNjc3NcbkBpbXBvcnQgXCJib3dlcl9jb21wb25lbnRzL2NvbXBhc3MtbWl4aW5zL2xpYi9jb21wYXNzL2NzczMvX3VzZXItaW50ZXJmYWNlLnNjc3NcIjtcbi8vIGVuZGJvd2VyXG5cblxuLy9cbi8vIE5hdmJhcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gV3JhcHBlciBhbmQgYmFzZSBjbGFzc1xuLy9cbi8vIFByb3ZpZGUgYSBzdGF0aWMgbmF2YmFyIGZyb20gd2hpY2ggd2UgZXhwYW5kIHRvIGNyZWF0ZSBmdWxsLXdpZHRoLCBmaXhlZCwgYW5kXG4vLyBvdGhlciBuYXZiYXIgdmFyaWF0aW9ucy5cblxuLm5hdmJhciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogJG5hdmJhci1oZWlnaHQ7IC8vIEVuc3VyZSBhIG5hdmJhciBhbHdheXMgc2hvd3MgKGUuZy4sIHdpdGhvdXQgYSAubmF2YmFyLWJyYW5kIGluIGNvbGxhcHNlZCBtb2RlKVxuICBtYXJnaW4tYm90dG9tOiAkbmF2YmFyLW1hcmdpbi1ib3R0b207XG4gIGJvcmRlcjogMDtcblxuICAvLyBQcmV2ZW50IGZsb2F0cyBmcm9tIGJyZWFraW5nIHRoZSBuYXZiYXJcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAkbmF2YmFyLWJvcmRlci1yYWRpdXM7XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgaGVhZGluZ1xuLy9cbi8vIEdyb3VwcyBgLm5hdmJhci1icmFuZGAgYW5kIGAubmF2YmFyLXRvZ2dsZWAgaW50byBhIHNpbmdsZSBjb21wb25lbnQgZm9yIGVhc3lcbi8vIHN0eWxpbmcgb2YgcmVzcG9uc2l2ZSBhc3BlY3RzLlxuXG4ubmF2YmFyLWhlYWRlciB7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgY29sbGFwc2UgKGJvZHkpXG4vL1xuLy8gR3JvdXAgeW91ciBuYXZiYXIgY29udGVudCBpbnRvIHRoaXMgZm9yIGVhc3kgY29sbGFwc2luZyBhbmQgZXhwYW5kaW5nIGFjcm9zc1xuLy8gdmFyaW91cyBkZXZpY2Ugc2l6ZXMuIEJ5IGRlZmF1bHQsIHRoaXMgY29udGVudCBpcyBjb2xsYXBzZWQgd2hlbiA8NzY4cHgsIGJ1dFxuLy8gd2lsbCBleHBhbmQgcGFzdCB0aGF0IGZvciBhIGhvcml6b250YWwgZGlzcGxheS5cbi8vXG4vLyBUbyBzdGFydCAob24gbW9iaWxlIGRldmljZXMpIHRoZSBuYXZiYXIgbGlua3MsIGZvcm1zLCBhbmQgYnV0dG9ucyBhcmUgc3RhY2tlZFxuLy8gdmVydGljYWxseSBhbmQgaW5jbHVkZSBhIGBtYXgtaGVpZ2h0YCB0byBvdmVyZmxvdyBpbiBjYXNlIHlvdSBoYXZlIHRvbyBtdWNoXG4vLyBjb250ZW50IGZvciB0aGUgdXNlcidzIHZpZXdwb3J0LlxuXG4ubmF2YmFyLWNvbGxhcHNlIHtcbiAgb3ZlcmZsb3cteDogdmlzaWJsZTtcbiAgcGFkZGluZy1yaWdodDogJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIHBhZGRpbmctbGVmdDogICRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG5cbiAgJi5pbiB7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuXG4gICAgJi5jb2xsYXBzZSB7XG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMDsgLy8gT3ZlcnJpZGUgZGVmYXVsdCBzZXR0aW5nXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgICYuaW4ge1xuICAgICAgb3ZlcmZsb3cteTogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvLyBVbmRvIHRoZSBjb2xsYXBzZSBzaWRlIHBhZGRpbmcgZm9yIG5hdmJhcnMgd2l0aCBjb250YWluZXJzIHRvIGVuc3VyZVxuICAgIC8vIGFsaWdubWVudCBvZiByaWdodC1hbGlnbmVkIGNvbnRlbnRzLlxuICAgIC5uYXZiYXItZml4ZWQtdG9wICYsXG4gICAgLm5hdmJhci1zdGF0aWMtdG9wICYsXG4gICAgLm5hdmJhci1maXhlZC1ib3R0b20gJiB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxufVxuXG4ubmF2YmFyLWZpeGVkLXRvcCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIHtcbiAgLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWF4LWhlaWdodDogJG5hdmJhci1jb2xsYXBzZS1tYXgtaGVpZ2h0O1xuXG4gICAgQG1lZGlhIChtYXgtZGV2aWNlLXdpZHRoOiAkc2NyZWVuLXhzLW1pbikgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSB7XG4gICAgICBtYXgtaGVpZ2h0OiAyMDBweDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBCb3RoIG5hdmJhciBoZWFkZXIgYW5kIGNvbGxhcHNlXG4vL1xuLy8gV2hlbiBhIGNvbnRhaW5lciBpcyBwcmVzZW50LCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBoZWFkZXIgYW5kIGNvbGxhcHNlLlxuXG4uY29udGFpbmVyLFxuLmNvbnRhaW5lci1mbHVpZCB7XG4gID4gLm5hdmJhci1oZWFkZXIsXG4gID4gLm5hdmJhci1jb2xsYXBzZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gICAgbWFyZ2luLWxlZnQ6ICAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG5cbiAgICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgICAgbWFyZ2luLWxlZnQ6ICAwO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vXG4vLyBOYXZiYXIgYWxpZ25tZW50IG9wdGlvbnNcbi8vXG4vLyBEaXNwbGF5IHRoZSBuYXZiYXIgYWNyb3NzIHRoZSBlbnRpcmV0eSBvZiB0aGUgcGFnZSBvciBmaXhlZCBpdCB0byB0aGUgdG9wIG9yXG4vLyBib3R0b20gb2YgdGhlIHBhZ2UuXG5cbi8vIFN0YXRpYyB0b3AgKHVuZml4ZWQsIGJ1dCAxMDAlIHdpZGUpIG5hdmJhclxuLm5hdmJhci1zdGF0aWMtdG9wIHtcbiAgei1pbmRleDogJHppbmRleC1uYXZiYXI7XG4gIGJvcmRlci13aWR0aDogMCAwIDFweDtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cblxuLy8gRml4IHRoZSB0b3AvYm90dG9tIG5hdmJhcnMgd2hlbiBzY3JlZW4gcmVhbCBlc3RhdGUgc3VwcG9ydHMgaXRcbi5uYXZiYXItZml4ZWQtdG9wLFxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LW5hdmJhci1maXhlZDtcblxuICAvLyBVbmRvIHRoZSByb3VuZGVkIGNvcm5lcnNcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICB9XG59XG4ubmF2YmFyLWZpeGVkLXRvcCB7XG4gIHRvcDogMDtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4O1xufVxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICBib3R0b206IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7IC8vIG92ZXJyaWRlIC5uYXZiYXIgZGVmYXVsdHNcbiAgYm9yZGVyLXdpZHRoOiAxcHggMCAwO1xufVxuXG5cbi8vIEJyYW5kL3Byb2plY3QgbmFtZVxuXG4ubmF2YmFyLWJyYW5kIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMCAwIDAgLTgwcHg7XG4gIHBhZGRpbmc6IDAgMCAwIDgwcHg7XG4gIGhlaWdodDogNTVweDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCRraW1jaGktbG9nbykgbm8tcmVwZWF0IDI0cHggM3B4O1xuICBjb2xvcjogJGhpZ2hsaWdodHMtY29sb3I7XG4gIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktYm9sZDsgXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogMS41NzFlbTtcbiAgbGluZS1oZWlnaHQ6IDU1cHg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG5cbiAgPiBpbWcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICAubmF2YmFyID4gLmNvbnRhaW5lciAmLFxuICAgIC5uYXZiYXIgPiAuY29udGFpbmVyLWZsdWlkICYge1xuICAgICAgbWFyZ2luLWxlZnQ6IC04MHB4O1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIE5hdmJhciB0b2dnbGVcbi8vXG4vLyBDdXN0b20gYnV0dG9uIGZvciB0b2dnbGluZyB0aGUgYC5uYXZiYXItY29sbGFwc2VgLCBwb3dlcmVkIGJ5IHRoZSBjb2xsYXBzZVxuLy8gSmF2YVNjcmlwdCBwbHVnaW4uXG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbG9hdDogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIHBhZGRpbmc6IDlweCAxMHB4O1xuICBAaW5jbHVkZSBuYXZiYXItdmVydGljYWwtYWxpZ24oMzRweCk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvLyBSZXNldCB1bnVzdWFsIEZpcmVmb3gtb24tQW5kcm9pZCBkZWZhdWx0IHN0eWxlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9pc3N1ZXMvMjE0XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1iYXNlO1xuXG4gIC8vIFdlIHJlbW92ZSB0aGUgYG91dGxpbmVgIGhlcmUsIGJ1dCBsYXRlciBjb21wZW5zYXRlIGJ5IGF0dGFjaGluZyBgOmhvdmVyYFxuICAvLyBzdHlsZXMgdG8gYDpmb2N1c2AuXG4gICY6Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cblxuICAvLyBCYXJzXG4gIC5pY29uLWJhciB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICB9XG4gIC5pY29uLWJhciArIC5pY29uLWJhciB7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cblxuLy8gTmF2YmFyIG5hdiBsaW5rc1xuLy9cbi8vIEJ1aWxkcyBvbiB0b3Agb2YgdGhlIGAubmF2YCBjb21wb25lbnRzIHdpdGggaXRzIG93biBtb2RpZmllciBjbGFzcyB0byBtYWtlXG4vLyB0aGUgbmF2IHRoZSBmdWxsIGhlaWdodCBvZiB0aGUgaG9yaXpvbnRhbCBuYXYgKGFib3ZlIDc2OHB4KS5cblxuLm5hdmJhci1uYXYge1xuICBtYXJnaW46ICgkbmF2YmFyLXBhZGRpbmctdmVydGljYWwgLyAyKSAoLSRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsKTtcblxuICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgIHBhZGRpbmctbGVmdDogNDBweDtcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0MHB4O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gICAgICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1hbHRlcm5hdGU7XG4gICAgICAgICAgZm9udC1zaXplOiAxM3B0O1xuXG4gICAgICAgICAgPiAuZmEge1xuICAgICAgICAgICAgZm9udC1zaXplOiAyNnB4O1xuICAgICAgICAgIH0gIFxuXG4gICAgICB9XG5cbiAgICAgID4gbGkgPiBhLmRyb3Bkb3duLXRvZ2dsZSB7XG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMjJweDtcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDIycHg7XG4gICAgICB9XG5cbiAgQG1lZGlhIChtYXgtd2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQtbWF4KSB7XG4gICAgLy8gRHJvcGRvd25zIGdldCBjdXN0b20gZGlzcGxheSB3aGVuIGNvbGxhcHNlZFxuICAgIC5vcGVuIC5kcm9wZG93bi1tZW51IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICBmbG9hdDogbm9uZTtcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgID4gbGkgPiBhLFxuICAgICAgLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgICAgIHBhZGRpbmc6IDVweCAxNXB4IDVweCAyNXB4O1xuICAgICAgfVxuICAgICAgPiBsaSA+IGEge1xuICAgICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICAgICAgICAmOmhvdmVyLFxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVW5jb2xsYXBzZSB0aGUgbmF2XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luOiAwO1xuXG4gICAgPiBsaSB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICAgID4gYSB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAgICAkbmF2YmFyLXBhZGRpbmctdmVydGljYWw7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAkbmF2YmFyLXBhZGRpbmctdmVydGljYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLy8gTmF2YmFyIGZvcm1cbi8vXG4vLyBFeHRlbnNpb24gb2YgdGhlIGAuZm9ybS1pbmxpbmVgIHdpdGggc29tZSBleHRyYSBmbGF2b3IgZm9yIG9wdGltdW0gZGlzcGxheSBpblxuLy8gb3VyIG5hdmJhcnMuXG5cbi5uYXZiYXItZm9ybSB7XG4gIG1hcmdpbi1sZWZ0OiAtJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIG1hcmdpbi1yaWdodDogLSRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBwYWRkaW5nOiAxMHB4ICRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgJHNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKSwgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtcbiAgQGluY2x1ZGUgYm94LXNoYWRvdygkc2hhZG93KTtcblxuICAvLyBNaXhpbiBiZWhhdmlvciBmb3Igb3B0aW11bSBkaXNwbGF5XG4gIEBpbmNsdWRlIGZvcm0taW5saW5lO1xuXG4gIC5mb3JtLWdyb3VwIHtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWZXJ0aWNhbGx5IGNlbnRlciBpbiBleHBhbmRlZCwgaG9yaXpvbnRhbCBuYXZiYXJcbiAgQGluY2x1ZGUgbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRpbnB1dC1oZWlnaHQtYmFzZSk7XG5cbiAgLy8gVW5kbyAxMDAlIHdpZHRoIGZvciBwdWxsIGNsYXNzZXNcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSk7XG4gIH1cbn1cblxuXG4vLyBEcm9wZG93biBtZW51c1xuXG4vLyBNZW51IHBvc2l0aW9uIGFuZCBtZW51IGNhcmV0c1xuXG4ubmF2YmFyLW5hdiA+IGxpID4gYS5kcm9wZG93bi10b2dnbGUgPiAuY2FyZXQge1xuICBib3JkZXItdG9wOiAwO1xuICBib3JkZXItbGVmdDogMDtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xuICBib3JkZXItYm90dG9tOiAwO1xuICBtYXJnaW4tbGVmdDogMTBweDtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogMzlweDtcblxuICAgICAgJjpiZWZvcmUge1xuICAgICAgICAgIGNvbnRlbnQ6ICdcXGYwNzgnO1xuICAgICAgICAgIGZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMSBGb250QXdlc29tZTtcbiAgICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgICAgdGV4dC1yZW5kZXJpbmc6IGF1dG87XG4gICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gICAgICAgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAgICAgICAgICAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWNvbG9yO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB0b3A6IDI0cHg7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDE0cHg7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG5cbn1cblxuLm5hdmJhci1uYXYgPiBsaS5kcm9wZG93bi5vcGVuID4gYSA+IC5jYXJldCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWJnO1xuXG4gICAgICAmOmJlZm9yZSB7XG4gICAgICAgICAgY29udGVudDogJ1xcZjA3Nyc7XG4gICAgICB9XG59XG5cbi5uYXZiYXItcmlnaHQgPiBsaSA+IGEge1xuICAgICAgaGVpZ2h0OiA0OXB4O1xuXG4gICAgICAuZmEge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgICB9XG5cbiAgICAgIC50b3BiYXItdGV4dCwgLmNhcmV0LCAuZmEge1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgfVxufVxuXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW4tdG9wOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWJnO1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSAhaW1wb3J0YW50KTtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuXG4gID4gbGkge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgPiBsaSA+IGEsXG4gID4gbGkgPiBzcGFuIHtcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIGNvbG9yOiAkbWVudS1mbGF0LXRleHQ7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1zYW5zLXNlcmlmO1xuICAgIGZvbnQtc2l6ZTogMTNwdDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGxpbmUtaGVpZ2h0OiAyNHB4OyAgICBcbiAgICBwYWRkaW5nOiA3cHggMzBweDtcbiAgICBoZWlnaHQ6IDQwcHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRtZW51LWZsYXQtZHJvcGRvd24tYm9yZGVyO1xuICAgIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMHB4IDFweCAwcHggMHB4ICRtZW51LWZsYXQtZHJvcGRvd24tZGl2aWRlci1iZyk7XG4gICAgY2xlYXI6IGJvdGg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLy8gcHJldmVudCBsaW5rcyBmcm9tIHJhbmRvbWx5IGJyZWFraW5nIG9udG8gbmV3IGxpbmVzXG5cbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG5cbiAgfVxuXG4gID4gbGkgPiBhID4gLmZhIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIGZvbnQtc2l6ZTogMjZweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICB9XG5cbiAgPiBsaS5jcml0aWNhbCA+IGEge1xuICAgICAgYmFja2dyb3VuZDogJG1lbnUtZmxhdC1kcm9wZG93bi1jcml0aWNhbC1iZztcbiAgfVxuXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICB3aWR0aDogMTJweDtcbiAgfVxuICAgXG4gIC8qIFRyYWNrICovXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcbiAgICAgIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAwIDZweCByZ2JhKDAsMCwwLDAuMykpO1xuICB9XG4gICBcbiAgLyogSGFuZGxlICovXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICM3OTc5Nzk7XG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNCM0IzQjM7XG4gICAgICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDZweCAxcHggNnB4ICM5ZTllOWUpOyBcbiAgfVxuXG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOndpbmRvdy1pbmFjdGl2ZSB7XG4gIH1cblxufVxuLy8gTWVudSBwb3NpdGlvbiBhbmQgbWVudSBjYXJldCBzdXBwb3J0IGZvciBkcm9wdXBzIHZpYSBleHRyYSBkcm9wdXAgY2xhc3Ncbi5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItbmF2ID4gbGkgPiAuZHJvcGRvd24tbWVudSB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKCRuYXZiYXItYm9yZGVyLXJhZGl1cyk7XG4gIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xufVxuXG5cbi8vIEJ1dHRvbnMgaW4gbmF2YmFyc1xuLy9cbi8vIFZlcnRpY2FsbHkgY2VudGVyIGEgYnV0dG9uIHdpdGhpbiBhIG5hdmJhciAod2hlbiAqbm90KiBpbiBhIGZvcm0pLlxuXG4ubmF2YmFyLWJ0biB7XG4gIEBpbmNsdWRlIG5hdmJhci12ZXJ0aWNhbC1hbGlnbigkaW5wdXQtaGVpZ2h0LWJhc2UpO1xuXG4gICYuYnRuLXNtIHtcbiAgICBAaW5jbHVkZSBuYXZiYXItdmVydGljYWwtYWxpZ24oJGlucHV0LWhlaWdodC1zbWFsbCk7XG4gIH1cbiAgJi5idG4teHMge1xuICAgIEBpbmNsdWRlIG5hdmJhci12ZXJ0aWNhbC1hbGlnbigyMik7XG4gIH1cbn1cblxuXG4vLyBUZXh0IGluIG5hdmJhcnNcbi8vXG4vLyBBZGQgYSBjbGFzcyB0byBtYWtlIGFueSBlbGVtZW50IHByb3Blcmx5IGFsaWduIGl0c2VsZiB2ZXJ0aWNhbGx5IHdpdGhpbiB0aGUgbmF2YmFycy5cblxuLm5hdmJhci10ZXh0IHtcbiAgQGluY2x1ZGUgbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRsaW5lLWhlaWdodC1jb21wdXRlZCk7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tbGVmdDogJG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gICAgbWFyZ2luLXJpZ2h0OiAkbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgfVxufVxuXG5cbi8vIENvbXBvbmVudCBhbGlnbm1lbnRcbi8vXG4vLyBSZXB1cnBvc2UgdGhlIHB1bGwgdXRpbGl0aWVzIGFzIHRoZWlyIG93biBuYXZiYXIgdXRpbGl0aWVzIHRvIGF2b2lkIHNwZWNpZmljaXR5XG4vLyBpc3N1ZXMgd2l0aCBwYXJlbnRzIGFuZCBjaGFpbmluZy4gT25seSBkbyB0aGlzIHdoZW4gdGhlIG5hdmJhciBpcyB1bmNvbGxhcHNlZFxuLy8gdGhvdWdoIHNvIHRoYXQgbmF2YmFyIGNvbnRlbnRzIHByb3Blcmx5IHN0YWNrIGFuZCBhbGlnbiBpbiBtb2JpbGUuXG4vL1xuLy8gRGVjbGFyZWQgYWZ0ZXIgdGhlIG5hdmJhciBjb21wb25lbnRzIHRvIGVuc3VyZSBtb3JlIHNwZWNpZmljaXR5IG9uIHRoZSBtYXJnaW5zLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogJGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAubmF2YmFyLWxlZnQge1xuICAgIGZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm5hdmJhci1yaWdodCB7XG4gICAgZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnQ7XG4gIG1hcmdpbi1yaWdodDogLSRuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuXG4gICAgfiAubmF2YmFyLXJpZ2h0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBBbHRlcm5hdGUgbmF2YmFyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRGVmYXVsdCBuYXZiYXJcbi5uYXZiYXItZGVmYXVsdCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1iZztcbiAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYm9yZGVyO1xuXG4gIC5uYXZiYXItYnJhbmQge1xuICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci10ZXh0IHtcbiAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWNvbG9yO1xuICB9XG5cbiAgLm5hdmJhci1uYXYge1xuICAgID4gbGkgPiBhIHtcbiAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1zaXplOiAxM3B0O1xuICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1ib2xkO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBtaW4td2lkdGg6IDE5MHB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgaGVpZ2h0OiAkbmF2YmFyLWhlaWdodDtcblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWJnO1xuICAgICAgfVxuXG4gICAgICAuZGlnaXQtY29udGFpbmVyIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogLTJweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gICAgICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgICAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICM1NTU7XG4gICAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNTU1O1xuICAgICAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICAgICAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWJhc2U7XG4gICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgICAgICBwYWRkaW5nOiAwIDhweDtcbiAgICAgIH1cblxuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZztcbiAgICAgIH1cblxuICAgICAgLmRpZ2l0LWNvbnRhaW5lciB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogI2ZmZjtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICB9XG4gICAgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZztcbiAgICAgIH1cblxuICAgICAgLmRpZ2l0LWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBAZWFjaCAkcGFnZSwgJGJnY29sb3IgaW4gJGNvbG9ycyB7XG5cbiAgICA+IC5hY3RpdmUgPiBhLiN7JHBhZ2V9IHtcbiAgICAgICAgJixcbiAgICAgICAgJjpob3ZlcixcbiAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGJnY29sb3IgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgID4gLmhvc3RuYW1lIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIHBhZGRpbmc6IDhweCAwO1xuICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgIHdpZHRoOiAxODBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDI0cHg7XG4gICAgICBAaW5jbHVkZSBib3gtc2l6aW5nKGJvcmRlci1ib3gpO1xuXG4gICAgICAuaG9zdC1sb2NhdGlvbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWFsdGVybmF0ZTtcbiAgICAgICAgY29sb3I6ICRoaWdobGlnaHRzLWNvbG9yO1xuICAgICAgICBmb250LXNpemU6IDEzcHQ7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIH1cblxuICAgIH1cblxuICB9XG5cbiAgLm5hdmJhci10b2dnbGUge1xuICAgIGJvcmRlci1jb2xvcjogJG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1ib3JkZXItY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC10b2dnbGUtaG92ZXItYmc7XG4gICAgfVxuICAgIC5pY29uLWJhciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWljb24tYmFyLWJnO1xuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItY29sbGFwc2UsXG4gIC5uYXZiYXItZm9ybSB7XG4gICAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtYm9yZGVyO1xuICB9XG5cbiAgLy8gRHJvcGRvd24gbWVudSBpdGVtc1xuICAubmF2YmFyLW5hdiB7XG4gICAgLy8gUmVtb3ZlIGJhY2tncm91bmQgY29sb3IgZnJvbSBvcGVuIGRyb3Bkb3duXG4gICAgPiAub3BlbiA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWJnO1xuICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heCkge1xuICAgICAgLy8gRHJvcGRvd25zIGdldCBjdXN0b20gZGlzcGxheSB3aGVuIGNvbGxhcHNlZFxuICAgICAgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgICA+IGxpID4gYSB7XG4gICAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuYWN0aXZlID4gYSB7XG4gICAgICAgICAgJixcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICAgICAmLFxuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8vIExpbmtzIGluIG5hdmJhcnNcbiAgLy9cbiAgLy8gQWRkIGEgY2xhc3MgdG8gZW5zdXJlIGxpbmtzIG91dHNpZGUgdGhlIG5hdmJhciBuYXYgYXJlIGNvbG9yZWQgY29ycmVjdGx5LlxuXG4gIC5uYXZiYXItbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC5idG4tbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogJG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgfVxuICAgICZbZGlzYWJsZWRdLFxuICAgIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBJbnZlcnNlIG5hdmJhclxuXG4ubmF2YmFyLWludmVyc2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYmc7XG4gIGJvcmRlci1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWJvcmRlcjtcblxuICAubmF2YmFyLWJyYW5kIHtcbiAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWJyYW5kLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWJyYW5kLWhvdmVyLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWJyYW5kLWhvdmVyLWJnO1xuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItdGV4dCB7XG4gICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1jb2xvcjtcbiAgfVxuXG4gIC5uYXZiYXItbmF2IHtcbiAgICA+IGxpID4gYSB7XG4gICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG5cbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1iZztcbiAgICAgIH1cbiAgICB9XG4gICAgPiAuYWN0aXZlID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtYmc7XG4gICAgICB9XG4gICAgfVxuICAgID4gLmRpc2FibGVkID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWJnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIERhcmtlbiB0aGUgcmVzcG9uc2l2ZSBuYXYgdG9nZ2xlXG4gIC5uYXZiYXItdG9nZ2xlIHtcbiAgICBib3JkZXItY29sb3I6ICRuYXZiYXItaW52ZXJzZS10b2dnbGUtYm9yZGVyLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtdG9nZ2xlLWhvdmVyLWJnO1xuICAgIH1cbiAgICAuaWNvbi1iYXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLXRvZ2dsZS1pY29uLWJhci1iZztcbiAgICB9XG4gIH1cblxuICAubmF2YmFyLWNvbGxhcHNlLFxuICAubmF2YmFyLWZvcm0ge1xuICAgIGJvcmRlci1jb2xvcjogZGFya2VuKCRuYXZiYXItaW52ZXJzZS1iZywgNyUpO1xuICB9XG5cbiAgLy8gRHJvcGRvd25zXG4gIC5uYXZiYXItbmF2IHtcbiAgICA+IC5vcGVuID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtYmc7XG4gICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6ICRncmlkLWZsb2F0LWJyZWFrcG9pbnQtbWF4KSB7XG4gICAgICAvLyBEcm9wZG93bnMgZ2V0IGN1c3RvbSBkaXNwbGF5XG4gICAgICAub3BlbiAuZHJvcGRvd24tbWVudSB7XG4gICAgICAgID4gLmRyb3Bkb3duLWhlYWRlciB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIC5kaXZpZGVyIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbmF2YmFyLWludmVyc2UtYm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgID4gbGkgPiBhIHtcbiAgICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICAgICAmLFxuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA+IC5kaXNhYmxlZCA+IGEge1xuICAgICAgICAgICYsXG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiAkbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC5idG4tbGluayB7XG4gICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogJG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG4gICAgfVxuICAgICZbZGlzYWJsZWRdLFxuICAgIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiQGltcG9ydCBcIi4uL3N1cHBvcnRcIjtcblxuLy8gVGhpcyBtaXhpbiBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgYW5kXG4vLyB0aGVpciBjb3JyZXNwb25kaW5nIGV4cGVyaW1lbnRhbCBDU1MyIHByb3BlcnRpZXMgd2hlblxuLy8gdGhlIGltcGxlbWVudGF0aW9ucyBhcmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIHByb3BlcnR5XG4vLyBwcmVmaXguXG5AbWl4aW4gZXhwZXJpbWVudGFsKCRwcm9wZXJ0eSwgJHZhbHVlLFxuICAkbW96ICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEsXG4gICR3ZWJraXQgICA6ICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itd2Via2l0LFxuICAkbyAgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW9wZXJhLFxuICAkbXMgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1pY3Jvc29mdCxcbiAgJGtodG1sICAgIDogJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1raHRtbCxcbiAgJG9mZmljaWFsIDogdHJ1ZVxuKSB7XG4gIEBpZiAkd2Via2l0ICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci13ZWJraXQgICAgeyAtd2Via2l0LSN7JHByb3BlcnR5fSA6ICR2YWx1ZTsgfVxuICBAaWYgJGtodG1sICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Ita2h0bWwgICAgIHsgIC1raHRtbC0jeyRwcm9wZXJ0eX0gOiAkdmFsdWU7IH1cbiAgQGlmICRtb3ogICAgIGFuZCAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEgICB7ICAgIC1tb3otI3skcHJvcGVydHl9IDogJHZhbHVlOyB9XG4gIEBpZiAkbXMgICAgICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1taWNyb3NvZnQgeyAgICAgLW1zLSN7JHByb3BlcnR5fSA6ICR2YWx1ZTsgfVxuICBAaWYgJG8gICAgICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itb3BlcmEgICAgIHsgICAgICAtby0jeyRwcm9wZXJ0eX0gOiAkdmFsdWU7IH1cbiAgQGlmICRvZmZpY2lhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgI3skcHJvcGVydHl9IDogJHZhbHVlOyB9XG59XG5cbi8vIFNhbWUgYXMgZXhwZXJpbWVudGFsKCksIGJ1dCBmb3IgY2FzZXMgd2hlbiB0aGUgcHJvcGVydHkgaXMgdGhlIHNhbWUgYW5kIHRoZSB2YWx1ZSBpcyB2ZW5kb3JpemVkXG5AbWl4aW4gZXhwZXJpbWVudGFsLXZhbHVlKCRwcm9wZXJ0eSwgJHZhbHVlLFxuICAkbW96ICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEsXG4gICR3ZWJraXQgICA6ICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itd2Via2l0LFxuICAkbyAgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW9wZXJhLFxuICAkbXMgICAgICAgOiAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1pY3Jvc29mdCxcbiAgJGtodG1sICAgIDogJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1raHRtbCxcbiAgJG9mZmljaWFsIDogdHJ1ZVxuKSB7XG4gIEBpZiAkd2Via2l0ICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci13ZWJraXQgICAgeyAjeyRwcm9wZXJ0eX0gOiAtd2Via2l0LSN7JHZhbHVlfTsgfVxuICBAaWYgJGtodG1sICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Ita2h0bWwgICAgIHsgI3skcHJvcGVydHl9IDogIC1raHRtbC0jeyR2YWx1ZX07IH1cbiAgQGlmICRtb3ogICAgIGFuZCAkZXhwZXJpbWVudGFsLXN1cHBvcnQtZm9yLW1vemlsbGEgICB7ICN7JHByb3BlcnR5fSA6ICAgIC1tb3otI3skdmFsdWV9OyB9XG4gIEBpZiAkbXMgICAgICBhbmQgJGV4cGVyaW1lbnRhbC1zdXBwb3J0LWZvci1taWNyb3NvZnQgeyAjeyRwcm9wZXJ0eX0gOiAgICAgLW1zLSN7JHZhbHVlfTsgfVxuICBAaWYgJG8gICAgICAgYW5kICRleHBlcmltZW50YWwtc3VwcG9ydC1mb3Itb3BlcmEgICAgIHsgI3skcHJvcGVydHl9IDogICAgICAtby0jeyR2YWx1ZX07IH1cbiAgQGlmICRvZmZpY2lhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICN7JHByb3BlcnR5fSA6ICAgICAgICAgI3skdmFsdWV9OyB9XG59XG4iLCIvLyBVc2VyIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoaXMgZmlsZSBjYW4gYmUgZXhwYW5kZWQgdG8gaGFuZGxlIGFsbCB0aGUgdXNlciBpbnRlcmZhY2UgcHJvcGVydGllcyBhc1xuLy8gdGhleSBiZWNvbWUgYXZhaWxhYmxlIGluIGJyb3dzZXJzOlxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9XRC1jc3MzLXVzZXJpbnQtMjAwMDAyMTZcbkBpbXBvcnQgXCJzaGFyZWRcIjtcblxuXG4vLyBUaGlzIHByb3BlcnR5IGNvbnRyb2xzIHRoZSBzZWxlY3Rpb24gbW9kZWwgYW5kIGdyYW51bGFyaXR5IG9mIGFuIGVsZW1lbnQuXG4vL1xuLy8gQHBhcmFtICRzZWxlY3Rcbi8vICAgWyBub25lIHwgdGV4dCB8IHRvZ2dsZSB8IGVsZW1lbnQgfCBlbGVtZW50cyB8IGFsbCB8IGluaGVyaXQgXVxuQG1peGluIHVzZXItc2VsZWN0KCRzZWxlY3QpIHtcbiAgJHNlbGVjdDogdW5xdW90ZSgkc2VsZWN0KTtcbiAgQGluY2x1ZGUgZXhwZXJpbWVudGFsKHVzZXItc2VsZWN0LCAkc2VsZWN0LFxuICAgIC1tb3osIC13ZWJraXQsIG5vdCgtbyksIG5vdCgtbXMpLCAta2h0bWwsIG9mZmljaWFsXG4gICk7XG59XG4iLCIvLyBOYXZiYXIgdmVydGljYWwgYWxpZ25cbi8vXG4vLyBWZXJ0aWNhbGx5IGNlbnRlciBlbGVtZW50cyBpbiB0aGUgbmF2YmFyLlxuLy8gRXhhbXBsZTogYW4gZWxlbWVudCBoYXMgYSBoZWlnaHQgb2YgMzBweCwgc28gd3JpdGUgb3V0IGAubmF2YmFyLXZlcnRpY2FsLWFsaWduKDMwcHgpO2AgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB0b3AgbWFyZ2luLlxuXG5AbWl4aW4gbmF2YmFyLXZlcnRpY2FsLWFsaWduKCRlbGVtZW50LWhlaWdodCkge1xuICBtYXJnaW4tdG9wOiAoKCRuYXZiYXItaGVpZ2h0IC0gJGVsZW1lbnQtaGVpZ2h0KSAvIDIpO1xuICBtYXJnaW4tYm90dG9tOiAoKCRuYXZiYXItaGVpZ2h0IC0gJGVsZW1lbnQtaGVpZ2h0KSAvIDIpO1xufVxuIiwiLy9cbi8vIEJyZWFkY3J1bWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5icmVhZGNydW1iIHtcbiAgcGFkZGluZzogJGJyZWFkY3J1bWItcGFkZGluZy12ZXJ0aWNhbCAkYnJlYWRjcnVtYi1wYWRkaW5nLWhvcml6b250YWw7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJyZWFkY3J1bWItYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gICAgKyBsaTpiZWZvcmUge1xuICAgICAgY29udGVudDogXCIjeyRicmVhZGNydW1iLXNlcGFyYXRvcn1cXDAwYTBcIjsgLy8gVW5pY29kZSBzcGFjZSBhZGRlZCBzaW5jZSBpbmxpbmUtYmxvY2sgbWVhbnMgbm9uLWNvbGxhcHNpbmcgd2hpdGUtc3BhY2VcbiAgICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgICAgY29sb3I6ICRicmVhZGNydW1iLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSB7XG4gICAgY29sb3I6ICRicmVhZGNydW1iLWFjdGl2ZS1jb2xvcjtcbiAgfVxufVxuIiwiLy9cbi8vIFBhZ2luYXRpb24gKG11bHRpcGxlIHBhZ2VzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lOyAvLyBSZW1vdmUgbGlzdC1zdHlsZSBhbmQgYmxvY2stbGV2ZWwgZGVmYXVsdHNcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsb2F0OiBsZWZ0OyAvLyBDb2xsYXBzZSB3aGl0ZS1zcGFjZVxuICAgICAgcGFkZGluZzogJHBhZGRpbmctYmFzZS12ZXJ0aWNhbCAkcGFkZGluZy1iYXNlLWhvcml6b250YWw7XG4gICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYWdpbmF0aW9uLWJvcmRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgIH1cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gYSxcbiAgICAgID4gc3BhbiB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItbGVmdC1yYWRpdXMoJGJvcmRlci1yYWRpdXMtYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICA+IGEsXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItcmlnaHQtcmFkaXVzKCRib3JkZXItcmFkaXVzLWJhc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gID4gbGkgPiBhLFxuICA+IGxpID4gc3BhbiB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDM7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24taG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1ob3Zlci1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJHBhZ2luYXRpb24taG92ZXItYm9yZGVyO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSA+IGEsXG4gID4gLmFjdGl2ZSA+IHNwYW4ge1xuICAgICYsXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDI7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tYWN0aXZlLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHBhZ2luYXRpb24tYWN0aXZlLWJnO1xuICAgICAgYm9yZGVyLWNvbG9yOiAkcGFnaW5hdGlvbi1hY3RpdmUtYm9yZGVyO1xuICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIH1cbiAgfVxuXG4gID4gLmRpc2FibGVkIHtcbiAgICA+IHNwYW4sXG4gICAgPiBzcGFuOmhvdmVyLFxuICAgID4gc3Bhbjpmb2N1cyxcbiAgICA+IGEsXG4gICAgPiBhOmhvdmVyLFxuICAgID4gYTpmb2N1cyB7XG4gICAgICBjb2xvcjogJHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnaW5hdGlvbi1kaXNhYmxlZC1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogJHBhZ2luYXRpb24tZGlzYWJsZWQtYm9yZGVyO1xuICAgICAgY3Vyc29yOiAkY3Vyc29yLWRpc2FibGVkO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTaXppbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIExhcmdlXG4ucGFnaW5hdGlvbi1sZyB7XG4gIEBpbmNsdWRlIHBhZ2luYXRpb24tc2l6ZSgkcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCwgJHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbCwgJGZvbnQtc2l6ZS1sYXJnZSwgJGxpbmUtaGVpZ2h0LWxhcmdlLCAkYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG5cbi8vIFNtYWxsXG4ucGFnaW5hdGlvbi1zbSB7XG4gIEBpbmNsdWRlIHBhZ2luYXRpb24tc2l6ZSgkcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCwgJHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbCwgJGZvbnQtc2l6ZS1zbWFsbCwgJGxpbmUtaGVpZ2h0LXNtYWxsLCAkYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG4iLCIvLyBQYWdpbmF0aW9uXG5cbkBtaXhpbiBwYWdpbmF0aW9uLXNpemUoJHBhZGRpbmctdmVydGljYWwsICRwYWRkaW5nLWhvcml6b250YWwsICRmb250LXNpemUsICRsaW5lLWhlaWdodCwgJGJvcmRlci1yYWRpdXMpIHtcbiAgPiBsaSB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBwYWRkaW5nOiAkcGFkZGluZy12ZXJ0aWNhbCAkcGFkZGluZy1ob3Jpem9udGFsO1xuICAgICAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICA+IGEsXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBAaW5jbHVkZSBib3JkZXItbGVmdC1yYWRpdXMoJGJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgPiBhLFxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXJpZ2h0LXJhZGl1cygkYm9yZGVyLXJhZGl1cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gUGFnZXIgcGFnaW5hdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4ucGFnZXIge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG4gIGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBwYWRkaW5nOiA1cHggMTRweDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYWdlci1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYWdlci1ib3JkZXI7XG4gICAgICBib3JkZXItcmFkaXVzOiAkcGFnZXItYm9yZGVyLXJhZGl1cztcbiAgICB9XG5cbiAgICA+IGE6aG92ZXIsXG4gICAgPiBhOmZvY3VzIHtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYWdlci1ob3Zlci1iZztcbiAgICB9XG4gIH1cblxuICAubmV4dCB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBmbG9hdDogcmlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLnByZXZpb3VzIHtcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgIH1cbiAgfVxuXG4gIC5kaXNhYmxlZCB7XG4gICAgPiBhLFxuICAgID4gYTpob3ZlcixcbiAgICA+IGE6Zm9jdXMsXG4gICAgPiBzcGFuIHtcbiAgICAgIGNvbG9yOiAkcGFnZXItZGlzYWJsZWQtY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFnZXItYmc7XG4gICAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gTGFiZWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ubGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmU7XG4gIHBhZGRpbmc6IC4yZW0gLjZlbSAuM2VtO1xuICBmb250LXNpemU6IDc1JTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGxhYmVsLWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgYm9yZGVyLXJhZGl1czogLjI1ZW07XG5cbiAgLy8gW2NvbnZlcnRlcl0gZXh0cmFjdGVkIGEmIHRvIGEubGFiZWxcblxuICAvLyBFbXB0eSBsYWJlbHMgY29sbGFwc2UgYXV0b21hdGljYWxseSAobm90IGF2YWlsYWJsZSBpbiBJRTgpXG4gICY6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvLyBRdWljayBmaXggZm9yIGxhYmVscyBpbiBidXR0b25zXG4gIC5idG4gJiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTFweDtcbiAgfVxufVxuXG4vLyBBZGQgaG92ZXIgZWZmZWN0cywgYnV0IG9ubHkgZm9yIGxpbmtzXG5hLmxhYmVsIHtcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6ICRsYWJlbC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbn1cblxuLy8gQ29sb3JzXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnMgKGxpbmtlZCBsYWJlbHMgZ2V0IGRhcmtlciBvbiA6aG92ZXIpXG5cbi5sYWJlbC1kZWZhdWx0IHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtZGVmYXVsdC1iZyk7XG59XG5cbi5sYWJlbC1wcmltYXJ5IHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtcHJpbWFyeS1iZyk7XG59XG5cbi5sYWJlbC1zdWNjZXNzIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtc3VjY2Vzcy1iZyk7XG59XG5cbi5sYWJlbC1pbmZvIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtaW5mby1iZyk7XG59XG5cbi5sYWJlbC13YXJuaW5nIHtcbiAgQGluY2x1ZGUgbGFiZWwtdmFyaWFudCgkbGFiZWwtd2FybmluZy1iZyk7XG59XG5cbi5sYWJlbC1kYW5nZXIge1xuICBAaW5jbHVkZSBsYWJlbC12YXJpYW50KCRsYWJlbC1kYW5nZXItYmcpO1xufVxuIiwiLy8gTGFiZWxzXG5cbkBtaXhpbiBsYWJlbC12YXJpYW50KCRjb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3I7XG5cbiAgJltocmVmXSB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkY29sb3IsIDEwJSk7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gQmFkZ2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAxMHB4O1xuICBwYWRkaW5nOiAzcHggN3B4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gIGZvbnQtd2VpZ2h0OiAkYmFkZ2UtZm9udC13ZWlnaHQ7XG4gIGNvbG9yOiAkYmFkZ2UtY29sb3I7XG4gIGxpbmUtaGVpZ2h0OiAkYmFkZ2UtbGluZS1oZWlnaHQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGJhZGdlLWJnO1xuICBib3JkZXItcmFkaXVzOiAkYmFkZ2UtYm9yZGVyLXJhZGl1cztcblxuICAvLyBFbXB0eSBiYWRnZXMgY29sbGFwc2UgYXV0b21hdGljYWxseSAobm90IGF2YWlsYWJsZSBpbiBJRTgpXG4gICY6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvLyBRdWljayBmaXggZm9yIGJhZGdlcyBpbiBidXR0b25zXG4gIC5idG4gJiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTFweDtcbiAgfVxuXG4gIC5idG4teHMgJixcbiAgLmJ0bi1ncm91cC14cyA+IC5idG4gJiB7XG4gICAgdG9wOiAwO1xuICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSYgdG8gYS5iYWRnZVxuXG4gIC8vIEFjY291bnQgZm9yIGJhZGdlcyBpbiBuYXZzXG4gIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlID4gJixcbiAgLm5hdi1waWxscyA+IC5hY3RpdmUgPiBhID4gJiB7XG4gICAgY29sb3I6ICRiYWRnZS1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJhZGdlLWFjdGl2ZS1iZztcbiAgfVxuXG4gIC5saXN0LWdyb3VwLWl0ZW0gPiAmIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gIH1cblxuICAubGlzdC1ncm91cC1pdGVtID4gJiArICYge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG5cbiAgLm5hdi1waWxscyA+IGxpID4gYSA+ICYge1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIH1cbn1cblxuLy8gSG92ZXIgc3RhdGUsIGJ1dCBvbmx5IGZvciBsaW5rc1xuYS5iYWRnZSB7XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkYmFkZ2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4iLCIvL1xuLy8gSnVtYm90cm9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5qdW1ib3Ryb24ge1xuICBwYWRkaW5nLXRvcDogICAgJGp1bWJvdHJvbi1wYWRkaW5nO1xuICBwYWRkaW5nLWJvdHRvbTogJGp1bWJvdHJvbi1wYWRkaW5nO1xuICBtYXJnaW4tYm90dG9tOiAkanVtYm90cm9uLXBhZGRpbmc7XG4gIGNvbG9yOiAkanVtYm90cm9uLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkanVtYm90cm9uLWJnO1xuXG4gIGgxLFxuICAuaDEge1xuICAgIGNvbG9yOiAkanVtYm90cm9uLWhlYWRpbmctY29sb3I7XG4gIH1cblxuICBwIHtcbiAgICBtYXJnaW4tYm90dG9tOiAoJGp1bWJvdHJvbi1wYWRkaW5nIC8gMik7XG4gICAgZm9udC1zaXplOiAkanVtYm90cm9uLWZvbnQtc2l6ZTtcbiAgICBmb250LXdlaWdodDogMjAwO1xuICB9XG5cbiAgPiBociB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogZGFya2VuKCRqdW1ib3Ryb24tYmcsIDEwJSk7XG4gIH1cblxuICAuY29udGFpbmVyICYsXG4gIC5jb250YWluZXItZmx1aWQgJiB7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXMtbGFyZ2U7IC8vIE9ubHkgcm91bmQgY29ybmVycyBhdCBoaWdoZXIgcmVzb2x1dGlvbnMgaWYgY29udGFpbmVkIGluIGEgY29udGFpbmVyXG4gIH1cblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikge1xuICAgIHBhZGRpbmctdG9wOiAgICAoJGp1bWJvdHJvbi1wYWRkaW5nICogMS42KTtcbiAgICBwYWRkaW5nLWJvdHRvbTogKCRqdW1ib3Ryb24tcGFkZGluZyAqIDEuNik7XG5cbiAgICAuY29udGFpbmVyICYsXG4gICAgLmNvbnRhaW5lci1mbHVpZCAmIHtcbiAgICAgIHBhZGRpbmctbGVmdDogICgkanVtYm90cm9uLXBhZGRpbmcgKiAyKTtcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICgkanVtYm90cm9uLXBhZGRpbmcgKiAyKTtcbiAgICB9XG5cbiAgICBoMSxcbiAgICAuaDEge1xuICAgICAgZm9udC1zaXplOiAkanVtYm90cm9uLWhlYWRpbmctZm9udC1zaXplO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFRodW1ibmFpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gTWl4aW4gYW5kIGFkanVzdCB0aGUgcmVndWxhciBpbWFnZSBjbGFzc1xuLnRodW1ibmFpbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAkdGh1bWJuYWlsLXBhZGRpbmc7XG4gIG1hcmdpbi1ib3R0b206ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1iYXNlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdGh1bWJuYWlsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCAkdGh1bWJuYWlsLWJvcmRlcjtcbiAgYm9yZGVyLXJhZGl1czogJHRodW1ibmFpbC1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSB0cmFuc2l0aW9uKGJvcmRlciAuMnMgZWFzZS1pbi1vdXQpO1xuXG4gID4gaW1nLFxuICBhID4gaW1nIHtcbiAgICBAaW5jbHVkZSBpbWctcmVzcG9uc2l2ZTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSY6aG92ZXIsIGEmOmZvY3VzLCBhJi5hY3RpdmUgdG8gYS50aHVtYm5haWw6aG92ZXIsIGEudGh1bWJuYWlsOmZvY3VzLCBhLnRodW1ibmFpbC5hY3RpdmVcblxuICAvLyBJbWFnZSBjYXB0aW9uc1xuICAuY2FwdGlvbiB7XG4gICAgcGFkZGluZzogJHRodW1ibmFpbC1jYXB0aW9uLXBhZGRpbmc7XG4gICAgY29sb3I6ICR0aHVtYm5haWwtY2FwdGlvbi1jb2xvcjtcbiAgfVxufVxuXG4vLyBBZGQgYSBob3ZlciBzdGF0ZSBmb3IgbGlua2VkIHZlcnNpb25zIG9ubHlcbmEudGh1bWJuYWlsOmhvdmVyLFxuYS50aHVtYm5haWw6Zm9jdXMsXG5hLnRodW1ibmFpbC5hY3RpdmUge1xuICBib3JkZXItY29sb3I6ICRsaW5rLWNvbG9yO1xufVxuIiwiLy9cbi8vIEFsZXJ0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYWxlcnQge1xuICBwYWRkaW5nOiAkYWxlcnQtcGFkZGluZztcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogJGFsZXJ0LWJvcmRlci1yYWRpdXM7XG5cbiAgLy8gSGVhZGluZ3MgZm9yIGxhcmdlciBhbGVydHNcbiAgaDQge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgLy8gU3BlY2lmaWVkIGZvciB0aGUgaDQgdG8gcHJldmVudCBjb25mbGljdHMgb2YgY2hhbmdpbmcgJGhlYWRpbmdzLWNvbG9yXG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cblxuICAvLyBQcm92aWRlIGNsYXNzIGZvciBsaW5rcyB0aGF0IG1hdGNoIGFsZXJ0c1xuICAuYWxlcnQtbGluayB7XG4gICAgZm9udC13ZWlnaHQ6ICRhbGVydC1saW5rLWZvbnQtd2VpZ2h0O1xuICB9XG5cbiAgLy8gSW1wcm92ZSBhbGlnbm1lbnQgYW5kIHNwYWNpbmcgb2YgaW5uZXIgY29udGVudFxuICA+IHAsXG4gID4gdWwge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICA+IHAgKyBwIHtcbiAgICBtYXJnaW4tdG9wOiA1cHg7XG4gIH1cbn1cblxuLy8gRGlzbWlzc2libGUgYWxlcnRzXG4vL1xuLy8gRXhwYW5kIHRoZSByaWdodCBwYWRkaW5nIGFuZCBhY2NvdW50IGZvciB0aGUgY2xvc2UgYnV0dG9uJ3MgcG9zaXRpb25pbmcuXG5cbi5hbGVydC1kaXNtaXNzYWJsZSwgLy8gVGhlIG1pc3NwZWxsZWQgLmFsZXJ0LWRpc21pc3NhYmxlIHdhcyBkZXByZWNhdGVkIGluIDMuMi4wLlxuLmFsZXJ0LWRpc21pc3NpYmxlIHtcbiAgcGFkZGluZy1yaWdodDogKCRhbGVydC1wYWRkaW5nICsgMjApO1xuXG4gIC8vIEFkanVzdCBjbG9zZSBsaW5rIHBvc2l0aW9uXG4gIC5jbG9zZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTJweDtcbiAgICByaWdodDogLTIxcHg7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbn1cblxuLy8gQWx0ZXJuYXRlIHN0eWxlc1xuLy9cbi8vIEdlbmVyYXRlIGNvbnRleHR1YWwgbW9kaWZpZXIgY2xhc3NlcyBmb3IgY29sb3JpemluZyB0aGUgYWxlcnQuXG5cbi5hbGVydC1zdWNjZXNzIHtcbiAgQGluY2x1ZGUgYWxlcnQtdmFyaWFudCgkYWxlcnQtc3VjY2Vzcy1iZywgJGFsZXJ0LXN1Y2Nlc3MtYm9yZGVyLCAkYWxlcnQtc3VjY2Vzcy10ZXh0KTtcbn1cblxuLmFsZXJ0LWluZm8ge1xuICBAaW5jbHVkZSBhbGVydC12YXJpYW50KCRhbGVydC1pbmZvLWJnLCAkYWxlcnQtaW5mby1ib3JkZXIsICRhbGVydC1pbmZvLXRleHQpO1xufVxuXG4uYWxlcnQtd2FybmluZyB7XG4gIEBpbmNsdWRlIGFsZXJ0LXZhcmlhbnQoJGFsZXJ0LXdhcm5pbmctYmcsICRhbGVydC13YXJuaW5nLWJvcmRlciwgJGFsZXJ0LXdhcm5pbmctdGV4dCk7XG59XG5cbi5hbGVydC1kYW5nZXIge1xuICBAaW5jbHVkZSBhbGVydC12YXJpYW50KCRhbGVydC1kYW5nZXItYmcsICRhbGVydC1kYW5nZXItYm9yZGVyLCAkYWxlcnQtZGFuZ2VyLXRleHQpO1xufVxuIiwiLy8gQWxlcnRzXG5cbkBtaXhpbiBhbGVydC12YXJpYW50KCRiYWNrZ3JvdW5kLCAkYm9yZGVyLCAkdGV4dC1jb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyO1xuICBjb2xvcjogJHRleHQtY29sb3I7XG5cbiAgaHIge1xuICAgIGJvcmRlci10b3AtY29sb3I6IGRhcmtlbigkYm9yZGVyLCA1JSk7XG4gIH1cbiAgLmFsZXJ0LWxpbmsge1xuICAgIGNvbG9yOiBkYXJrZW4oJHRleHQtY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vXG4vLyBQcm9ncmVzcyBiYXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhciBhbmltYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFdlYktpdFxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVzIHtcbiAgZnJvbSAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7IH1cbiAgdG8gICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH1cbn1cblxuLy8gU3BlYyBhbmQgSUUxMCtcbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXMge1xuICBmcm9tICB7IGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDsgfVxuICB0byAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfVxufVxuXG5cbi8vIEJhciBpdHNlbGZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gT3V0ZXIgY29udGFpbmVyXG4ucHJvZ3Jlc3Mge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6ICRsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRwcm9ncmVzcy1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgMXB4IDJweCByZ2JhKDAsMCwwLC4xKSk7XG59XG5cbi8vIEJhciBvZiBwcm9ncmVzc1xuLnByb2dyZXNzLWJhciB7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBjb2xvcjogJHByb2dyZXNzLWJhci1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYmFyLWJnO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjE1KSk7XG4gIEBpbmNsdWRlIHRyYW5zaXRpb24od2lkdGggLjZzIGVhc2UpO1xufVxuXG4vLyBTdHJpcGVkIGJhcnNcbi8vXG4vLyBgLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhcmAgaXMgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgaW4gZmF2b3Igb2YgdGhlXG4vLyBgLnByb2dyZXNzLWJhci1zdHJpcGVkYCBjbGFzcywgd2hpY2ggeW91IGp1c3QgYWRkIHRvIGFuIGV4aXN0aW5nXG4vLyBgLnByb2dyZXNzLWJhcmAuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLFxuLnByb2dyZXNzLWJhci1zdHJpcGVkIHtcbiAgQGluY2x1ZGUgZ3JhZGllbnQtc3RyaXBlZDtcbiAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHg7XG59XG5cbi8vIENhbGwgYW5pbWF0aW9uIGZvciB0aGUgYWN0aXZlIG9uZVxuLy9cbi8vIGAucHJvZ3Jlc3MuYWN0aXZlIC5wcm9ncmVzcy1iYXJgIGlzIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMi4wIGluIGZhdm9yIG9mIHRoZVxuLy8gYC5wcm9ncmVzcy1iYXIuYWN0aXZlYCBhcHByb2FjaC5cbi5wcm9ncmVzcy5hY3RpdmUgLnByb2dyZXNzLWJhcixcbi5wcm9ncmVzcy1iYXIuYWN0aXZlIHtcbiAgQGluY2x1ZGUgYW5pbWF0aW9uKHByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZSk7XG59XG5cblxuLy8gVmFyaWF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucHJvZ3Jlc3MtYmFyLXN1Y2Nlc3Mge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3MtYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWluZm8ge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLWluZm8tYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLXdhcm5pbmcge1xuICBAaW5jbHVkZSBwcm9ncmVzcy1iYXItdmFyaWFudCgkcHJvZ3Jlc3MtYmFyLXdhcm5pbmctYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLWRhbmdlciB7XG4gIEBpbmNsdWRlIHByb2dyZXNzLWJhci12YXJpYW50KCRwcm9ncmVzcy1iYXItZGFuZ2VyLWJnKTtcbn1cbiIsIi8vIEdyYWRpZW50c1xuXG5cblxuLy8gSG9yaXpvbnRhbCBncmFkaWVudCwgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4vL1xuLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbi8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG5AbWl4aW4gZ3JhZGllbnQtaG9yaXpvbnRhbCgkc3RhcnQtY29sb3I6ICM1NTUsICRlbmQtY29sb3I6ICMzMzMsICRzdGFydC1wZXJjZW50OiAwJSwgJGVuZC1wZXJjZW50OiAxMDAlKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBTYWZhcmkgNS4xLTYsIENocm9tZSAxMCtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBPcGVyYSAxMlxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAvLyBTdGFuZGFyZCwgSUUxMCwgRmlyZWZveCAxNissIE9wZXJhIDEyLjEwKywgU2FmYXJpIDcrLCBDaHJvbWUgMjYrXG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRzdGFydC1jb2xvcil9JywgZW5kQ29sb3JzdHI9JyN7aWUtaGV4LXN0cigkZW5kLWNvbG9yKX0nLCBHcmFkaWVudFR5cGU9MSk7IC8vIElFOSBhbmQgZG93blxufVxuXG4vLyBWZXJ0aWNhbCBncmFkaWVudCwgZnJvbSB0b3AgdG8gYm90dG9tXG4vL1xuLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbi8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG5AbWl4aW4gZ3JhZGllbnQtdmVydGljYWwoJHN0YXJ0LWNvbG9yOiAjNTU1LCAkZW5kLWNvbG9yOiAjMzMzLCAkc3RhcnQtcGVyY2VudDogMCUsICRlbmQtcGVyY2VudDogMTAwJSkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICRzdGFydC1jb2xvciAkc3RhcnQtcGVyY2VudCwgJGVuZC1jb2xvciAkZW5kLXBlcmNlbnQpOyAgLy8gT3BlcmEgMTJcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgJHN0YXJ0LWNvbG9yICRzdGFydC1wZXJjZW50LCAkZW5kLWNvbG9yICRlbmQtcGVyY2VudCk7IC8vIFN0YW5kYXJkLCBJRTEwLCBGaXJlZm94IDE2KywgT3BlcmEgMTIuMTArLCBTYWZhcmkgNyssIENocm9tZSAyNitcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScje2llLWhleC1zdHIoJHN0YXJ0LWNvbG9yKX0nLCBlbmRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRlbmQtY29sb3IpfScsIEdyYWRpZW50VHlwZT0wKTsgLy8gSUU5IGFuZCBkb3duXG59XG5cbkBtaXhpbiBncmFkaWVudC1kaXJlY3Rpb25hbCgkc3RhcnQtY29sb3I6ICM1NTUsICRlbmQtY29sb3I6ICMzMzMsICRkZWc6IDQ1ZGVnKSB7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoJGRlZywgJHN0YXJ0LWNvbG9yLCAkZW5kLWNvbG9yKTsgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgkZGVnLCAkc3RhcnQtY29sb3IsICRlbmQtY29sb3IpOyAvLyBPcGVyYSAxMlxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJGRlZywgJHN0YXJ0LWNvbG9yLCAkZW5kLWNvbG9yKTsgLy8gU3RhbmRhcmQsIElFMTAsIEZpcmVmb3ggMTYrLCBPcGVyYSAxMi4xMCssIFNhZmFyaSA3KywgQ2hyb21lIDI2K1xufVxuQG1peGluIGdyYWRpZW50LWhvcml6b250YWwtdGhyZWUtY29sb3JzKCRzdGFydC1jb2xvcjogIzAwYjNlZSwgJG1pZC1jb2xvcjogIzdhNDNiNiwgJGNvbG9yLXN0b3A6IDUwJSwgJGVuZC1jb2xvcjogI2MzMzI1Zikge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCAkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgJHN0YXJ0LWNvbG9yLCAkbWlkLWNvbG9yICRjb2xvci1zdG9wLCAkZW5kLWNvbG9yKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScje2llLWhleC1zdHIoJHN0YXJ0LWNvbG9yKX0nLCBlbmRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRlbmQtY29sb3IpfScsIEdyYWRpZW50VHlwZT0xKTsgLy8gSUU5IGFuZCBkb3duLCBnZXRzIG5vIGNvbG9yLXN0b3AgYXQgYWxsIGZvciBwcm9wZXIgZmFsbGJhY2tcbn1cbkBtaXhpbiBncmFkaWVudC12ZXJ0aWNhbC10aHJlZS1jb2xvcnMoJHN0YXJ0LWNvbG9yOiAjMDBiM2VlLCAkbWlkLWNvbG9yOiAjN2E0M2I2LCAkY29sb3Itc3RvcDogNTAlLCAkZW5kLWNvbG9yOiAjYzMzMjVmKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCRzdGFydC1jb2xvciwgJG1pZC1jb2xvciAkY29sb3Itc3RvcCwgJGVuZC1jb2xvcik7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgkc3RhcnQtY29sb3IsICRtaWQtY29sb3IgJGNvbG9yLXN0b3AsICRlbmQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJHN0YXJ0LWNvbG9yLCAkbWlkLWNvbG9yICRjb2xvci1zdG9wLCAkZW5kLWNvbG9yKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI3tpZS1oZXgtc3RyKCRzdGFydC1jb2xvcil9JywgZW5kQ29sb3JzdHI9JyN7aWUtaGV4LXN0cigkZW5kLWNvbG9yKX0nLCBHcmFkaWVudFR5cGU9MCk7IC8vIElFOSBhbmQgZG93biwgZ2V0cyBubyBjb2xvci1zdG9wIGF0IGFsbCBmb3IgcHJvcGVyIGZhbGxiYWNrXG59XG5AbWl4aW4gZ3JhZGllbnQtcmFkaWFsKCRpbm5lci1jb2xvcjogIzU1NSwgJG91dGVyLWNvbG9yOiAjMzMzKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtcmFkaWFsLWdyYWRpZW50KGNpcmNsZSwgJGlubmVyLWNvbG9yLCAkb3V0ZXItY29sb3IpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlLCAkaW5uZXItY29sb3IsICRvdXRlci1jb2xvcik7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG5AbWl4aW4gZ3JhZGllbnQtc3RyaXBlZCgkY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjE1KSwgJGFuZ2xlOiA0NWRlZykge1xuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgkYW5nbGUsICRjb2xvciAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCAkY29sb3IgNTAlLCAkY29sb3IgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KCRhbmdsZSwgJGNvbG9yIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsICRjb2xvciA1MCUsICRjb2xvciA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJGFuZ2xlLCAkY29sb3IgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgJGNvbG9yIDUwJSwgJGNvbG9yIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG59XG4iLCIvLyBQcm9ncmVzcyBiYXJzXG5cbkBtaXhpbiBwcm9ncmVzcy1iYXItdmFyaWFudCgkY29sb3IpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yO1xuXG4gIC8vIERlcHJlY2F0ZWQgcGFyZW50IGNsYXNzIHJlcXVpcmVtZW50IGFzIG9mIHYzLjIuMFxuICAucHJvZ3Jlc3Mtc3RyaXBlZCAmIHtcbiAgICBAaW5jbHVkZSBncmFkaWVudC1zdHJpcGVkO1xuICB9XG59XG4iLCIubWVkaWEge1xuICAvLyBQcm9wZXIgc3BhY2luZyBiZXR3ZWVuIGluc3RhbmNlcyBvZiAubWVkaWFcbiAgbWFyZ2luLXRvcDogMTVweDtcblxuICAmOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi5tZWRpYSxcbi5tZWRpYS1ib2R5IHtcbiAgem9vbTogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLm1lZGlhLWJvZHkge1xuICB3aWR0aDogMTAwMDBweDtcbn1cblxuLm1lZGlhLW9iamVjdCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuXG4gIC8vIEZpeCBjb2xsYXBzZSBpbiB3ZWJraXQgZnJvbSBtYXgtd2lkdGg6IDEwMCUgYW5kIGRpc3BsYXk6IHRhYmxlLWNlbGwuXG4gICYuaW1nLXRodW1ibmFpbCB7XG4gICAgbWF4LXdpZHRoOiBub25lO1xuICB9XG59XG5cbi5tZWRpYS1yaWdodCxcbi5tZWRpYSA+IC5wdWxsLXJpZ2h0IHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYSA+IC5wdWxsLWxlZnQge1xuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxuXG4ubWVkaWEtbGVmdCxcbi5tZWRpYS1yaWdodCxcbi5tZWRpYS1ib2R5IHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxuLm1lZGlhLW1pZGRsZSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5tZWRpYS1ib3R0b20ge1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4vLyBSZXNldCBtYXJnaW5zIG9uIGhlYWRpbmdzIGZvciB0aWdodGVyIGRlZmF1bHQgc3BhY2luZ1xuLm1lZGlhLWhlYWRpbmcge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi8vIE1lZGlhIGxpc3QgdmFyaWF0aW9uXG4vL1xuLy8gVW5kbyBkZWZhdWx0IHVsL29sIHN0eWxlc1xuLm1lZGlhLWxpc3Qge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG4iLCIvL1xuLy8gTGlzdCBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQmFzZSBjbGFzc1xuLy9cbi8vIEVhc2lseSB1c2FibGUgb24gPHVsPiwgPG9sPiwgb3IgPGRpdj4uXG5cbi5saXN0LWdyb3VwIHtcbiAgLy8gTm8gbmVlZCB0byBzZXQgbGlzdC1zdHlsZTogbm9uZTsgc2luY2UgLmxpc3QtZ3JvdXAtaXRlbSBpcyBibG9jayBsZXZlbFxuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDA7IC8vIHJlc2V0IHBhZGRpbmcgYmVjYXVzZSB1bCBhbmQgb2xcbn1cblxuXG4vLyBJbmRpdmlkdWFsIGxpc3QgaXRlbXNcbi8vXG4vLyBVc2Ugb24gYGxpYHMgb3IgYGRpdmBzIHdpdGhpbiB0aGUgYC5saXN0LWdyb3VwYCBwYXJlbnQuXG5cbi5saXN0LWdyb3VwLWl0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gIC8vIFBsYWNlIHRoZSBib3JkZXIgb24gdGhlIGxpc3QgaXRlbXMgYW5kIG5lZ2F0aXZlIG1hcmdpbiB1cCBmb3IgYmV0dGVyIHN0eWxpbmdcbiAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGxpc3QtZ3JvdXAtYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRsaXN0LWdyb3VwLWJvcmRlcjtcblxuICAvLyBSb3VuZCB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXNcbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoJGxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyk7XG4gIH1cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKCRsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO1xuICB9XG59XG5cblxuLy8gSW50ZXJhY3RpdmUgbGlzdCBpdGVtc1xuLy9cbi8vIFVzZSBhbmNob3Igb3IgYnV0dG9uIGVsZW1lbnRzIGluc3RlYWQgb2YgYGxpYHMgb3IgYGRpdmBzIHRvIGNyZWF0ZSBpbnRlcmFjdGl2ZSBpdGVtcy5cbi8vIEluY2x1ZGVzIGFuIGV4dHJhIGAuYWN0aXZlYCBtb2RpZmllciBjbGFzcyBmb3Igc2hvd2luZyBzZWxlY3RlZCBpdGVtcy5cblxuYS5saXN0LWdyb3VwLWl0ZW0sXG5idXR0b24ubGlzdC1ncm91cC1pdGVtIHtcbiAgY29sb3I6ICRsaXN0LWdyb3VwLWxpbmstY29sb3I7XG5cbiAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgICBjb2xvcjogJGxpc3QtZ3JvdXAtbGluay1oZWFkaW5nLWNvbG9yO1xuICB9XG5cbiAgLy8gSG92ZXIgc3RhdGVcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRsaXN0LWdyb3VwLWhvdmVyLWJnO1xuICB9XG59XG5cbmJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0ge1xuICB3aWR0aDogMTAwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIC8vIERpc2FibGVkIHN0YXRlXG4gICYuZGlzYWJsZWQsXG4gICYuZGlzYWJsZWQ6aG92ZXIsXG4gICYuZGlzYWJsZWQ6Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRsaXN0LWdyb3VwLWRpc2FibGVkLWJnO1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcjtcbiAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG5cbiAgICAvLyBGb3JjZSBjb2xvciB0byBpbmhlcml0IGZvciBjdXN0b20gY29udGVudFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiAkbGlzdC1ncm91cC1kaXNhYmxlZC10ZXh0LWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFjdGl2ZSBjbGFzcyBvbiBpdGVtIGl0c2VsZiwgbm90IHBhcmVudFxuICAmLmFjdGl2ZSxcbiAgJi5hY3RpdmU6aG92ZXIsXG4gICYuYWN0aXZlOmZvY3VzIHtcbiAgICB6LWluZGV4OiAyOyAvLyBQbGFjZSBhY3RpdmUgaXRlbXMgYWJvdmUgdGhlaXIgc2libGluZ3MgZm9yIHByb3BlciBib3JkZXIgc3R5bGluZ1xuICAgIGNvbG9yOiAkbGlzdC1ncm91cC1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGxpc3QtZ3JvdXAtYWN0aXZlLWJnO1xuICAgIGJvcmRlci1jb2xvcjogJGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjtcblxuICAgIC8vIEZvcmNlIGNvbG9yIHRvIGluaGVyaXQgZm9yIGN1c3RvbSBjb250ZW50XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiAkbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhbnRzXG4vL1xuLy8gQWRkIG1vZGlmaWVyIGNsYXNzZXMgdG8gY2hhbmdlIHRleHQgYW5kIGJhY2tncm91bmQgY29sb3Igb24gaW5kaXZpZHVhbCBpdGVtcy5cbi8vIE9yZ2FuaXphdGlvbmFsbHksIHRoaXMgbXVzdCBjb21lIGFmdGVyIHRoZSBgOmhvdmVyYCBzdGF0ZXMuXG5cbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHN1Y2Nlc3MsICRzdGF0ZS1zdWNjZXNzLWJnLCAkc3RhdGUtc3VjY2Vzcy10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KGluZm8sICRzdGF0ZS1pbmZvLWJnLCAkc3RhdGUtaW5mby10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHdhcm5pbmcsICRzdGF0ZS13YXJuaW5nLWJnLCAkc3RhdGUtd2FybmluZy10ZXh0KTtcbkBpbmNsdWRlIGxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KGRhbmdlciwgJHN0YXRlLWRhbmdlci1iZywgJHN0YXRlLWRhbmdlci10ZXh0KTtcblxuXG4vLyBDdXN0b20gY29udGVudCBvcHRpb25zXG4vL1xuLy8gRXh0cmEgY2xhc3NlcyBmb3IgY3JlYXRpbmcgd2VsbC1mb3JtYXR0ZWQgY29udGVudCB3aXRoaW4gYC5saXN0LWdyb3VwLWl0ZW1gcy5cblxuLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbn1cbiIsIi8vIExpc3QgR3JvdXBzXG5cbkBtaXhpbiBsaXN0LWdyb3VwLWl0ZW0tdmFyaWFudCgkc3RhdGUsICRiYWNrZ3JvdW5kLCAkY29sb3IpIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbS0jeyRzdGF0ZX0ge1xuICAgIGNvbG9yOiAkY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQ7XG5cbiAgICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYSYsIGJ1dHRvbiYgdG8gYS5saXN0LWdyb3VwLWl0ZW0tI3skc3RhdGV9LCBidXR0b24ubGlzdC1ncm91cC1pdGVtLSN7JHN0YXRlfVxuICB9XG5cbiAgYS5saXN0LWdyb3VwLWl0ZW0tI3skc3RhdGV9LFxuICBidXR0b24ubGlzdC1ncm91cC1pdGVtLSN7JHN0YXRlfSB7XG4gICAgY29sb3I6ICRjb2xvcjtcblxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG5cbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkYmFja2dyb3VuZCwgNSUpO1xuICAgIH1cbiAgICAmLmFjdGl2ZSxcbiAgICAmLmFjdGl2ZTpob3ZlcixcbiAgICAmLmFjdGl2ZTpmb2N1cyB7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbiAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFBhbmVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ucGFuZWwge1xuICBtYXJnaW4tYm90dG9tOiAkbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6ICRwYW5lbC1ib3JkZXItcmFkaXVzO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSkpO1xufVxuXG4vLyBQYW5lbCBjb250ZW50c1xuLnBhbmVsLWJvZHkge1xuICBwYWRkaW5nOiAkcGFuZWwtYm9keS1wYWRkaW5nO1xuICBAaW5jbHVkZSBjbGVhcmZpeDtcbn1cblxuLy8gT3B0aW9uYWwgaGVhZGluZ1xuLnBhbmVsLWhlYWRpbmcge1xuICBwYWRkaW5nOiAkcGFuZWwtaGVhZGluZy1wYWRkaW5nO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKCgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpKTtcblxuICA+IC5kcm9wZG93biAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBXaXRoaW4gaGVhZGluZywgc3RyaXAgYW55IGBoKmAgdGFnIG9mIGl0cyBkZWZhdWx0IG1hcmdpbnMgZm9yIHNwYWNpbmcuXG4ucGFuZWwtdGl0bGUge1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LXNpemU6IGNlaWwoKCRmb250LXNpemUtYmFzZSAqIDEuMTI1KSk7XG4gIGNvbG9yOiBpbmhlcml0O1xuXG4gID4gYSxcbiAgPiBzbWFsbCxcbiAgPiAuc21hbGwsXG4gID4gc21hbGwgPiBhLFxuICA+IC5zbWFsbCA+IGEge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsIGZvb3RlciAoc3RheXMgZ3JheSBpbiBldmVyeSBtb2RpZmllciBjbGFzcylcbi5wYW5lbC1mb290ZXIge1xuICBwYWRkaW5nOiAkcGFuZWwtZm9vdGVyLXBhZGRpbmc7XG4gIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1mb290ZXItYmc7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAkcGFuZWwtaW5uZXItYm9yZGVyO1xuICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cygoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG59XG5cblxuLy8gTGlzdCBncm91cHMgaW4gcGFuZWxzXG4vL1xuLy8gQnkgZGVmYXVsdCwgc3BhY2Ugb3V0IGxpc3QgZ3JvdXAgY29udGVudCBmcm9tIHBhbmVsIGhlYWRpbmdzIHRvIGFjY291bnQgZm9yXG4vLyBhbnkga2luZCBvZiBjdXN0b20gY29udGVudCBiZXR3ZWVuIHRoZSB0d28uXG5cbi5wYW5lbCB7XG4gID4gLmxpc3QtZ3JvdXAsXG4gID4gLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICAubGlzdC1ncm91cC1pdGVtIHtcbiAgICAgIGJvcmRlci13aWR0aDogMXB4IDA7XG4gICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIH1cblxuICAgIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMDtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBib3JkZXIgYm90dG9tIHJhZGl1cyBmb3IgbGFzdCBvbmVcbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IC5wYW5lbC1oZWFkaW5nICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG4gICAgfVxuICB9XG59XG4vLyBDb2xsYXBzZSBzcGFjZSBiZXR3ZWVuIHdoZW4gdGhlcmUncyBubyBhZGRpdGlvbmFsIGNvbnRlbnQuXG4ucGFuZWwtaGVhZGluZyArIC5saXN0LWdyb3VwIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgfVxufVxuLmxpc3QtZ3JvdXAgKyAucGFuZWwtZm9vdGVyIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbn1cblxuLy8gVGFibGVzIGluIHBhbmVsc1xuLy9cbi8vIFBsYWNlIGEgbm9uLWJvcmRlcmVkIGAudGFibGVgIHdpdGhpbiBhIHBhbmVsIChub3Qgd2l0aGluIGEgYC5wYW5lbC1ib2R5YCkgYW5kXG4vLyB3YXRjaCBpdCBnbyBmdWxsIHdpZHRoLlxuXG4ucGFuZWwge1xuICA+IC50YWJsZSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSxcbiAgPiAucGFuZWwtY29sbGFwc2UgPiAudGFibGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICBjYXB0aW9uIHtcbiAgICAgIHBhZGRpbmctbGVmdDogJHBhbmVsLWJvZHktcGFkZGluZztcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICRwYW5lbC1ib2R5LXBhZGRpbmc7XG4gICAgfVxuICB9XG4gIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gID4gLnRhYmxlOmZpcnN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkIHtcbiAgICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG5cbiAgICA+IHRoZWFkOmZpcnN0LWNoaWxkLFxuICAgID4gdGJvZHk6Zmlyc3QtY2hpbGQge1xuICAgICAgPiB0cjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG5cbiAgICAgICAgdGQ6Zmlyc3QtY2hpbGQsXG4gICAgICAgIHRoOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZDpsYXN0LWNoaWxkLFxuICAgICAgICB0aDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gQWRkIGJvcmRlciBib3R0b20gcmFkaXVzIGZvciBsYXN0IG9uZVxuICA+IC50YWJsZTpsYXN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQgPiAudGFibGU6bGFzdC1jaGlsZCB7XG4gICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXMoKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuXG4gICAgPiB0Ym9keTpsYXN0LWNoaWxkLFxuICAgID4gdGZvb3Q6bGFzdC1jaGlsZCB7XG4gICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAoJHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuXG4gICAgICAgIHRkOmZpcnN0LWNoaWxkLFxuICAgICAgICB0aDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogKCRwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGQ6bGFzdC1jaGlsZCxcbiAgICAgICAgdGg6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICgkcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gLnBhbmVsLWJvZHkgKyAudGFibGUsXG4gID4gLnBhbmVsLWJvZHkgKyAudGFibGUtcmVzcG9uc2l2ZSxcbiAgPiAudGFibGUgKyAucGFuZWwtYm9keSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSArIC5wYW5lbC1ib2R5IHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgfVxuICA+IC50YWJsZSA+IHRib2R5OmZpcnN0LWNoaWxkID4gdHI6Zmlyc3QtY2hpbGQgdGgsXG4gID4gLnRhYmxlID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0ZCB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgfVxuICA+IC50YWJsZS1ib3JkZXJlZCxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZS1ib3JkZXJlZCB7XG4gICAgYm9yZGVyOiAwO1xuICAgID4gdGhlYWQsXG4gICAgPiB0Ym9keSxcbiAgICA+IHRmb290IHtcbiAgICAgID4gdHIge1xuICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICA+IHRkOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItbGVmdDogMDtcbiAgICAgICAgfVxuICAgICAgICA+IHRoOmxhc3QtY2hpbGQsXG4gICAgICAgID4gdGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgID4gdGhlYWQsXG4gICAgPiB0Ym9keSB7XG4gICAgICA+IHRyOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgPiB0ZCxcbiAgICAgICAgPiB0aCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICA+IHRib2R5LFxuICAgID4gdGZvb3Qge1xuICAgICAgPiB0cjpsYXN0LWNoaWxkIHtcbiAgICAgICAgPiB0ZCxcbiAgICAgICAgPiB0aCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IC50YWJsZS1yZXNwb25zaXZlIHtcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG5cbi8vIENvbGxhcHNhYmxlIHBhbmVscyAoYWthLCBhY2NvcmRpb24pXG4vL1xuLy8gV3JhcCBhIHNlcmllcyBvZiBwYW5lbHMgaW4gYC5wYW5lbC1ncm91cGAgdG8gdHVybiB0aGVtIGludG8gYW4gYWNjb3JkaW9uIHdpdGhcbi8vIHRoZSBoZWxwIG9mIG91ciBjb2xsYXBzZSBKYXZhU2NyaXB0IHBsdWdpbi5cblxuLnBhbmVsLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogJGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuXG4gIC8vIFRpZ2h0ZW4gdXAgbWFyZ2luIHNvIGl0J3Mgb25seSBiZXR3ZWVuIHBhbmVsc1xuICAucGFuZWwge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgYm9yZGVyLXJhZGl1czogJHBhbmVsLWJvcmRlci1yYWRpdXM7XG5cbiAgICArIC5wYW5lbCB7XG4gICAgICBtYXJnaW4tdG9wOiA1cHg7XG4gICAgfVxuICB9XG5cbiAgLnBhbmVsLWhlYWRpbmcge1xuICAgIGJvcmRlci1ib3R0b206IDA7XG5cbiAgICArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5LFxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLmxpc3QtZ3JvdXAge1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRwYW5lbC1pbm5lci1ib3JkZXI7XG4gICAgfVxuICB9XG5cbiAgLnBhbmVsLWZvb3RlciB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICArIC5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keSB7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHBhbmVsLWlubmVyLWJvcmRlcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnNcbi5wYW5lbC1kZWZhdWx0IHtcbiAgQGluY2x1ZGUgcGFuZWwtdmFyaWFudCgkcGFuZWwtZGVmYXVsdC1ib3JkZXIsICRwYW5lbC1kZWZhdWx0LXRleHQsICRwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmcsICRwYW5lbC1kZWZhdWx0LWJvcmRlcik7XG59XG4ucGFuZWwtcHJpbWFyeSB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLXByaW1hcnktYm9yZGVyLCAkcGFuZWwtcHJpbWFyeS10ZXh0LCAkcGFuZWwtcHJpbWFyeS1oZWFkaW5nLWJnLCAkcGFuZWwtcHJpbWFyeS1ib3JkZXIpO1xufVxuLnBhbmVsLXN1Y2Nlc3Mge1xuICBAaW5jbHVkZSBwYW5lbC12YXJpYW50KCRwYW5lbC1zdWNjZXNzLWJvcmRlciwgJHBhbmVsLXN1Y2Nlc3MtdGV4dCwgJHBhbmVsLXN1Y2Nlc3MtaGVhZGluZy1iZywgJHBhbmVsLXN1Y2Nlc3MtYm9yZGVyKTtcbn1cbi5wYW5lbC1pbmZvIHtcbiAgQGluY2x1ZGUgcGFuZWwtdmFyaWFudCgkcGFuZWwtaW5mby1ib3JkZXIsICRwYW5lbC1pbmZvLXRleHQsICRwYW5lbC1pbmZvLWhlYWRpbmctYmcsICRwYW5lbC1pbmZvLWJvcmRlcik7XG59XG4ucGFuZWwtd2FybmluZyB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLXdhcm5pbmctYm9yZGVyLCAkcGFuZWwtd2FybmluZy10ZXh0LCAkcGFuZWwtd2FybmluZy1oZWFkaW5nLWJnLCAkcGFuZWwtd2FybmluZy1ib3JkZXIpO1xufVxuLnBhbmVsLWRhbmdlciB7XG4gIEBpbmNsdWRlIHBhbmVsLXZhcmlhbnQoJHBhbmVsLWRhbmdlci1ib3JkZXIsICRwYW5lbC1kYW5nZXItdGV4dCwgJHBhbmVsLWRhbmdlci1oZWFkaW5nLWJnLCAkcGFuZWwtZGFuZ2VyLWJvcmRlcik7XG59XG4iLCIvLyBQYW5lbHNcblxuQG1peGluIHBhbmVsLXZhcmlhbnQoJGJvcmRlciwgJGhlYWRpbmctdGV4dC1jb2xvciwgJGhlYWRpbmctYmctY29sb3IsICRoZWFkaW5nLWJvcmRlcikge1xuICBib3JkZXItY29sb3I6ICRib3JkZXI7XG5cbiAgJiA+IC5wYW5lbC1oZWFkaW5nIHtcbiAgICBjb2xvcjogJGhlYWRpbmctdGV4dC1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGluZy1iZy1jb2xvcjtcbiAgICBib3JkZXItY29sb3I6ICRoZWFkaW5nLWJvcmRlcjtcblxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGJvcmRlcjtcbiAgICB9XG4gICAgLmJhZGdlIHtcbiAgICAgIGNvbG9yOiAkaGVhZGluZy1iZy1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRoZWFkaW5nLXRleHQtY29sb3I7XG4gICAgfVxuICB9XG4gICYgPiAucGFuZWwtZm9vdGVyIHtcbiAgICArIC5wYW5lbC1jb2xsYXBzZSA+IC5wYW5lbC1ib2R5IHtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRib3JkZXI7XG4gICAgfVxuICB9XG59XG4iLCIvLyBFbWJlZHMgcmVzcG9uc2l2ZVxuLy9cbi8vIENyZWRpdDogTmljb2xhcyBHYWxsYWdoZXIgYW5kIFNVSVQgQ1NTLlxuXG4uZW1iZWQtcmVzcG9uc2l2ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogMDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAuZW1iZWQtcmVzcG9uc2l2ZS1pdGVtLFxuICBpZnJhbWUsXG4gIGVtYmVkLFxuICBvYmplY3QsXG4gIHZpZGVvIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IDA7XG4gIH1cbn1cblxuLy8gTW9kaWZpZXIgY2xhc3MgZm9yIDE2OjkgYXNwZWN0IHJhdGlvXG4uZW1iZWQtcmVzcG9uc2l2ZS0xNmJ5OSB7XG4gIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG59XG5cbi8vIE1vZGlmaWVyIGNsYXNzIGZvciA0OjMgYXNwZWN0IHJhdGlvXG4uZW1iZWQtcmVzcG9uc2l2ZS00YnkzIHtcbiAgcGFkZGluZy1ib3R0b206IDc1JTtcbn1cbiIsIi8vXG4vLyBXZWxsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ud2VsbCB7XG4gIG1pbi1oZWlnaHQ6IDIwcHg7XG4gIHBhZGRpbmc6IDE5cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3ZWxsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCAkd2VsbC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG4gIEBpbmNsdWRlIGJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KSk7XG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlci1jb2xvcjogI2RkZDtcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsLjE1KTtcbiAgfVxufVxuXG4vLyBTaXplc1xuLndlbGwtbGcge1xuICBwYWRkaW5nOiAyNHB4O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1sYXJnZTtcbn1cbi53ZWxsLXNtIHtcbiAgcGFkZGluZzogOXB4O1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cy1zbWFsbDtcbn1cbiIsIi8vXG4vLyBDbG9zZSBpY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4uY2xvc2Uge1xuICBmbG9hdDogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogKCRmb250LXNpemUtYmFzZSAqIDEuNSk7XG4gIGZvbnQtd2VpZ2h0OiAkY2xvc2UtZm9udC13ZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogJGNsb3NlLWNvbG9yO1xuICB0ZXh0LXNoYWRvdzogJGNsb3NlLXRleHQtc2hhZG93O1xuICBAaW5jbHVkZSBvcGFjaXR5KC4yKTtcblxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBjb2xvcjogJGNsb3NlLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgQGluY2x1ZGUgb3BhY2l0eSguNSk7XG4gIH1cblxuICAvLyBbY29udmVydGVyXSBleHRyYWN0ZWQgYnV0dG9uJiB0byBidXR0b24uY2xvc2Vcbn1cblxuLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBidXR0b24gdmVyc2lvblxuLy8gaU9TIHJlcXVpcmVzIHRoZSBidXR0b24gZWxlbWVudCBpbnN0ZWFkIG9mIGFuIGFuY2hvciB0YWcuXG4vLyBJZiB5b3Ugd2FudCB0aGUgYW5jaG9yIHZlcnNpb24sIGl0IHJlcXVpcmVzIGBocmVmPVwiI1wiYC5cbi8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvY2xpY2sjU2FmYXJpX01vYmlsZVxuYnV0dG9uLmNsb3NlIHtcbiAgcGFkZGluZzogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG4iLCIvKlxuKiBQcm9qZWN0IEtpbWNoaVxuKlxuKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDE1XG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG4vL1xuLy8gTW9kYWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyAubW9kYWwtb3BlbiAgICAgIC0gYm9keSBjbGFzcyBmb3Iga2lsbGluZyB0aGUgc2Nyb2xsXG4vLyAubW9kYWwgICAgICAgICAgIC0gY29udGFpbmVyIHRvIHNjcm9sbCB3aXRoaW5cbi8vIC5tb2RhbC1kaWFsb2cgICAgLSBwb3NpdGlvbmluZyBzaGVsbCBmb3IgdGhlIGFjdHVhbCBtb2RhbFxuLy8gLm1vZGFsLWNvbnRlbnQgICAtIGFjdHVhbCBtb2RhbCB3LyBiZyBhbmQgY29ybmVycyBhbmQgc2hpdFxuXG4vLyBLaWxsIHRoZSBzY3JvbGwgb24gdGhlIGJvZHlcbi5tb2RhbC1vcGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLy8gQ29udGFpbmVyIHRoYXQgdGhlIG1vZGFsIHNjcm9sbHMgd2l0aGluXG4ubW9kYWwge1xuICBkaXNwbGF5OiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHppbmRleC1tb2RhbDtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuXG4gIC8vIFByZXZlbnQgQ2hyb21lIG9uIFdpbmRvd3MgZnJvbSBhZGRpbmcgYSBmb2N1cyBvdXRsaW5lLiBGb3IgZGV0YWlscywgc2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEwOTUxLlxuICBvdXRsaW5lOiAwO1xuXG4gIC8vIFdoZW4gZmFkaW5nIGluIHRoZSBtb2RhbCwgYW5pbWF0ZSBpdCB0byBzbGlkZSBkb3duXG4gICYuZmFkZSAubW9kYWwtZGlhbG9nIHtcbiAgICBAaW5jbHVkZSB0cmFuc2xhdGUoMCwgLTI1JSk7XG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbi10cmFuc2Zvcm0oMC4zcyBlYXNlLW91dCk7XG4gIH1cbiAgJi5pbiAubW9kYWwtZGlhbG9nIHsgQGluY2x1ZGUgdHJhbnNsYXRlKDAsIDApIH1cbn1cbi5tb2RhbC1vcGVuIC5tb2RhbCB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLy8gU2hlbGwgZGl2IHRvIHBvc2l0aW9uIHRoZSBtb2RhbCB3aXRoIGJvdHRvbSBwYWRkaW5nXG4ubW9kYWwtZGlhbG9nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogYXV0bztcbiAgbWFyZ2luOiAxMHB4O1xuICBib3JkZXI6IDZweCBzb2xpZCAkbW9kYWwtY29udGVudC1mYWxsYmFjay1ib3JkZXItY29sb3I7IC8vb2xkIGJyb3dzZXJzIGZhbGxiYWNrIChpZTggZXRjKVxuICBib3JkZXI6IDZweCBzb2xpZCAkbW9kYWwtY29udGVudC1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsgIFxufVxuXG4vLyBBY3R1YWwgbW9kYWxcbi5tb2RhbC1jb250ZW50IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtY29udGVudC1iZztcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgYm9yZGVyOiAzcHggc29saWQgIzk5OTsgICBcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lICFpbXBvcnRhbnQpO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBvdXRsaW5lOiAwO1xufVxuXG5cbi8vIE1vZGFsIGJhY2tncm91bmRcbi5tb2RhbC1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkemluZGV4LW1vZGFsLWJhY2tncm91bmQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICRtb2RhbC1iYWNrZHJvcC1iZztcbiAgLy8gRmFkZSBmb3IgYmFja2Ryb3BcbiAgJi5mYWRlIHsgQGluY2x1ZGUgb3BhY2l0eSgwKTsgfVxuICAmLmluIHsgQGluY2x1ZGUgb3BhY2l0eSgkbW9kYWwtYmFja2Ryb3Atb3BhY2l0eSk7IH1cbn1cblxuLy8gTW9kYWwgaGVhZGVyXG4vLyBUb3Agc2VjdGlvbiBvZiB0aGUgbW9kYWwgdy8gdGl0bGUgYW5kIGRpc21pc3Ncbi5tb2RhbC1oZWFkZXIge1xuICBwYWRkaW5nOiAkbW9kYWwtdGl0bGUtcGFkZGluZztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRtb2RhbC1oZWFkZXItYm9yZGVyLWNvbG9yO1xuICBtaW4taGVpZ2h0OiAoJG1vZGFsLXRpdGxlLXBhZGRpbmcgKyAkbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQpO1xufVxuLy8gQ2xvc2UgaWNvblxuLm1vZGFsLWhlYWRlciAuY2xvc2Uge1xuICBtYXJnaW4tdG9wOiAtMnB4O1xufVxuXG4vLyBUaXRsZSB0ZXh0IHdpdGhpbiBoZWFkZXJcbi5tb2RhbC10aXRsZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGxpbmUtaGVpZ2h0OiAkbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQ7XG4gICAgZm9udC1zaXplOiAyN3B4O1xuICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbGlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IDMwMCAhaW1wb3J0YW50O1xufVxuXG4vLyBNb2RhbCBib2R5XG4vLyBXaGVyZSBhbGwgbW9kYWwgY29udGVudCByZXNpZGVzIChzaWJsaW5nIG9mIC5tb2RhbC1oZWFkZXIgYW5kIC5tb2RhbC1mb290ZXIpXG4ubW9kYWwtYm9keSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogJG1vZGFsLWlubmVyLXBhZGRpbmc7XG59XG5cbi8vIEZvb3RlciAoZm9yIGFjdGlvbnMpXG4ubW9kYWwtZm9vdGVyIHtcbiAgcGFkZGluZzogJG1vZGFsLWlubmVyLXBhZGRpbmc7XG4gIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDtcbiAgYm9yZGVyLXRvcDogMDtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7IC8vIGNsZWFyIGl0IGluIGNhc2UgZm9sa3MgdXNlIC5wdWxsLSogY2xhc3NlcyBvbiBidXR0b25zXG5cbiAgLmJ0biB7XG4gICAgcGFkZGluZzogNnB4IDEycHg7XG4gICAgbWluLXdpZHRoOiA3NXB4O1xuICAgIH1cblxuICAvLyBQcm9wZXJseSBzcGFjZSBvdXQgYnV0dG9uc1xuICAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyAvLyBhY2NvdW50IGZvciBpbnB1dFt0eXBlPVwic3VibWl0XCJdIHdoaWNoIGdldHMgdGhlIGJvdHRvbSBtYXJnaW4gbGlrZSBhbGwgb3RoZXIgaW5wdXRzXG4gIH1cbiAgLy8gYnV0IG92ZXJyaWRlIHRoYXQgZm9yIGJ1dHRvbiBncm91cHNcbiAgLmJ0bi1ncm91cCAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIH1cbiAgLy8gYW5kIG92ZXJyaWRlIGl0IGZvciBibG9jayBidXR0b25zIGFzIHdlbGxcbiAgLmJ0bi1ibG9jayArIC5idG4tYmxvY2sge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi8vIE1lYXN1cmUgc2Nyb2xsYmFyIHdpZHRoIGZvciBwYWRkaW5nIGJvZHkgZHVyaW5nIG1vZGFsIHNob3cvaGlkZVxuLm1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC05OTk5cHg7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5cbi8vIFNjYWxlIHVwIHRoZSBtb2RhbFxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG4gIC8vIEF1dG9tYXRpY2FsbHkgc2V0IG1vZGFsJ3Mgd2lkdGggZm9yIGxhcmdlciB2aWV3cG9ydHNcbiAgLm1vZGFsLWRpYWxvZyB7XG4gICAgd2lkdGg6ICRtb2RhbC1tZDtcbiAgICBtYXJnaW46IDMwcHggYXV0bztcbiAgfVxuICAubW9kYWwtY29udGVudCB7XG4gICAgQGluY2x1ZGUgYm94LXNoYWRvdygwIDVweCAxNXB4IHJnYmEoMCwwLDAsLjUpKTtcbiAgfVxuXG4gIC8vIE1vZGFsIHNpemVzXG4gIC5tb2RhbC1zbSB7IHdpZHRoOiAkbW9kYWwtc207IH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSB7XG4gIC5tb2RhbC1sZyB7IHdpZHRoOiAkbW9kYWwtbGc7IH1cbn1cblxuLm1vZGFsIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgeyBcbiAgLm1vZGFsOmJlZm9yZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgY29udGVudDogXCIgXCI7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG59XG5cbi5tb2RhbC1kaWFsb2cge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbkBlYWNoICRwYWdlLCAkYmdjb2xvciBpbiAkY29sb3JzIHtcbiAgIyN7JHBhZ2V9LXJvb3QtY29udGFpbmVyIHtcblxuICAgICAgLm1vZGFsLWZvb3RlciB7XG4gICAgICAgICAgYmFja2dyb3VuZDogJGJnY29sb3IgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgfVxufSIsIi8vXG4vLyBUb29sdGlwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4udG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogJHppbmRleC10b29sdGlwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgLy8gT3VyIHBhcmVudCBlbGVtZW50IGNhbiBiZSBhcmJpdHJhcnkgc2luY2UgdG9vbHRpcHMgYXJlIGJ5IGRlZmF1bHQgaW5zZXJ0ZWQgYXMgYSBzaWJsaW5nIG9mIHRoZWlyIHRhcmdldCBlbGVtZW50LlxuICAvLyBTbyByZXNldCBvdXIgZm9udCBhbmQgdGV4dCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGluaGVyaXRpbmcgd2VpcmQgdmFsdWVzLlxuICBAaW5jbHVkZSByZXNldC10ZXh0O1xuICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG5cbiAgQGluY2x1ZGUgb3BhY2l0eSgwKTtcblxuICAmLmluICAgICB7IEBpbmNsdWRlIG9wYWNpdHkoJHRvb2x0aXAtb3BhY2l0eSk7IH1cbiAgJi50b3AgICAgeyBtYXJnaW4tdG9wOiAgLTNweDsgcGFkZGluZzogJHRvb2x0aXAtYXJyb3ctd2lkdGggMDsgfVxuICAmLnJpZ2h0ICB7IG1hcmdpbi1sZWZ0OiAgM3B4OyBwYWRkaW5nOiAwICR0b29sdGlwLWFycm93LXdpZHRoOyB9XG4gICYuYm90dG9tIHsgbWFyZ2luLXRvcDogICAzcHg7IHBhZGRpbmc6ICR0b29sdGlwLWFycm93LXdpZHRoIDA7IH1cbiAgJi5sZWZ0ICAgeyBtYXJnaW4tbGVmdDogLTNweDsgcGFkZGluZzogMCAkdG9vbHRpcC1hcnJvdy13aWR0aDsgfVxufVxuXG4vLyBXcmFwcGVyIGZvciB0aGUgdG9vbHRpcCBjb250ZW50XG4udG9vbHRpcC1pbm5lciB7XG4gIG1heC13aWR0aDogJHRvb2x0aXAtbWF4LXdpZHRoO1xuICBwYWRkaW5nOiAzcHggOHB4O1xuICBjb2xvcjogJHRvb2x0aXAtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHRvb2x0aXAtYmc7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWJhc2U7XG59XG5cbi8vIEFycm93c1xuLnRvb2x0aXAtYXJyb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG59XG4vLyBOb3RlOiBEZXByZWNhdGVkIC50b3AtbGVmdCwgLnRvcC1yaWdodCwgLmJvdHRvbS1sZWZ0LCBhbmQgLmJvdHRvbS1yaWdodCBhcyBvZiB2My4zLjFcbi50b29sdGlwIHtcbiAgJi50b3AgLnRvb2x0aXAtYXJyb3cge1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogJHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbiAgJi50b3AtbGVmdCAudG9vbHRpcC1hcnJvdyB7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAkdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBtYXJnaW4tYm90dG9tOiAtJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAkdG9vbHRpcC1hcnJvdy13aWR0aCAkdG9vbHRpcC1hcnJvdy13aWR0aCAwO1xuICAgIGJvcmRlci10b3AtY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYudG9wLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgbWFyZ2luLWJvdHRvbTogLSR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGggMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLnJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogNTAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6ICR0b29sdGlwLWFycm93LXdpZHRoIDAgJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tIC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAwICR0b29sdGlwLWFycm93LXdpZHRoICR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICR0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogMDtcbiAgICByaWdodDogJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgbWFyZ2luLXRvcDogLSR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogMCAkdG9vbHRpcC1hcnJvdy13aWR0aCAkdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmJvdHRvbS1yaWdodCAudG9vbHRpcC1hcnJvdyB7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6ICR0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IDAgJHRvb2x0aXAtYXJyb3ctd2lkdGggJHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbn1cbiIsIkBtaXhpbiByZXNldC10ZXh0KCkge1xuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWJhc2U7XG4gIC8vIFdlIGRlbGliZXJhdGVseSBkbyBOT1QgcmVzZXQgZm9udC1zaXplLlxuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gIGxpbmUtYnJlYWs6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRmFsbGJhY2sgZm9yIHdoZXJlIGBzdGFydGAgaXMgbm90IHN1cHBvcnRlZFxuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIHdvcmQtYnJlYWs6IG5vcm1hbDtcbiAgd29yZC1zcGFjaW5nOiBub3JtYWw7XG4gIHdvcmQtd3JhcDogbm9ybWFsO1xufVxuIiwiLy9cbi8vIFBvcG92ZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi5wb3BvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6ICR6aW5kZXgtcG9wb3ZlcjtcbiAgZGlzcGxheTogbm9uZTtcbiAgbWF4LXdpZHRoOiAkcG9wb3Zlci1tYXgtd2lkdGg7XG4gIHBhZGRpbmc6IDFweDtcbiAgLy8gT3VyIHBhcmVudCBlbGVtZW50IGNhbiBiZSBhcmJpdHJhcnkgc2luY2UgcG9wb3ZlcnMgYXJlIGJ5IGRlZmF1bHQgaW5zZXJ0ZWQgYXMgYSBzaWJsaW5nIG9mIHRoZWlyIHRhcmdldCBlbGVtZW50LlxuICAvLyBTbyByZXNldCBvdXIgZm9udCBhbmQgdGV4dCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGluaGVyaXRpbmcgd2VpcmQgdmFsdWVzLlxuICBAaW5jbHVkZSByZXNldC10ZXh0O1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcG9wb3Zlci1iZztcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgJHBvcG92ZXItZmFsbGJhY2stYm9yZGVyLWNvbG9yO1xuICBib3JkZXI6IDFweCBzb2xpZCAkcG9wb3Zlci1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzLWxhcmdlO1xuICBAaW5jbHVkZSBib3gtc2hhZG93KDAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMikpO1xuXG4gIC8vIE9mZnNldCB0aGUgcG9wb3ZlciB0byBhY2NvdW50IGZvciB0aGUgcG9wb3ZlciBhcnJvd1xuICAmLnRvcCAgICAgeyBtYXJnaW4tdG9wOiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7IH1cbiAgJi5yaWdodCAgIHsgbWFyZ2luLWxlZnQ6ICRwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYuYm90dG9tICB7IG1hcmdpbi10b3A6ICRwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYubGVmdCAgICB7IG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7IH1cbn1cblxuLnBvcG92ZXItdGl0bGUge1xuICBtYXJnaW46IDA7IC8vIHJlc2V0IGhlYWRpbmcgbWFyZ2luXG4gIHBhZGRpbmc6IDhweCAxNHB4O1xuICBmb250LXNpemU6ICRmb250LXNpemUtYmFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHBvcG92ZXItdGl0bGUtYmc7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBkYXJrZW4oJHBvcG92ZXItdGl0bGUtYmcsIDUlKTtcbiAgYm9yZGVyLXJhZGl1czogKCRib3JkZXItcmFkaXVzLWxhcmdlIC0gMSkgKCRib3JkZXItcmFkaXVzLWxhcmdlIC0gMSkgMCAwO1xufVxuXG4ucG9wb3Zlci1jb250ZW50IHtcbiAgcGFkZGluZzogOXB4IDE0cHg7XG59XG5cbi8vIEFycm93c1xuLy9cbi8vIC5hcnJvdyBpcyBvdXRlciwgLmFycm93OmFmdGVyIGlzIGlubmVyXG5cbi5wb3BvdmVyID4gLmFycm93IHtcbiAgJixcbiAgJjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIH1cbn1cbi5wb3BvdmVyID4gLmFycm93IHtcbiAgYm9yZGVyLXdpZHRoOiAkcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbn1cbi5wb3BvdmVyID4gLmFycm93OmFmdGVyIHtcbiAgYm9yZGVyLXdpZHRoOiAkcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgY29udGVudDogXCJcIjtcbn1cblxuLnBvcG92ZXIge1xuICAmLnRvcCA+IC5hcnJvdyB7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjsgLy8gSUU4IGZhbGxiYWNrXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItY29sb3I7XG4gICAgYm90dG9tOiAtJHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiBcIiBcIjtcbiAgICAgIGJvdHRvbTogMXB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJi5yaWdodCA+IC5hcnJvdyB7XG4gICAgdG9wOiA1MCU7XG4gICAgbGVmdDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgICBib3JkZXItcmlnaHQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItcmlnaHQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICBsZWZ0OiAxcHg7XG4gICAgICBib3R0b206IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAkcG9wb3Zlci1hcnJvdy1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJi5ib3R0b20gPiAuYXJyb3cge1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIGJvcmRlci10b3Atd2lkdGg6IDA7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItZmFsbGJhY2stY29sb3I7IC8vIElFOCBmYWxsYmFja1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgIHRvcDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICB0b3A6IDFweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtJHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgfVxuICB9XG5cbiAgJi5sZWZ0ID4gLmFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICByaWdodDogLSRwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIG1hcmdpbi10b3A6IC0kcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6ICRwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItbGVmdC1jb2xvcjogJHBvcG92ZXItYXJyb3ctb3V0ZXItY29sb3I7XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiBcIiBcIjtcbiAgICAgIHJpZ2h0OiAxcHg7XG4gICAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgICBib3JkZXItbGVmdC1jb2xvcjogJHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgICBib3R0b206IC0kcG9wb3Zlci1hcnJvdy13aWR0aDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBDYXJvdXNlbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBXcmFwcGVyIGZvciB0aGUgc2xpZGUgY29udGFpbmVyIGFuZCBpbmRpY2F0b3JzXG4uY2Fyb3VzZWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jYXJvdXNlbC1pbm5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2lkdGg6IDEwMCU7XG5cbiAgPiAuaXRlbSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbiguNnMgZWFzZS1pbi1vdXQgbGVmdCk7XG5cbiAgICAvLyBBY2NvdW50IGZvciBqYW5raXR1ZGUgb24gaW1hZ2VzXG4gICAgPiBpbWcsXG4gICAgPiBhID4gaW1nIHtcbiAgICAgIEBpbmNsdWRlIGltZy1yZXNwb25zaXZlO1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgfVxuXG4gICAgLy8gV2ViS2l0IENTUzMgdHJhbnNmb3JtcyBmb3Igc3VwcG9ydGVkIGRldmljZXNcbiAgICBAbWVkaWEgYWxsIGFuZCAodHJhbnNmb3JtLTNkKSwgKC13ZWJraXQtdHJhbnNmb3JtLTNkKSB7XG4gICAgICBAaW5jbHVkZSB0cmFuc2l0aW9uLXRyYW5zZm9ybSgwLjZzIGVhc2UtaW4tb3V0KTtcbiAgICAgIEBpbmNsdWRlIGJhY2tmYWNlLXZpc2liaWxpdHkoaGlkZGVuKTtcbiAgICAgIEBpbmNsdWRlIHBlcnNwZWN0aXZlKDEwMDBweCk7XG5cbiAgICAgICYubmV4dCxcbiAgICAgICYuYWN0aXZlLnJpZ2h0IHtcbiAgICAgICAgQGluY2x1ZGUgdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG4gICAgICAmLnByZXYsXG4gICAgICAmLmFjdGl2ZS5sZWZ0IHtcbiAgICAgICAgQGluY2x1ZGUgdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgICAgJi5uZXh0LmxlZnQsXG4gICAgICAmLnByZXYucmlnaHQsXG4gICAgICAmLmFjdGl2ZSB7XG4gICAgICAgIEBpbmNsdWRlIHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSxcbiAgPiAubmV4dCxcbiAgPiAucHJldiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICA+IC5hY3RpdmUge1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICA+IC5uZXh0LFxuICA+IC5wcmV2IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgPiAubmV4dCB7XG4gICAgbGVmdDogMTAwJTtcbiAgfVxuICA+IC5wcmV2IHtcbiAgICBsZWZ0OiAtMTAwJTtcbiAgfVxuICA+IC5uZXh0LmxlZnQsXG4gID4gLnByZXYucmlnaHQge1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICA+IC5hY3RpdmUubGVmdCB7XG4gICAgbGVmdDogLTEwMCU7XG4gIH1cbiAgPiAuYWN0aXZlLnJpZ2h0IHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG5cbn1cblxuLy8gTGVmdC9yaWdodCBjb250cm9scyBmb3IgbmF2XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmNhcm91c2VsLWNvbnRyb2wge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgYm90dG9tOiAwO1xuICB3aWR0aDogJGNhcm91c2VsLWNvbnRyb2wtd2lkdGg7XG4gIEBpbmNsdWRlIG9wYWNpdHkoJGNhcm91c2VsLWNvbnRyb2wtb3BhY2l0eSk7XG4gIGZvbnQtc2l6ZTogJGNhcm91c2VsLWNvbnRyb2wtZm9udC1zaXplO1xuICBjb2xvcjogJGNhcm91c2VsLWNvbnRyb2wtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdGV4dC1zaGFkb3c6ICRjYXJvdXNlbC10ZXh0LXNoYWRvdztcbiAgLy8gV2UgY2FuJ3QgaGF2ZSB0aGlzIHRyYW5zaXRpb24gaGVyZSBiZWNhdXNlIFdlYktpdCBjYW5jZWxzIHRoZSBjYXJvdXNlbFxuICAvLyBhbmltYXRpb24gaWYgeW91IHRyaXAgdGhpcyB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIGFub3RoZXIgYW5pbWF0aW9uLlxuXG4gIC8vIFNldCBncmFkaWVudHMgZm9yIGJhY2tncm91bmRzXG4gICYubGVmdCB7XG4gICAgQGluY2x1ZGUgZ3JhZGllbnQtaG9yaXpvbnRhbCgkc3RhcnQtY29sb3I6IHJnYmEoMCwwLDAsLjUpLCAkZW5kLWNvbG9yOiByZ2JhKDAsMCwwLC4wMDAxKSk7XG4gIH1cbiAgJi5yaWdodCB7XG4gICAgbGVmdDogYXV0bztcbiAgICByaWdodDogMDtcbiAgICBAaW5jbHVkZSBncmFkaWVudC1ob3Jpem9udGFsKCRzdGFydC1jb2xvcjogcmdiYSgwLDAsMCwuMDAwMSksICRlbmQtY29sb3I6IHJnYmEoMCwwLDAsLjUpKTtcbiAgfVxuXG4gIC8vIEhvdmVyL2ZvY3VzIHN0YXRlXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG4gICAgY29sb3I6ICRjYXJvdXNlbC1jb250cm9sLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBAaW5jbHVkZSBvcGFjaXR5KC45KTtcbiAgfVxuXG4gIC8vIFRvZ2dsZXNcbiAgLmljb24tcHJldixcbiAgLmljb24tbmV4dCxcbiAgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xuICAgIHotaW5kZXg6IDU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLW5leHQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5pY29uLW5leHQge1xuICAgIHdpZHRoOiAgMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgZm9udC1mYW1pbHk6IHNlcmlmO1xuICB9XG5cblxuICAuaWNvbi1wcmV2IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDM5JzsvLyBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAoVSsyMDM5KVxuICAgIH1cbiAgfVxuICAuaWNvbi1uZXh0IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDNhJzsvLyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKFUrMjAzQSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3B0aW9uYWwgaW5kaWNhdG9yIHBpcHNcbi8vXG4vLyBBZGQgYW4gdW5vcmRlcmVkIGxpc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNsYXNzIGFuZCBhZGQgYSBsaXN0IGl0ZW0gZm9yIGVhY2hcbi8vIHNsaWRlIHlvdXIgY2Fyb3VzZWwgaG9sZHMuXG5cbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIHdpZHRoOiA2MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAgMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgbWFyZ2luOiAxcHg7XG4gICAgdGV4dC1pbmRlbnQ6IC05OTlweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgIC8vIElFOC05IGhhY2sgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgLy9cbiAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA4LTkgZG9lcyBub3Qgc3VwcG9ydCBjbGlja3Mgb24gZWxlbWVudHMgd2l0aG91dCBhIHNldFxuICAgIC8vIGBiYWNrZ3JvdW5kLWNvbG9yYC4gV2UgY2Fubm90IHVzZSBgZmlsdGVyYCBzaW5jZSB0aGF0J3Mgbm90IHZpZXdlZCBhcyBhXG4gICAgLy8gYmFja2dyb3VuZCBjb2xvciBieSB0aGUgYnJvd3Nlci4gVGh1cywgYSBoYWNrIGlzIG5lZWRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2NsaWNrI0ludGVybmV0X0V4cGxvcmVyXG4gICAgLy9cbiAgICAvLyBGb3IgSUU4LCB3ZSBzZXQgc29saWQgYmxhY2sgYXMgaXQgZG9lc24ndCBzdXBwb3J0IGByZ2JhKClgLiBGb3IgSUU5LCB3ZVxuICAgIC8vIHNldCBhbHBoYSB0cmFuc3BhcmVuY3kgZm9yIHRoZSBiZXN0IHJlc3VsdHMgcG9zc2libGUuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMCBcXDk7IC8vIElFOFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMCk7IC8vIElFOVxuICB9XG4gIC5hY3RpdmUge1xuICAgIG1hcmdpbjogMDtcbiAgICB3aWR0aDogIDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjYXJvdXNlbC1pbmRpY2F0b3ItYWN0aXZlLWJnO1xuICB9XG59XG5cbi8vIE9wdGlvbmFsIGNhcHRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGlkZGVuIGJ5IGRlZmF1bHQgZm9yIHNtYWxsZXIgdmlld3BvcnRzXG4uY2Fyb3VzZWwtY2FwdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMTUlO1xuICByaWdodDogMTUlO1xuICBib3R0b206IDIwcHg7XG4gIHotaW5kZXg6IDEwO1xuICBwYWRkaW5nLXRvcDogMjBweDtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG4gIGNvbG9yOiAkY2Fyb3VzZWwtY2FwdGlvbi1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXNoYWRvdzogJGNhcm91c2VsLXRleHQtc2hhZG93O1xuICAmIC5idG4ge1xuICAgIHRleHQtc2hhZG93OiBub25lOyAvLyBObyBzaGFkb3cgZm9yIGJ1dHRvbiBlbGVtZW50cyBpbiBjYXJvdXNlbC1jYXB0aW9uXG4gIH1cbn1cblxuXG4vLyBTY2FsZSB1cCBjb250cm9scyBmb3IgdGFibGV0cyBhbmQgdXBcbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSB7XG5cbiAgLy8gU2NhbGUgdXAgdGhlIGNvbnRyb2xzIGEgc21pZGdlXG4gIC5jYXJvdXNlbC1jb250cm9sIHtcbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tbGVmdCxcbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gICAgLmljb24tcHJldixcbiAgICAuaWNvbi1uZXh0IHtcbiAgICAgIHdpZHRoOiAzMHB4O1xuICAgICAgaGVpZ2h0OiAzMHB4O1xuICAgICAgbWFyZ2luLXRvcDogLTE1cHg7XG4gICAgICBmb250LXNpemU6IDMwcHg7XG4gICAgfVxuICAgIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAgIC5pY29uLXByZXYge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICAgIH1cbiAgICAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsXG4gICAgLmljb24tbmV4dCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgYW5kIGxlZnQgYWxpZ24gdGhlIGNhcHRpb25zXG4gIC5jYXJvdXNlbC1jYXB0aW9uIHtcbiAgICBsZWZ0OiAyMCU7XG4gICAgcmlnaHQ6IDIwJTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMzBweDtcbiAgfVxuXG4gIC8vIE1vdmUgdXAgdGhlIGluZGljYXRvcnNcbiAgLmNhcm91c2VsLWluZGljYXRvcnMge1xuICAgIGJvdHRvbTogMjBweDtcbiAgfVxufVxuIiwiLy9cbi8vIFV0aWxpdHkgY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBGbG9hdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmNsZWFyZml4IHtcbiAgQGluY2x1ZGUgY2xlYXJmaXg7XG59XG4uY2VudGVyLWJsb2NrIHtcbiAgQGluY2x1ZGUgY2VudGVyLWJsb2NrO1xufVxuLnB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQgIWltcG9ydGFudDtcbn1cbi5wdWxsLWxlZnQge1xuICBmbG9hdDogbGVmdCAhaW1wb3J0YW50O1xufVxuXG5cbi8vIFRvZ2dsaW5nIGNvbnRlbnRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gTm90ZTogRGVwcmVjYXRlZCAuaGlkZSBpbiBmYXZvciBvZiAuaGlkZGVuIG9yIC5zci1vbmx5IChhcyBhcHByb3ByaWF0ZSkgaW4gdjMuMC4xXG4uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5zaG93IHtcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbn1cbi5pbnZpc2libGUge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG4udGV4dC1oaWRlIHtcbiAgQGluY2x1ZGUgdGV4dC1oaWRlO1xufVxuXG5cbi8vIEhpZGUgZnJvbSBzY3JlZW5yZWFkZXJzIGFuZCBicm93c2Vyc1xuLy9cbi8vIENyZWRpdDogSFRNTDUgQm9pbGVycGxhdGVcblxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuXG4vLyBGb3IgQWZmaXggcGx1Z2luXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5hZmZpeCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbiIsIi8vIENlbnRlci1hbGlnbiBhIGJsb2NrIGxldmVsIGVsZW1lbnRcblxuQG1peGluIGNlbnRlci1ibG9jaygpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4iLCIvLyBDU1MgaW1hZ2UgcmVwbGFjZW1lbnRcbi8vXG4vLyBIZWFkcyB1cCEgdjMgbGF1bmNoZWQgd2l0aCBvbmx5IGAuaGlkZS10ZXh0KClgLCBidXQgcGVyIG91ciBwYXR0ZXJuIGZvclxuLy8gbWl4aW5zIGJlaW5nIHJldXNlZCBhcyBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhpcyBkb2Vzbid0IGhvbGQgdXAuIEFzXG4vLyBvZiB2My4wLjEgd2UgaGF2ZSBhZGRlZCBgLnRleHQtaGlkZSgpYCBhbmQgZGVwcmVjYXRlZCBgLmhpZGUtdGV4dCgpYC5cbi8vXG4vLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2NvbW1pdC9hYTAzOTZlYWU3NTdcblxuLy8gRGVwcmVjYXRlZCBhcyBvZiB2My4wLjEgKHdpbGwgYmUgcmVtb3ZlZCBpbiB2NClcbkBtaXhpbiBoaWRlLXRleHQoKSB7XG4gIGZvbnQ6IDAvMCBhO1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHRleHQtc2hhZG93OiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xufVxuXG4vLyBOZXcgbWl4aW4gdG8gdXNlIGFzIG9mIHYzLjAuMVxuQG1peGluIHRleHQtaGlkZSgpIHtcbiAgQGluY2x1ZGUgaGlkZS10ZXh0O1xufVxuIiwiLy9cbi8vIFJlc3BvbnNpdmU6IFV0aWxpdHkgY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBJRTEwIGluIFdpbmRvd3MgKFBob25lKSA4XG4vL1xuLy8gU3VwcG9ydCBmb3IgcmVzcG9uc2l2ZSB2aWV3cyB2aWEgbWVkaWEgcXVlcmllcyBpcyBraW5kIG9mIGJvcmtlZCBpbiBJRTEwLCBmb3Jcbi8vIFN1cmZhY2UvZGVza3RvcCBpbiBzcGxpdCB2aWV3IGFuZCBmb3IgV2luZG93cyBQaG9uZSA4LiBUaGlzIHBhcnRpY3VsYXIgZml4XG4vLyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgc25pcHBldCBvZiBKYXZhU2NyaXB0IHRvIHNuaWZmIHRoZSB1c2VyIGFnZW50IGFuZFxuLy8gYXBwbHkgc29tZSBjb25kaXRpb25hbCBDU1MgdG8gKm9ubHkqIHRoZSBTdXJmYWNlL2Rlc2t0b3AgV2luZG93cyA4LiBMb29rIGF0XG4vLyBvdXIgR2V0dGluZyBTdGFydGVkIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBidWcuXG4vL1xuLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZm9sbG93aW5nOlxuLy9cbi8vIElzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEwNDk3XG4vLyBEb2NzOiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9nZXR0aW5nLXN0YXJ0ZWQvI3N1cHBvcnQtaWUxMC13aWR0aFxuLy8gU291cmNlOiBodHRwOi8vdGlta2FkbGVjLmNvbS8yMDEzLzAxL3dpbmRvd3MtcGhvbmUtOC1hbmQtZGV2aWNlLXdpZHRoL1xuLy8gU291cmNlOiBodHRwOi8vdGlta2FkbGVjLmNvbS8yMDEyLzEwL2llMTAtc25hcC1tb2RlLWFuZC1yZXNwb25zaXZlLWRlc2lnbi9cblxuQGF0LXJvb3Qge1xuICBALW1zLXZpZXdwb3J0IHtcbiAgICB3aWR0aDogZGV2aWNlLXdpZHRoO1xuICB9XG59XG5cblxuLy8gVmlzaWJpbGl0eSB1dGlsaXRpZXNcbi8vIE5vdGU6IERlcHJlY2F0ZWQgLnZpc2libGUteHMsIC52aXNpYmxlLXNtLCAudmlzaWJsZS1tZCwgYW5kIC52aXNpYmxlLWxnIGFzIG9mIHYzLjIuMFxuXG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUteHMnKTtcbkBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcudmlzaWJsZS1zbScpO1xuQGluY2x1ZGUgcmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoJy52aXNpYmxlLW1kJyk7XG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUtbGcnKTtcblxuLnZpc2libGUteHMtYmxvY2ssXG4udmlzaWJsZS14cy1pbmxpbmUsXG4udmlzaWJsZS14cy1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1zbS1ibG9jayxcbi52aXNpYmxlLXNtLWlubGluZSxcbi52aXNpYmxlLXNtLWlubGluZS1ibG9jayxcbi52aXNpYmxlLW1kLWJsb2NrLFxuLnZpc2libGUtbWQtaW5saW5lLFxuLnZpc2libGUtbWQtaW5saW5lLWJsb2NrLFxuLnZpc2libGUtbGctYmxvY2ssXG4udmlzaWJsZS1sZy1pbmxpbmUsXG4udmlzaWJsZS1sZy1pbmxpbmUtYmxvY2sge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLXhzJyk7XG59XG4udmlzaWJsZS14cy1ibG9jayB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXhzLWlubGluZSB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAkc2NyZWVuLXhzLW1heCkge1xuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS14cy1pbmxpbmUtYmxvY2sge1xuICBAbWVkaWEgKG1heC13aWR0aDogJHNjcmVlbi14cy1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1zbS1taW4pIGFuZCAobWF4LXdpZHRoOiAkc2NyZWVuLXNtLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLXNtJyk7XG59XG4udmlzaWJsZS1zbS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tc20tbWF4KSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtc20taW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1zbS1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtc20taW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tc20tbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1zbS1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiAkc2NyZWVuLW1kLW1heCkge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLXZpc2liaWxpdHkoJy52aXNpYmxlLW1kJyk7XG59XG4udmlzaWJsZS1tZC1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tbWQtbWF4KSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbWQtaW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1tZC1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbWQtaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbWQtbWluKSBhbmQgKG1heC13aWR0aDogJHNjcmVlbi1tZC1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCcudmlzaWJsZS1sZycpO1xufVxuLnZpc2libGUtbGctYmxvY2sge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS1sZy1pbmxpbmUge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJHNjcmVlbi1sZy1taW4pIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbGctaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRzY3JlZW4tbGctbWluKSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6ICRzY3JlZW4teHMtbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLXhzJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tc20tbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLXNtJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6ICRzY3JlZW4tbWQtbWF4KSB7XG4gIEBpbmNsdWRlIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCcuaGlkZGVuLW1kJyk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAkc2NyZWVuLWxnLW1pbikge1xuICBAaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLmhpZGRlbi1sZycpO1xufVxuXG5cbi8vIFByaW50IHV0aWxpdGllc1xuLy9cbi8vIE1lZGlhIHF1ZXJpZXMgYXJlIHBsYWNlZCBvbiB0aGUgaW5zaWRlIHRvIGJlIG1peGluLWZyaWVuZGx5LlxuXG4vLyBOb3RlOiBEZXByZWNhdGVkIC52aXNpYmxlLXByaW50IGFzIG9mIHYzLjIuMFxuXG5AaW5jbHVkZSByZXNwb25zaXZlLWludmlzaWJpbGl0eSgnLnZpc2libGUtcHJpbnQnKTtcblxuQG1lZGlhIHByaW50IHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCcudmlzaWJsZS1wcmludCcpO1xufVxuLnZpc2libGUtcHJpbnQtYmxvY2sge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS1wcmludC1pbmxpbmUge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtcHJpbnQtaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuQG1lZGlhIHByaW50IHtcbiAgQGluY2x1ZGUgcmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoJy5oaWRkZW4tcHJpbnQnKTtcbn1cbiIsIi8vIFJlc3BvbnNpdmUgdXRpbGl0aWVzXG5cbi8vXG4vLyBNb3JlIGVhc2lseSBpbmNsdWRlIGFsbCB0aGUgc3RhdGVzIGZvciByZXNwb25zaXZlLXV0aWxpdGllcy5sZXNzLlxuLy8gW2NvbnZlcnRlcl0gJHBhcmVudCBoYWNrXG5AbWl4aW4gcmVzcG9uc2l2ZS12aXNpYmlsaXR5KCRwYXJlbnQpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxuICB0YWJsZSN7JHBhcmVudH0gIHsgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsgfVxuICB0ciN7JHBhcmVudH0gICAgIHsgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7IH1cbiAgdGgjeyRwYXJlbnR9LFxuICB0ZCN7JHBhcmVudH0gICAgIHsgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50OyB9XG59XG5cbi8vIFtjb252ZXJ0ZXJdICRwYXJlbnQgaGFja1xuQG1peGluIHJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCRwYXJlbnQpIHtcbiAgI3skcGFyZW50fSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG4iLCIvKiBcblRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG5Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBib290c3RyYXAtc2VsZWN0XG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS4gKi9cblxuLy8gTWl4aW5zXG5AbWl4aW4gY3Vyc29yLWRpc2FibGVkKCkge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4vLyBSdWxlc1xuLmJvb3RzdHJhcC1zZWxlY3Qge1xuICAvKndpZHRoOiAyMjBweFxcOTsgSUU4IGFuZCBiZWxvdyovXG4gIC8vbm9pbnNwZWN0aW9uIENzc1Nob3J0aGFuZFByb3BlcnR5VmFsdWVcbiAgd2lkdGg6IDIyMHB4IFxcMDsgLypJRTkgYW5kIGJlbG93Ki9cblxuICAvLyBUaGUgc2VsZWN0cGlja2VyIGJ1dHRvblxuICA+IC5idG4ge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDBweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAyNXB4O1xuICB9XG5cbiAgLy8gRXJyb3IgZGlzcGxheVxuICAuZXJyb3IgJiAuYnRuIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkY29sb3ItcmVkLWVycm9yO1xuICB9XG5cbiAgLy8gRXJyb3IgZGlzcGxheVxuICAuY29udHJvbC1ncm91cC5lcnJvciAmIC5kcm9wZG93bi10b2dnbGUge1xuICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLXJlZC1lcnJvcjtcbiAgfVxuXG4gICYuZml0LXdpZHRoIHtcbiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50O1xuICB9XG5cbiAgJjpub3QoW2NsYXNzKj1cImNvbC1cIl0pOm5vdChbY2xhc3MqPVwiZm9ybS1jb250cm9sXCJdKTpub3QoLmlucHV0LWdyb3VwLWJ0bikge1xuICAgIHdpZHRoOiAkd2lkdGgtZGVmYXVsdDtcbiAgfVxuXG4gIC5idG46Zm9jdXMge1xuICAgIG91dGxpbmU6IHRoaW4gZG90dGVkICMzMzMzMzMgIWltcG9ydGFudDtcbiAgICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3IgIWltcG9ydGFudDtcbiAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgfVxufVxuXG4uYm9vdHN0cmFwLXNlbGVjdC5mb3JtLWNvbnRyb2wge1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG5cbiAgJjpub3QoW2NsYXNzKj1cImNvbC1cIl0pIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4vLyBUaGUgc2VsZWN0cGlja2VyIGNvbXBvbmVudHNcbi5ib290c3RyYXAtc2VsZWN0LmJ0bi1ncm91cCB7XG4gICY6bm90KC5pbnB1dC1ncm91cC1idG4pLFxuICAmW2NsYXNzKj1cImNvbC1cIl0ge1xuICAgIGZsb2F0OiBub25lO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxuXG4gIC8vIEZvcmNlcyB0aGUgcHVsbCB0byB0aGUgcmlnaHQsIGlmIG5lY2Vzc2FyeVxuICAmLFxuICAmW2NsYXNzKj1cImNvbC1cIl0sXG4gIC5yb3ctZmx1aWQgJltjbGFzcyo9XCJjb2wtXCJdIHtcbiAgICAmLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICAgICAgZmxvYXQ6IHJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC5mb3JtLXNlYXJjaCAmLFxuICAuZm9ybS1pbmxpbmUgJixcbiAgLmZvcm0taG9yaXpvbnRhbCAmLFxuICAuZm9ybS1ncm91cCAmIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG5cbiAgLmZvcm0tZ3JvdXAtbGcgICYuZm9ybS1jb250cm9sLFxuICAuZm9ybS1ncm91cC1zbSAgJi5mb3JtLWNvbnRyb2wge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAvLyBTZXQgdGhlIHdpZHRoIG9mIHRoZSBsaXZlIHNlYXJjaCAoYW5kIGFueSBvdGhlciBmb3JtIGNvbnRyb2wgd2l0aGluIGFuIGlubGluZSBmb3JtKVxuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbHZpb21vcmV0by9ib290c3RyYXAtc2VsZWN0L2lzc3Vlcy82ODVcbiAgLmZvcm0taW5saW5lICYgLmZvcm0tY29udHJvbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAuaW5wdXQtYXBwZW5kICYge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICB9XG5cbiAgLmlucHV0LXByZXBlbmQgJiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMXB4O1xuICB9XG5cbiAgPiAuZGlzYWJsZWQge1xuICAgIEBpbmNsdWRlIGN1cnNvci1kaXNhYmxlZDtcblxuICAgICY6Zm9jdXMge1xuICAgICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBzZWxlY3RwaWNrZXIgYnV0dG9uXG4gIC5idG4ge1xuICAgIC5maWx0ZXItb3B0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgfVxuXG4gICAgLmNhcmV0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiA0MHB4O1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICRidG4tZGVmYXVsdC1ib3JkZXI7XG4gICAgICBoZWlnaHQ6IDM4cHg7XG4gICAgfVxuXG4gICAgLmNhcmV0OmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFxmMDc4JztcbiAgICAgIGZvbnQtZmFtaWx5OiBcIkZvbnRBd2Vzb21lXCI7XG4gICAgICBmb250LXNpemU6IDE1cHg7XG4gICAgICBjb2xvcjogIzY2NjY2NjtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGxlZnQ6IDEycHg7XG4gICAgICB0b3A6IDlweDtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmNhcmV0IHtcbiAgICAgIGJvcmRlci1jb2xvcjogZGFya2VuKCRidG4tZGVmYXVsdC1ib3JkZXIsIDEyJSk7XG4gICAgfVxuXG4gICAgJjpmb2N1cyAuY2FyZXQge1xuICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oJGJ0bi1kZWZhdWx0LWJvcmRlciwgMjUlKTtcbiAgICB9XG5cbiAgfVxuXG4gICZbY2xhc3MqPVwiY29sLVwiXSAuYnRuIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC8vIFRoZSBzZWxlY3RwaWNrZXIgZHJvcGRvd25cbiAgLmRyb3Bkb3duLW1lbnUge1xuICAgIG1pbi13aWR0aDogMTAwJTtcbiAgICB6LWluZGV4OiAkemluZGV4LXNlbGVjdC1kcm9wZG93bjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG4gICAgJi5pbm5lciB7XG4gICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cblxuICAgIGxpIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICAgJjpub3QoLmRpc2FibGVkKSBhOmhvdmVyIHNtYWxsLFxuICAgICAgJjpub3QoLmRpc2FibGVkKSBhOmZvY3VzIHNtYWxsLFxuICAgICAgJi5hY3RpdmU6bm90KC5kaXNhYmxlZCkgYSBzbWFsbCB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItYmx1ZS1ob3ZlcjtcbiAgICAgICAgY29sb3I6IGZhZGUoJGNvbG9yLWJsdWUtaG92ZXIsIDQwJSk7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQgYSB7XG4gICAgICAgIEBpbmNsdWRlIGN1cnNvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgYSB7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgICAgICAmLm9wdCB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHBhZGRpbmctbGVmdDogMi4yNWVtO1xuICAgICAgICB9XG5cbiAgICAgICAgc3Bhbi5jaGVjay1tYXJrIHtcbiAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4udGV4dCB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNtYWxsIHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAwLjVlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubm90aWZ5IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJvdHRvbTogNXB4O1xuICAgICAgd2lkdGg6IDk2JTtcbiAgICAgIG1hcmdpbjogMCAyJTtcbiAgICAgIG1pbi1oZWlnaHQ6IDI2cHg7XG4gICAgICBwYWRkaW5nOiAzcHggNXB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiKDI0NSwgMjQ1LCAyNDUpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIyNywgMjI3LCAyMjcpO1xuICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IGZhZGUocmdiKDAsIDAsIDApLCA1JSk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIG9wYWNpdHk6IDAuOTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICB9XG5cbiAgLm5vLXJlc3VsdHMge1xuICAgIHBhZGRpbmc6IDNweDtcbiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xuICAgIG1hcmdpbjogMCA1cHg7XG4gIH1cblxuICAmLmZpdC13aWR0aCAuYnRuIHtcbiAgICAuZmlsdGVyLW9wdGlvbiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgIH1cblxuICAgIC5jYXJldCB7XG4gICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgICAgdG9wOiBhdXRvO1xuICAgICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICB9XG4gIH1cblxuICAmLnNob3ctdGljayAuZHJvcGRvd24tbWVudSBsaSB7XG4gICAgJi5zZWxlY3RlZCBhIHNwYW4uY2hlY2stbWFyayB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICByaWdodDogMTVweDtcbiAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG5cbiAgICBhIHNwYW4udGV4dCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDM0cHg7XG4gICAgfVxuICB9XG59XG5cbi5ib290c3RyYXAtc2VsZWN0LnNob3ctbWVudS1hcnJvdyB7XG4gICYub3BlbiA+IC5idG4ge1xuICAgIHotaW5kZXg6ICR6aW5kZXgtc2VsZWN0LWRyb3Bkb3duICsgMTtcbiAgfVxuXG4gIC5kcm9wZG93bi10b2dnbGUge1xuICAgICY6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgYm9yZGVyLWxlZnQ6IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlci1yaWdodDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyLWJvdHRvbS13aWR0aDogN3B4O1xuICAgICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7XG4gICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkY29sb3ItZ3JleS1hcnJvdztcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGZhZGUoJGNvbG9yLWdyZXktYXJyb3csIDIwJSk7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IC00cHg7XG4gICAgICBsZWZ0OiA5cHg7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBib3JkZXItbGVmdDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgd2hpdGU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IC00cHg7XG4gICAgICBsZWZ0OiAxMHB4O1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cblxuICAmLmRyb3B1cCAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBib3R0b206IGF1dG87XG4gICAgICB0b3A6IC0zcHg7XG4gICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgYm9yZGVyLXRvcC13aWR0aDogN3B4O1xuICAgICAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAkY29sb3ItZ3JleS1hcnJvdztcbiAgICAgIGJvcmRlci10b3AtY29sb3I6IGZhZGUoJGNvbG9yLWdyZXktYXJyb3csIDIwJSk7XG4gICAgfVxuXG4gICAgJjphZnRlciB7XG4gICAgICBib3R0b206IGF1dG87XG4gICAgICB0b3A6IC0zcHg7XG4gICAgICBib3JkZXItdG9wOiA2cHggc29saWQgd2hpdGU7XG4gICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gICYucHVsbC1yaWdodCAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICByaWdodDogMTJweDtcbiAgICAgIGxlZnQ6IGF1dG87XG4gICAgfVxuXG4gICAgJjphZnRlciB7XG4gICAgICByaWdodDogMTNweDtcbiAgICAgIGxlZnQ6IGF1dG87XG4gICAgfVxuICB9XG5cbiAgJi5vcGVuID4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gICAgJjpiZWZvcmUsXG4gICAgJjphZnRlciB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIH1cbn1cblxuLmJvb3RzdHJhcC1zZWxlY3QuYnRuLWdyb3VwLm9wZW4ge1xuXG4gICAgLmJ0biAuY2FyZXQge1xuICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IGRhcmtlbigkYnRuLWRlZmF1bHQtYm9yZGVyLCAxMiUpO1xuICAgIH1cblxuICAgIC5idG46aG92ZXIgLmNhcmV0IHtcbiAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBkYXJrZW4oJGJ0bi1kZWZhdWx0LWJvcmRlciwgMjUlKTtcbiAgICB9XG5cbn1cblxuLmJzLXNlYXJjaGJveCxcbi5icy1hY3Rpb25zYm94IHtcbiAgcGFkZGluZzogNHB4IDhweDtcbn1cblxuLmJzLWFjdGlvbnNib3gge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgJiAuYnRuLWdyb3VwIGJ1dHRvbiB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxufVxuXG4uYnMtc2VhcmNoYm94IHtcbiAgJiArIC5icy1hY3Rpb25zYm94IHtcbiAgICBwYWRkaW5nOiAwIDhweCA0cHg7XG4gIH1cblxuICAmIGlucHV0LmZvcm0tY29udHJvbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4ubW9iaWxlLWRldmljZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG4gIG9wYWNpdHk6IDA7XG59XG4iLCIubG9naW4tYXJlYSB7XG4gICAgbWFyZ2luOiA5MHB4IGF1dG8gMDtcbiAgICB3aWR0aDogMzAwcHg7XG5cbiAgICAuYnRuLWxvZ2luIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICAgIGZsb2F0OiBub25lO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA1MHB4OyBcbiAgICB9XG5cbiAgICAuY29sLW1kLTEyLCAuY29sLWxnLTEyIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmJvb3RzdHJhcC1zZWxlY3QsXG4gICAgLnNlbGVjdHBpY2tlciB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbGlnaHQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNwdDtcbiAgICB9XG5cbiAgICAuZHJvcGRvd24tdG9nZ2xlLnNlbGVjdHBpY2tlciB7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXA6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgfVxuXG59XG4iLCIudG9vbGJhciB7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogJG5hdmJhci1kZWZhdWx0LWJnO1xuXG4gICAgLnRvb2xzIHtcbiAgICAgICAgaGVpZ2h0OiA0MHB4O1xuICAgIH1cblxuICAgIGEge1xuICAgICAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWFsdGVybmF0ZTtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBjb2xvcjogJGhpZ2hsaWdodHMtY29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgZm9udC1zaXplOiAxM3B0O1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgICBwYWRkaW5nOiA2cHggMDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDUwcHg7XG4gICAgfVxuXG4gICAgc3BhbiwgLmZhIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXG4gICAgfVxuXG4gICAgLmZhIHtcbiAgICAgICAgZm9udC1zaXplOiAyNHB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgfVxuXG59XG5cbkBlYWNoICRwYWdlLCAkYmdjb2xvciBpbiAkY29sb3JzIHtcblxuIyN7JHBhZ2V9LXJvb3QtY29udGFpbmVyIC50b29sYmFyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRiZ2NvbG9yICFpbXBvcnRhbnQ7XG4gICAgfVxufSIsIi5idG4ge1xuICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktYmFzZTtcbiAgICBmb250LXNpemU6IDEzcHQ7XG59XG5cbi5idG4tbG9naW4ge1xuICBAaW5jbHVkZSBidXR0b24tdmFyaWFudCgkYnRuLWxvZ2luLWNvbG9yLCAkYnRuLWxvZ2luLWJnLCAkYnRuLWxvZ2luLWJvcmRlcik7XG59IiwiLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuLmRpYWxvZy1ib3JkZXItZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jbGlwOiBib3JkZXItYm94O1xuICAgIGJvcmRlcjogNnB4IHNvbGlkIHJnYmEoMTcwLDE3MCwxNzAsMC4zKTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG59XG5cbi5kaWFsb2ctY29udGFpbmVyIHtcbiAgICBib3JkZXI6IDNweCBzb2xpZCAjOTk5OTk5O1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLXRpdGxlIHtcbiAgICBoZWlnaHQ6IDYwcHg7XG4gICAgcGFkZGluZzogMjBweCAwIDIwcHggMjBweDtcbiAgICBtYXJnaW46IDA7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgZm9udC1zaXplOiAyN3B4O1xuICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbGlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IDMwMCAhaW1wb3J0YW50O1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWJvZHkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1mb290ZXIge1xuICAgIGhlaWdodDogNTBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA4QUJGO1xufVxuXG4uZGlhbG9nLWNvbnRhaW5lciAuZGlhbG9nLWZvb3RlciAuZGlhbG9nLWJ1dHRvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHdpZHRoOiA3NXB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBsaW5lLWhlaWdodDogMzBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRpYWxvZy1jb250YWluZXIgLmRpYWxvZy1mb290ZXIgLmRpYWxvZy1idXR0b246aG92ZXJ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUVFRTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59IiwiLypcbiogUHJvamVjdCBLaW1jaGlcbipcbiogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxNVxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuXG4vL1xuLy8gTWVudS1GbGF0IERyb3AtRG93blxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRHJvcGRvd24gYXJyb3cvY2FyZXRcblxuLm1lbnUtZmxhdCB7XG5cbiAgICAuYnRuIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGtpbWNoaS1kcm9wZG93biAhaW1wb3J0YW50O1xuICAgICAgICBtaW4td2lkdGg6IDE2MHB4O1xuICAgICAgICBib3JkZXI6IDAgIWltcG9ydGFudDtcbiAgICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1ib2xkO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6ICRmb250LXNpemUtYnRuO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICAgICAgcGFkZGluZzogNHB4IDQ1cHggNXB4IDM4cHg7XG5cbiAgICAgICAgJiA+IGkge1xuICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gICAgICAgIHdpZHRoOiAyNnB4O1xuICAgICAgICBoZWlnaHQ6IDQwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbGVmdDogNnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgJiA+IGk6YmVmb3JlIHtcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAuY2FyZXQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDQwcHg7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3JkZXItdG9wOiAwIFxcOTtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgYm9yZGVyLWxlZnQ6IDA7XG5cbiAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBcImZvbnRlbGxvXCI7XG4gICAgICAgICAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICAgICAgc3BlYWs6IG5vbmU7XG4gICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XG4gICAgICAgICAgICB3aWR0aDogMS4yZW07XG4gICAgICAgICAgICBoZWlnaHQ6IDEuMmVtO1xuICAgICAgICAgICAgbWFyZ2luOiAuNWVtO1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgZm9udC12YXJpYW50OiBub3JtYWw7XG4gICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyZW07XG4gICAgICAgICAgICBjb250ZW50OiAnXFxlODYxJztcbiAgICAgIH1cblxuICAgIH1cblxuXG5cbiAgICAvLyBUaGUgZHJvcGRvd24gd3JhcHBlciAoZGl2KVxuICAgICYuZHJvcHVwLFxuICAgICYuZHJvcGRvd24ge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgdGhlIGZvY3VzIG9uIHRoZSBkcm9wZG93biB0b2dnbGUgd2hlbiBjbG9zaW5nIGRyb3Bkb3duc1xuICAgIC5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICAgICAgb3V0bGluZTogMDtcbiAgICB9XG5cbiAgICAvLyBUaGUgZHJvcGRvd24gbWVudSAodWwpXG4gICAgLmRyb3Bkb3duLW1lbnUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAxMDAlO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHotaW5kZXg6ICR6aW5kZXgtZHJvcGRvd247XG4gICAgICBkaXNwbGF5OiBub25lOyAvLyBub25lIGJ5IGRlZmF1bHQsIGJ1dCBibG9jayBvbiBcIm9wZW5cIiBvZiB0aGUgbWVudVxuICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICBtaW4td2lkdGg6IDE2MHB4O1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDsgLy8gb3ZlcnJpZGUgZGVmYXVsdCB1bFxuICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1idG47XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0OyAvLyBFbnN1cmVzIHByb3BlciBhbGlnbm1lbnQgaWYgcGFyZW50IGhhcyBpdCBjaGFuZ2VkIChlLmcuLCBtb2RhbCBmb290ZXIpXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWJnO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSAhaW1wb3J0YW50KTtcbiAgICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG5cbiAgICAgICAgICAvLyBBbGlnbnMgdGhlIGRyb3Bkb3duIG1lbnUgdG8gcmlnaHRcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIERlcHJlY2F0ZWQgYXMgb2YgMy4xLjAgaW4gZmF2b3Igb2YgYC5kcm9wZG93bi1tZW51LVtkaXJdYFxuICAgICAgICAgICYucHVsbC1yaWdodCB7XG4gICAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGl2aWRlcnMgKGJhc2ljYWxseSBhbiBocikgd2l0aGluIHRoZSBkcm9wZG93blxuICAgICAgICAgIC5kaXZpZGVyIHtcbiAgICAgICAgICAgIEBpbmNsdWRlIG5hdi1kaXZpZGVyKCRtZW51LWZsYXQtZHJvcGRvd24tZGl2aWRlci1iZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgICAgICAvL2JvcmRlci10b3A6IDFweCBzb2xpZCAkbWVudS1mbGF0LWRyb3Bkb3duLWRpdmlkZXItYmc7XG4gICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJG1lbnUtZmxhdC1kcm9wZG93bi1ib3JkZXI7XG4gICAgICAgICAgICBAaW5jbHVkZSBib3gtc2hhZG93KGluc2V0IDBweCAxcHggMHB4IDBweCAkbWVudS1mbGF0LWRyb3Bkb3duLWRpdmlkZXItYmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgID4gbGk6Zmlyc3QtY2hpbGQgPiBhIHtcbiAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkbWVudS1mbGF0LWRyb3Bkb3duLWJnO1xuICAgICAgICAgICAgQGluY2x1ZGUgYm94LXNoYWRvdyhub25lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICA+IGxpLmNyaXRpY2FsOmxhc3QtY2hpbGQgPiBhIHtcbiAgICAgICAgICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTGlua3Mgd2l0aGluIHRoZSBkcm9wZG93biBtZW51XG4gICAgICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICBwYWRkaW5nOiA0cHggNnB4O1xuICAgICAgICAgICAgY2xlYXI6IGJvdGg7XG4gICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodC1tZW51LWZsYXQ7XG4gICAgICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC10ZXh0O1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLy8gcHJldmVudCBsaW5rcyBmcm9tIHJhbmRvbWx5IGJyZWFraW5nIG9udG8gbmV3IGxpbmVzXG5cbiAgICAgICAgICAgICAgICA+IGkge1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI2cHg7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjZweDtcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIb3Zlci9Gb2N1cyBzdGF0ZVxuICAgIC5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIHN0YXRlXG4gICAgLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJG1lbnUtZmxhdC1kcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWVudS1mbGF0LWRyb3Bkb3duLWxpbmstYWN0aXZlLWJnO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgLmRyb3Bkb3duLW1lbnUgPiBsaS5jcml0aWNhbCA+IGEge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkbWVudS1mbGF0LWRyb3Bkb3duLWNyaXRpY2FsLWJnO1xuICAgIH1cblxuICAgIC8vIERpc2FibGVkIHN0YXRlXG4gICAgLy9cbiAgICAvLyBHcmF5IG91dCB0ZXh0IGFuZCBlbnN1cmUgdGhlIGhvdmVyL2ZvY3VzIHN0YXRlIHJlbWFpbnMgZ3JheVxuXG4gICAgLmRyb3Bkb3duLW1lbnUgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkZHJvcGRvd24tbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLy8gTnVrZSBob3Zlci9mb2N1cyBlZmZlY3RzXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlbW92ZSBDU1MgZ3JhZGllbnRcbiAgICAgICAgQGluY2x1ZGUgcmVzZXQtZmlsdGVyO1xuICAgICAgICBjdXJzb3I6ICRjdXJzb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3BlbiBzdGF0ZSBmb3IgdGhlIGRyb3Bkb3duXG4gICAgJi5vcGVuIHtcblxuICAgICAgICAuYnRuIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNob3cgdGhlIG1lbnVcbiAgICAgID4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cblxuICAgICAgLmNhcmV0IHtcbiAgICAgICAgYmFja2dyb3VuZDogIzNhMzkzYjtcbiAgICAgIH1cblxuICAgICAgLmNhcmV0OmJlZm9yZSB7XG4gICAgICAgIGNvbnRlbnQ6ICdcXGU4NjQnO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgdGhlIG91dGxpbmUgd2hlbiA6Zm9jdXMgaXMgdHJpZ2dlcmVkXG4gICAgICA+IGEge1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgfVxuICAgIH1cblxufVxuXG4vLyBNZW51IHBvc2l0aW9uaW5nXG4vL1xuLy8gQWRkIGV4dHJhIGNsYXNzIHRvIGAuZHJvcGRvd24tbWVudWAgdG8gZmxpcCB0aGUgYWxpZ25tZW50IG9mIHRoZSBkcm9wZG93blxuLy8gbWVudSB3aXRoIHRoZSBwYXJlbnQuXG4uZHJvcGRvd24tbWVudS1yaWdodCB7XG4gIGxlZnQ6IGF1dG87IC8vIFJlc2V0IHRoZSBkZWZhdWx0IGZyb20gYC5kcm9wZG93bi1tZW51YFxuICByaWdodDogMDtcbn1cbi8vIFdpdGggdjMsIHdlIGVuYWJsZWQgYXV0by1mbGlwcGluZyBpZiB5b3UgaGF2ZSBhIGRyb3Bkb3duIHdpdGhpbiBhIHJpZ2h0XG4vLyBhbGlnbmVkIG5hdiBjb21wb25lbnQuIFRvIGVuYWJsZSB0aGUgdW5kb2luZyBvZiB0aGF0LCB3ZSBwcm92aWRlIGFuIG92ZXJyaWRlXG4vLyB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRyb3Bkb3duIG1lbnUgYWxpZ25tZW50LlxuLy9cbi8vIFRoaXMgaXMgb25seSBmb3IgbGVmdC1hbGlnbmluZyBhIGRyb3Bkb3duIG1lbnUgd2l0aGluIGEgYC5uYXZiYXItcmlnaHRgIG9yXG4vLyBgLnB1bGwtcmlnaHRgIG5hdiBjb21wb25lbnQuXG4uZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IGF1dG87XG59XG5cbi8vIERyb3Bkb3duIHNlY3Rpb24gaGVhZGVyc1xuLmRyb3Bkb3duLWhlYWRlciB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAzcHggMjBweDtcbiAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiAkZHJvcGRvd24taGVhZGVyLWNvbG9yO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwOyAvLyBhcyB3aXRoID4gbGkgPiBhXG59XG5cbi8vIEJhY2tkcm9wIHRvIGNhdGNoIGJvZHkgY2xpY2tzIG9uIG1vYmlsZSwgZXRjLlxuLmRyb3Bkb3duLWJhY2tkcm9wIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICB0b3A6IDA7XG4gIHotaW5kZXg6ICgkemluZGV4LWRyb3Bkb3duIC0gMTApO1xufVxuXG4vLyBSaWdodCBhbGlnbmVkIGRyb3Bkb3duc1xuLnB1bGwtcmlnaHQgPiAuZHJvcGRvd24tbWVudSB7XG4gIHJpZ2h0OiAwO1xuICBsZWZ0OiBhdXRvO1xufVxuXG4vLyBBbGxvdyBmb3IgZHJvcGRvd25zIHRvIGdvIGJvdHRvbSB1cCAoYWthLCBkcm9wdXAtbWVudSlcbi8vXG4vLyBKdXN0IGFkZCAuZHJvcHVwIGFmdGVyIHRoZSBzdGFuZGFyZCAuZHJvcGRvd24gY2xhc3MgYW5kIHlvdSdyZSBzZXQsIGJyby5cbi8vIFRPRE86IGFic3RyYWN0IHRoaXMgc28gdGhhdCB0aGUgbmF2YmFyIGZpeGVkIHN0eWxlcyBhcmUgbm90IHBsYWNlZCBoZXJlP1xuXG4uZHJvcHVwLFxuLm5hdmJhci1maXhlZC1ib3R0b20gLmRyb3Bkb3duIHtcbiAgLy8gUmV2ZXJzZSB0aGUgY2FyZXRcbiAgLmNhcmV0IHtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJvcmRlci1ib3R0b206ICRjYXJldC13aWR0aC1iYXNlIGRhc2hlZDtcbiAgICBib3JkZXItYm90dG9tOiAkY2FyZXQtd2lkdGgtYmFzZSBzb2xpZCBcXDk7IC8vIElFOFxuICAgIGNvbnRlbnQ6IFwiXCI7XG4gIH1cbiAgLy8gRGlmZmVyZW50IHBvc2l0aW9uaW5nIGZvciBib3R0b20gdXAgbWVudVxuICAuZHJvcGRvd24tbWVudSB7XG4gICAgdG9wOiBhdXRvO1xuICAgIGJvdHRvbTogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gIH1cbn1cblxuXG4vLyBDb21wb25lbnQgYWxpZ25tZW50XG4vL1xuLy8gUmVpdGVyYXRlIHBlciBuYXZiYXIubGVzcyBhbmQgdGhlIG1vZGlmaWVkIGNvbXBvbmVudCBhbGlnbm1lbnQgdGhlcmUuXG5cbkBtZWRpYSAobWluLXdpZHRoOiAkZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gIC5uYXZiYXItcmlnaHQge1xuICAgIC5kcm9wZG93bi1tZW51IHtcbiAgICAgIHJpZ2h0OiAwOyBsZWZ0OiBhdXRvO1xuICAgIH1cbiAgICAvLyBOZWNlc3NhcnkgZm9yIG92ZXJyaWRlcyBvZiB0aGUgZGVmYXVsdCByaWdodCBhbGlnbmVkIG1lbnUuXG4gICAgLy8gV2lsbCByZW1vdmUgY29tZSB2NCBpbiBhbGwgbGlrZWxpaG9vZC5cbiAgICAuZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgICAgIGxlZnQ6IDA7IHJpZ2h0OiBhdXRvO1xuICAgIH1cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9
*/
\ No newline at end of file
diff --git a/ui/src/dist/libs/themes/base/jquery-ui.css
b/ui/src/dist/libs/themes/base/jquery-ui.css
new file mode 100644
index 0000000..975aa1b
--- /dev/null
+++ b/ui/src/dist/libs/themes/base/jquery-ui.css
@@ -0,0 +1,1225 @@
+/*! jQuery UI - v1.11.3 - 2015-02-12
+*
http://jqueryui.com
+* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css,
dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css,
selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit
http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif...
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see
h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image:
url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 2em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background:
url("data:image/gif;base64,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");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position:
relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Arial,Helvetica,sans-serif;
+ font-size: 1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Arial,Helvetica,sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #dddddd;
+ background: #ffffff;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #dddddd;
+ background: #e9e9e9;
+ color: #333333;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #333333;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #c5c5c5;
+ background: #f6f6f6;
+ font-weight: normal;
+ color: #454545;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #454545;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #cccccc;
+ background: #ededed;
+ font-weight: normal;
+ color: #2b2b2b;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #2b2b2b;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #003eff;
+ background: #007fff;
+ font-weight: normal;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #dad55e;
+ background: #fffa90;
+ color: #777620;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #777620;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #f1a899;
+ background: #fddfdf;
+ color: #5f3f3f;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #5f3f3f;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #5f3f3f;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("images/ui-icons_777777_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("images/ui-icons_555555_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("images/ui-icons_ffffff_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("images/ui-icons_777620_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("images/ui-icons_cc0000_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 3px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #aaaaaa;
+ opacity: .3;
+ filter: Alpha(Opacity=30); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: 0px 0 0 0px;
+ padding: 5px;
+ background: #666666;
+ opacity: .3;
+ filter: Alpha(Opacity=30); /* support: IE8 */
+ border-radius: 8px;
+}
diff --git a/ui/src/dist/libs/vendor.js b/ui/src/dist/libs/vendor.js
new file mode 100644
index 0000000..ef0e2ec
--- /dev/null
+++ b/ui/src/dist/libs/vendor.js
@@ -0,0 +1,5523 @@
+/*!
+ *
https://github.com/es-shims/es5-shim
+ * @license es5-shim Copyright 2009-2015 by contributors, MIT License
+ * see
https://github.com/es-shims/es5-shim/blob/master/LICENSE
+ */
+
+// vim: ts=4 sts=4 sw=4 expandtab
+
+// Add semicolon to prevent IIFE from being passed as argument to concatenated code.
+;
+
+// UMD (Universal Module Definition)
+// see
https://github.com/umdjs/umd/blob/master/returnExports.js
+(function (root, factory) {
+ 'use strict';
+
+ /* global define, exports, module */
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory);
+ } else if (typeof exports === 'object') {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like enviroments that support module.exports,
+ // like Node.
+ module.exports = factory();
+ } else {
+ // Browser globals (root is window)
+ root.returnExports = factory();
+ }
+}(this, function () {
+
+/**
+ * Brings an environment as close to ECMAScript 5 compliance
+ * as is possible with the facilities of erstwhile engines.
+ *
+ * Annotated ES5:
http://es5.github.com/ (specific links below)
+ * ES5 Spec:
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
+ * Required reading:
http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-nat...
+ */
+
+// Shortcut to an often accessed properties, in order to avoid multiple
+// dereference that costs universally. This also holds a reference to known-good
+// functions.
+var $Array = Array;
+var ArrayPrototype = $Array.prototype;
+var $Object = Object;
+var ObjectPrototype = $Object.prototype;
+var FunctionPrototype = Function.prototype;
+var $String = String;
+var StringPrototype = $String.prototype;
+var $Number = Number;
+var NumberPrototype = $Number.prototype;
+var array_slice = ArrayPrototype.slice;
+var array_splice = ArrayPrototype.splice;
+var array_push = ArrayPrototype.push;
+var array_unshift = ArrayPrototype.unshift;
+var array_concat = ArrayPrototype.concat;
+var call = FunctionPrototype.call;
+var max = Math.max;
+var min = Math.min;
+
+// Having a toString local variable name breaks in Opera so use to_string.
+var to_string = ObjectPrototype.toString;
+
+var hasToStringTag = typeof Symbol === 'function' && typeof
Symbol.toStringTag === 'symbol';
+var isCallable; /* inlined from
https://npmjs.com/is-callable */ var fnToStr =
Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try {
fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object
Function]', genClass = '[object GeneratorFunction]'; isCallable = function
isCallable(value) { if (typeof value !== 'function') { return false; } if
(hasToStringTag) { return tryFunctionObject(value); } var strClass =
to_string.call(value); return strClass === fnClass || strClass === genClass; };
+var isRegex; /* inlined from
https://npmjs.com/is-regex */ var regexExec =
RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try {
regexExec.call(value); return true; } catch (e) { return false; } }, regexClass =
'[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !==
'object') { return false; } return hasToStringTag ? tryRegexExec(value) :
to_string.call(value) === regexClass; };
+var isString; /* inlined from
https://npmjs.com/is-string */ var strValue =
String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try {
strValue.call(value); return true; } catch (e) { return false; } }, stringClass =
'[object String]'; isString = function isString(value) { if (typeof value ===
'string') { return true; } if (typeof value !== 'object') { return false;
} return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass;
};
+
+/* inlined from
http://npmjs.com/define-properties */
+var defineProperties = (function (has) {
+ var supportsDescriptors = $Object.defineProperty && (function () {
+ try {
+ var obj = {};
+ $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
+ for (var _ in obj) { return false; }
+ return obj.x === obj;
+ } catch (e) { /* this is ES3 */
+ return false;
+ }
+ }());
+
+ // Define configurable, writable and non-enumerable props
+ // if they don't exist.
+ var defineProperty;
+ if (supportsDescriptors) {
+ defineProperty = function (object, name, method, forceAssign) {
+ if (!forceAssign && (name in object)) { return; }
+ $Object.defineProperty(object, name, {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: method
+ });
+ };
+ } else {
+ defineProperty = function (object, name, method, forceAssign) {
+ if (!forceAssign && (name in object)) { return; }
+ object[name] = method;
+ };
+ }
+ return function defineProperties(object, map, forceAssign) {
+ for (var name in map) {
+ if (has.call(map, name)) {
+ defineProperty(object, name, map[name], forceAssign);
+ }
+ }
+ };
+}(ObjectPrototype.hasOwnProperty));
+
+//
+// Util
+// ======
+//
+
+/* replaceable with
https://npmjs.com/package/es-abstract /helpers/isPrimitive */
+var isPrimitive = function isPrimitive(input) {
+ var type = typeof input;
+ return input === null || (type !== 'object' && type !==
'function');
+};
+
+var ES = {
+ // ES5 9.4
+ //
http://es5.github.com/#x9.4
+ //
http://jsperf.com/to-integer
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToInteger */
+ ToInteger: function ToInteger(num) {
+ var n = +num;
+ if (n !== n) { // isNaN
+ n = 0;
+ } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
+ n = (n > 0 || -1) * Math.floor(Math.abs(n));
+ }
+ return n;
+ },
+
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToPrimitive */
+ ToPrimitive: function ToPrimitive(input) {
+ var val, valueOf, toStr;
+ if (isPrimitive(input)) {
+ return input;
+ }
+ valueOf = input.valueOf;
+ if (isCallable(valueOf)) {
+ val = valueOf.call(input);
+ if (isPrimitive(val)) {
+ return val;
+ }
+ }
+ toStr = input.toString;
+ if (isCallable(toStr)) {
+ val = toStr.call(input);
+ if (isPrimitive(val)) {
+ return val;
+ }
+ }
+ throw new TypeError();
+ },
+
+ // ES5 9.9
+ //
http://es5.github.com/#x9.9
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToObject */
+ ToObject: function (o) {
+ /* jshint eqnull: true */
+ if (o == null) { // this matches both null and undefined
+ throw new TypeError("can't convert " + o + ' to
object');
+ }
+ return $Object(o);
+ },
+
+ /* replaceable with
https://npmjs.com/package/es-abstract ES5.ToUint32 */
+ ToUint32: function ToUint32(x) {
+ return x >>> 0;
+ }
+};
+
+//
+// Function
+// ========
+//
+
+// ES-5 15.3.4.5
+//
http://es5.github.com/#x15.3.4.5
+
+var Empty = function Empty() {};
+
+defineProperties(FunctionPrototype, {
+ bind: function bind(that) { // .length is 1
+ // 1. Let Target be the this value.
+ var target = this;
+ // 2. If IsCallable(Target) is false, throw a TypeError exception.
+ if (!isCallable(target)) {
+ throw new TypeError('Function.prototype.bind called on incompatible '
+ target);
+ }
+ // 3. Let A be a new (possibly empty) internal list of all of the
+ // argument values provided after thisArg (arg1, arg2 etc), in order.
+ // XXX slicedArgs will stand in for "A" if used
+ var args = array_slice.call(arguments, 1); // for normal call
+ // 4. Let F be a new native ECMAScript object.
+ // 11. Set the [[Prototype]] internal property of F to the standard
+ // built-in Function prototype object as specified in 15.3.3.1.
+ // 12. Set the [[Call]] internal property of F as described in
+ // 15.3.4.5.1.
+ // 13. Set the [[Construct]] internal property of F as described in
+ // 15.3.4.5.2.
+ // 14. Set the [[HasInstance]] internal property of F as described in
+ // 15.3.4.5.3.
+ var bound;
+ var binder = function () {
+
+ if (this instanceof bound) {
+ // 15.3.4.5.2 [[Construct]]
+ // When the [[Construct]] internal method of a function object,
+ // F that was created using the bind function is called with a
+ // list of arguments ExtraArgs, the following steps are taken:
+ // 1. Let target be the value of F's [[TargetFunction]]
+ // internal property.
+ // 2. If target has no [[Construct]] internal method, a
+ // TypeError exception is thrown.
+ // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
+ // property.
+ // 4. Let args be a new list containing the same values as the
+ // list boundArgs in the same order followed by the same
+ // values as the list ExtraArgs in the same order.
+ // 5. Return the result of calling the [[Construct]] internal
+ // method of target providing args as the arguments.
+
+ var result = target.apply(
+ this,
+ array_concat.call(args, array_slice.call(arguments))
+ );
+ if ($Object(result) === result) {
+ return result;
+ }
+ return this;
+
+ } else {
+ // 15.3.4.5.1 [[Call]]
+ // When the [[Call]] internal method of a function object, F,
+ // which was created using the bind function is called with a
+ // this value and a list of arguments ExtraArgs, the following
+ // steps are taken:
+ // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
+ // property.
+ // 2. Let boundThis be the value of F's [[BoundThis]] internal
+ // property.
+ // 3. Let target be the value of F's [[TargetFunction]] internal
+ // property.
+ // 4. Let args be a new list containing the same values as the
+ // list boundArgs in the same order followed by the same
+ // values as the list ExtraArgs in the same order.
+ // 5. Return the result of calling the [[Call]] internal method
+ // of target providing boundThis as the this value and
+ // providing args as the arguments.
+
+ // equiv: target.call(this, ...boundArgs, ...args)
+ return target.apply(
+ that,
+ array_concat.call(args, array_slice.call(arguments))
+ );
+
+ }
+
+ };
+
+ // 15. If the [[Class]] internal property of Target is "Function",
then
+ // a. Let L be the length property of Target minus the length of A.
+ // b. Set the length own property of F to either 0 or L, whichever is
+ // larger.
+ // 16. Else set the length own property of F to 0.
+
+ var boundLength = max(0, target.length - args.length);
+
+ // 17. Set the attributes of the length own property of F to the values
+ // specified in 15.3.5.1.
+ var boundArgs = [];
+ for (var i = 0; i < boundLength; i++) {
+ array_push.call(boundArgs, '$' + i);
+ }
+
+ // XXX Build a dynamic function with desired amount of arguments is the only
+ // way to set the length property of a function.
+ // In environments where Content Security Policies enabled (Chrome extensions,
+ // for ex.) all use of eval or Function costructor throws an exception.
+ // However in all of these environments Function.prototype.bind exists
+ // and so this code will never be executed.
+ bound = Function('binder', 'return function (' +
boundArgs.join(',') + '){ return binder.apply(this, arguments);
}')(binder);
+
+ if (target.prototype) {
+ Empty.prototype = target.prototype;
+ bound.prototype = new Empty();
+ // Clean up dangling references.
+ Empty.prototype = null;
+ }
+
+ // TODO
+ // 18. Set the [[Extensible]] internal property of F to true.
+
+ // TODO
+ // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
+ // 20. Call the [[DefineOwnProperty]] internal method of F with
+ // arguments "caller", PropertyDescriptor {[[Get]]: thrower,
[[Set]]:
+ // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
+ // false.
+ // 21. Call the [[DefineOwnProperty]] internal method of F with
+ // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
+ // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
+ // and false.
+
+ // TODO
+ // NOTE Function objects created using Function.prototype.bind do not
+ // have a prototype property or the [[Code]], [[FormalParameters]], and
+ // [[Scope]] internal properties.
+ // XXX can't delete prototype in pure-js.
+
+ // 22. Return F.
+ return bound;
+ }
+});
+
+// _Please note: Shortcuts are defined after `Function.prototype.bind` as we
+// us it in defining shortcuts.
+var owns = call.bind(ObjectPrototype.hasOwnProperty);
+var toStr = call.bind(ObjectPrototype.toString);
+var strSlice = call.bind(StringPrototype.slice);
+var strSplit = call.bind(StringPrototype.split);
+
+//
+// Array
+// =====
+//
+
+var isArray = $Array.isArray || function isArray(obj) {
+ return toStr(obj) === '[object Array]';
+};
+
+// ES5 15.4.4.12
+//
http://es5.github.com/#x15.4.4.13
+// Return len+argCount.
+// [bugfix, ielt8]
+// IE < 8 bug: [].unshift(0) === undefined but should be "1"
+var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
+defineProperties(ArrayPrototype, {
+ unshift: function () {
+ array_unshift.apply(this, arguments);
+ return this.length;
+ }
+}, hasUnshiftReturnValueBug);
+
+// ES5 15.4.3.2
+//
http://es5.github.com/#x15.4.3.2
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+defineProperties($Array, { isArray: isArray });
+
+// The IsCallable() check in the Array functions
+// has been replaced with a strict check on the
+// internal class of the object to trap cases where
+// the provided function was actually a regular
+// expression literal, which in V8 and
+// JavaScriptCore is a typeof "function". Only in
+// V8 are regular expression literals permitted as
+// reduce parameters, so it is desirable in the
+// general case for the shim to match the more
+// strict and common behavior of rejecting regular
+// expressions.
+
+// ES5 15.4.4.18
+//
http://es5.github.com/#x15.4.4.18
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/arra...
+
+// Check failure of by-index access of string characters (IE < 9)
+// and failure of `0 in boxedString` (Rhino)
+var boxedString = $Object('a');
+var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
+
+var properlyBoxesContext = function properlyBoxed(method) {
+ // Check node 0.6.21 bug where third parameter is not boxed
+ var properlyBoxesNonStrict = true;
+ var properlyBoxesStrict = true;
+ if (method) {
+ method.call('foo', function (_, __, context) {
+ if (typeof context !== 'object') { properlyBoxesNonStrict = false; }
+ });
+
+ method.call([1], function () {
+ 'use strict';
+
+ properlyBoxesStrict = typeof this === 'string';
+ }, 'x');
+ }
+ return !!method && properlyBoxesNonStrict && properlyBoxesStrict;
+};
+
+defineProperties(ArrayPrototype, {
+ forEach: function forEach(callbackfn /*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var i = -1;
+ var length = self.length >>> 0;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.forEach callback must be a
function');
+ }
+
+ while (++i < length) {
+ if (i in self) {
+ // Invoke the callback function with call, passing arguments:
+ // context, property value, property key, thisArg object
+ if (typeof T !== 'undefined') {
+ callbackfn.call(T, self[i], i, object);
+ } else {
+ callbackfn(self[i], i, object);
+ }
+ }
+ }
+ }
+}, !properlyBoxesContext(ArrayPrototype.forEach));
+
+// ES5 15.4.4.19
+//
http://es5.github.com/#x15.4.4.19
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+defineProperties(ArrayPrototype, {
+ map: function map(callbackfn/*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var result = $Array(length);
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.map callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self) {
+ if (typeof T !== 'undefined') {
+ result[i] = callbackfn.call(T, self[i], i, object);
+ } else {
+ result[i] = callbackfn(self[i], i, object);
+ }
+ }
+ }
+ return result;
+ }
+}, !properlyBoxesContext(ArrayPrototype.map));
+
+// ES5 15.4.4.20
+//
http://es5.github.com/#x15.4.4.20
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+defineProperties(ArrayPrototype, {
+ filter: function filter(callbackfn /*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var result = [];
+ var value;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.filter callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self) {
+ value = self[i];
+ if (typeof T === 'undefined' ? callbackfn(value, i, object) :
callbackfn.call(T, value, i, object)) {
+ array_push.call(result, value);
+ }
+ }
+ }
+ return result;
+ }
+}, !properlyBoxesContext(ArrayPrototype.filter));
+
+// ES5 15.4.4.16
+//
http://es5.github.com/#x15.4.4.16
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+defineProperties(ArrayPrototype, {
+ every: function every(callbackfn /*, thisArg*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.every callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self && !(typeof T === 'undefined' ?
callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
+ return false;
+ }
+ }
+ return true;
+ }
+}, !properlyBoxesContext(ArrayPrototype.every));
+
+// ES5 15.4.4.17
+//
http://es5.github.com/#x15.4.4.17
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+defineProperties(ArrayPrototype, {
+ some: function some(callbackfn/*, thisArg */) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+ var T;
+ if (arguments.length > 1) {
+ T = arguments[1];
+ }
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.some callback must be a
function');
+ }
+
+ for (var i = 0; i < length; i++) {
+ if (i in self && (typeof T === 'undefined' ?
callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
+ return true;
+ }
+ }
+ return false;
+ }
+}, !properlyBoxesContext(ArrayPrototype.some));
+
+// ES5 15.4.4.21
+//
http://es5.github.com/#x15.4.4.21
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+var reduceCoercesToObject = false;
+if (ArrayPrototype.reduce) {
+ reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_,
__, ___, list) { return list; }) === 'object';
+}
+defineProperties(ArrayPrototype, {
+ reduce: function reduce(callbackfn /*, initialValue*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.reduce callback must be a
function');
+ }
+
+ // no value to return if no initial value and an empty array
+ if (length === 0 && arguments.length === 1) {
+ throw new TypeError('reduce of empty array with no initial value');
+ }
+
+ var i = 0;
+ var result;
+ if (arguments.length >= 2) {
+ result = arguments[1];
+ } else {
+ do {
+ if (i in self) {
+ result = self[i++];
+ break;
+ }
+
+ // if array contains no values, no initial value to return
+ if (++i >= length) {
+ throw new TypeError('reduce of empty array with no initial
value');
+ }
+ } while (true);
+ }
+
+ for (; i < length; i++) {
+ if (i in self) {
+ result = callbackfn(result, self[i], i, object);
+ }
+ }
+
+ return result;
+ }
+}, !reduceCoercesToObject);
+
+// ES5 15.4.4.22
+//
http://es5.github.com/#x15.4.4.22
+//
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Ar...
+var reduceRightCoercesToObject = false;
+if (ArrayPrototype.reduceRight) {
+ reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5',
function (_, __, ___, list) { return list; }) === 'object';
+}
+defineProperties(ArrayPrototype, {
+ reduceRight: function reduceRight(callbackfn/*, initial*/) {
+ var object = ES.ToObject(this);
+ var self = splitString && isString(this) ? strSplit(this, '') :
object;
+ var length = self.length >>> 0;
+
+ // If no callback function or if callback is not a callable function
+ if (!isCallable(callbackfn)) {
+ throw new TypeError('Array.prototype.reduceRight callback must be a
function');
+ }
+
+ // no value to return if no initial value, empty array
+ if (length === 0 && arguments.length === 1) {
+ throw new TypeError('reduceRight of empty array with no initial
value');
+ }
+
+ var result;
+ var i = length - 1;
+ if (arguments.length >= 2) {
+ result = arguments[1];
+ } else {
+ do {
+ if (i in self) {
+ result = self[i--];
+ break;
+ }
+
+ // if array contains no values, no initial value to return
+ if (--i < 0) {
+ throw new TypeError('reduceRight of empty array with no initial
value');
+ }
+ } while (true);
+ }
+
+ if (i < 0) {
+ return result;
+ }
+
+ do {
+ if (i in self) {
+ result = callbackfn(result, self[i], i, object);
+ }
+ } while (i--);
+
+ return result;
+ }
+}, !reduceRightCoercesToObject);
+
+// ES5 15.4.4.14
+//
http://es5.github.com/#x15.4.4.14
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !==
-1;
+defineProperties(ArrayPrototype, {
+ indexOf: function indexOf(searchElement /*, fromIndex */) {
+ var self = splitString && isString(this) ? strSplit(this, '') :
ES.ToObject(this);
+ var length = self.length >>> 0;
+
+ if (length === 0) {
+ return -1;
+ }
+
+ var i = 0;
+ if (arguments.length > 1) {
+ i = ES.ToInteger(arguments[1]);
+ }
+
+ // handle negative indices
+ i = i >= 0 ? i : max(0, length + i);
+ for (; i < length; i++) {
+ if (i in self && self[i] === searchElement) {
+ return i;
+ }
+ }
+ return -1;
+ }
+}, hasFirefox2IndexOfBug);
+
+// ES5 15.4.4.15
+//
http://es5.github.com/#x15.4.4.15
+//
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Arra...
+var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0,
1].lastIndexOf(0, -3) !== -1;
+defineProperties(ArrayPrototype, {
+ lastIndexOf: function lastIndexOf(searchElement /*, fromIndex */) {
+ var self = splitString && isString(this) ? strSplit(this, '') :
ES.ToObject(this);
+ var length = self.length >>> 0;
+
+ if (length === 0) {
+ return -1;
+ }
+ var i = length - 1;
+ if (arguments.length > 1) {
+ i = min(i, ES.ToInteger(arguments[1]));
+ }
+ // handle negative indices
+ i = i >= 0 ? i : length - Math.abs(i);
+ for (; i >= 0; i--) {
+ if (i in self && searchElement === self[i]) {
+ return i;
+ }
+ }
+ return -1;
+ }
+}, hasFirefox2LastIndexOfBug);
+
+// ES5 15.4.4.12
+//
http://es5.github.com/#x15.4.4.12
+var spliceNoopReturnsEmptyArray = (function () {
+ var a = [1, 2];
+ var result = a.splice();
+ return a.length === 2 && isArray(result) && result.length === 0;
+}());
+defineProperties(ArrayPrototype, {
+ // Safari 5.0 bug where .splice() returns undefined
+ splice: function splice(start, deleteCount) {
+ if (arguments.length === 0) {
+ return [];
+ } else {
+ return array_splice.apply(this, arguments);
+ }
+ }
+}, !spliceNoopReturnsEmptyArray);
+
+var spliceWorksWithEmptyObject = (function () {
+ var obj = {};
+ ArrayPrototype.splice.call(obj, 0, 0, 1);
+ return obj.length === 1;
+}());
+defineProperties(ArrayPrototype, {
+ splice: function splice(start, deleteCount) {
+ if (arguments.length === 0) { return []; }
+ var args = arguments;
+ this.length = max(ES.ToInteger(this.length), 0);
+ if (arguments.length > 0 && typeof deleteCount !== 'number')
{
+ args = array_slice.call(arguments);
+ if (args.length < 2) {
+ array_push.call(args, this.length - start);
+ } else {
+ args[1] = ES.ToInteger(deleteCount);
+ }
+ }
+ return array_splice.apply(this, args);
+ }
+}, !spliceWorksWithEmptyObject);
+var spliceWorksWithLargeSparseArrays = (function () {
+ // Per
https://github.com/es-shims/es5-shim/issues/295
+ // Safari 7/8 breaks with sparse arrays of size 1e5 or greater
+ var arr = new $Array(1e5);
+ // note: the index MUST be 8 or larger or the test will false pass
+ arr[8] = 'x';
+ arr.splice(1, 1);
+ // note: this test must be defined *after* the indexOf shim
+ // per
https://github.com/es-shims/es5-shim/issues/313
+ return arr.indexOf('x') === 7;
+}());
+var spliceWorksWithSmallSparseArrays = (function () {
+ // Per
https://github.com/es-shims/es5-shim/issues/295
+ // Opera 12.15 breaks on this, no idea why.
+ var n = 256;
+ var arr = [];
+ arr[n] = 'a';
+ arr.splice(n + 1, 0, 'b');
+ return arr[n] === 'a';
+}());
+defineProperties(ArrayPrototype, {
+ splice: function splice(start, deleteCount) {
+ var O = ES.ToObject(this);
+ var A = [];
+ var len = ES.ToUint32(O.length);
+ var relativeStart = ES.ToInteger(start);
+ var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) :
min(relativeStart, len);
+ var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len -
actualStart);
+
+ var k = 0;
+ var from;
+ while (k < actualDeleteCount) {
+ from = $String(actualStart + k);
+ if (owns(O, from)) {
+ A[k] = O[from];
+ }
+ k += 1;
+ }
+
+ var items = array_slice.call(arguments, 2);
+ var itemCount = items.length;
+ var to;
+ if (itemCount < actualDeleteCount) {
+ k = actualStart;
+ while (k < (len - actualDeleteCount)) {
+ from = $String(k + actualDeleteCount);
+ to = $String(k + itemCount);
+ if (owns(O, from)) {
+ O[to] = O[from];
+ } else {
+ delete O[to];
+ }
+ k += 1;
+ }
+ k = len;
+ while (k > (len - actualDeleteCount + itemCount)) {
+ delete O[k - 1];
+ k -= 1;
+ }
+ } else if (itemCount > actualDeleteCount) {
+ k = len - actualDeleteCount;
+ while (k > actualStart) {
+ from = $String(k + actualDeleteCount - 1);
+ to = $String(k + itemCount - 1);
+ if (owns(O, from)) {
+ O[to] = O[from];
+ } else {
+ delete O[to];
+ }
+ k -= 1;
+ }
+ }
+ k = actualStart;
+ for (var i = 0; i < items.length; ++i) {
+ O[k] = items[i];
+ k += 1;
+ }
+ O.length = len - actualDeleteCount + itemCount;
+
+ return A;
+ }
+}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);
+
+//
+// Object
+// ======
+//
+
+// ES5 15.2.3.14
+//
http://es5.github.com/#x15.2.3.14
+
+//
http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-impl...
+var hasDontEnumBug = !({ 'toString': null
}).propertyIsEnumerable('toString');
+var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
+var hasStringEnumBug = !owns('x', '0');
+var equalsConstructorPrototype = function (o) {
+ var ctor = o.constructor;
+ return ctor && ctor.prototype === o;
+};
+var blacklistedKeys = {
+ $window: true,
+ $console: true,
+ $parent: true,
+ $self: true,
+ $frames: true,
+ $frameElement: true,
+ $webkitIndexedDB: true,
+ $webkitStorageInfo: true
+};
+var hasAutomationEqualityBug = (function () {
+ /* globals window */
+ if (typeof window === 'undefined') { return false; }
+ for (var k in window) {
+ if (!blacklistedKeys['$' + k] && owns(window, k) &&
window[k] !== null && typeof window[k] === 'object') {
+ try {
+ equalsConstructorPrototype(window[k]);
+ } catch (e) {
+ return true;
+ }
+ }
+ }
+ return false;
+}());
+var equalsConstructorPrototypeIfNotBuggy = function (object) {
+ if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return
equalsConstructorPrototype(object); }
+ try {
+ return equalsConstructorPrototype(object);
+ } catch (e) {
+ return false;
+ }
+};
+var dontEnums = [
+ 'toString',
+ 'toLocaleString',
+ 'valueOf',
+ 'hasOwnProperty',
+ 'isPrototypeOf',
+ 'propertyIsEnumerable',
+ 'constructor'
+];
+var dontEnumsLength = dontEnums.length;
+
+var isArguments = function isArguments(value) {
+ var str = toStr(value);
+ var isArgs = str === '[object Arguments]';
+ if (!isArgs) {
+ isArgs = !isArray(value) &&
+ value !== null &&
+ typeof value === 'object' &&
+ typeof value.length === 'number' &&
+ value.length >= 0 &&
+ isCallable(value.callee);
+ }
+ return isArgs;
+};
+
+defineProperties($Object, {
+ keys: function keys(object) {
+ var isFn = isCallable(object);
+ var isArgs = isArguments(object);
+ var isObject = object !== null && typeof object === 'object';
+ var isStr = isObject && isString(object);
+
+ if (!isObject && !isFn && !isArgs) {
+ throw new TypeError('Object.keys called on a non-object');
+ }
+
+ var theKeys = [];
+ var skipProto = hasProtoEnumBug && isFn;
+ if ((isStr && hasStringEnumBug) || isArgs) {
+ for (var i = 0; i < object.length; ++i) {
+ array_push.call(theKeys, $String(i));
+ }
+ }
+
+ if (!isArgs) {
+ for (var name in object) {
+ if (!(skipProto && name === 'prototype') &&
owns(object, name)) {
+ array_push.call(theKeys, $String(name));
+ }
+ }
+ }
+
+ if (hasDontEnumBug) {
+ var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
+ for (var j = 0; j < dontEnumsLength; j++) {
+ var dontEnum = dontEnums[j];
+ if (!(skipConstructor && dontEnum === 'constructor')
&& owns(object, dontEnum)) {
+ array_push.call(theKeys, dontEnum);
+ }
+ }
+ }
+ return theKeys;
+ }
+});
+
+var keysWorksWithArguments = $Object.keys && (function () {
+ // Safari 5.0 bug
+ return $Object.keys(arguments).length === 2;
+}(1, 2));
+var originalKeys = $Object.keys;
+defineProperties($Object, {
+ keys: function keys(object) {
+ if (isArguments(object)) {
+ return originalKeys(array_slice.call(object));
+ } else {
+ return originalKeys(object);
+ }
+ }
+}, !keysWorksWithArguments);
+
+//
+// Date
+// ====
+//
+
+// ES5 15.9.5.43
+//
http://es5.github.com/#x15.9.5.43
+// This function returns a String value represent the instance in time
+// represented by this Date object. The format of the String is the Date Time
+// string format defined in 15.9.1.15. All fields are present in the String.
+// The time zone is always UTC, denoted by the suffix Z. If the time value of
+// this object is not a finite Number a RangeError exception is thrown.
+var negativeDate = -62198755200000;
+var negativeYearString = '-000001';
+var hasNegativeDateBug = Date.prototype.toISOString && new
Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
+var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString()
!== '1969-12-31T23:59:59.999Z';
+
+defineProperties(Date.prototype, {
+ toISOString: function toISOString() {
+ var result, length, value, year, month;
+ if (!isFinite(this)) {
+ throw new RangeError('Date.prototype.toISOString called on non-finite
value.');
+ }
+
+ year = this.getUTCFullYear();
+
+ month = this.getUTCMonth();
+ // see
https://github.com/es-shims/es5-shim/issues/111
+ year += Math.floor(month / 12);
+ month = (month % 12 + 12) % 12;
+
+ // the date time string format is specified in 15.9.1.15.
+ result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(),
this.getUTCSeconds()];
+ year = (
+ (year < 0 ? '-' : (year > 9999 ? '+' : '')) +
+ strSlice('00000' + Math.abs(year), (0 <= year && year
<= 9999) ? -4 : -6)
+ );
+
+ length = result.length;
+ while (length--) {
+ value = result[length];
+ // pad months, days, hours, minutes, and seconds to have two
+ // digits.
+ if (value < 10) {
+ result[length] = '0' + value;
+ }
+ }
+ // pad milliseconds to have three digits.
+ return (
+ year + '-' + array_slice.call(result, 0, 2).join('-') +
+ 'T' + array_slice.call(result, 2).join(':') + '.' +
+ strSlice('000' + this.getUTCMilliseconds(), -3) + 'Z'
+ );
+ }
+}, hasNegativeDateBug || hasSafari51DateBug);
+
+// ES5 15.9.5.44
+//
http://es5.github.com/#x15.9.5.44
+// This function provides a String representation of a Date object for use by
+// JSON.stringify (15.12.3).
+var dateToJSONIsSupported = (function () {
+ try {
+ return Date.prototype.toJSON &&
+ new Date(NaN).toJSON() === null &&
+ new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1
&&
+ Date.prototype.toJSON.call({ // generic
+ toISOString: function () { return true; }
+ });
+ } catch (e) {
+ return false;
+ }
+}());
+if (!dateToJSONIsSupported) {
+ Date.prototype.toJSON = function toJSON(key) {
+ // When the toJSON method is called with argument key, the following
+ // steps are taken:
+
+ // 1. Let O be the result of calling ToObject, giving it the this
+ // value as its argument.
+ // 2. Let tv be ES.ToPrimitive(O, hint Number).
+ var O = $Object(this);
+ var tv = ES.ToPrimitive(O);
+ // 3. If tv is a Number and is not finite, return null.
+ if (typeof tv === 'number' && !isFinite(tv)) {
+ return null;
+ }
+ // 4. Let toISO be the result of calling the [[Get]] internal method of
+ // O with argument "toISOString".
+ var toISO = O.toISOString;
+ // 5. If IsCallable(toISO) is false, throw a TypeError exception.
+ if (!isCallable(toISO)) {
+ throw new TypeError('toISOString property is not callable');
+ }
+ // 6. Return the result of calling the [[Call]] internal method of
+ // toISO with O as the this value and an empty argument list.
+ return toISO.call(O);
+
+ // NOTE 1 The argument is ignored.
+
+ // NOTE 2 The toJSON function is intentionally generic; it does not
+ // require that its this value be a Date object. Therefore, it can be
+ // transferred to other kinds of objects for use as a method. However,
+ // it does require that any such object have a toISOString method. An
+ // object is free to use the argument key to filter its
+ // stringification.
+ };
+}
+
+// ES5 15.9.4.2
+//
http://es5.github.com/#x15.9.4.2
+// based on work shared by Daniel Friesen (dantman)
+//
http://gist.github.com/303249
+var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
+var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) ||
!isNaN(Date.parse('2012-11-31T23:59:59.000Z')) ||
!isNaN(Date.parse('2012-12-31T23:59:60.000Z'));
+var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));
+if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates ||
!supportsExtendedYears) {
+ // XXX global assignment won't work in embeddings that use
+ // an alternate object for the context.
+ /* global Date: true */
+ /* eslint-disable no-undef */
+ Date = (function (NativeDate) {
+ /* eslint-enable no-undef */
+ // Date.length === 7
+ var DateShim = function Date(Y, M, D, h, m, s, ms) {
+ var length = arguments.length;
+ var date;
+ if (this instanceof NativeDate) {
+ date = length === 1 && $String(Y) === Y ? // isString(Y)
+ // We explicitly pass it through parse:
+ new NativeDate(DateShim.parse(Y)) :
+ // We have to manually make calls depending on argument
+ // length here
+ length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :
+ length >= 6 ? new NativeDate(Y, M, D, h, m, s) :
+ length >= 5 ? new NativeDate(Y, M, D, h, m) :
+ length >= 4 ? new NativeDate(Y, M, D, h) :
+ length >= 3 ? new NativeDate(Y, M, D) :
+ length >= 2 ? new NativeDate(Y, M) :
+ length >= 1 ? new NativeDate(Y) :
+ new NativeDate();
+ } else {
+ date = NativeDate.apply(this, arguments);
+ }
+ // Prevent mixups with unfixed Date object
+ defineProperties(date, { constructor: DateShim }, true);
+ return date;
+ };
+
+ // 15.9.1.15 Date Time String Format.
+ var isoDateExpression = new RegExp('^' +
+ '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign +
+ // 6-digit extended year
+ '(?:-(\\d{2})' + // optional month capture
+ '(?:-(\\d{2})' + // optional day capture
+ '(?:' + // capture hours:minutes:seconds.milliseconds
+ 'T(\\d{2})' + // hours capture
+ ':(\\d{2})' + // minutes capture
+ '(?:' + // optional :seconds.milliseconds
+ ':(\\d{2})' + // seconds capture
+ '(?:(\\.\\d{1,}))?' + // milliseconds capture
+ ')?' +
+ '(' + // capture UTC offset component
+ 'Z|' + // UTC capture
+ '(?:' + // offset specifier +/-hours:minutes
+ '([-+])' + // sign capture
+ '(\\d{2})' + // hours offset capture
+ ':(\\d{2})' + // minutes offset capture
+ ')' +
+ ')?)?)?)?' +
+ '$');
+
+ var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
+
+ var dayFromMonth = function dayFromMonth(year, month) {
+ var t = month > 1 ? 1 : 0;
+ return (
+ months[month] +
+ Math.floor((year - 1969 + t) / 4) -
+ Math.floor((year - 1901 + t) / 100) +
+ Math.floor((year - 1601 + t) / 400) +
+ 365 * (year - 1970)
+ );
+ };
+
+ var toUTC = function toUTC(t) {
+ return $Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));
+ };
+
+ // Copy any custom methods a 3rd party library may have added
+ for (var key in NativeDate) {
+ if (owns(NativeDate, key)) {
+ DateShim[key] = NativeDate[key];
+ }
+ }
+
+ // Copy "native" methods explicitly; they may be non-enumerable
+ defineProperties(DateShim, {
+ now: NativeDate.now,
+ UTC: NativeDate.UTC
+ }, true);
+ DateShim.prototype = NativeDate.prototype;
+ defineProperties(DateShim.prototype, {
+ constructor: DateShim
+ }, true);
+
+ // Upgrade Date.parse to handle simplified ISO 8601 strings
+ var parseShim = function parse(string) {
+ var match = isoDateExpression.exec(string);
+ if (match) {
+ // parse months, days, hours, minutes, seconds, and milliseconds
+ // provide default values if necessary
+ // parse the UTC offset component
+ var year = $Number(match[1]),
+ month = $Number(match[2] || 1) - 1,
+ day = $Number(match[3] || 1) - 1,
+ hour = $Number(match[4] || 0),
+ minute = $Number(match[5] || 0),
+ second = $Number(match[6] || 0),
+ millisecond = Math.floor($Number(match[7] || 0) * 1000),
+ // When time zone is missed, local offset should be used
+ // (ES 5.1 bug)
+ // see
https://bugs.ecmascript.org/show_bug.cgi?id=112
+ isLocalTime = Boolean(match[4] && !match[8]),
+ signOffset = match[9] === '-' ? 1 : -1,
+ hourOffset = $Number(match[10] || 0),
+ minuteOffset = $Number(match[11] || 0),
+ result;
+ if (
+ hour < (
+ minute > 0 || second > 0 || millisecond > 0 ?
+ 24 : 25
+ ) &&
+ minute < 60 && second < 60 && millisecond <
1000 &&
+ month > -1 && month < 12 && hourOffset < 24
&&
+ minuteOffset < 60 && // detect invalid offsets
+ day > -1 &&
+ day < (
+ dayFromMonth(year, month + 1) -
+ dayFromMonth(year, month)
+ )
+ ) {
+ result = (
+ (dayFromMonth(year, month) + day) * 24 +
+ hour +
+ hourOffset * signOffset
+ ) * 60;
+ result = (
+ (result + minute + minuteOffset * signOffset) * 60 +
+ second
+ ) * 1000 + millisecond;
+ if (isLocalTime) {
+ result = toUTC(result);
+ }
+ if (-8.64e15 <= result && result <= 8.64e15) {
+ return result;
+ }
+ }
+ return NaN;
+ }
+ return NativeDate.parse.apply(this, arguments);
+ };
+ defineProperties(DateShim, { parse: parseShim });
+
+ return DateShim;
+ }(Date));
+ /* global Date: false */
+}
+
+// ES5 15.9.4.4
+//
http://es5.github.com/#x15.9.4.4
+if (!Date.now) {
+ Date.now = function now() {
+ return new Date().getTime();
+ };
+}
+
+//
+// Number
+// ======
+//
+
+// ES5.1 15.7.4.5
+//
http://es5.github.com/#x15.7.4.5
+var hasToFixedBugs = NumberPrototype.toFixed && (
+ (0.00008).toFixed(3) !== '0.000' ||
+ (0.9).toFixed(0) !== '1' ||
+ (1.255).toFixed(2) !== '1.25' ||
+ (1000000000000000128).toFixed(0) !== '1000000000000000128'
+);
+
+var toFixedHelpers = {
+ base: 1e7,
+ size: 6,
+ data: [0, 0, 0, 0, 0, 0],
+ multiply: function multiply(n, c) {
+ var i = -1;
+ var c2 = c;
+ while (++i < toFixedHelpers.size) {
+ c2 += n * toFixedHelpers.data[i];
+ toFixedHelpers.data[i] = c2 % toFixedHelpers.base;
+ c2 = Math.floor(c2 / toFixedHelpers.base);
+ }
+ },
+ divide: function divide(n) {
+ var i = toFixedHelpers.size, c = 0;
+ while (--i >= 0) {
+ c += toFixedHelpers.data[i];
+ toFixedHelpers.data[i] = Math.floor(c / n);
+ c = (c % n) * toFixedHelpers.base;
+ }
+ },
+ numToString: function numToString() {
+ var i = toFixedHelpers.size;
+ var s = '';
+ while (--i >= 0) {
+ if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
+ var t = $String(toFixedHelpers.data[i]);
+ if (s === '') {
+ s = t;
+ } else {
+ s += strSlice('0000000', 0, 7 - t.length) + t;
+ }
+ }
+ }
+ return s;
+ },
+ pow: function pow(x, n, acc) {
+ return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2,
acc)));
+ },
+ log: function log(x) {
+ var n = 0;
+ var x2 = x;
+ while (x2 >= 4096) {
+ n += 12;
+ x2 /= 4096;
+ }
+ while (x2 >= 2) {
+ n += 1;
+ x2 /= 2;
+ }
+ return n;
+ }
+};
+
+defineProperties(NumberPrototype, {
+ toFixed: function toFixed(fractionDigits) {
+ var f, x, s, m, e, z, j, k;
+
+ // Test for NaN and round fractionDigits down
+ f = $Number(fractionDigits);
+ f = f !== f ? 0 : Math.floor(f);
+
+ if (f < 0 || f > 20) {
+ throw new RangeError('Number.toFixed called with invalid number of
decimals');
+ }
+
+ x = $Number(this);
+
+ // Test for NaN
+ if (x !== x) {
+ return 'NaN';
+ }
+
+ // If it is too big or small, return the string value of the number
+ if (x <= -1e21 || x >= 1e21) {
+ return $String(x);
+ }
+
+ s = '';
+
+ if (x < 0) {
+ s = '-';
+ x = -x;
+ }
+
+ m = '0';
+
+ if (x > 1e-21) {
+ // 1e-21 < x < 1e21
+ // -70 < log2(x) < 70
+ e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
+ z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2,
e, 1));
+ z *= 0x10000000000000; // Math.pow(2, 52);
+ e = 52 - e;
+
+ // -18 < e < 122
+ // x = z / 2 ^ e
+ if (e > 0) {
+ toFixedHelpers.multiply(0, z);
+ j = f;
+
+ while (j >= 7) {
+ toFixedHelpers.multiply(1e7, 0);
+ j -= 7;
+ }
+
+ toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
+ j = e - 1;
+
+ while (j >= 23) {
+ toFixedHelpers.divide(1 << 23);
+ j -= 23;
+ }
+
+ toFixedHelpers.divide(1 << j);
+ toFixedHelpers.multiply(1, 1);
+ toFixedHelpers.divide(2);
+ m = toFixedHelpers.numToString();
+ } else {
+ toFixedHelpers.multiply(0, z);
+ toFixedHelpers.multiply(1 << (-e), 0);
+ m = toFixedHelpers.numToString() +
strSlice('0.00000000000000000000', 2, 2 + f);
+ }
+ }
+
+ if (f > 0) {
+ k = m.length;
+
+ if (k <= f) {
+ m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;
+ } else {
+ m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);
+ }
+ } else {
+ m = s + m;
+ }
+
+ return m;
+ }
+}, hasToFixedBugs);
+
+//
+// String
+// ======
+//
+
+// ES5 15.5.4.14
+//
http://es5.github.com/#x15.5.4.14
+
+// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
+// Many browsers do not split properly with regular expressions or they
+// do not perform the split correctly under obscure conditions.
+// See
http://blog.stevenlevithan.com/archives/cross-browser-split
+// I've tested in many browsers and this seems to cover the deviant ones:
+// 'ab'.split(/(?:ab)*/) should be ["", ""], not
[""]
+// '.'.split(/(.?)(.?)/) should be ["", ".", "",
""], not ["", ""]
+// 'tesst'.split(/(s)*/) should be ["t", undefined, "e",
"s", "t"], not
+// [undefined, "t", undefined, "e", ...]
+// ''.split(/.?/) should be [], not [""]
+// '.'.split(/()()/) should be ["."], not ["",
"", "."]
+
+if (
+ 'ab'.split(/(?:ab)*/).length !== 2 ||
+ '.'.split(/(.?)(.?)/).length !== 4 ||
+ 'tesst'.split(/(s)*/)[1] === 't' ||
+ 'test'.split(/(?:)/, -1).length !== 4 ||
+ ''.split(/.?/).length ||
+ '.'.split(/()()/).length > 1
+) {
+ (function () {
+ var compliantExecNpcg = typeof (/()??/).exec('')[1] ===
'undefined'; // NPCG: nonparticipating capturing group
+
+ StringPrototype.split = function (separator, limit) {
+ var string = this;
+ if (typeof separator === 'undefined' && limit === 0) {
+ return [];
+ }
+
+ // If `separator` is not a regex, use native split
+ if (!isRegex(separator)) {
+ return strSplit(this, separator, limit);
+ }
+
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') + // in ES6
+ (separator.sticky ? 'y' : ''), // Firefox 3+ and
ES6
+ lastLastIndex = 0,
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ separator2, match, lastIndex, lastLength;
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ string += ''; // Type-convert
+ if (!compliantExecNpcg) {
+ // Doesn't need flags gy, but they don't hurt
+ separator2 = new RegExp('^' + separatorCopy.source +
'$(?!\\s)', flags);
+ }
+ /* Values for `limit`, per the spec:
+ * If undefined: 4294967295 // Math.pow(2, 32) - 1
+ * If 0, Infinity, or NaN: 0
+ * If positive number: limit = Math.floor(limit); if (limit > 4294967295)
limit -= 4294967296;
+ * If negative number: 4294967296 - Math.floor(Math.abs(limit))
+ * If other: Type-convert, then use the above rules
+ */
+ var splitLimit = typeof limit === 'undefined' ?
+ -1 >>> 0 : // Math.pow(2, 32) - 1
+ ES.ToUint32(limit);
+ match = separatorCopy.exec(string);
+ while (match) {
+ // `separatorCopy.lastIndex` is not reliable cross-browser
+ lastIndex = match.index + match[0].length;
+ if (lastIndex > lastLastIndex) {
+ array_push.call(output, strSlice(string, lastLastIndex,
match.index));
+ // Fix browsers whose `exec` methods don't consistently return
`undefined` for
+ // nonparticipating capturing groups
+ if (!compliantExecNpcg && match.length > 1) {
+ /* eslint-disable no-loop-func */
+ match[0].replace(separator2, function () {
+ for (var i = 1; i < arguments.length - 2; i++) {
+ if (typeof arguments[i] === 'undefined') {
+ match[i] = void 0;
+ }
+ }
+ });
+ /* eslint-enable no-loop-func */
+ }
+ if (match.length > 1 && match.index < string.length) {
+ array_push.apply(output, array_slice.call(match, 1));
+ }
+ lastLength = match[0].length;
+ lastLastIndex = lastIndex;
+ if (output.length >= splitLimit) {
+ break;
+ }
+ }
+ if (separatorCopy.lastIndex === match.index) {
+ separatorCopy.lastIndex++; // Avoid an infinite loop
+ }
+ match = separatorCopy.exec(string);
+ }
+ if (lastLastIndex === string.length) {
+ if (lastLength || !separatorCopy.test('')) {
+ array_push.call(output, '');
+ }
+ } else {
+ array_push.call(output, strSlice(string, lastLastIndex));
+ }
+ return output.length > splitLimit ? strSlice(output, 0, splitLimit) :
output;
+ };
+ }());
+
+// [bugfix, chrome]
+// If separator is undefined, then the result array contains just one String,
+// which is the this value (converted to a String). If limit is not undefined,
+// then the output array is truncated so that it contains no more than limit
+// elements.
+// "0".split(undefined, 0) -> []
+} else if ('0'.split(void 0, 0).length) {
+ StringPrototype.split = function split(separator, limit) {
+ if (typeof separator === 'undefined' && limit === 0) { return [];
}
+ return strSplit(this, separator, limit);
+ };
+}
+
+var str_replace = StringPrototype.replace;
+var replaceReportsGroupsCorrectly = (function () {
+ var groups = [];
+ 'x'.replace(/x(.)?/g, function (match, group) {
+ array_push.call(groups, group);
+ });
+ return groups.length === 1 && typeof groups[0] === 'undefined';
+}());
+
+if (!replaceReportsGroupsCorrectly) {
+ StringPrototype.replace = function replace(searchValue, replaceValue) {
+ var isFn = isCallable(replaceValue);
+ var hasCapturingGroups = isRegex(searchValue) &&
(/\)[*?]/).test(searchValue.source);
+ if (!isFn || !hasCapturingGroups) {
+ return str_replace.call(this, searchValue, replaceValue);
+ } else {
+ var wrappedReplaceValue = function (match) {
+ var length = arguments.length;
+ var originalLastIndex = searchValue.lastIndex;
+ searchValue.lastIndex = 0;
+ var args = searchValue.exec(match) || [];
+ searchValue.lastIndex = originalLastIndex;
+ array_push.call(args, arguments[length - 2], arguments[length - 1]);
+ return replaceValue.apply(this, args);
+ };
+ return str_replace.call(this, searchValue, wrappedReplaceValue);
+ }
+ };
+}
+
+// ECMA-262, 3rd B.2.3
+// Not an ECMAScript standard, although ECMAScript 3rd Edition has a
+// non-normative section suggesting uniform semantics and it should be
+// normalized across all browsers
+// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
+var string_substr = StringPrototype.substr;
+var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !==
'b';
+defineProperties(StringPrototype, {
+ substr: function substr(start, length) {
+ var normalizedStart = start;
+ if (start < 0) {
+ normalizedStart = max(this.length + start, 0);
+ }
+ return string_substr.call(this, normalizedStart, length);
+ }
+}, hasNegativeSubstrBug);
+
+// ES5 15.5.4.20
+// whitespace from:
http://es5.github.io/#x15.5.4.20
+var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
+ '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' +
+ '\u2029\uFEFF';
+var zeroWidth = '\u200b';
+var wsRegexChars = '[' + ws + ']';
+var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars +
'*');
+var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');
+var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() ||
!zeroWidth.trim());
+defineProperties(StringPrototype, {
+ //
http://blog.stevenlevithan.com/archives/faster-trim-javascript
+ //
http://perfectionkills.com/whitespace-deviations/
+ trim: function trim() {
+ if (typeof this === 'undefined' || this === null) {
+ throw new TypeError("can't convert " + this + ' to
object');
+ }
+ return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp,
'');
+ }
+}, hasTrimWhitespaceBug);
+
+// ES-5 15.1.2.2
+if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
+ /* global parseInt: true */
+ parseInt = (function (origParseInt) {
+ var hexRegex = /^0[xX]/;
+ return function parseInt(str, radix) {
+ var string = $String(str).trim();
+ var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);
+ return origParseInt(string, defaultedRadix);
+ };
+ }(parseInt));
+}
+
+}));
+
+/*
+ json2.js
+ 2015-05-03
+
+ Public Domain.
+
+ NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+ See
http://www.JSON.org/js.html
+
+
+ This code should be minified before deployment.
+ See
http://javascript.crockford.com/jsmin.html
+
+ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+ NOT CONTROL.
+
+
+ This file creates a global JSON object containing two methods: stringify
+ and parse. This file is provides the ES5 JSON capability to ES3 systems.
+ If a project might run on IE8 or earlier, then this file should be included.
+ This file does nothing on ES5 systems.
+
+ JSON.stringify(value, replacer, space)
+ value any JavaScript value, usually an object or array.
+
+ replacer an optional parameter that determines how object
+ values are stringified for objects. It can be a
+ function or an array of strings.
+
+ space an optional parameter that specifies the indentation
+ of nested structures. If it is omitted, the text will
+ be packed without extra whitespace. If it is a number,
+ it will specify the number of spaces to indent at each
+ level. If it is a string (such as '\t' or
' '),
+ it contains the characters used to indent at each level.
+
+ This method produces a JSON text from a JavaScript value.
+
+ When an object value is found, if the object contains a toJSON
+ method, its toJSON method will be called and the result will be
+ stringified. A toJSON method does not serialize: it returns the
+ value represented by the name/value pair that should be serialized,
+ or undefined if nothing should be serialized. The toJSON method
+ will be passed the key associated with the value, and this will be
+ bound to the value
+
+ For example, this would serialize Dates as ISO strings.
+
+ Date.prototype.toJSON = function (key) {
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10
+ ? '0' + n
+ : n;
+ }
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+ You can provide an optional replacer method. It will be passed the
+ key and value of each member, with this bound to the containing
+ object. The value that is returned from your method will be
+ serialized. If your method returns undefined, then the member will
+ be excluded from the serialization.
+
+ If the replacer parameter is an array of strings, then it will be
+ used to select the members to be serialized. It filters the results
+ such that only members with keys listed in the replacer array are
+ stringified.
+
+ Values that do not have JSON representations, such as undefined or
+ functions, will not be serialized. Such values in objects will be
+ dropped; in arrays they will be replaced with null. You can use
+ a replacer function to replace those with JSON values.
+ JSON.stringify(undefined) returns undefined.
+
+ The optional space parameter produces a stringification of the
+ value that is filled with line breaks and indentation to make it
+ easier to read.
+
+ If the space parameter is a non-empty string, then that string will
+ be used for indentation. If the space parameter is a number, then
+ the indentation will be that many spaces.
+
+ Example:
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}]);
+ // text is '["e",{"pluribus":"unum"}]'
+
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}], null,
'\t');
+ // text is '[\n\t"e",\n\t{\n\t\t"pluribus":
"unum"\n\t}\n]'
+
+ text = JSON.stringify([new Date()], function (key, value) {
+ return this[key] instanceof Date
+ ? 'Date(' + this[key] + ')'
+ : value;
+ });
+ // text is '["Date(---current time---)"]'
+
+
+ JSON.parse(text, reviver)
+ This method parses a JSON text to produce an object or array.
+ It can throw a SyntaxError exception.
+
+ The optional reviver parameter is a function that can filter and
+ transform the results. It receives each of the keys and values,
+ and its return value is used instead of the original value.
+ If it returns what it received, then the structure is not modified.
+ If it returns undefined then the member is deleted.
+
+ Example:
+
+ // Parse the text. Values that look like ISO date strings will
+ // be converted to Date objects.
+
+ myData = JSON.parse(text, function (key, value) {
+ var a;
+ if (typeof value === 'string') {
+ a =
+/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+ if (a) {
+ return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+ +a[5], +a[6]));
+ }
+ }
+ return value;
+ });
+
+ myData = JSON.parse('["Date(09/09/2001)"]', function (key,
value) {
+ var d;
+ if (typeof value === 'string' &&
+ value.slice(0, 5) === 'Date(' &&
+ value.slice(-1) === ')') {
+ d = new Date(value.slice(5, -1));
+ if (d) {
+ return d;
+ }
+ }
+ return value;
+ });
+
+
+ This is a reference implementation. You are free to copy, modify, or
+ redistribute.
+*/
+
+/*jslint
+ eval, for, this
+*/
+
+/*property
+ JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+ getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+ lastIndex, length, parse, prototype, push, replace, slice, stringify,
+ test, toJSON, toString, valueOf
+*/
+
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+if (typeof JSON !== 'object') {
+ JSON = {};
+}
+
+(function () {
+ 'use strict';
+
+ var rx_one = /^[\],:{}\s]*$/,
+ rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+ rx_three =
/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+ rx_four = /(?:^|:|,)(?:\s*\[)+/g,
+ rx_escapable =
/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ rx_dangerous =
/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10
+ ? '0' + n
+ : n;
+ }
+
+ function this_value() {
+ return this.valueOf();
+ }
+
+ if (typeof Date.prototype.toJSON !== 'function') {
+
+ Date.prototype.toJSON = function () {
+
+ return isFinite(this.valueOf())
+ ? this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z'
+ : null;
+ };
+
+ Boolean.prototype.toJSON = this_value;
+ Number.prototype.toJSON = this_value;
+ String.prototype.toJSON = this_value;
+ }
+
+ var gap,
+ indent,
+ meta,
+ rep;
+
+
+ function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+ rx_escapable.lastIndex = 0;
+ return rx_escapable.test(string)
+ ? '"' + string.replace(rx_escapable, function (a) {
+ var c = meta[a];
+ return typeof c === 'string'
+ ? c
+ : '\\u' + ('0000' +
a.charCodeAt(0).toString(16)).slice(-4);
+ }) + '"'
+ : '"' + string + '"';
+ }
+
+
+ function str(key, holder) {
+
+// Produce a string from holder[key].
+
+ var i, // The loop counter.
+ k, // The member key.
+ v, // The member value.
+ length,
+ mind = gap,
+ partial,
+ value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+ if (value && typeof value === 'object' &&
+ typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+ if (typeof rep === 'function') {
+ value = rep.call(holder, key, value);
+ }
+
+// What happens next depends on the value's type.
+
+ switch (typeof value) {
+ case 'string':
+ return quote(value);
+
+ case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value)
+ ? String(value)
+ : 'null';
+
+ case 'boolean':
+ case 'null':
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce 'null'. The case is included here in
+// the remote chance that this gets fixed someday.
+
+ return String(value);
+
+// If the type is 'object', we might be dealing with an object or an array or
+// null.
+
+ case 'object':
+
+// Due to a specification blunder in ECMAScript, typeof null is 'object',
+// so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+ gap += indent;
+ partial = [];
+
+// Is the value an array?
+
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+ length = value.length;
+ for (i = 0; i < length; i += 1) {
+ partial[i] = str(i, value) || 'null';
+ }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+ v = partial.length === 0
+ ? '[]'
+ : gap
+ ? '[\n' + gap + partial.join(',\n' + gap) +
'\n' + mind + ']'
+ : '[' + partial.join(',') + ']';
+ gap = mind;
+ return v;
+ }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+ if (rep && typeof rep === 'object') {
+ length = rep.length;
+ for (i = 0; i < length; i += 1) {
+ if (typeof rep[i] === 'string') {
+ k = rep[i];
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (
+ gap
+ ? ': '
+ : ':'
+ ) + v);
+ }
+ }
+ }
+ } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (
+ gap
+ ? ': '
+ : ':'
+ ) + v);
+ }
+ }
+ }
+ }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+ v = partial.length === 0
+ ? '{}'
+ : gap
+ ? '{\n' + gap + partial.join(',\n' + gap) +
'\n' + mind + '}'
+ : '{' + partial.join(',') + '}';
+ gap = mind;
+ return v;
+ }
+ }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+ if (typeof JSON.stringify !== 'function') {
+ meta = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"': '\\"',
+ '\\': '\\\\'
+ };
+ JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+ var i;
+ gap = '';
+ indent = '';
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+ if (typeof space === 'number') {
+ for (i = 0; i < space; i += 1) {
+ indent += ' ';
+ }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+ } else if (typeof space === 'string') {
+ indent = space;
+ }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+ rep = replacer;
+ if (replacer && typeof replacer !== 'function' &&
+ (typeof replacer !== 'object' ||
+ typeof replacer.length !== 'number')) {
+ throw new Error('JSON.stringify');
+ }
+
+// Make a fake root object containing our value under the key of ''.
+// Return the result of stringifying the value.
+
+ return str('', {'': value});
+ };
+ }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+ if (typeof JSON.parse !== 'function') {
+ JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+ var j;
+
+ function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+ var k, v, value = holder[key];
+ if (value && typeof value === 'object') {
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = walk(value, k);
+ if (v !== undefined) {
+ value[k] = v;
+ } else {
+ delete value[k];
+ }
+ }
+ }
+ }
+ return reviver.call(holder, key, value);
+ }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+ text = String(text);
+ rx_dangerous.lastIndex = 0;
+ if (rx_dangerous.test(text)) {
+ text = text.replace(rx_dangerous, function (a) {
+ return '\\u' +
+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with '()' and
'new'
+// because they can cause invocation, and '=' because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text
is safe for eval.
+
+ if (
+ rx_one.test(
+ text
+ .replace(rx_two, '@')
+ .replace(rx_three, ']')
+ .replace(rx_four, '')
+ )
+ ) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+ j = eval('(' + text + ')');
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+ return typeof reviver === 'function'
+ ? walk({'': j}, '')
+ : j;
+ }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+ throw new SyntaxError('JSON.parse');
+ };
+ }
+}());
+
+;(function () {
+
+ var object = typeof exports != 'undefined' ? exports : this; // #8: web
workers
+ var chars =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+ function InvalidCharacterError(message) {
+ this.message = message;
+ }
+ InvalidCharacterError.prototype = new Error;
+ InvalidCharacterError.prototype.name = 'InvalidCharacterError';
+
+ // encoder
+ // [
https://gist.github.com/999166] by [
https://github.com/nignag]
+ object.btoa || (
+ object.btoa = function (input) {
+ var str = String(input);
+ for (
+ // initialize result and counter
+ var block, charCode, idx = 0, map = chars, output = '';
+ // if the next str index does not exist:
+ // change the mapping table to "="
+ // check if d has no fractional digits
+ str.charAt(idx | 0) || (map = '=', idx % 1);
+ // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
+ output += map.charAt(63 & block >> 8 - idx % 1 * 8)
+ ) {
+ charCode = str.charCodeAt(idx += 3/4);
+ if (charCode > 0xFF) {
+ throw new InvalidCharacterError("'btoa' failed: The string to be
encoded contains characters outside of the Latin1 range.");
+ }
+ block = block << 8 | charCode;
+ }
+ return output;
+ });
+
+ // decoder
+ // [
https://gist.github.com/1020396] by [
https://github.com/atk]
+ object.atob || (
+ object.atob = function (input) {
+ var str = String(input).replace(/=+$/, '');
+ if (str.length % 4 == 1) {
+ throw new InvalidCharacterError("'atob' failed: The string to be
decoded is not correctly encoded.");
+ }
+ for (
+ // initialize result and counters
+ var bc = 0, bs, buffer, idx = 0, output = '';
+ // get next character
+ buffer = str.charAt(idx++);
+ // character found in table? initialize bit storage and add its ascii value;
+ ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
+ // and if not first of each 4 characters,
+ // convert the first 8 bits to one ascii character
+ bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc &
6)) : 0
+ ) {
+ // try to find character in table (0-63, not found => -1)
+ buffer = chars.indexOf(buffer);
+ }
+ return output;
+ });
+
+}());
+
+/*!
+ * typeahead.js 0.11.1
+ *
https://github.com/twitter/typeahead.js
+ * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
+ */
+
+(function(root, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("bloodhound", [ "jquery" ], function(a0) {
+ return root["Bloodhound"] = factory(a0);
+ });
+ } else if (typeof exports === "object") {
+ module.exports = factory(require("jquery"));
+ } else {
+ root["Bloodhound"] = factory(jQuery);
+ }
+})(this, function($) {
+ var _ = function() {
+ "use strict";
+ return {
+ isMsie: function() {
+ return /(msie|trident)/i.test(navigator.userAgent) ?
navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
+ },
+ isBlankString: function(str) {
+ return !str || /^\s*$/.test(str);
+ },
+ escapeRegExChars: function(str) {
+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
"\\$&");
+ },
+ isString: function(obj) {
+ return typeof obj === "string";
+ },
+ isNumber: function(obj) {
+ return typeof obj === "number";
+ },
+ isArray: $.isArray,
+ isFunction: $.isFunction,
+ isObject: $.isPlainObject,
+ isUndefined: function(obj) {
+ return typeof obj === "undefined";
+ },
+ isElement: function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ },
+ isJQuery: function(obj) {
+ return obj instanceof $;
+ },
+ toStr: function toStr(s) {
+ return _.isUndefined(s) || s === null ? "" : s + "";
+ },
+ bind: $.proxy,
+ each: function(collection, cb) {
+ $.each(collection, reverseArgs);
+ function reverseArgs(index, value) {
+ return cb(value, index);
+ }
+ },
+ map: $.map,
+ filter: $.grep,
+ every: function(obj, test) {
+ var result = true;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (!(result = test.call(null, val, key, obj))) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ some: function(obj, test) {
+ var result = false;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (result = test.call(null, val, key, obj)) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ mixin: $.extend,
+ identity: function(x) {
+ return x;
+ },
+ clone: function(obj) {
+ return $.extend(true, {}, obj);
+ },
+ getIdGenerator: function() {
+ var counter = 0;
+ return function() {
+ return counter++;
+ };
+ },
+ templatify: function templatify(obj) {
+ return $.isFunction(obj) ? obj : template;
+ function template() {
+ return String(obj);
+ }
+ },
+ defer: function(fn) {
+ setTimeout(fn, 0);
+ },
+ debounce: function(func, wait, immediate) {
+ var timeout, result;
+ return function() {
+ var context = this, args = arguments, later, callNow;
+ later = function() {
+ timeout = null;
+ if (!immediate) {
+ result = func.apply(context, args);
+ }
+ };
+ callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) {
+ result = func.apply(context, args);
+ }
+ return result;
+ };
+ },
+ throttle: function(func, wait) {
+ var context, args, timeout, result, previous, later;
+ previous = 0;
+ later = function() {
+ previous = new Date();
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date(), remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ },
+ stringify: function(val) {
+ return _.isString(val) ? val : JSON.stringify(val);
+ },
+ noop: function() {}
+ };
+ }();
+ var VERSION = "0.11.1";
+ var tokenizers = function() {
+ "use strict";
+ return {
+ nonword: nonword,
+ whitespace: whitespace,
+ obj: {
+ nonword: getObjTokenizer(nonword),
+ whitespace: getObjTokenizer(whitespace)
+ }
+ };
+ function whitespace(str) {
+ str = _.toStr(str);
+ return str ? str.split(/\s+/) : [];
+ }
+ function nonword(str) {
+ str = _.toStr(str);
+ return str ? str.split(/\W+/) : [];
+ }
+ function getObjTokenizer(tokenizer) {
+ return function setKey(keys) {
+ keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);
+ return function tokenize(o) {
+ var tokens = [];
+ _.each(keys, function(k) {
+ tokens = tokens.concat(tokenizer(_.toStr(o[k])));
+ });
+ return tokens;
+ };
+ };
+ }
+ }();
+ var LruCache = function() {
+ "use strict";
+ function LruCache(maxSize) {
+ this.maxSize = _.isNumber(maxSize) ? maxSize : 100;
+ this.reset();
+ if (this.maxSize <= 0) {
+ this.set = this.get = $.noop;
+ }
+ }
+ _.mixin(LruCache.prototype, {
+ set: function set(key, val) {
+ var tailItem = this.list.tail, node;
+ if (this.size >= this.maxSize) {
+ this.list.remove(tailItem);
+ delete this.hash[tailItem.key];
+ this.size--;
+ }
+ if (node = this.hash[key]) {
+ node.val = val;
+ this.list.moveToFront(node);
+ } else {
+ node = new Node(key, val);
+ this.list.add(node);
+ this.hash[key] = node;
+ this.size++;
+ }
+ },
+ get: function get(key) {
+ var node = this.hash[key];
+ if (node) {
+ this.list.moveToFront(node);
+ return node.val;
+ }
+ },
+ reset: function reset() {
+ this.size = 0;
+ this.hash = {};
+ this.list = new List();
+ }
+ });
+ function List() {
+ this.head = this.tail = null;
+ }
+ _.mixin(List.prototype, {
+ add: function add(node) {
+ if (this.head) {
+ node.next = this.head;
+ this.head.prev = node;
+ }
+ this.head = node;
+ this.tail = this.tail || node;
+ },
+ remove: function remove(node) {
+ node.prev ? node.prev.next = node.next : this.head = node.next;
+ node.next ? node.next.prev = node.prev : this.tail = node.prev;
+ },
+ moveToFront: function(node) {
+ this.remove(node);
+ this.add(node);
+ }
+ });
+ function Node(key, val) {
+ this.key = key;
+ this.val = val;
+ this.prev = this.next = null;
+ }
+ return LruCache;
+ }();
+ var PersistentStorage = function() {
+ "use strict";
+ var LOCAL_STORAGE;
+ try {
+ LOCAL_STORAGE = window.localStorage;
+ LOCAL_STORAGE.setItem("~~~", "!");
+ LOCAL_STORAGE.removeItem("~~~");
+ } catch (err) {
+ LOCAL_STORAGE = null;
+ }
+ function PersistentStorage(namespace, override) {
+ this.prefix = [ "__", namespace, "__"
].join("");
+ this.ttlKey = "__ttl__";
+ this.keyMatcher = new RegExp("^" +
_.escapeRegExChars(this.prefix));
+ this.ls = override || LOCAL_STORAGE;
+ !this.ls && this._noop();
+ }
+ _.mixin(PersistentStorage.prototype, {
+ _prefix: function(key) {
+ return this.prefix + key;
+ },
+ _ttlKey: function(key) {
+ return this._prefix(key) + this.ttlKey;
+ },
+ _noop: function() {
+ this.get = this.set = this.remove = this.clear = this.isExpired =
_.noop;
+ },
+ _safeSet: function(key, val) {
+ try {
+ this.ls.setItem(key, val);
+ } catch (err) {
+ if (err.name === "QuotaExceededError") {
+ this.clear();
+ this._noop();
+ }
+ }
+ },
+ get: function(key) {
+ if (this.isExpired(key)) {
+ this.remove(key);
+ }
+ return decode(this.ls.getItem(this._prefix(key)));
+ },
+ set: function(key, val, ttl) {
+ if (_.isNumber(ttl)) {
+ this._safeSet(this._ttlKey(key), encode(now() + ttl));
+ } else {
+ this.ls.removeItem(this._ttlKey(key));
+ }
+ return this._safeSet(this._prefix(key), encode(val));
+ },
+ remove: function(key) {
+ this.ls.removeItem(this._ttlKey(key));
+ this.ls.removeItem(this._prefix(key));
+ return this;
+ },
+ clear: function() {
+ var i, keys = gatherMatchingKeys(this.keyMatcher);
+ for (i = keys.length; i--; ) {
+ this.remove(keys[i]);
+ }
+ return this;
+ },
+ isExpired: function(key) {
+ var ttl = decode(this.ls.getItem(this._ttlKey(key)));
+ return _.isNumber(ttl) && now() > ttl ? true : false;
+ }
+ });
+ return PersistentStorage;
+ function now() {
+ return new Date().getTime();
+ }
+ function encode(val) {
+ return JSON.stringify(_.isUndefined(val) ? null : val);
+ }
+ function decode(val) {
+ return $.parseJSON(val);
+ }
+ function gatherMatchingKeys(keyMatcher) {
+ var i, key, keys = [], len = LOCAL_STORAGE.length;
+ for (i = 0; i < len; i++) {
+ if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) {
+ keys.push(key.replace(keyMatcher, ""));
+ }
+ }
+ return keys;
+ }
+ }();
+ var Transport = function() {
+ "use strict";
+ var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6,
sharedCache = new LruCache(10);
+ function Transport(o) {
+ o = o || {};
+ this.cancelled = false;
+ this.lastReq = null;
+ this._send = o.transport;
+ this._get = o.limiter ? o.limiter(this._get) : this._get;
+ this._cache = o.cache === false ? new LruCache(0) : sharedCache;
+ }
+ Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {
+ maxPendingRequests = num;
+ };
+ Transport.resetCache = function resetCache() {
+ sharedCache.reset();
+ };
+ _.mixin(Transport.prototype, {
+ _fingerprint: function fingerprint(o) {
+ o = o || {};
+ return o.url + o.type + $.param(o.data || {});
+ },
+ _get: function(o, cb) {
+ var that = this, fingerprint, jqXhr;
+ fingerprint = this._fingerprint(o);
+ if (this.cancelled || fingerprint !== this.lastReq) {
+ return;
+ }
+ if (jqXhr = pendingRequests[fingerprint]) {
+ jqXhr.done(done).fail(fail);
+ } else if (pendingRequestsCount < maxPendingRequests) {
+ pendingRequestsCount++;
+ pendingRequests[fingerprint] =
this._send(o).done(done).fail(fail).always(always);
+ } else {
+ this.onDeckRequestArgs = [].slice.call(arguments, 0);
+ }
+ function done(resp) {
+ cb(null, resp);
+ that._cache.set(fingerprint, resp);
+ }
+ function fail() {
+ cb(true);
+ }
+ function always() {
+ pendingRequestsCount--;
+ delete pendingRequests[fingerprint];
+ if (that.onDeckRequestArgs) {
+ that._get.apply(that, that.onDeckRequestArgs);
+ that.onDeckRequestArgs = null;
+ }
+ }
+ },
+ get: function(o, cb) {
+ var resp, fingerprint;
+ cb = cb || $.noop;
+ o = _.isString(o) ? {
+ url: o
+ } : o || {};
+ fingerprint = this._fingerprint(o);
+ this.cancelled = false;
+ this.lastReq = fingerprint;
+ if (resp = this._cache.get(fingerprint)) {
+ cb(null, resp);
+ } else {
+ this._get(o, cb);
+ }
+ },
+ cancel: function() {
+ this.cancelled = true;
+ }
+ });
+ return Transport;
+ }();
+ var SearchIndex = window.SearchIndex = function() {
+ "use strict";
+ var CHILDREN = "c", IDS = "i";
+ function SearchIndex(o) {
+ o = o || {};
+ if (!o.datumTokenizer || !o.queryTokenizer) {
+ $.error("datumTokenizer and queryTokenizer are both
required");
+ }
+ this.identify = o.identify || _.stringify;
+ this.datumTokenizer = o.datumTokenizer;
+ this.queryTokenizer = o.queryTokenizer;
+ this.reset();
+ }
+ _.mixin(SearchIndex.prototype, {
+ bootstrap: function bootstrap(o) {
+ this.datums = o.datums;
+ this.trie = o.trie;
+ },
+ add: function(data) {
+ var that = this;
+ data = _.isArray(data) ? data : [ data ];
+ _.each(data, function(datum) {
+ var id, tokens;
+ that.datums[id = that.identify(datum)] = datum;
+ tokens = normalizeTokens(that.datumTokenizer(datum));
+ _.each(tokens, function(token) {
+ var node, chars, ch;
+ node = that.trie;
+ chars = token.split("");
+ while (ch = chars.shift()) {
+ node = node[CHILDREN][ch] || (node[CHILDREN][ch] =
newNode());
+ node[IDS].push(id);
+ }
+ });
+ });
+ },
+ get: function get(ids) {
+ var that = this;
+ return _.map(ids, function(id) {
+ return that.datums[id];
+ });
+ },
+ search: function search(query) {
+ var that = this, tokens, matches;
+ tokens = normalizeTokens(this.queryTokenizer(query));
+ _.each(tokens, function(token) {
+ var node, chars, ch, ids;
+ if (matches && matches.length === 0) {
+ return false;
+ }
+ node = that.trie;
+ chars = token.split("");
+ while (node && (ch = chars.shift())) {
+ node = node[CHILDREN][ch];
+ }
+ if (node && chars.length === 0) {
+ ids = node[IDS].slice(0);
+ matches = matches ? getIntersection(matches, ids) : ids;
+ } else {
+ matches = [];
+ return false;
+ }
+ });
+ return matches ? _.map(unique(matches), function(id) {
+ return that.datums[id];
+ }) : [];
+ },
+ all: function all() {
+ var values = [];
+ for (var key in this.datums) {
+ values.push(this.datums[key]);
+ }
+ return values;
+ },
+ reset: function reset() {
+ this.datums = {};
+ this.trie = newNode();
+ },
+ serialize: function serialize() {
+ return {
+ datums: this.datums,
+ trie: this.trie
+ };
+ }
+ });
+ return SearchIndex;
+ function normalizeTokens(tokens) {
+ tokens = _.filter(tokens, function(token) {
+ return !!token;
+ });
+ tokens = _.map(tokens, function(token) {
+ return token.toLowerCase();
+ });
+ return tokens;
+ }
+ function newNode() {
+ var node = {};
+ node[IDS] = [];
+ node[CHILDREN] = {};
+ return node;
+ }
+ function unique(array) {
+ var seen = {}, uniques = [];
+ for (var i = 0, len = array.length; i < len; i++) {
+ if (!seen[array[i]]) {
+ seen[array[i]] = true;
+ uniques.push(array[i]);
+ }
+ }
+ return uniques;
+ }
+ function getIntersection(arrayA, arrayB) {
+ var ai = 0, bi = 0, intersection = [];
+ arrayA = arrayA.sort();
+ arrayB = arrayB.sort();
+ var lenArrayA = arrayA.length, lenArrayB = arrayB.length;
+ while (ai < lenArrayA && bi < lenArrayB) {
+ if (arrayA[ai] < arrayB[bi]) {
+ ai++;
+ } else if (arrayA[ai] > arrayB[bi]) {
+ bi++;
+ } else {
+ intersection.push(arrayA[ai]);
+ ai++;
+ bi++;
+ }
+ }
+ return intersection;
+ }
+ }();
+ var Prefetch = function() {
+ "use strict";
+ var keys;
+ keys = {
+ data: "data",
+ protocol: "protocol",
+ thumbprint: "thumbprint"
+ };
+ function Prefetch(o) {
+ this.url = o.url;
+ this.ttl = o.ttl;
+ this.cache = o.cache;
+ this.prepare = o.prepare;
+ this.transform = o.transform;
+ this.transport = o.transport;
+ this.thumbprint = o.thumbprint;
+ this.storage = new PersistentStorage(o.cacheKey);
+ }
+ _.mixin(Prefetch.prototype, {
+ _settings: function settings() {
+ return {
+ url: this.url,
+ type: "GET",
+ dataType: "json"
+ };
+ },
+ store: function store(data) {
+ if (!this.cache) {
+ return;
+ }
+ this.storage.set(keys.data, data, this.ttl);
+ this.storage.set(keys.protocol, location.protocol, this.ttl);
+ this.storage.set(keys.thumbprint, this.thumbprint, this.ttl);
+ },
+ fromCache: function fromCache() {
+ var stored = {}, isExpired;
+ if (!this.cache) {
+ return null;
+ }
+ stored.data = this.storage.get(keys.data);
+ stored.protocol = this.storage.get(keys.protocol);
+ stored.thumbprint = this.storage.get(keys.thumbprint);
+ isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !==
location.protocol;
+ return stored.data && !isExpired ? stored.data : null;
+ },
+ fromNetwork: function(cb) {
+ var that = this, settings;
+ if (!cb) {
+ return;
+ }
+ settings = this.prepare(this._settings());
+ this.transport(settings).fail(onError).done(onResponse);
+ function onError() {
+ cb(true);
+ }
+ function onResponse(resp) {
+ cb(null, that.transform(resp));
+ }
+ },
+ clear: function clear() {
+ this.storage.clear();
+ return this;
+ }
+ });
+ return Prefetch;
+ }();
+ var Remote = function() {
+ "use strict";
+ function Remote(o) {
+ this.url = o.url;
+ this.prepare = o.prepare;
+ this.transform = o.transform;
+ this.transport = new Transport({
+ cache: o.cache,
+ limiter: o.limiter,
+ transport: o.transport
+ });
+ }
+ _.mixin(Remote.prototype, {
+ _settings: function settings() {
+ return {
+ url: this.url,
+ type: "GET",
+ dataType: "json"
+ };
+ },
+ get: function get(query, cb) {
+ var that = this, settings;
+ if (!cb) {
+ return;
+ }
+ query = query || "";
+ settings = this.prepare(query, this._settings());
+ return this.transport.get(settings, onResponse);
+ function onResponse(err, resp) {
+ err ? cb([]) : cb(that.transform(resp));
+ }
+ },
+ cancelLastRequest: function cancelLastRequest() {
+ this.transport.cancel();
+ }
+ });
+ return Remote;
+ }();
+ var oParser = function() {
+ "use strict";
+ return function parse(o) {
+ var defaults, sorter;
+ defaults = {
+ initialize: true,
+ identify: _.stringify,
+ datumTokenizer: null,
+ queryTokenizer: null,
+ sufficient: 5,
+ sorter: null,
+ local: [],
+ prefetch: null,
+ remote: null
+ };
+ o = _.mixin(defaults, o || {});
+ !o.datumTokenizer && $.error("datumTokenizer is
required");
+ !o.queryTokenizer && $.error("queryTokenizer is
required");
+ sorter = o.sorter;
+ o.sorter = sorter ? function(x) {
+ return x.sort(sorter);
+ } : _.identity;
+ o.local = _.isFunction(o.local) ? o.local() : o.local;
+ o.prefetch = parsePrefetch(o.prefetch);
+ o.remote = parseRemote(o.remote);
+ return o;
+ };
+ function parsePrefetch(o) {
+ var defaults;
+ if (!o) {
+ return null;
+ }
+ defaults = {
+ url: null,
+ ttl: 24 * 60 * 60 * 1e3,
+ cache: true,
+ cacheKey: null,
+ thumbprint: "",
+ prepare: _.identity,
+ transform: _.identity,
+ transport: null
+ };
+ o = _.isString(o) ? {
+ url: o
+ } : o;
+ o = _.mixin(defaults, o);
+ !o.url && $.error("prefetch requires url to be set");
+ o.transform = o.filter || o.transform;
+ o.cacheKey = o.cacheKey || o.url;
+ o.thumbprint = VERSION + o.thumbprint;
+ o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
+ return o;
+ }
+ function parseRemote(o) {
+ var defaults;
+ if (!o) {
+ return;
+ }
+ defaults = {
+ url: null,
+ cache: true,
+ prepare: null,
+ replace: null,
+ wildcard: null,
+ limiter: null,
+ rateLimitBy: "debounce",
+ rateLimitWait: 300,
+ transform: _.identity,
+ transport: null
+ };
+ o = _.isString(o) ? {
+ url: o
+ } : o;
+ o = _.mixin(defaults, o);
+ !o.url && $.error("remote requires url to be set");
+ o.transform = o.filter || o.transform;
+ o.prepare = toRemotePrepare(o);
+ o.limiter = toLimiter(o);
+ o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
+ delete o.replace;
+ delete o.wildcard;
+ delete o.rateLimitBy;
+ delete o.rateLimitWait;
+ return o;
+ }
+ function toRemotePrepare(o) {
+ var prepare, replace, wildcard;
+ prepare = o.prepare;
+ replace = o.replace;
+ wildcard = o.wildcard;
+ if (prepare) {
+ return prepare;
+ }
+ if (replace) {
+ prepare = prepareByReplace;
+ } else if (o.wildcard) {
+ prepare = prepareByWildcard;
+ } else {
+ prepare = idenityPrepare;
+ }
+ return prepare;
+ function prepareByReplace(query, settings) {
+ settings.url = replace(settings.url, query);
+ return settings;
+ }
+ function prepareByWildcard(query, settings) {
+ settings.url = settings.url.replace(wildcard,
encodeURIComponent(query));
+ return settings;
+ }
+ function idenityPrepare(query, settings) {
+ return settings;
+ }
+ }
+ function toLimiter(o) {
+ var limiter, method, wait;
+ limiter = o.limiter;
+ method = o.rateLimitBy;
+ wait = o.rateLimitWait;
+ if (!limiter) {
+ limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait);
+ }
+ return limiter;
+ function debounce(wait) {
+ return function debounce(fn) {
+ return _.debounce(fn, wait);
+ };
+ }
+ function throttle(wait) {
+ return function throttle(fn) {
+ return _.throttle(fn, wait);
+ };
+ }
+ }
+ function callbackToDeferred(fn) {
+ return function wrapper(o) {
+ var deferred = $.Deferred();
+ fn(o, onSuccess, onError);
+ return deferred;
+ function onSuccess(resp) {
+ _.defer(function() {
+ deferred.resolve(resp);
+ });
+ }
+ function onError(err) {
+ _.defer(function() {
+ deferred.reject(err);
+ });
+ }
+ };
+ }
+ }();
+ var Bloodhound = function() {
+ "use strict";
+ var old;
+ old = window && window.Bloodhound;
+ function Bloodhound(o) {
+ o = oParser(o);
+ this.sorter = o.sorter;
+ this.identify = o.identify;
+ this.sufficient = o.sufficient;
+ this.local = o.local;
+ this.remote = o.remote ? new Remote(o.remote) : null;
+ this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;
+ this.index = new SearchIndex({
+ identify: this.identify,
+ datumTokenizer: o.datumTokenizer,
+ queryTokenizer: o.queryTokenizer
+ });
+ o.initialize !== false && this.initialize();
+ }
+ Bloodhound.noConflict = function noConflict() {
+ window && (window.Bloodhound = old);
+ return Bloodhound;
+ };
+ Bloodhound.tokenizers = tokenizers;
+ _.mixin(Bloodhound.prototype, {
+ __ttAdapter: function ttAdapter() {
+ var that = this;
+ return this.remote ? withAsync : withoutAsync;
+ function withAsync(query, sync, async) {
+ return that.search(query, sync, async);
+ }
+ function withoutAsync(query, sync) {
+ return that.search(query, sync);
+ }
+ },
+ _loadPrefetch: function loadPrefetch() {
+ var that = this, deferred, serialized;
+ deferred = $.Deferred();
+ if (!this.prefetch) {
+ deferred.resolve();
+ } else if (serialized = this.prefetch.fromCache()) {
+ this.index.bootstrap(serialized);
+ deferred.resolve();
+ } else {
+ this.prefetch.fromNetwork(done);
+ }
+ return deferred.promise();
+ function done(err, data) {
+ if (err) {
+ return deferred.reject();
+ }
+ that.add(data);
+ that.prefetch.store(that.index.serialize());
+ deferred.resolve();
+ }
+ },
+ _initialize: function initialize() {
+ var that = this, deferred;
+ this.clear();
+ (this.initPromise = this._loadPrefetch()).done(addLocalToIndex);
+ return this.initPromise;
+ function addLocalToIndex() {
+ that.add(that.local);
+ }
+ },
+ initialize: function initialize(force) {
+ return !this.initPromise || force ? this._initialize() :
this.initPromise;
+ },
+ add: function add(data) {
+ this.index.add(data);
+ return this;
+ },
+ get: function get(ids) {
+ ids = _.isArray(ids) ? ids : [].slice.call(arguments);
+ return this.index.get(ids);
+ },
+ search: function search(query, sync, async) {
+ var that = this, local;
+ local = this.sorter(this.index.search(query));
+ sync(this.remote ? local.slice() : local);
+ if (this.remote && local.length < this.sufficient) {
+ this.remote.get(query, processRemote);
+ } else if (this.remote) {
+ this.remote.cancelLastRequest();
+ }
+ return this;
+ function processRemote(remote) {
+ var nonDuplicates = [];
+ _.each(remote, function(r) {
+ !_.some(local, function(l) {
+ return that.identify(r) === that.identify(l);
+ }) && nonDuplicates.push(r);
+ });
+ async && async(nonDuplicates);
+ }
+ },
+ all: function all() {
+ return this.index.all();
+ },
+ clear: function clear() {
+ this.index.reset();
+ return this;
+ },
+ clearPrefetchCache: function clearPrefetchCache() {
+ this.prefetch && this.prefetch.clear();
+ return this;
+ },
+ clearRemoteCache: function clearRemoteCache() {
+ Transport.resetCache();
+ return this;
+ },
+ ttAdapter: function ttAdapter() {
+ return this.__ttAdapter();
+ }
+ });
+ return Bloodhound;
+ }();
+ return Bloodhound;
+});
+
+(function(root, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("typeahead.js", [ "jquery" ], function(a0) {
+ return factory(a0);
+ });
+ } else if (typeof exports === "object") {
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(jQuery);
+ }
+})(this, function($) {
+ var _ = function() {
+ "use strict";
+ return {
+ isMsie: function() {
+ return /(msie|trident)/i.test(navigator.userAgent) ?
navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
+ },
+ isBlankString: function(str) {
+ return !str || /^\s*$/.test(str);
+ },
+ escapeRegExChars: function(str) {
+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
"\\$&");
+ },
+ isString: function(obj) {
+ return typeof obj === "string";
+ },
+ isNumber: function(obj) {
+ return typeof obj === "number";
+ },
+ isArray: $.isArray,
+ isFunction: $.isFunction,
+ isObject: $.isPlainObject,
+ isUndefined: function(obj) {
+ return typeof obj === "undefined";
+ },
+ isElement: function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ },
+ isJQuery: function(obj) {
+ return obj instanceof $;
+ },
+ toStr: function toStr(s) {
+ return _.isUndefined(s) || s === null ? "" : s + "";
+ },
+ bind: $.proxy,
+ each: function(collection, cb) {
+ $.each(collection, reverseArgs);
+ function reverseArgs(index, value) {
+ return cb(value, index);
+ }
+ },
+ map: $.map,
+ filter: $.grep,
+ every: function(obj, test) {
+ var result = true;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (!(result = test.call(null, val, key, obj))) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ some: function(obj, test) {
+ var result = false;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (result = test.call(null, val, key, obj)) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ mixin: $.extend,
+ identity: function(x) {
+ return x;
+ },
+ clone: function(obj) {
+ return $.extend(true, {}, obj);
+ },
+ getIdGenerator: function() {
+ var counter = 0;
+ return function() {
+ return counter++;
+ };
+ },
+ templatify: function templatify(obj) {
+ return $.isFunction(obj) ? obj : template;
+ function template() {
+ return String(obj);
+ }
+ },
+ defer: function(fn) {
+ setTimeout(fn, 0);
+ },
+ debounce: function(func, wait, immediate) {
+ var timeout, result;
+ return function() {
+ var context = this, args = arguments, later, callNow;
+ later = function() {
+ timeout = null;
+ if (!immediate) {
+ result = func.apply(context, args);
+ }
+ };
+ callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) {
+ result = func.apply(context, args);
+ }
+ return result;
+ };
+ },
+ throttle: function(func, wait) {
+ var context, args, timeout, result, previous, later;
+ previous = 0;
+ later = function() {
+ previous = new Date();
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date(), remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ },
+ stringify: function(val) {
+ return _.isString(val) ? val : JSON.stringify(val);
+ },
+ noop: function() {}
+ };
+ }();
+ var WWW = function() {
+ "use strict";
+ var defaultClassNames = {
+ wrapper: "twitter-typeahead",
+ input: "tt-input",
+ hint: "tt-hint",
+ menu: "tt-menu",
+ dataset: "tt-dataset",
+ suggestion: "tt-suggestion",
+ selectable: "tt-selectable",
+ empty: "tt-empty",
+ open: "tt-open",
+ cursor: "tt-cursor",
+ highlight: "tt-highlight"
+ };
+ return build;
+ function build(o) {
+ var www, classes;
+ classes = _.mixin({}, defaultClassNames, o);
+ www = {
+ css: buildCss(),
+ classes: classes,
+ html: buildHtml(classes),
+ selectors: buildSelectors(classes)
+ };
+ return {
+ css:
www.css,
+ html:
www.html,
+ classes:
www.classes,
+ selectors:
www.selectors,
+ mixin: function(o) {
+ _.mixin(o, www);
+ }
+ };
+ }
+ function buildHtml(c) {
+ return {
+ wrapper: '<span class="' + c.wrapper +
'"></span>',
+ menu: '<div class="' + c.menu +
'"></div>'
+ };
+ }
+ function buildSelectors(classes) {
+ var selectors = {};
+ _.each(classes, function(v, k) {
+ selectors[k] = "." + v;
+ });
+ return selectors;
+ }
+ function buildCss() {
+ var css = {
+ wrapper: {
+ position: "relative",
+ display: "inline-block"
+ },
+ hint: {
+ position: "absolute",
+ top: "0",
+ left: "0",
+ borderColor: "transparent",
+ boxShadow: "none",
+ opacity: "1"
+ },
+ input: {
+ position: "relative",
+ verticalAlign: "top",
+ backgroundColor: "transparent"
+ },
+ inputWithNoHint: {
+ position: "relative",
+ verticalAlign: "top"
+ },
+ menu: {
+ position: "absolute",
+ top: "100%",
+ left: "0",
+ zIndex: "100",
+ display: "none"
+ },
+ ltr: {
+ left: "0",
+ right: "auto"
+ },
+ rtl: {
+ left: "auto",
+ right: " 0"
+ }
+ };
+ if (_.isMsie()) {
+ _.mixin(css.input, {
+ backgroundImage:
"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
+ });
+ }
+ return css;
+ }
+ }();
+ var EventBus = function() {
+ "use strict";
+ var namespace, deprecationMap;
+ namespace = "typeahead:";
+ deprecationMap = {
+ render: "rendered",
+ cursorchange: "cursorchanged",
+ select: "selected",
+ autocomplete: "autocompleted"
+ };
+ function EventBus(o) {
+ if (!o || !o.el) {
+ $.error("EventBus initialized without el");
+ }
+ this.$el = $(o.el);
+ }
+ _.mixin(EventBus.prototype, {
+ _trigger: function(type, args) {
+ var $e;
+ $e = $.Event(namespace + type);
+ (args = args || []).unshift($e);
+ this.$el.trigger.apply(this.$el, args);
+ return $e;
+ },
+ before: function(type) {
+ var args, $e;
+ args = [].slice.call(arguments, 1);
+ $e = this._trigger("before" + type, args);
+ return $e.isDefaultPrevented();
+ },
+ trigger: function(type) {
+ var deprecatedType;
+ this._trigger(type, [].slice.call(arguments, 1));
+ if (deprecatedType = deprecationMap[type]) {
+ this._trigger(deprecatedType, [].slice.call(arguments, 1));
+ }
+ }
+ });
+ return EventBus;
+ }();
+ var EventEmitter = function() {
+ "use strict";
+ var splitter = /\s+/, nextTick = getNextTick();
+ return {
+ onSync: onSync,
+ onAsync: onAsync,
+ off: off,
+ trigger: trigger
+ };
+ function on(method, types, cb, context) {
+ var type;
+ if (!cb) {
+ return this;
+ }
+ types = types.split(splitter);
+ cb = context ? bindContext(cb, context) : cb;
+ this._callbacks = this._callbacks || {};
+ while (type = types.shift()) {
+ this._callbacks[type] = this._callbacks[type] || {
+ sync: [],
+ async: []
+ };
+ this._callbacks[type][method].push(cb);
+ }
+ return this;
+ }
+ function onAsync(types, cb, context) {
+ return on.call(this, "async", types, cb, context);
+ }
+ function onSync(types, cb, context) {
+ return on.call(this, "sync", types, cb, context);
+ }
+ function off(types) {
+ var type;
+ if (!this._callbacks) {
+ return this;
+ }
+ types = types.split(splitter);
+ while (type = types.shift()) {
+ delete this._callbacks[type];
+ }
+ return this;
+ }
+ function trigger(types) {
+ var type, callbacks, args, syncFlush, asyncFlush;
+ if (!this._callbacks) {
+ return this;
+ }
+ types = types.split(splitter);
+ args = [].slice.call(arguments, 1);
+ while ((type = types.shift()) && (callbacks = this._callbacks[type]))
{
+ syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));
+ asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));
+ syncFlush() && nextTick(asyncFlush);
+ }
+ return this;
+ }
+ function getFlush(callbacks, context, args) {
+ return flush;
+ function flush() {
+ var cancelled;
+ for (var i = 0, len = callbacks.length; !cancelled && i < len;
i += 1) {
+ cancelled = callbacks[i].apply(context, args) === false;
+ }
+ return !cancelled;
+ }
+ }
+ function getNextTick() {
+ var nextTickFn;
+ if (window.setImmediate) {
+ nextTickFn = function nextTickSetImmediate(fn) {
+ setImmediate(function() {
+ fn();
+ });
+ };
+ } else {
+ nextTickFn = function nextTickSetTimeout(fn) {
+ setTimeout(function() {
+ fn();
+ }, 0);
+ };
+ }
+ return nextTickFn;
+ }
+ function bindContext(fn, context) {
+ return fn.bind ? fn.bind(context) : function() {
+ fn.apply(context, [].slice.call(arguments, 0));
+ };
+ }
+ }();
+ var highlight = function(doc) {
+ "use strict";
+ var defaults = {
+ node: null,
+ pattern: null,
+ tagName: "strong",
+ className: null,
+ wordsOnly: false,
+ caseSensitive: false
+ };
+ return function hightlight(o) {
+ var regex;
+ o = _.mixin({}, defaults, o);
+ if (!o.node || !o.pattern) {
+ return;
+ }
+ o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
+ regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
+ traverse(o.node, hightlightTextNode);
+ function hightlightTextNode(textNode) {
+ var match, patternNode, wrapperNode;
+ if (match = regex.exec(textNode.data)) {
+ wrapperNode = doc.createElement(o.tagName);
+ o.className && (wrapperNode.className = o.className);
+ patternNode = textNode.splitText(match.index);
+ patternNode.splitText(match[0].length);
+ wrapperNode.appendChild(patternNode.cloneNode(true));
+ textNode.parentNode.replaceChild(wrapperNode, patternNode);
+ }
+ return !!match;
+ }
+ function traverse(el, hightlightTextNode) {
+ var childNode, TEXT_NODE_TYPE = 3;
+ for (var i = 0; i < el.childNodes.length; i++) {
+ childNode = el.childNodes[i];
+ if (childNode.nodeType === TEXT_NODE_TYPE) {
+ i += hightlightTextNode(childNode) ? 1 : 0;
+ } else {
+ traverse(childNode, hightlightTextNode);
+ }
+ }
+ }
+ };
+ function getRegex(patterns, caseSensitive, wordsOnly) {
+ var escapedPatterns = [], regexStr;
+ for (var i = 0, len = patterns.length; i < len; i++) {
+ escapedPatterns.push(_.escapeRegExChars(patterns[i]));
+ }
+ regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|")
+ ")\\b" : "(" + escapedPatterns.join("|") + ")";
+ return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr,
"i");
+ }
+ }(window.document);
+ var Input = function() {
+ "use strict";
+ var specialKeyCodeMap;
+ specialKeyCodeMap = {
+ 9: "tab",
+ 27: "esc",
+ 37: "left",
+ 39: "right",
+ 13: "enter",
+ 38: "up",
+ 40: "down"
+ };
+ function Input(o, www) {
+ o = o || {};
+ if (!o.input) {
+ $.error("input is missing");
+ }
+
www.mixin(this);
+ this.$hint = $(o.hint);
+ this.$input = $(o.input);
+ this.query = this.$input.val();
+ this.queryWhenFocused = this.hasFocus() ? this.query : null;
+ this.$overflowHelper = buildOverflowHelper(this.$input);
+ this._checkLanguageDirection();
+ if (this.$hint.length === 0) {
+ this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid =
_.noop;
+ }
+ }
+ Input.normalizeQuery = function(str) {
+ return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, "
");
+ };
+ _.mixin(Input.prototype, EventEmitter, {
+ _onBlur: function onBlur() {
+ this.resetInputValue();
+ this.trigger("blurred");
+ },
+ _onFocus: function onFocus() {
+ this.queryWhenFocused = this.query;
+ this.trigger("focused");
+ },
+ _onKeydown: function onKeydown($e) {
+ var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
+ this._managePreventDefault(keyName, $e);
+ if (keyName && this._shouldTrigger(keyName, $e)) {
+ this.trigger(keyName + "Keyed", $e);
+ }
+ },
+ _onInput: function onInput() {
+ this._setQuery(this.getInputValue());
+ this.clearHintIfInvalid();
+ this._checkLanguageDirection();
+ },
+ _managePreventDefault: function managePreventDefault(keyName, $e) {
+ var preventDefault;
+ switch (keyName) {
+ case "up":
+ case "down":
+ preventDefault = !withModifier($e);
+ break;
+
+ default:
+ preventDefault = false;
+ }
+ preventDefault && $e.preventDefault();
+ },
+ _shouldTrigger: function shouldTrigger(keyName, $e) {
+ var trigger;
+ switch (keyName) {
+ case "tab":
+ trigger = !withModifier($e);
+ break;
+
+ default:
+ trigger = true;
+ }
+ return trigger;
+ },
+ _checkLanguageDirection: function checkLanguageDirection() {
+ var dir = (this.$input.css("direction") ||
"ltr").toLowerCase();
+ if (this.dir !== dir) {
+ this.dir = dir;
+ this.$hint.attr("dir", dir);
+ this.trigger("langDirChanged", dir);
+ }
+ },
+ _setQuery: function setQuery(val, silent) {
+ var areEquivalent, hasDifferentWhitespace;
+ areEquivalent = areQueriesEquivalent(val, this.query);
+ hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length
: false;
+ this.query = val;
+ if (!silent && !areEquivalent) {
+ this.trigger("queryChanged", this.query);
+ } else if (!silent && hasDifferentWhitespace) {
+ this.trigger("whitespaceChanged", this.query);
+ }
+ },
+ bind: function() {
+ var that = this, onBlur, onFocus, onKeydown, onInput;
+ onBlur = _.bind(this._onBlur, this);
+ onFocus = _.bind(this._onFocus, this);
+ onKeydown = _.bind(this._onKeydown, this);
+ onInput = _.bind(this._onInput, this);
+ this.$input.on("blur.tt", onBlur).on("focus.tt",
onFocus).on("keydown.tt", onKeydown);
+ if (!_.isMsie() || _.isMsie() > 9) {
+ this.$input.on("input.tt", onInput);
+ } else {
+ this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",
function($e) {
+ if (specialKeyCodeMap[$e.which || $e.keyCode]) {
+ return;
+ }
+ _.defer(_.bind(that._onInput, that, $e));
+ });
+ }
+ return this;
+ },
+ focus: function focus() {
+ this.$input.focus();
+ },
+ blur: function blur() {
+ this.$input.blur();
+ },
+ getLangDir: function getLangDir() {
+ return this.dir;
+ },
+ getQuery: function getQuery() {
+ return this.query || "";
+ },
+ setQuery: function setQuery(val, silent) {
+ this.setInputValue(val);
+ this._setQuery(val, silent);
+ },
+ hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {
+ return this.query !== this.queryWhenFocused;
+ },
+ getInputValue: function getInputValue() {
+ return this.$input.val();
+ },
+ setInputValue: function setInputValue(value) {
+ this.$input.val(value);
+ this.clearHintIfInvalid();
+ this._checkLanguageDirection();
+ },
+ resetInputValue: function resetInputValue() {
+ this.setInputValue(this.query);
+ },
+ getHint: function getHint() {
+ return this.$hint.val();
+ },
+ setHint: function setHint(value) {
+ this.$hint.val(value);
+ },
+ clearHint: function clearHint() {
+ this.setHint("");
+ },
+ clearHintIfInvalid: function clearHintIfInvalid() {
+ var val, hint, valIsPrefixOfHint, isValid;
+ val = this.getInputValue();
+ hint = this.getHint();
+ valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
+ isValid = val !== "" && valIsPrefixOfHint &&
!this.hasOverflow();
+ !isValid && this.clearHint();
+ },
+ hasFocus: function hasFocus() {
+ return this.$input.is(":focus");
+ },
+ hasOverflow: function hasOverflow() {
+ var constraint = this.$input.width() - 2;
+ this.$overflowHelper.text(this.getInputValue());
+ return this.$overflowHelper.width() >= constraint;
+ },
+ isCursorAtEnd: function() {
+ var valueLength, selectionStart, range;
+ valueLength = this.$input.val().length;
+ selectionStart = this.$input[0].selectionStart;
+ if (_.isNumber(selectionStart)) {
+ return selectionStart === valueLength;
+ } else if (document.selection) {
+ range = document.selection.createRange();
+ range.moveStart("character", -valueLength);
+ return valueLength === range.text.length;
+ }
+ return true;
+ },
+ destroy: function destroy() {
+ this.$hint.off(".tt");
+ this.$input.off(".tt");
+ this.$overflowHelper.remove();
+ this.$hint = this.$input = this.$overflowHelper =
$("<div>");
+ }
+ });
+ return Input;
+ function buildOverflowHelper($input) {
+ return $('<pre
aria-hidden="true"></pre>').css({
+ position: "absolute",
+ visibility: "hidden",
+ whiteSpace: "pre",
+ fontFamily: $input.css("font-family"),
+ fontSize: $input.css("font-size"),
+ fontStyle: $input.css("font-style"),
+ fontVariant: $input.css("font-variant"),
+ fontWeight: $input.css("font-weight"),
+ wordSpacing: $input.css("word-spacing"),
+ letterSpacing: $input.css("letter-spacing"),
+ textIndent: $input.css("text-indent"),
+ textRendering: $input.css("text-rendering"),
+ textTransform: $input.css("text-transform")
+ }).insertAfter($input);
+ }
+ function areQueriesEquivalent(a, b) {
+ return Input.normalizeQuery(a) === Input.normalizeQuery(b);
+ }
+ function withModifier($e) {
+ return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
+ }
+ }();
+ var Dataset = function() {
+ "use strict";
+ var keys, nameGenerator;
+ keys = {
+ val: "tt-selectable-display",
+ obj: "tt-selectable-object"
+ };
+ nameGenerator = _.getIdGenerator();
+ function Dataset(o, www) {
+ o = o || {};
+ o.templates = o.templates || {};
+ o.templates.notFound = o.templates.notFound || o.templates.empty;
+ if (!o.source) {
+ $.error("missing source");
+ }
+ if (!o.node) {
+ $.error("missing node");
+ }
+ if (o.name && !isValidName(o.name)) {
+ $.error("invalid dataset name: " + o.name);
+ }
+
www.mixin(this);
+ this.highlight = !!o.highlight;
+ this.name = o.name || nameGenerator();
+ this.limit = o.limit || 5;
+ this.displayFn = getDisplayFn(o.display || o.displayKey);
+ this.templates = getTemplates(o.templates, this.displayFn);
+ this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;
+ this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;
+ this._resetLastSuggestion();
+ this.$el =
$(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" +
this.name);
+ }
+ Dataset.extractData = function extractData(el) {
+ var $el = $(el);
+ if ($el.data(keys.obj)) {
+ return {
+ val: $el.data(keys.val) || "",
+ obj: $el.data(keys.obj) || null
+ };
+ }
+ return null;
+ };
+ _.mixin(Dataset.prototype, EventEmitter, {
+ _overwrite: function overwrite(query, suggestions) {
+ suggestions = suggestions || [];
+ if (suggestions.length) {
+ this._renderSuggestions(query, suggestions);
+ } else if (this.async && this.templates.pending) {
+ this._renderPending(query);
+ } else if (!this.async && this.templates.notFound) {
+ this._renderNotFound(query);
+ } else {
+ this._empty();
+ }
+ this.trigger("rendered", this.name, suggestions, false);
+ },
+ _append: function append(query, suggestions) {
+ suggestions = suggestions || [];
+ if (suggestions.length && this.$lastSuggestion.length) {
+ this._appendSuggestions(query, suggestions);
+ } else if (suggestions.length) {
+ this._renderSuggestions(query, suggestions);
+ } else if (!this.$lastSuggestion.length &&
this.templates.notFound) {
+ this._renderNotFound(query);
+ }
+ this.trigger("rendered", this.name, suggestions, true);
+ },
+ _renderSuggestions: function renderSuggestions(query, suggestions) {
+ var $fragment;
+ $fragment = this._getSuggestionsFragment(query, suggestions);
+ this.$lastSuggestion = $fragment.children().last();
+ this.$el.html($fragment).prepend(this._getHeader(query,
suggestions)).append(this._getFooter(query, suggestions));
+ },
+ _appendSuggestions: function appendSuggestions(query, suggestions) {
+ var $fragment, $lastSuggestion;
+ $fragment = this._getSuggestionsFragment(query, suggestions);
+ $lastSuggestion = $fragment.children().last();
+ this.$lastSuggestion.after($fragment);
+ this.$lastSuggestion = $lastSuggestion;
+ },
+ _renderPending: function renderPending(query) {
+ var template = this.templates.pending;
+ this._resetLastSuggestion();
+ template && this.$el.html(template({
+ query: query,
+ dataset: this.name
+ }));
+ },
+ _renderNotFound: function renderNotFound(query) {
+ var template = this.templates.notFound;
+ this._resetLastSuggestion();
+ template && this.$el.html(template({
+ query: query,
+ dataset: this.name
+ }));
+ },
+ _empty: function empty() {
+ this.$el.empty();
+ this._resetLastSuggestion();
+ },
+ _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions)
{
+ var that = this, fragment;
+ fragment = document.createDocumentFragment();
+ _.each(suggestions, function getSuggestionNode(suggestion) {
+ var $el, context;
+ context = that._injectQuery(query, suggestion);
+ $el = $(that.templates.suggestion(context)).data(keys.obj,
suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion +
" " + that.classes.selectable);
+ fragment.appendChild($el[0]);
+ });
+ this.highlight && highlight({
+ className: this.classes.highlight,
+ node: fragment,
+ pattern: query
+ });
+ return $(fragment);
+ },
+ _getFooter: function getFooter(query, suggestions) {
+ return this.templates.footer ? this.templates.footer({
+ query: query,
+ suggestions: suggestions,
+ dataset: this.name
+ }) : null;
+ },
+ _getHeader: function getHeader(query, suggestions) {
+ return this.templates.header ? this.templates.header({
+ query: query,
+ suggestions: suggestions,
+ dataset: this.name
+ }) : null;
+ },
+ _resetLastSuggestion: function resetLastSuggestion() {
+ this.$lastSuggestion = $();
+ },
+ _injectQuery: function injectQuery(query, obj) {
+ return _.isObject(obj) ? _.mixin({
+ _query: query
+ }, obj) : obj;
+ },
+ update: function update(query) {
+ var that = this, canceled = false, syncCalled = false, rendered = 0;
+ this.cancel();
+ this.cancel = function cancel() {
+ canceled = true;
+ that.cancel = $.noop;
+ that.async && that.trigger("asyncCanceled",
query);
+ };
+ this.source(query, sync, async);
+ !syncCalled && sync([]);
+ function sync(suggestions) {
+ if (syncCalled) {
+ return;
+ }
+ syncCalled = true;
+ suggestions = (suggestions || []).slice(0, that.limit);
+ rendered = suggestions.length;
+ that._overwrite(query, suggestions);
+ if (rendered < that.limit && that.async) {
+ that.trigger("asyncRequested", query);
+ }
+ }
+ function async(suggestions) {
+ suggestions = suggestions || [];
+ if (!canceled && rendered < that.limit) {
+ that.cancel = $.noop;
+ rendered += suggestions.length;
+ that._append(query, suggestions.slice(0, that.limit -
rendered));
+ that.async && that.trigger("asyncReceived",
query);
+ }
+ }
+ },
+ cancel: $.noop,
+ clear: function clear() {
+ this._empty();
+ this.cancel();
+ this.trigger("cleared");
+ },
+ isEmpty: function isEmpty() {
+ return this.$el.is(":empty");
+ },
+ destroy: function destroy() {
+ this.$el = $("<div>");
+ }
+ });
+ return Dataset;
+ function getDisplayFn(display) {
+ display = display || _.stringify;
+ return _.isFunction(display) ? display : displayFn;
+ function displayFn(obj) {
+ return obj[display];
+ }
+ }
+ function getTemplates(templates, displayFn) {
+ return {
+ notFound: templates.notFound &&
_.templatify(templates.notFound),
+ pending: templates.pending && _.templatify(templates.pending),
+ header: templates.header && _.templatify(templates.header),
+ footer: templates.footer && _.templatify(templates.footer),
+ suggestion: templates.suggestion || suggestionTemplate
+ };
+ function suggestionTemplate(context) {
+ return $("<div>").text(displayFn(context));
+ }
+ }
+ function isValidName(str) {
+ return /^[_a-zA-Z0-9-]+$/.test(str);
+ }
+ }();
+ var Menu = function() {
+ "use strict";
+ function Menu(o, www) {
+ var that = this;
+ o = o || {};
+ if (!o.node) {
+ $.error("node is required");
+ }
+
www.mixin(this);
+ this.$node = $(o.node);
+ this.query = null;
+ this.datasets = _.map(o.datasets, initializeDataset);
+ function initializeDataset(oDataset) {
+ var node = that.$node.find(oDataset.node).first();
+ oDataset.node = node.length ? node :
$("<div>").appendTo(that.$node);
+ return new Dataset(oDataset, www);
+ }
+ }
+ _.mixin(Menu.prototype, EventEmitter, {
+ _onSelectableClick: function onSelectableClick($e) {
+ this.trigger("selectableClicked", $($e.currentTarget));
+ },
+ _onRendered: function onRendered(type, dataset, suggestions, async) {
+ this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+ this.trigger("datasetRendered", dataset, suggestions, async);
+ },
+ _onCleared: function onCleared() {
+ this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+ this.trigger("datasetCleared");
+ },
+ _propagate: function propagate() {
+ this.trigger.apply(this, arguments);
+ },
+ _allDatasetsEmpty: function allDatasetsEmpty() {
+ return _.every(this.datasets, isDatasetEmpty);
+ function isDatasetEmpty(dataset) {
+ return dataset.isEmpty();
+ }
+ },
+ _getSelectables: function getSelectables() {
+ return this.$node.find(this.selectors.selectable);
+ },
+ _removeCursor: function _removeCursor() {
+ var $selectable = this.getActiveSelectable();
+ $selectable && $selectable.removeClass(this.classes.cursor);
+ },
+ _ensureVisible: function ensureVisible($el) {
+ var elTop, elBottom, nodeScrollTop, nodeHeight;
+ elTop = $el.position().top;
+ elBottom = elTop + $el.outerHeight(true);
+ nodeScrollTop = this.$node.scrollTop();
+ nodeHeight = this.$node.height() +
parseInt(this.$node.css("paddingTop"), 10) +
parseInt(this.$node.css("paddingBottom"), 10);
+ if (elTop < 0) {
+ this.$node.scrollTop(nodeScrollTop + elTop);
+ } else if (nodeHeight < elBottom) {
+ this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));
+ }
+ },
+ bind: function() {
+ var that = this, onSelectableClick;
+ onSelectableClick = _.bind(this._onSelectableClick, this);
+ this.$node.on("click.tt", this.selectors.selectable,
onSelectableClick);
+ _.each(this.datasets, function(dataset) {
+ dataset.onSync("asyncRequested", that._propagate,
that).onSync("asyncCanceled", that._propagate,
that).onSync("asyncReceived", that._propagate,
that).onSync("rendered", that._onRendered, that).onSync("cleared",
that._onCleared, that);
+ });
+ return this;
+ },
+ isOpen: function isOpen() {
+ return this.$node.hasClass(this.classes.open);
+ },
+ open: function open() {
+ this.$node.addClass(this.classes.open);
+ },
+ close: function close() {
+ this.$node.removeClass(this.classes.open);
+ this._removeCursor();
+ },
+ setLanguageDirection: function setLanguageDirection(dir) {
+ this.$node.attr("dir", dir);
+ },
+ selectableRelativeToCursor: function selectableRelativeToCursor(delta) {
+ var $selectables, $oldCursor, oldIndex, newIndex;
+ $oldCursor = this.getActiveSelectable();
+ $selectables = this._getSelectables();
+ oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;
+ newIndex = oldIndex + delta;
+ newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;
+ newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;
+ return newIndex === -1 ? null : $selectables.eq(newIndex);
+ },
+ setCursor: function setCursor($selectable) {
+ this._removeCursor();
+ if ($selectable = $selectable && $selectable.first()) {
+ $selectable.addClass(this.classes.cursor);
+ this._ensureVisible($selectable);
+ }
+ },
+ getSelectableData: function getSelectableData($el) {
+ return $el && $el.length ? Dataset.extractData($el) : null;
+ },
+ getActiveSelectable: function getActiveSelectable() {
+ var $selectable =
this._getSelectables().filter(this.selectors.cursor).first();
+ return $selectable.length ? $selectable : null;
+ },
+ getTopSelectable: function getTopSelectable() {
+ var $selectable = this._getSelectables().first();
+ return $selectable.length ? $selectable : null;
+ },
+ update: function update(query) {
+ var isValidUpdate = query !== this.query;
+ if (isValidUpdate) {
+ this.query = query;
+ _.each(this.datasets, updateDataset);
+ }
+ return isValidUpdate;
+ function updateDataset(dataset) {
+ dataset.update(query);
+ }
+ },
+ empty: function empty() {
+ _.each(this.datasets, clearDataset);
+ this.query = null;
+ this.$node.addClass(this.classes.empty);
+ function clearDataset(dataset) {
+ dataset.clear();
+ }
+ },
+ destroy: function destroy() {
+ this.$node.off(".tt");
+ this.$node = $("<div>");
+ _.each(this.datasets, destroyDataset);
+ function destroyDataset(dataset) {
+ dataset.destroy();
+ }
+ }
+ });
+ return Menu;
+ }();
+ var DefaultMenu = function() {
+ "use strict";
+ var s = Menu.prototype;
+ function DefaultMenu() {
+ Menu.apply(this, [].slice.call(arguments, 0));
+ }
+ _.mixin(DefaultMenu.prototype, Menu.prototype, {
+ open: function open() {
+ !this._allDatasetsEmpty() && this._show();
+ return s.open.apply(this, [].slice.call(arguments, 0));
+ },
+ close: function close() {
+ this._hide();
+ return s.close.apply(this, [].slice.call(arguments, 0));
+ },
+ _onRendered: function onRendered() {
+ if (this._allDatasetsEmpty()) {
+ this._hide();
+ } else {
+ this.isOpen() && this._show();
+ }
+ return s._onRendered.apply(this, [].slice.call(arguments, 0));
+ },
+ _onCleared: function onCleared() {
+ if (this._allDatasetsEmpty()) {
+ this._hide();
+ } else {
+ this.isOpen() && this._show();
+ }
+ return s._onCleared.apply(this, [].slice.call(arguments, 0));
+ },
+ setLanguageDirection: function setLanguageDirection(dir) {
+ this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl);
+ return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));
+ },
+ _hide: function hide() {
+ this.$node.hide();
+ },
+ _show: function show() {
+ this.$node.css("display", "block");
+ }
+ });
+ return DefaultMenu;
+ }();
+ var Typeahead = function() {
+ "use strict";
+ function Typeahead(o, www) {
+ var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed,
onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;
+ o = o || {};
+ if (!o.input) {
+ $.error("missing input");
+ }
+ if (!o.menu) {
+ $.error("missing menu");
+ }
+ if (!o.eventBus) {
+ $.error("missing event bus");
+ }
+
www.mixin(this);
+ this.eventBus = o.eventBus;
+ this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
+ this.input = o.input;
+ this.menu = o.menu;
+ this.enabled = true;
+ this.active = false;
+ this.input.hasFocus() && this.activate();
+ this.dir = this.input.getLangDir();
+ this._hacks();
+ this.menu.bind().onSync("selectableClicked",
this._onSelectableClicked, this).onSync("asyncRequested",
this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled,
this).onSync("asyncReceived", this._onAsyncReceived,
this).onSync("datasetRendered", this._onDatasetRendered,
this).onSync("datasetCleared", this._onDatasetCleared, this);
+ onFocused = c(this, "activate", "open",
"_onFocused");
+ onBlurred = c(this, "deactivate", "_onBlurred");
+ onEnterKeyed = c(this, "isActive", "isOpen",
"_onEnterKeyed");
+ onTabKeyed = c(this, "isActive", "isOpen",
"_onTabKeyed");
+ onEscKeyed = c(this, "isActive", "_onEscKeyed");
+ onUpKeyed = c(this, "isActive", "open",
"_onUpKeyed");
+ onDownKeyed = c(this, "isActive", "open",
"_onDownKeyed");
+ onLeftKeyed = c(this, "isActive", "isOpen",
"_onLeftKeyed");
+ onRightKeyed = c(this, "isActive", "isOpen",
"_onRightKeyed");
+ onQueryChanged = c(this, "_openIfActive",
"_onQueryChanged");
+ onWhitespaceChanged = c(this, "_openIfActive",
"_onWhitespaceChanged");
+ this.input.bind().onSync("focused", onFocused,
this).onSync("blurred", onBlurred, this).onSync("enterKeyed",
onEnterKeyed, this).onSync("tabKeyed", onTabKeyed,
this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed",
onUpKeyed, this).onSync("downKeyed", onDownKeyed,
this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed",
onRightKeyed, this).onSync("queryChanged", onQueryChanged,
this).onSync("whitespaceChanged", onWhitespaceChanged,
this).onSync("langDirChanged", this._onLangDirChanged, this);
+ }
+ _.mixin(Typeahead.prototype, {
+ _hacks: function hacks() {
+ var $input, $menu;
+ $input = this.input.$input || $("<div>");
+ $menu = this.menu.$node || $("<div>");
+ $input.on("blur.tt", function($e) {
+ var active, isActive, hasActive;
+ active = document.activeElement;
+ isActive = $menu.is(active);
+ hasActive = $menu.has(active).length > 0;
+ if (_.isMsie() && (isActive || hasActive)) {
+ $e.preventDefault();
+ $e.stopImmediatePropagation();
+ _.defer(function() {
+ $input.focus();
+ });
+ }
+ });
+ $menu.on("mousedown.tt", function($e) {
+ $e.preventDefault();
+ });
+ },
+ _onSelectableClicked: function onSelectableClicked(type, $el) {
+ this.select($el);
+ },
+ _onDatasetCleared: function onDatasetCleared() {
+ this._updateHint();
+ },
+ _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions,
async) {
+ this._updateHint();
+ this.eventBus.trigger("render", suggestions, async, dataset);
+ },
+ _onAsyncRequested: function onAsyncRequested(type, dataset, query) {
+ this.eventBus.trigger("asyncrequest", query, dataset);
+ },
+ _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {
+ this.eventBus.trigger("asynccancel", query, dataset);
+ },
+ _onAsyncReceived: function onAsyncReceived(type, dataset, query) {
+ this.eventBus.trigger("asyncreceive", query, dataset);
+ },
+ _onFocused: function onFocused() {
+ this._minLengthMet() && this.menu.update(this.input.getQuery());
+ },
+ _onBlurred: function onBlurred() {
+ if (this.input.hasQueryChangedSinceLastFocus()) {
+ this.eventBus.trigger("change", this.input.getQuery());
+ }
+ },
+ _onEnterKeyed: function onEnterKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ this.select($selectable) && $e.preventDefault();
+ }
+ },
+ _onTabKeyed: function onTabKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ this.select($selectable) && $e.preventDefault();
+ } else if ($selectable = this.menu.getTopSelectable()) {
+ this.autocomplete($selectable) && $e.preventDefault();
+ }
+ },
+ _onEscKeyed: function onEscKeyed() {
+ this.close();
+ },
+ _onUpKeyed: function onUpKeyed() {
+ this.moveCursor(-1);
+ },
+ _onDownKeyed: function onDownKeyed() {
+ this.moveCursor(+1);
+ },
+ _onLeftKeyed: function onLeftKeyed() {
+ if (this.dir === "rtl" && this.input.isCursorAtEnd())
{
+ this.autocomplete(this.menu.getTopSelectable());
+ }
+ },
+ _onRightKeyed: function onRightKeyed() {
+ if (this.dir === "ltr" && this.input.isCursorAtEnd())
{
+ this.autocomplete(this.menu.getTopSelectable());
+ }
+ },
+ _onQueryChanged: function onQueryChanged(e, query) {
+ this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();
+ },
+ _onWhitespaceChanged: function onWhitespaceChanged() {
+ this._updateHint();
+ },
+ _onLangDirChanged: function onLangDirChanged(e, dir) {
+ if (this.dir !== dir) {
+ this.dir = dir;
+ this.menu.setLanguageDirection(dir);
+ }
+ },
+ _openIfActive: function openIfActive() {
+ this.isActive() && this.open();
+ },
+ _minLengthMet: function minLengthMet(query) {
+ query = _.isString(query) ? query : this.input.getQuery() ||
"";
+ return query.length >= this.minLength;
+ },
+ _updateHint: function updateHint() {
+ var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;
+ $selectable = this.menu.getTopSelectable();
+ data = this.menu.getSelectableData($selectable);
+ val = this.input.getInputValue();
+ if (data && !_.isBlankString(val) &&
!this.input.hasOverflow()) {
+ query = Input.normalizeQuery(val);
+ escapedQuery = _.escapeRegExChars(query);
+ frontMatchRegEx = new RegExp("^(?:" + escapedQuery +
")(.+$)", "i");
+ match = frontMatchRegEx.exec(data.val);
+ match && this.input.setHint(val + match[1]);
+ } else {
+ this.input.clearHint();
+ }
+ },
+ isEnabled: function isEnabled() {
+ return this.enabled;
+ },
+ enable: function enable() {
+ this.enabled = true;
+ },
+ disable: function disable() {
+ this.enabled = false;
+ },
+ isActive: function isActive() {
+ return this.active;
+ },
+ activate: function activate() {
+ if (this.isActive()) {
+ return true;
+ } else if (!this.isEnabled() || this.eventBus.before("active"))
{
+ return false;
+ } else {
+ this.active = true;
+ this.eventBus.trigger("active");
+ return true;
+ }
+ },
+ deactivate: function deactivate() {
+ if (!this.isActive()) {
+ return true;
+ } else if (this.eventBus.before("idle")) {
+ return false;
+ } else {
+ this.active = false;
+ this.close();
+ this.eventBus.trigger("idle");
+ return true;
+ }
+ },
+ isOpen: function isOpen() {
+ return this.menu.isOpen();
+ },
+ open: function open() {
+ if (!this.isOpen() && !this.eventBus.before("open")) {
+ this.menu.open();
+ this._updateHint();
+ this.eventBus.trigger("open");
+ }
+ return this.isOpen();
+ },
+ close: function close() {
+ if (this.isOpen() && !this.eventBus.before("close")) {
+ this.menu.close();
+ this.input.clearHint();
+ this.input.resetInputValue();
+ this.eventBus.trigger("close");
+ }
+ return !this.isOpen();
+ },
+ setVal: function setVal(val) {
+ this.input.setQuery(_.toStr(val));
+ },
+ getVal: function getVal() {
+ return this.input.getQuery();
+ },
+ select: function select($selectable) {
+ var data = this.menu.getSelectableData($selectable);
+ if (data && !this.eventBus.before("select", data.obj))
{
+ this.input.setQuery(data.val, true);
+ this.eventBus.trigger("select", data.obj);
+ this.close();
+ return true;
+ }
+ return false;
+ },
+ autocomplete: function autocomplete($selectable) {
+ var query, data, isValid;
+ query = this.input.getQuery();
+ data = this.menu.getSelectableData($selectable);
+ isValid = data && query !== data.val;
+ if (isValid && !this.eventBus.before("autocomplete",
data.obj)) {
+ this.input.setQuery(data.val);
+ this.eventBus.trigger("autocomplete", data.obj);
+ return true;
+ }
+ return false;
+ },
+ moveCursor: function moveCursor(delta) {
+ var query, $candidate, data, payload, cancelMove;
+ query = this.input.getQuery();
+ $candidate = this.menu.selectableRelativeToCursor(delta);
+ data = this.menu.getSelectableData($candidate);
+ payload = data ? data.obj : null;
+ cancelMove = this._minLengthMet() && this.menu.update(query);
+ if (!cancelMove &&
!this.eventBus.before("cursorchange", payload)) {
+ this.menu.setCursor($candidate);
+ if (data) {
+ this.input.setInputValue(data.val);
+ } else {
+ this.input.resetInputValue();
+ this._updateHint();
+ }
+ this.eventBus.trigger("cursorchange", payload);
+ return true;
+ }
+ return false;
+ },
+ destroy: function destroy() {
+ this.input.destroy();
+ this.menu.destroy();
+ }
+ });
+ return Typeahead;
+ function c(ctx) {
+ var methods = [].slice.call(arguments, 1);
+ return function() {
+ var args = [].slice.call(arguments);
+ _.each(methods, function(method) {
+ return ctx[method].apply(ctx, args);
+ });
+ };
+ }
+ }();
+ (function() {
+ "use strict";
+ var old, keys, methods;
+ old = $.fn.typeahead;
+ keys = {
+ www: "tt-www",
+ attrs: "tt-attrs",
+ typeahead: "tt-typeahead"
+ };
+ methods = {
+ initialize: function initialize(o, datasets) {
+ var www;
+ datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
+ o = o || {};
+ www = WWW(o.classNames);
+ return this.each(attach);
+ function attach() {
+ var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu,
eventBus, input, menu, typeahead, MenuConstructor;
+ _.each(datasets, function(d) {
+ d.highlight = !!o.highlight;
+ });
+ $input = $(this);
+ $wrapper = $(www.html.wrapper);
+ $hint = $elOrNull(o.hint);
+ $menu = $elOrNull(o.menu);
+ defaultHint = o.hint !== false && !$hint;
+ defaultMenu = o.menu !== false && !$menu;
+ defaultHint && ($hint = buildHintFromInput($input, www));
+ defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));
+ $hint && $hint.val("");
+ $input = prepInput($input, www);
+ if (defaultHint || defaultMenu) {
+ $wrapper.css(www.css.wrapper);
+ $input.css(defaultHint ?
www.css.input :
www.css.inputWithNoHint);
+ $input.wrap($wrapper).parent().prepend(defaultHint ? $hint :
null).append(defaultMenu ? $menu : null);
+ }
+ MenuConstructor = defaultMenu ? DefaultMenu : Menu;
+ eventBus = new EventBus({
+ el: $input
+ });
+ input = new Input({
+ hint: $hint,
+ input: $input
+ }, www);
+ menu = new MenuConstructor({
+ node: $menu,
+ datasets: datasets
+ }, www);
+ typeahead = new Typeahead({
+ input: input,
+ menu: menu,
+ eventBus: eventBus,
+ minLength: o.minLength
+ }, www);
+ $input.data(keys.www, www);
+ $input.data(keys.typeahead, typeahead);
+ }
+ },
+ isEnabled: function isEnabled() {
+ var enabled;
+ ttEach(this.first(), function(t) {
+ enabled = t.isEnabled();
+ });
+ return enabled;
+ },
+ enable: function enable() {
+ ttEach(this, function(t) {
+ t.enable();
+ });
+ return this;
+ },
+ disable: function disable() {
+ ttEach(this, function(t) {
+ t.disable();
+ });
+ return this;
+ },
+ isActive: function isActive() {
+ var active;
+ ttEach(this.first(), function(t) {
+ active = t.isActive();
+ });
+ return active;
+ },
+ activate: function activate() {
+ ttEach(this, function(t) {
+ t.activate();
+ });
+ return this;
+ },
+ deactivate: function deactivate() {
+ ttEach(this, function(t) {
+ t.deactivate();
+ });
+ return this;
+ },
+ isOpen: function isOpen() {
+ var open;
+ ttEach(this.first(), function(t) {
+ open = t.isOpen();
+ });
+ return open;
+ },
+ open: function open() {
+ ttEach(this, function(t) {
+ t.open();
+ });
+ return this;
+ },
+ close: function close() {
+ ttEach(this, function(t) {
+ t.close();
+ });
+ return this;
+ },
+ select: function select(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.select($el);
+ });
+ return success;
+ },
+ autocomplete: function autocomplete(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.autocomplete($el);
+ });
+ return success;
+ },
+ moveCursor: function moveCursoe(delta) {
+ var success = false;
+ ttEach(this.first(), function(t) {
+ success = t.moveCursor(delta);
+ });
+ return success;
+ },
+ val: function val(newVal) {
+ var query;
+ if (!arguments.length) {
+ ttEach(this.first(), function(t) {
+ query = t.getVal();
+ });
+ return query;
+ } else {
+ ttEach(this, function(t) {
+ t.setVal(newVal);
+ });
+ return this;
+ }
+ },
+ destroy: function destroy() {
+ ttEach(this, function(typeahead, $input) {
+ revert($input);
+ typeahead.destroy();
+ });
+ return this;
+ }
+ };
+ $.fn.typeahead = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, [].slice.call(arguments, 1));
+ } else {
+ return methods.initialize.apply(this, arguments);
+ }
+ };
+ $.fn.typeahead.noConflict = function noConflict() {
+ $.fn.typeahead = old;
+ return this;
+ };
+ function ttEach($els, fn) {
+ $els.each(function() {
+ var $input = $(this), typeahead;
+ (typeahead = $input.data(keys.typeahead)) && fn(typeahead,
$input);
+ });
+ }
+ function buildHintFromInput($input, www) {
+ return
$input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly",
true).removeAttr("id name placeholder required").attr({
+ autocomplete: "off",
+ spellcheck: "false",
+ tabindex: -1
+ });
+ }
+ function prepInput($input, www) {
+ $input.data(keys.attrs, {
+ dir: $input.attr("dir"),
+ autocomplete: $input.attr("autocomplete"),
+ spellcheck: $input.attr("spellcheck"),
+ style: $input.attr("style")
+ });
+ $input.addClass(www.classes.input).attr({
+ autocomplete: "off",
+ spellcheck: false
+ });
+ try {
+ !$input.attr("dir") && $input.attr("dir",
"auto");
+ } catch (e) {}
+ return $input;
+ }
+ function getBackgroundStyles($el) {
+ return {
+ backgroundAttachment: $el.css("background-attachment"),
+ backgroundClip: $el.css("background-clip"),
+ backgroundColor: $el.css("background-color"),
+ backgroundImage: $el.css("background-image"),
+ backgroundOrigin: $el.css("background-origin"),
+ backgroundPosition: $el.css("background-position"),
+ backgroundRepeat: $el.css("background-repeat"),
+ backgroundSize: $el.css("background-size")
+ };
+ }
+ function revert($input) {
+ var www, $wrapper;
+ www = $input.data(keys.www);
+ $wrapper = $input.parent().filter(www.selectors.wrapper);
+ _.each($input.data(keys.attrs), function(val, key) {
+ _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
+ });
+
$input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);
+ if ($wrapper.length) {
+ $input.detach().insertAfter($wrapper);
+ $wrapper.remove();
+ }
+ }
+ function $elOrNull(obj) {
+ var isValid, $el;
+ isValid = _.isJQuery(obj) || _.isElement(obj);
+ $el = isValid ? $(obj).first() : [];
+ return $el.length ? $el : null;
+ }
+ })();
+});
+/*
+ * bag.js - js/css/other loader + kv storage
+ *
+ * Copyright 2013-2014 Vitaly Puzrin
+ *
https://github.com/nodeca/bag.js
+ *
+ * License MIT
+ */
+
+/*global define*/
+
+(function (root, factory) {
+ 'use strict';
+
+ if (typeof define === 'function' && define.amd) {
+ define(factory);
+ } else if (typeof module === 'object' && typeof module.exports ===
'object') {
+ module.exports = factory();
+ } else {
+ root.Bag = factory();
+ }
+} (this, function () {
+ 'use strict';
+
+ var head = document.head || document.getElementsByTagName('head')[0];
+
+ //////////////////////////////////////////////////////////////////////////////
+ // helpers
+
+ function _nope() { return; }
+
+ function _isString(obj) {
+ return Object.prototype.toString.call(obj) === '[object String]';
+ }
+
+ var _isArray = Array.isArray || function isArray(obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+ };
+
+ function _isFunction(obj) {
+ return Object.prototype.toString.call(obj) === '[object Function]';
+ }
+
+ function _each(obj, iterator) {
+ if (_isArray(obj)) {
+ if (obj.forEach) {
+ return obj.forEach(iterator);
+ }
+ for (var i = 0; i < obj.length; i++) {
+ iterator(obj[i], i, obj);
+ }
+ } else {
+ for (var k in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, k)) {
+ iterator(obj[k], k);
+ }
+ }
+ }
+ }
+
+ function _default(obj, src) {
+ // extend obj with src properties if not exists;
+ _each(src, function (val, key) {
+ if (!obj[key]) { obj[key] = src[key]; }
+ });
+ }
+
+
+ function _asyncEach(arr, iterator, callback) {
+ callback = callback || _nope;
+ if (!arr.length) { return callback(); }
+
+ var completed = 0;
+ _each(arr, function (x) {
+ iterator(x, function (err) {
+ if (err) {
+ callback(err);
+ callback = _nope;
+ } else {
+ completed += 1;
+ if (completed >= arr.length) {
+ callback();
+ }
+ }
+ });
+ });
+ }
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // Adapters for Store class
+
+ function DomStorage(namespace) {
+ var self = this;
+ var _ns = namespace + '__';
+ var _storage = localStorage;
+
+
+ this.init = function (callback) {
+ callback();
+ };
+
+
+ this.remove = function (key, callback) {
+ callback = callback || _nope;
+ _storage.removeItem(_ns + key);
+ callback();
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ var obj = {
+ value: value,
+ expire: expire
+ };
+
+ var err;
+
+ try {
+ _storage.setItem(_ns + key, JSON.stringify(obj));
+ } catch (e) {
+ // On quota error try to reset storage & try again.
+ // Just remove all keys, without conditions, no optimizations needed.
+ if (e.name.toUpperCase().indexOf('QUOTA') >= 0) {
+ try {
+ _each(_storage, function (val, name) {
+ var k = name.split(_ns)[1];
+ if (k) { self.remove(k); }
+ });
+ _storage.setItem(_ns + key, JSON.stringify(obj));
+ } catch (e2) {
+ err = e2;
+ }
+ } else {
+ err = e;
+ }
+ }
+
+ callback(err);
+ };
+
+
+ this.get = function (key, raw, callback) {
+ if (_isFunction(raw)) {
+ callback = raw;
+ raw = false;
+ }
+
+ var err, data;
+
+ try {
+ data = JSON.parse(_storage.getItem(_ns + key));
+ data = raw ? data : data.value;
+ } catch (e) {
+ err = new Error('Can\'t read key: ' + key);
+ }
+
+ callback(err, data);
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+ var now = +new Date();
+
+ _each(_storage, function (val, name) {
+ var key = name.split(_ns)[1];
+
+ if (!key) { return; }
+
+ if (!expiredOnly) {
+ self.remove(key);
+ return;
+ }
+
+ var raw;
+ self.get(key, true, function (__, data) {
+ raw = data; // can use this hack, because get is sync;
+ });
+ if (raw && (raw.expire > 0) && ((raw.expire - now) < 0)) {
+ self.remove(key);
+ }
+ });
+
+ callback();
+ };
+ }
+
+
+ DomStorage.prototype.exists = function () {
+ try {
+ localStorage.setItem('__ls_test__', '__ls_test__');
+ localStorage.removeItem('__ls_test__');
+ return true;
+ } catch (e) {
+ return false;
+ }
+ };
+
+
+
+ function WebSql(namespace) {
+ var db;
+
+
+ this.init = function (callback) {
+ db = window.openDatabase(namespace, '1.0', 'bag.js db', 2e5);
+
+ if (!db) { return callback('Can\'t open webdql database'); }
+
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'CREATE TABLE IF NOT EXISTS kv (key TEXT PRIMARY KEY, value TEXT, expire
INTEGER KEY)',
+ [],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.remove = function (key, callback) {
+ callback = callback || _nope;
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'DELETE FROM kv WHERE key = ?',
+ [ key ],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'INSERT OR REPLACE INTO kv (key, value, expire) VALUES (?, ?, ?)',
+ [ key, JSON.stringify(value), expire ],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.get = function (key, callback) {
+ db.readTransaction(function (tx) {
+ tx.executeSql(
+ 'SELECT value FROM kv WHERE key = ?',
+ [ key ],
+ function (tx, result) {
+ if (result.rows.length === 0) {
+ return callback(new Error('key not found: ' + key));
+ }
+ var value = result.rows.item(0).value;
+ var err, data;
+ try {
+ data = JSON.parse(value);
+ } catch (e) {
+ err = new Error('Can\'t unserialise data: ' + value);
+ }
+ callback(err, data);
+ },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+
+ db.transaction(function (tx) {
+ if (expiredOnly) {
+ tx.executeSql(
+ 'DELETE FROM kv WHERE expire > 0 AND expire < ?',
+ [ +new Date() ],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ } else {
+ db.transaction(function (tx) {
+ tx.executeSql(
+ 'DELETE FROM kv',
+ [],
+ function () { return callback(); },
+ function (tx, err) { return callback(err); }
+ );
+ });
+ }
+ });
+ };
+ }
+
+
+ WebSql.prototype.exists = function () {
+ return (!!window.openDatabase);
+ };
+
+
+
+ function Idb(namespace) {
+ var db;
+
+ this.init = function (callback) {
+ var idb = this.idb = window.indexedDB; /* || window.webkitIndexedDB ||
+ window.mozIndexedDB || window.msIndexedDB;*/
+
+ var req = idb.open(namespace, 2 /*version*/);
+
+ req.onsuccess = function (e) {
+ db = e.target.result;
+ callback();
+ };
+ req.onblocked = function (e) {
+ callback(new Error('IndexedDB blocked. ' + e.target.errorCode));
+ };
+ req.onerror = function (e) {
+ callback(new Error('IndexedDB opening error. ' + e.target.errorCode));
+ };
+ req.onupgradeneeded = function (e) {
+ db = e.target.result;
+ if (db.objectStoreNames.contains('kv')) {
+ db.deleteObjectStore('kv');
+ }
+ var store = db.createObjectStore('kv', { keyPath: 'key' });
+ store.createIndex('expire', 'expire', { unique: false });
+ };
+ };
+
+
+ this.remove = function (key, callback) {
+ var tx = db.transaction('kv', 'readwrite');
+
+ tx.oncomplete = function () { callback(); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Key remove error:
', e.target)); };
+
+ // IE 8 not allow to use reserved keywords as functions. More info:
+ //
http://tiffanybbrown.com/2013/09/10/expected-identifier-bug-in-internet-e...
+ tx.objectStore('kv')['delete'](key).onerror = function () {
tx.abort(); };
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ var tx = db.transaction('kv', 'readwrite');
+
+ tx.oncomplete = function () { callback(); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Key set error:
', e.target)); };
+
+ tx.objectStore('kv').put({
+ key: key,
+ value: value,
+ expire: expire
+ }).onerror = function () { tx.abort(); };
+ };
+
+
+ this.get = function (key, callback) {
+ var err, result;
+ var tx = db.transaction('kv');
+
+ tx.oncomplete = function () { callback(err, result); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Key get error:
', e.target)); };
+
+ tx.objectStore('kv').get(key).onsuccess = function (e) {
+ if (e.target.result) {
+ result = e.target.result.value;
+ } else {
+ err = new Error('key not found: ' + key);
+ }
+ };
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+ var keyrange = window.IDBKeyRange; /* ||
+ window.webkitIDBKeyRange || window.msIDBKeyRange;*/
+ var tx, store;
+
+ tx = db.transaction('kv', 'readwrite');
+ store = tx.objectStore('kv');
+
+ tx.oncomplete = function () { callback(); };
+ tx.onerror = tx.onabort = function (e) { callback(new Error('Clear error:
', e.target)); };
+
+ if (expiredOnly) {
+
+ var cursor = store.index('expire').openCursor(keyrange.bound(1, +new
Date()));
+
+ cursor.onsuccess = function (e) {
+ var _cursor = e.target.result;
+ if (_cursor) {
+ // IE 8 not allow to use reserved keywords as functions (`delete` and
`continue`). More info:
+ //
http://tiffanybbrown.com/2013/09/10/expected-identifier-bug-in-internet-e...
+ store['delete'](_cursor.primaryKey).onerror = function () {
tx.abort(); };
+ _cursor['continue']();
+ }
+ };
+
+ } else {
+ // Just clear everything
+ tx.objectStore('kv').clear().onerror = function () { tx.abort(); };
+ }
+ };
+ }
+
+
+ Idb.prototype.exists = function () {
+ var db = window.indexedDB /*||
+ window.webkitIndexedDB ||
+ window.mozIndexedDB ||
+ window.msIndexedDB*/;
+
+ if (!db) {
+ return false;
+ }
+
+ // Check outdated idb implementations, where `onupgradeneede` event doesn't
work,
+ // see
https://github.com/pouchdb/pouchdb/issues/1207 for more details
+ var dbName = '__idb_test__';
+ var result = db.open(dbName, 1).onupgradeneeded === null;
+
+ if (db.deleteDatabase) {
+ db.deleteDatabase(dbName);
+ }
+
+ return result;
+ };
+
+
+
+ /////////////////////////////////////////////////////////////////////////////
+ // key/value storage with expiration
+
+ var storeAdapters = {
+ indexeddb: Idb,
+ websql: WebSql,
+ localstorage: DomStorage
+ };
+
+
+ // namespace - db name or similar
+ // storesList - array of allowed adapter names to use
+ //
+ function Storage(namespace, storesList) {
+ var self = this;
+
+ var db = null;
+
+ // States of db init singletone process
+ // 'done' / 'progress' / 'failed' / undefined
+ var initState;
+ var initStack = [];
+
+ _each(storesList, function (name) {
+ // do storage names case insensitive
+ name = name.toLowerCase();
+
+ if (!storeAdapters[name]) {
+ throw new Error('Wrong storage adapter name: ' + name, storesList);
+ }
+
+ if (storeAdapters[name].prototype.exists() && !db) {
+ db = new storeAdapters[name](namespace);
+ return false; // terminate search on first success
+ }
+ });
+
+ if (!db) {
+ /* eslint-disable no-console */
+ // If no adaprets - don't make error for correct fallback.
+ // Just log that we continue work without storing results.
+ if (typeof console !== 'undefined' && console.log) {
+ console.log('None of requested storages available: ' + storesList);
+ }
+ /* eslint-enable no-console */
+ }
+
+
+ this.init = function (callback) {
+ if (!db) {
+ callback(new Error('No available db'));
+ return;
+ }
+
+ if (initState === 'done') {
+ callback();
+ return;
+ }
+
+ if (initState === 'progress') {
+ initStack.push(callback);
+ return;
+ }
+
+ initStack.push(callback);
+ initState = 'progress';
+
+ db.init(function (err) {
+ initState = !err ? 'done' : 'failed';
+ _each(initStack, function (cb) {
+ cb(err);
+ });
+ initStack = [];
+
+ // Clear expired. A bit dirty without callback,
+ // but we don't care until clear compleete
+ if (!err) { self.clear(true); }
+ });
+ };
+
+
+ this.set = function (key, value, expire, callback) {
+ if (_isFunction(expire)) {
+ callback = expire;
+ expire = null;
+ }
+ callback = callback || _nope;
+ expire = expire ? +(new Date()) + (expire * 1000) : 0;
+
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.set(key, value, expire, callback);
+ });
+ };
+
+
+ this.get = function (key, callback) {
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.get(key, callback);
+ });
+ };
+
+
+ this.remove = function (key, callback) {
+ callback = callback || _nope;
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.remove(key, callback);
+ });
+ };
+
+
+ this.clear = function (expiredOnly, callback) {
+ if (_isFunction(expiredOnly)) {
+ callback = expiredOnly;
+ expiredOnly = false;
+ }
+ callback = callback || _nope;
+
+ this.init(function (err) {
+ if (err) { return callback(err); }
+ db.clear(expiredOnly, callback);
+ });
+ };
+ }
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // Bag class implementation
+
+ function Bag(options) {
+ if (!(this instanceof Bag)) { return new Bag(options); }
+
+ var self = this;
+
+ options = options || {};
+
+ this.prefix = options.prefix || 'bag';
+ this.timeout = options.timeout || 20; // 20 seconds
+ this.expire = options.expire || 30 * 24; // 30 days
+ this.isValidItem = options.isValidItem || null;
+
+ this.stores = _isArray(options.stores) ? options.stores : [ 'indexeddb',
'websql', 'localstorage' ];
+
+ var storage = null;
+
+ this._queue = [];
+ this._chained = false;
+
+ this._createStorage = function () {
+ if (!storage) { storage = new Storage(self.prefix, self.stores); }
+ };
+
+ function getUrl(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url);
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4) {
+ if (xhr.status === 200) {
+ callback(null, {
+ content: xhr.responseText,
+ type: xhr.getResponseHeader('content-type')
+ });
+ callback = _nope;
+ } else {
+ callback(new Error('Can\'t open url ' + url +
+ (xhr.status ? xhr.statusText + ' (' + xhr.status + ')' :
'')));
+ callback = _nope;
+ }
+ }
+ };
+
+ setTimeout(function () {
+ if (xhr.readyState < 4) {
+ xhr.abort();
+ callback(new Error('Timeout'));
+ callback = _nope;
+ }
+ }, self.timeout * 1000);
+
+ xhr.send();
+ }
+
+ function createCacheObj(obj, response) {
+ var cacheObj = {};
+
+ _each([ 'url', 'key', 'unique' ], function (key) {
+ if (obj[key]) { cacheObj[key] = obj[key]; }
+ });
+
+ var now = +new Date();
+ cacheObj.data = response.content;
+ cacheObj.originalType = response.type;
+ cacheObj.type = obj.type || response.type;
+ cacheObj.stamp = now;
+
+ return cacheObj;
+ }
+
+ function saveUrl(obj, callback) {
+ getUrl(obj.url_real, function (err, result) {
+ if (err) { return callback(err); }
+
+ var delay = (obj.expire || self.expire) * 60 * 60; // in seconds
+
+ var cached = createCacheObj(obj, result);
+
+ self.set(obj.key, cached, delay, function () {
+ // Don't check error - have to return data anyway
+ _default(obj, cached);
+ callback(null, obj);
+ });
+ });
+ }
+
+
+ function isCacheValid(cached, obj) {
+ return !cached ||
+ cached.expire - +new Date() < 0 ||
+ obj.unique !== cached.unique ||
+ obj.url !== cached.url ||
+ (self.isValidItem && !self.isValidItem(cached, obj));
+ }
+
+
+ function fetch(obj, callback) {
+
+ if (!obj.url) { return callback(); }
+ obj.key = (obj.key || obj.url);
+
+ self.get(obj.key, function (err_cache, cached) {
+
+ // Check error only on forced fetch from cache
+ if (err_cache && obj.cached) {
+ callback(err_cache);
+ return;
+ }
+
+ // if can't get object from store, then just load it from web.
+ obj.execute = (obj.execute !== false);
+ var shouldFetch = !!err_cache || isCacheValid(cached, obj);
+
+ // If don't have to load new date - return one from cache
+ if (!obj.live && !shouldFetch) {
+ obj.type = obj.type || cached.originalType;
+ _default(obj, cached);
+ callback(null, obj);
+ return;
+ }
+
+ // calculate loading url
+ obj.url_real = obj.url;
+ if (obj.unique) {
+ // set parameter to prevent browser cache
+ obj.url_real = obj.url + ((obj.url.indexOf('?') > 0) ?
'&' : '?') + 'bag-unique=' + obj.unique;
+ }
+
+ saveUrl(obj, function (err_load) {
+ if (err_cache && err_load) {
+ callback(err_load);
+ return;
+ }
+
+ if (err_load) {
+ obj.type = obj.type || cached.originalType;
+ _default(obj, cached);
+ callback(null, obj);
+ return;
+ }
+
+ callback(null, obj);
+ });
+ });
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // helpers to set absolute sourcemap url
+
+ /* eslint-disable max-len */
+ var sourceMappingRe = /(?:^([ \t]*\/\/[@|#][ \t]+sourceMappingURL=)(.+?)([
\t]*)$)|(?:^([ \t]*\/\*[@#][ \t]+sourceMappingURL=)(.+?)([ \t]*\*\/[ \t])*$)/mg;
+ /* eslint-enable max-len */
+
+ function parse_url(url) {
+ var pattern = new
RegExp('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?');
+ var matches = url.match(pattern);
+ return {
+ scheme: matches[2],
+ authority: matches[4],
+ path: matches[5],
+ query: matches[7],
+ fragment: matches[9]
+ };
+ }
+
+ function patchMappingUrl(obj) {
+ var refUrl = parse_url(obj.url);
+ var done = false;
+ var res = obj.data.replace(sourceMappingRe, function (match, p1, p2, p3, p4, p5,
p6) {
+ if (!match) { return null; }
+ done = true;
+ // select matched group of params
+ if (!p1) { p1 = p4; p2 = p5; p3 = p6; }
+ var mapUrl = parse_url(p2);
+
+ var scheme = (mapUrl.scheme ? mapUrl.scheme : refUrl.scheme) ||
window.location.protocol.slice(0, -1);
+ var authority = (mapUrl.authority ? mapUrl.authority : refUrl.authority) ||
window.location.host;
+ /* eslint-disable max-len */
+ var path = mapUrl.path[0] === '/' ? mapUrl.path :
refUrl.path.split('/').slice(0, -1).join('/') + '/' +
mapUrl.path;
+ /* eslint-enable max-len */
+ return p1 + (scheme + '://' + authority + path) + p3;
+ });
+ return done ? res : '';
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ var handlers = {
+ 'application/javascript': function injectScript(obj) {
+ var script = document.createElement('script'), txt;
+
+ // try to change sourcemap address to absolute
+ txt = patchMappingUrl(obj);
+ if (!txt) {
+ // or add script name for dev tools
+ txt = obj.data + '\n//# sourceURL=' + obj.url;
+ }
+
+ // Have to use .text, since we support IE8,
+ // which won't allow appending to a script
+ script.text = txt;
+ head.appendChild(script);
+ return;
+ },
+
+ 'text/css': function injectStyle(obj) {
+ var style = document.createElement('style'), txt;
+
+ // try to change sourcemap address to absolute
+ txt = patchMappingUrl(obj);
+ if (!txt) {
+ // or add stylesheet script name for dev tools
+ txt = obj.data + '\n/*# sourceURL=' + obj.url + ' */';
+ }
+
+ // Needed to enable `style.styleSheet` in IE
+ style.setAttribute('type', 'text/css');
+
+ if (style.styleSheet) {
+ // We should append style element to DOM before assign css text to
+ // workaround IE bugs with `@import` and `@font-face`.
+ //
https://github.com/andrewwakeling/ie-css-bugs
+ head.appendChild(style);
+
+ style.styleSheet.cssText = txt; // IE method
+ } else {
+ style.appendChild(document.createTextNode(txt)); // others
+ head.appendChild(style);
+ }
+
+ return;
+ }
+ };
+
+
+ function execute(obj) {
+ if (!obj.type) { return; }
+
+ // Cut off encoding if exists:
+ // application/javascript; charset=UTF-8
+ var handlerName = obj.type.split(';')[0];
+
+ // Fix outdated mime types if needed, to use single handler
+ if (handlerName === 'application/x-javascript' || handlerName ===
'text/javascript') {
+ handlerName = 'application/javascript';
+ }
+
+ if (handlers[handlerName]) {
+ handlers[handlerName](obj);
+ }
+ return;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ //
+ // Public methods
+ //
+
+ this.require = function (resources, callback) {
+ var queue = self._queue;
+
+ if (_isFunction(resources)) {
+ callback = resources;
+ resources = null;
+ }
+
+ if (resources) {
+ var res = _isArray(resources) ? resources : [ resources ];
+
+ // convert string urls to structures
+ // and push to queue
+ _each(res, function (r, i) {
+ if (_isString(r)) { res[i] = { url: r }; }
+ queue.push(res[i]);
+ });
+ }
+
+ self._createStorage();
+
+ if (!callback) {
+ self._chained = true;
+ return self;
+ }
+
+ _asyncEach(queue, fetch, function (err) {
+ if (err) {
+ // cleanup
+ self._chained = false;
+ self._queue = [];
+
+ callback(err);
+ return;
+ }
+
+ _each(queue, function (obj) {
+ if (obj.execute) {
+ execute(obj);
+ }
+ });
+
+ // return content only, if one need fuul info -
+ // check input object, that will be extended.
+ var replies = [];
+ _each(queue, function (r) { replies.push(r.data); });
+
+ var result = (_isArray(resources) || self._chained) ? replies : replies[0];
+
+ // cleanup
+ self._chained = false;
+ self._queue = [];
+
+ callback(null, result);
+ });
+ };
+
+
+ // Create proxy methods (init store then subcall)
+ _each([ 'remove', 'get', 'set', 'clear' ], function
(method) {
+ self[method] = function () {
+ self._createStorage();
+ storage[method].apply(storage, arguments);
+ };
+ });
+
+
+ this.addHandler = function (types, handler) {
+ types = _isArray(types) ? types : [ types ];
+ _each(types, function (type) { handlers[type] = handler; });
+ };
+
+
+ this.removeHandler = function (types) {
+ self.addHandler(types/*, undefined*/);
+ };
+ }
+
+ return Bag;
+
+}));
diff --git a/ui/src/dist/list-flat.css b/ui/src/dist/list-flat.css
new file mode 100644
index 0000000..ba0439d
--- /dev/null
+++ b/ui/src/dist/list-flat.css
@@ -0,0 +1,83 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.list-titlef {
+ height: 30px;
+ line-height: 30px;
+ width: 25%;
+ border-bottom: 1px solid #DEDEDE;
+ color: #626262;
+ font-size: 17px;
+ padding: 10px 0;
+ background: white;
+}
+
+.list-content {
+ height: 300px;
+ width: 25%;
+}
+
+.list-item {
+ border-bottom: 1px solid #F5F5F5;
+ height: 40px;
+}
+
+.list-item-odd {
+ background: #FFFFFF;
+}
+
+.list-item-even {
+ background: #FCFCFC;
+}
+
+.list-item:hover {
+ background: #DDDDDD;
+}
+
+.list-inline {
+ display: inline-block;
+}
+
+.list-item-icon {
+ line-height: 20px;
+ vertical-align: 35%;
+}
+
+.list-item-info {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+.list-item-name {
+ font-size: 14px;
+ line-height: 14px;
+ padding: 9px 0 0;
+}
+
+.list-item-button {
+ position: relative;
+ width: 150px;
+ padding: 5px;
+ float: right;
+}
+
+.list-item-detail {
+ font-size: 11px;
+ color: #CDCDCD;
+}
\ No newline at end of file
diff --git a/ui/src/dist/menu-flat.css b/ui/src/dist/menu-flat.css
new file mode 100644
index 0000000..385a312
--- /dev/null
+++ b/ui/src/dist/menu-flat.css
@@ -0,0 +1,89 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.menu-content {
+ position: relative;
+ height: 35px;
+ width: 170px;
+}
+
+.menu-box {
+ width: 100%;
+ height: 30px;
+ border-radius: 3px 3px 0 3px;
+ cursor: pointer;
+ vertical-align: middle;
+ background: #4E4D4F;
+ color: #EDEDED;
+ float: right;
+ position: relative;
+ padding-bottom: 5px;
+}
+
+.menu-label {
+ position: relative;
+}
+
+.menu-icon-front,
+.list-icon-front {
+ position: relative;
+ font-size: 17px;
+ line-height: 32px;
+ padding-right: 10px;
+ padding-left: 5px;
+ color: #EDEDED;
+}
+
+.menu-icon {
+ position: relative;
+ float: right;
+ line-height: 35px;
+ padding-right: 10px;
+ padding-left: 10px;
+ color: #CFCFCF;
+ font-size: 10px;
+ border-top-right-radius: 3px;
+}
+
+.menu-container {
+ border: 1px solid #999999;
+ width: 100px;
+}
+
+.menu-list {
+ position: absolute;
+ z-index: 3;
+ float: right;
+ width: 100%;
+ top: 35px;
+ padding-left: 0;
+ cursor: pointer;
+ background: #3A393B;
+ margin: 0;
+}
+
+.menu-list li {
+ list-style: none;
+ position: relative;
+ color: #EDEDED;
+ border-top: 1px groove black;
+}
+
+.menu-list li:first-child {
+ border: none;
+}
diff --git a/ui/src/dist/message-flat.css b/ui/src/dist/message-flat.css
new file mode 100644
index 0000000..8281bff
--- /dev/null
+++ b/ui/src/dist/message-flat.css
@@ -0,0 +1,87 @@
+/*
+* Project Kimchi
+*
+* Copyright IBM, Corp. 2015
+*
+* Licensed under the Apache License, Version 2.0 (the 'License');
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*
http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an 'AS IS' BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+.border-grey {
+ background-clip: border-box;
+ border: 6px solid rgba(170,170,170,0.3);
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ width: 502px;
+ height: 202px;
+ border-radius: 5px;
+}
+
+.message-dialog {
+ border: 3px solid #999999;
+ height: 198px;
+ width: 498px;
+ background: white;
+}
+
+.message-dialog .message-inline {
+ display: inline-block;
+}
+
+.message-dialog .message-type-icon {
+ position: absolute;
+ margin: 20px 20px;
+ color: #008ABF;
+ font-size: 50px;
+}
+
+.message-dialog .message-main {
+ position: relative;
+ margin: 30px 0 0 110px;
+ width: 350px;
+}
+
+.message-dialog .message-confirm-info {
+ margin: 20px 0 0 110px;
+ width: 350px;
+}
+
+.message-dialog .message-footer {
+ position: absolute;
+ left: 3px;
+ right: 1px;
+ bottom: 1px;
+ height: 50px;
+ background-color: #008ABF;
+}
+
+.message-dialog .message-footer .message-button {
+ display: inline-block;
+ background-color: white;
+ width: 75px;
+ height: 30px;
+ line-height: 30px;
+ position: relative;
+ margin-left: 10px;
+ margin-top: 10px;
+ text-align: center;
+ vertical-align: middle;
+}
+
+.message-dialog .message-footer .message-button:hover{
+ background-color: #EEEEEE;
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/ui/src/dist/messagebar-flat.css b/ui/src/dist/messagebar-flat.css
new file mode 100644
index 0000000..d5efc8e
--- /dev/null
+++ b/ui/src/dist/messagebar-flat.css
@@ -0,0 +1,64 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.messagebar {
+ height: 30px;
+}
+
+.messagebar .messagebar-text {
+ text-align: left;
+ vertical-align: 50%;
+}
+
+.messagebar .messageHead {
+ display: inline-block;
+ width: 5px;
+ height: 30px;
+}
+
+.messagebar-close {
+ line-height: 30px;
+ vertical-align: middle;
+ margin-right: 10px;
+ cursor: pointer;
+ float: right;
+}
+
+.green {
+ background-color: #DAE6CB;
+}
+
+.dark-green {
+ background-color: #89C53A;
+}
+
+.yellow {
+ background-color: #F1E3C2;
+}
+
+.dark-yellow {
+ background-color: #FDB60D;
+}
+
+.red {
+ background-color: #EAC3C7;
+}
+
+.dark-red {
+ background-color: #D81227;
+}
\ No newline at end of file
diff --git a/ui/src/dist/radio-flat.css b/ui/src/dist/radio-flat.css
new file mode 100644
index 0000000..0c03485
--- /dev/null
+++ b/ui/src/dist/radio-flat.css
@@ -0,0 +1,30 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ .radio-label {
+ position: relative;
+ cursor: pointer;
+ }
+
+ .radio-content {
+ margin-right: 10px;
+ }
+
+ .inline-radio {
+ display: inline-block;
+ }
\ No newline at end of file
diff --git a/ui/src/dist/selectmenu-flat.css b/ui/src/dist/selectmenu-flat.css
new file mode 100644
index 0000000..0f91d80
--- /dev/null
+++ b/ui/src/dist/selectmenu-flat.css
@@ -0,0 +1,88 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.select-content {
+ position: relative;
+ height: 30px;
+ width: 170px;
+}
+
+.selected-box {
+ width: 75%;
+ height: 30px;
+ border: 1px solid #d8d8d8;
+ border-radius: 3px;
+ cursor: pointer;
+ background: #FFFFFF;
+ float: right;
+}
+
+.select-val {
+ display: none;
+}
+
+.select-label {
+ line-height: 32px;
+ vertical-align: middle;
+ position: relative;
+ margin-left: 20px;
+}
+
+.select-icon {
+ position: relative;
+ float: right;
+ line-height: 30px;
+ vertical-align: middle;
+ padding-right: 10px;
+ padding-left: 10px;
+ color: #555555;
+ font-size: 10px;
+}
+
+.select-icon:hover {
+ background: #FCFCFC;
+}
+
+.selectmenu-opt {
+ background: #FFFFFF;
+}
+
+.selectmenu-list {
+ border: 1px solid #d8d8d8;
+ width: 99%;
+ position: absolute;
+ top: 31px;
+ cursor: pointer;
+ padding: 0;
+ margin: 0;
+}
+
+.selectmenu-list li {
+ list-style: none;
+ position: relative;
+ height: 20px;
+ padding: 5px 0 5px 20px;
+ line-height: 21px;
+ vertical-align: middle;
+ border-bottom: 1px solid #d8d8d8;
+ z-index: 3;
+}
+
+.selectmenu-opt:hover {
+ background: #FCFCFC;
+}
diff --git a/ui/src/dist/tabs.css b/ui/src/dist/tabs.css
new file mode 100644
index 0000000..47404b7
--- /dev/null
+++ b/ui/src/dist/tabs.css
@@ -0,0 +1,46 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ui-tabs {
+ border: 0 none !important;
+ padding: 0;
+ position: relative;
+}
+
+.ui-tabs .ui-tabs-nav {
+ background: none;
+ border-color: #ededed;
+ border-width: 0 0 2px;
+}
+
+.ui-tabs .ui-tabs-nav li {
+ background: none;
+ border-width: 0;
+ padding: 0 0px 1px;
+}
+
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ border-bottom: 2px solid #008abf;
+ margin-bottom: -2px;
+ font-weight: bold;
+}
+
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ line-height: 1;
+ padding: 10px 20px 5px;
+}
diff --git a/ui/src/dist/textbox-flat.css b/ui/src/dist/textbox-flat.css
new file mode 100644
index 0000000..39d5ffb
--- /dev/null
+++ b/ui/src/dist/textbox-flat.css
@@ -0,0 +1,22 @@
+/*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *
http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ .textbox-container {
+ border: 1px solid #CCC;
+ border-radius: 3px;
+ }
\ No newline at end of file
diff --git a/ui/src/gulpfile.babel.js b/ui/src/gulpfile.babel.js
new file mode 100755
index 0000000..f320768
--- /dev/null
+++ b/ui/src/gulpfile.babel.js
@@ -0,0 +1,216 @@
+// generated on 2015-07-08 using generator-gulp-webapp 1.0.2
+import gulp from 'gulp';
+import gulpLoadPlugins from 'gulp-load-plugins';
+import browserSync from 'browser-sync';
+import del from 'del';
+import {stream as wiredep} from 'wiredep';
+
+const $ = gulpLoadPlugins();
+const reload = browserSync.reload;
+
+var merge = require('merge-stream');
+var eslint = require('gulp-eslint');
+var handlebars = require('gulp-handlebars');
+var wrap = require('gulp-wrap');
+var declare = require('gulp-declare');
+var concat = require('gulp-concat');
+
+gulp.task('sass', () => {
+ return gulp.src(['app/css/**/*.scss'])
+ .pipe($.plumber())
+ .pipe($.sourcemaps.init())
+ .pipe($.sass.sync({
+ outputStyle: 'expanded',
+ precision: 10,
+ includePaths: ['.']
+ }).on('error', $.sass.logError))
+ .pipe($.autoprefixer({browsers: ['last 1 version', 'Firefox ESR',
'ie 9']}))
+ .pipe($.sourcemaps.write())
+ .pipe(gulp.dest('.tmp/css'))
+ .pipe(reload({stream: true}));
+
+ // var css = gulp.src('app/css/*.css')
+ // .pipe($.plumber())
+ // .pipe($.autoprefixer({browsers: ['last 1 version', 'Firefox ESR',
'ie 9']}))
+ // .pipe(gulp.dest('.tmp/css'))
+ // .pipe(gulp.dest('dist/css'))
+ // .pipe(reload({stream: true}));
+ //
+ // return merge(sass,css);
+});
+
+// gulp.task('templates', function(){
+// gulp.src('app/templates/**/*.hbs')
+// .pipe(handlebars())
+// .pipe(wrap('Handlebars.template(<%= contents %>)'))
+// .pipe(declare({
+// namespace: 'Wok.templates',
+// noRedeclare: true, // Avoid duplicate declarations
+// }))
+// .pipe(concat('templates.js'))
+// .pipe(gulp.dest('.tmp/js'))
+// .pipe(gulp.dest('dist/js'))
+// });
+
+const lintOptions = {
+ env: {
+ mocha: true
+ },
+ rules: {
+ 'no-undef': 0,
+ 'no-unused-vars': 0,
+ eqeqeq: 0,
+ 'space-infix-ops': 0,
+ 'no-underscore-dangle': 0,
+ 'camelcase': 1,
+ 'comma-dangle': 0,
+ curly: 0,
+ quotes: 0,
+ semi: 0,
+ strict: 0,
+ 'key-spacing': 0,
+ 'semi-spacing': 0,
+ 'comma-spacing': 0,
+ 'dot-notation': 0,
+ 'no-array-constructor': 0
+ },
+ globals: {
+ 'jQuery' : true,
+ '$' : true,
+ assert: false,
+ expect: false,
+ should: false
+ }
+};
+
+gulp.task('lint', function () {
+ return
gulp.src(['js/**/*.js','!js/**/*.min.js','!libs/**/*.js','!js/**/vendor.js','!js/**/plugins.js'])
+ .pipe(eslint(lintOptions))
+ .pipe(eslint.format());
+});
+
+
+gulp.task('html', ['sass'], () => {
+ const assets = $.useref.assets({searchPath: ['.tmp', 'app',
'.']});
+
+ return gulp.src(['app/**/*.html','app/js/widgets/samples/*.html'])
+ .pipe(assets)
+ .pipe(assets.restore())
+ .pipe($.useref())
+ .pipe(gulp.dest('dist'));
+});
+
+gulp.task('images', () => {
+ return gulp.src('app/images/**/*')
+ .pipe($.if($.if.isFile, $.cache($.imagemin({
+ progressive: true,
+ interlaced: true,
+ // don't remove IDs from SVGs, they are often used
+ // as hooks for embedding and styling
+ svgoPlugins: [{cleanupIDs: false}]
+ }))
+ .on('error', function (err) {
+ console.log(err);
+ this.end();
+ })))
+ .pipe(gulp.dest('dist/images'));
+});
+
+gulp.task('fonts', () => {
+ return gulp.src(require('main-bower-files')({
+ filter: '**/*.ttf'
+ }).concat('app/fontawesome/**/*'))
+ .pipe(gulp.dest('.tmp/fontawesome/font'))
+ .pipe(gulp.dest('dist/fontawesome/font'));
+});
+
+gulp.task('extras', () => {
+ return gulp.src([
+ 'app/**/.*',
+ 'app/css/theme-default/*.css',
+ '!app/**/.html'
+ ], {
+ dot: true
+ }).pipe(gulp.dest('dist'));
+});
+
+gulp.task('clean', del.bind(null, ['.tmp', 'dist']));
+
+gulp.task('serve', ['sass', 'fonts'], () => {
+ browserSync({
+ notify: false,
+ port: 9000,
+ server: {
+ baseDir: ['.tmp', 'app'],
+ routes: {
+ '/bower_components': 'bower_components'
+ }
+ }
+ });
+
+ gulp.watch([
+ 'app/**/*.html',
+ 'app/js/**/*.js',
+ 'app/libs/**/*.js',
+ 'app/libs/**/*.css',
+ 'app/js/**/*.html',
+ 'app/images/**/*',
+ '.tmp/fontawesome/**/*'
+ ]).on('change', reload);
+
+ gulp.watch('app/css/**/*.scss', ['sass']);
+ gulp.watch('app/js/**/*.js', ['lint']);
+ gulp.watch('app/fontawesome/**/*', ['fonts']);
+ gulp.watch('bower.json', ['wiredep', 'fonts']);
+});
+
+gulp.task('serve:dist', () => {
+ browserSync({
+ notify: false,
+ port: 9000,
+ server: {
+ baseDir: ['dist']
+ }
+ });
+});
+
+gulp.task('serve:test', () => {
+ browserSync({
+ notify: false,
+ port: 9000,
+ ui: false,
+ server: {
+ baseDir: 'test',
+ routes: {
+ '/bower_components': 'bower_components'
+ }
+ }
+ });
+
+ gulp.watch('test/spec/**/*.js').on('change', reload);
+ gulp.watch('test/spec/**/*.js', ['lint:test']);
+});
+
+// inject bower components
+gulp.task('wiredep', () => {
+ gulp.src('app/css/**/*.scss')
+ .pipe(wiredep({
+ ignorePath: /^(\.\.\/)+/
+ }))
+ .pipe(gulp.dest('app/css'));
+
+ gulp.src('app/**/*.html')
+ .pipe(wiredep({
+ exclude: ['bootstrap-sass-official'],
+ ignorePath: /^(\.\.\/)*\.\./
+ }))
+ .pipe(gulp.dest('app'));
+});
+
+gulp.task('build', ['lint','html', 'images',
'fonts', 'extras'], () => {
+ return gulp.src('dist/**/*').pipe($.size({title: 'build', gzip:
true}));
+});
+
+gulp.task('default', ['clean'], () => {
+ gulp.start('build');
+});
diff --git a/ui/src/package.json b/ui/src/package.json
new file mode 100644
index 0000000..1f8031b
--- /dev/null
+++ b/ui/src/package.json
@@ -0,0 +1,46 @@
+{
+ "engines": {
+ "node": ">=0.12.0"
+ },
+ "devDependencies": {
+ "babel": "^5.8.21",
+ "babel-core": "^5.8.21",
+ "browser-sync": "^2.8.2",
+ "del": "^1.1.1",
+ "gulp": "^3.9.0",
+ "gulp-autoprefixer": "^2.3.1",
+ "gulp-cache": "^0.2.8",
+ "gulp-concat": "^2.6.0",
+ "gulp-declare": "^0.3.0",
+ "gulp-eslint": "^0.13.2",
+ "gulp-if": "^1.2.5",
+ "gulp-imagemin": "^2.2.1",
+ "gulp-load-plugins": "^0.10.0",
+ "gulp-minify-css": "^1.1.1",
+ "gulp-minify-html": "^1.0.4",
+ "gulp-plumber": "^1.0.1",
+ "gulp-sass": "^2.0.4",
+ "gulp-size": "^1.2.1",
+ "gulp-sourcemaps": "^1.5.0",
+ "gulp-uglify": "^1.1.0",
+ "gulp-useref": "^1.1.1",
+ "gulp-wrap": "^0.11.0",
+ "main-bower-files": "^2.9.0",
+ "merge-stream": "^0.1.8",
+ "opn": "^1.0.1",
+ "wiredep": "^2.2.2"
+ },
+ "eslintConfig": {
+ "env": {
+ "node": true,
+ "browser": true
+ },
+ "rules": {
+ "quotes": [
+ 2,
+ "single"
+ ]
+ }
+ },
+ "dependencies": {}
+}
diff --git a/ui/src/test/index.html b/ui/src/test/index.html
new file mode 100755
index 0000000..1785dfe
--- /dev/null
+++ b/ui/src/test/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Mocha Spec Runner</title>
+ <link rel="stylesheet"
href="/bower_components/mocha/mocha.css">
+</head>
+<body>
+ <div id="mocha"></div>
+ <script src="/bower_components/mocha/mocha.js"></script>
+ <script>mocha.setup('bdd');</script>
+ <script src="/bower_components/chai/chai.js"></script>
+ <script>
+ var assert = chai.assert;
+ var expect = chai.expect;
+ var should = chai.should();
+ </script>
+ <!-- bower:js -->
+ <!-- endbower -->
+ <!-- include source files here... -->
+ <!-- include spec files here... -->
+ <script src="spec/test.js"></script>
+ <script>mocha.run();</script>
+</body>
+</html>
diff --git a/ui/src/test/spec/test.js b/ui/src/test/spec/test.js
new file mode 100755
index 0000000..0fca0fb
--- /dev/null
+++ b/ui/src/test/spec/test.js
@@ -0,0 +1,11 @@
+(function () {
+ 'use strict';
+
+ describe('Give it some context', function () {
+ describe('maybe a bit more context here', function () {
+ it('should run here few assertions', function () {
+
+ });
+ });
+ });
+})();
--
1.9.3