From bdb9bd3625a5771bcd65c02359bf7682d6f46324 Mon Sep 17 00:00:00 2001 From: pablo2048 Date: Sat, 29 Oct 2022 13:41:12 +0200 Subject: [PATCH] Webovy server odsud https://github.com/vortigont/ESPAsyncWebServer/tree/yubxmod - vsechny upravy a zpristupneni bufferu pro JSON dle https://github.com/yubox-node-org/ESPAsyncWebServer/pull/8 --- README.md | 209 +- .../ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino | 257 + .../ESP_AsyncFSBrowser/data/.exclude.files | 3 + examples/ESP_AsyncFSBrowser/data/ace.ico.gz | Bin 0 -> 6307 bytes .../ESP_AsyncFSBrowser/data/acefull.js.gz | Bin 0 -> 118766 bytes examples/ESP_AsyncFSBrowser/data/edit_gz | Bin 0 -> 4503 bytes examples/ESP_AsyncFSBrowser/data/favicon.ico | Bin 0 -> 1150 bytes .../ESP_AsyncFSBrowser/data/folder/image.jpg | Bin 0 -> 6071 bytes .../ESP_AsyncFSBrowser/data/folder/test.txt | 1 + examples/ESP_AsyncFSBrowser/data/index.htm | 131 + .../ESP_AsyncFSBrowser/data/worker-css.js.gz | Bin 0 -> 32927 bytes .../ESP_AsyncFSBrowser/data/worker-html.js.gz | Bin 0 -> 45019 bytes .../data/worker-javascript.js.gz | Bin 0 -> 112558 bytes .../ESP_AsyncFSBrowser/data/worker-json.js.gz | Bin 0 -> 6923 bytes examples/SmartSwitch/1.PNG | Bin 0 -> 17650 bytes examples/SmartSwitch/2.PNG | Bin 0 -> 12835 bytes examples/SmartSwitch/3.PNG | Bin 0 -> 26824 bytes examples/SmartSwitch/4.PNG | Bin 0 -> 17958 bytes examples/SmartSwitch/ESPAsyncWiFiManager.cpp | 1177 ++++ examples/SmartSwitch/ESPAsyncWiFiManager.h | 283 + examples/SmartSwitch/PinOut_Notes.txt | 56 + examples/SmartSwitch/README.md | 19 + examples/SmartSwitch/SmartSwitch.ino | 750 +++ examples/SmartSwitch/Xtea.cpp | 48 + examples/SmartSwitch/Xtea.h | 20 + examples/SmartSwitch/data/.exclude.files | 3 + examples/SmartSwitch/data/ace.ico.gz | Bin 0 -> 6307 bytes examples/SmartSwitch/data/acefull.js.gz | Bin 0 -> 118766 bytes examples/SmartSwitch/data/app.css.gz | Bin 0 -> 2740 bytes examples/SmartSwitch/data/app.min.js.gz | Bin 0 -> 38439 bytes examples/SmartSwitch/data/edit_gz | Bin 0 -> 4503 bytes examples/SmartSwitch/data/favicon.ico.gz | Bin 0 -> 4314 bytes examples/SmartSwitch/data/index.htm | 626 ++ .../SmartSwitch/data/login/favicon.ico.gz | Bin 0 -> 5806 bytes examples/SmartSwitch/data/login/index.htm | 36 + examples/SmartSwitch/data/worker-css.js.gz | Bin 0 -> 32927 bytes examples/SmartSwitch/data/worker-html.js.gz | Bin 0 -> 45019 bytes .../SmartSwitch/data/worker-javascript.js.gz | Bin 0 -> 112558 bytes examples/SmartSwitch/data/worker-json.js.gz | Bin 0 -> 6923 bytes examples/SmartSwitch/data_src/.exclude.files | 2 + examples/SmartSwitch/data_src/acefull.js | 30 + examples/SmartSwitch/data_src/app.css | 1 + examples/SmartSwitch/data_src/app.min.js | 533 ++ examples/SmartSwitch/data_src/favicon.ico | Bin 0 -> 15406 bytes examples/SmartSwitch/data_src/index.htm | 599 ++ .../data_src/js_css_src/.exclude.files | 2 + .../data_src/js_css_src/ace-drafts/ace.js | 14 + .../js_css_src/ace-drafts/ext-searchbox.js | 5 + .../js_css_src/ace-drafts/mode-css.js | 1 + .../js_css_src/ace-drafts/mode-html.js | 1 + .../js_css_src/ace-drafts/mode-javascript.js | 1 + .../js_css_src/ace-drafts/worker-html.js | 1 + .../SmartSwitch/data_src/js_css_src/ace.js | 14 + .../SmartSwitch/data_src/js_css_src/app.js | 5787 +++++++++++++++++ .../js_css_src/js-time-picker/1-inline.html | 30 + .../js_css_src/js-time-picker/2-popup.html | 27 + .../js_css_src/js-time-picker/README.txt | 29 + .../js-time-picker/tpick-light-pop.css | 65 + .../js_css_src/js-time-picker/tpick-light.css | 47 + .../js_css_src/js-time-picker/tpick-pop.js | 136 + .../js_css_src/js-time-picker/tpick.js | 116 + .../justgage-1.2.2/examples/auto-adjust.htm | 94 + .../justgage-1.2.2/examples/counter.html | 58 + .../examples/custom-interval.htm | 82 + .../justgage-1.2.2/examples/custom-node.html | 130 + .../examples/custom-sectors.html | 88 + .../examples/custom-value-renderer.html | 116 + .../examples/customize-style.htm | 137 + .../justgage-1.2.2/examples/defaults.html | 60 + .../justgage-1.2.2/examples/font-options.html | 62 + .../examples/format-number.html | 56 + .../examples/html5-data-attribute-config.html | 54 + .../examples/human-friendly-numbers.html | 109 + .../justgage-1.2.2/examples/pointer.html | 168 + .../examples/refresh-maximum.html | 91 + .../examples/responsive-gauges.htm | 71 + .../justgage-1.2.2/examples/reverse.html | 144 + .../js_css_src/justgage-1.2.2/justgage.js | 1220 ++++ .../justgage-1.2.2/raphael-2.1.4.min.js | 12 + .../js_css_src/styled-notifications/.babelrc | 3 + .../styled-notifications/.eslintrc.js | 31 + .../styled-notifications/.gitignore | 30 + .../styled-notifications/.travis.yml | 3 + .../styled-notifications/LICENSE.md | 7 + .../__tests__/helpers.test.js | 104 + .../__tests__/index.tests.js | 144 + .../styled-notifications/demo/demo.js | 34 + .../styled-notifications/demo/index.html | 101 + .../styled-notifications/demo/index_my.html | 37 + .../dist/notifications.css | 1 + .../dist/notifications.css.gz | Bin 0 -> 2487 bytes .../dist/notifications.js | 1 + .../dist/notifications.js.gz | Bin 0 -> 1723 bytes .../styled-notifications/package.json | 58 + .../js_css_src/styled-notifications/readme.md | 82 + .../styled-notifications/src/helpers.js | 24 + .../styled-notifications/src/index.js | 148 + .../src/polyfills/classList.js | 68 + .../styled-notifications/src/style.scss | 134 + .../styled-notifications/webpack.config.js | 41 + extras/README.md | 25 + extras/do_ed_fs.bat | 9 + extras/do_emb.bat | 9 + extras/ehg.c | 124 + extras/ehg.exe | Bin 0 -> 4096 bytes extras/rehg.c | 101 + extras/rehg.exe | Bin 0 -> 2560 bytes extras/tmp1/placeholder | 0 extras/undo.bat | 4 + extras/update_ace.bat | 44 + library.json | 26 +- library.properties | 9 + src/AsyncEventSource.cpp | 158 +- src/AsyncEventSource.h | 32 +- src/AsyncWebSocket.cpp | 1606 +++-- src/AsyncWebSocket.h | 258 +- src/AsyncWebSynchronization.h | 99 +- src/ESPAsyncWebServer.h | 79 +- src/SPIFFSEditor.cpp | 342 + src/SPIFFSEditor.h | 25 + src/StringArray.h | 32 +- src/WebAuthentication.cpp | 68 +- src/WebAuthentication.h | 2 +- src/WebHandlers.cpp | 62 +- src/WebRequest.cpp | 355 +- src/WebResponseImpl.h | 4 +- src/WebResponses.cpp | 203 +- src/WebServer.cpp | 17 +- src/edit.htm | 581 ++ src/edit.htm.gz.h | 231 + 130 files changed, 17841 insertions(+), 1527 deletions(-) create mode 100644 examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino create mode 100644 examples/ESP_AsyncFSBrowser/data/.exclude.files create mode 100644 examples/ESP_AsyncFSBrowser/data/ace.ico.gz create mode 100644 examples/ESP_AsyncFSBrowser/data/acefull.js.gz create mode 100644 examples/ESP_AsyncFSBrowser/data/edit_gz create mode 100644 examples/ESP_AsyncFSBrowser/data/favicon.ico create mode 100644 examples/ESP_AsyncFSBrowser/data/folder/image.jpg create mode 100644 examples/ESP_AsyncFSBrowser/data/folder/test.txt create mode 100644 examples/ESP_AsyncFSBrowser/data/index.htm create mode 100644 examples/ESP_AsyncFSBrowser/data/worker-css.js.gz create mode 100644 examples/ESP_AsyncFSBrowser/data/worker-html.js.gz create mode 100644 examples/ESP_AsyncFSBrowser/data/worker-javascript.js.gz create mode 100644 examples/ESP_AsyncFSBrowser/data/worker-json.js.gz create mode 100644 examples/SmartSwitch/1.PNG create mode 100644 examples/SmartSwitch/2.PNG create mode 100644 examples/SmartSwitch/3.PNG create mode 100644 examples/SmartSwitch/4.PNG create mode 100644 examples/SmartSwitch/ESPAsyncWiFiManager.cpp create mode 100644 examples/SmartSwitch/ESPAsyncWiFiManager.h create mode 100644 examples/SmartSwitch/PinOut_Notes.txt create mode 100644 examples/SmartSwitch/README.md create mode 100644 examples/SmartSwitch/SmartSwitch.ino create mode 100644 examples/SmartSwitch/Xtea.cpp create mode 100644 examples/SmartSwitch/Xtea.h create mode 100644 examples/SmartSwitch/data/.exclude.files create mode 100644 examples/SmartSwitch/data/ace.ico.gz create mode 100644 examples/SmartSwitch/data/acefull.js.gz create mode 100644 examples/SmartSwitch/data/app.css.gz create mode 100644 examples/SmartSwitch/data/app.min.js.gz create mode 100644 examples/SmartSwitch/data/edit_gz create mode 100644 examples/SmartSwitch/data/favicon.ico.gz create mode 100644 examples/SmartSwitch/data/index.htm create mode 100644 examples/SmartSwitch/data/login/favicon.ico.gz create mode 100644 examples/SmartSwitch/data/login/index.htm create mode 100644 examples/SmartSwitch/data/worker-css.js.gz create mode 100644 examples/SmartSwitch/data/worker-html.js.gz create mode 100644 examples/SmartSwitch/data/worker-javascript.js.gz create mode 100644 examples/SmartSwitch/data/worker-json.js.gz create mode 100644 examples/SmartSwitch/data_src/.exclude.files create mode 100644 examples/SmartSwitch/data_src/acefull.js create mode 100644 examples/SmartSwitch/data_src/app.css create mode 100644 examples/SmartSwitch/data_src/app.min.js create mode 100644 examples/SmartSwitch/data_src/favicon.ico create mode 100644 examples/SmartSwitch/data_src/index.htm create mode 100644 examples/SmartSwitch/data_src/js_css_src/.exclude.files create mode 100644 examples/SmartSwitch/data_src/js_css_src/ace-drafts/ace.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/ace-drafts/ext-searchbox.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-css.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-html.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-javascript.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/ace-drafts/worker-html.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/ace.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/app.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/js-time-picker/1-inline.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/js-time-picker/2-popup.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/js-time-picker/README.txt create mode 100644 examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light-pop.css create mode 100644 examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light.css create mode 100644 examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-pop.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/auto-adjust.htm create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/counter.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-interval.htm create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-node.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-sectors.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-value-renderer.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/customize-style.htm create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/defaults.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/font-options.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/format-number.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/html5-data-attribute-config.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/human-friendly-numbers.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/pointer.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/refresh-maximum.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/responsive-gauges.htm create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/reverse.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/justgage.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/raphael-2.1.4.min.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/.babelrc create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/.eslintrc.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/.gitignore create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/.travis.yml create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/LICENSE.md create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/helpers.test.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/index.tests.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/demo.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index_my.html create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.css create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.css.gz create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.js.gz create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/package.json create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/readme.md create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/helpers.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/index.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/polyfills/classList.js create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/style.scss create mode 100644 examples/SmartSwitch/data_src/js_css_src/styled-notifications/webpack.config.js create mode 100644 extras/README.md create mode 100644 extras/do_ed_fs.bat create mode 100644 extras/do_emb.bat create mode 100644 extras/ehg.c create mode 100644 extras/ehg.exe create mode 100644 extras/rehg.c create mode 100644 extras/rehg.exe create mode 100644 extras/tmp1/placeholder create mode 100644 extras/undo.bat create mode 100644 extras/update_ace.bat create mode 100644 library.properties create mode 100644 src/SPIFFSEditor.cpp create mode 100644 src/SPIFFSEditor.h create mode 100644 src/edit.htm create mode 100644 src/edit.htm.gz.h diff --git a/README.md b/README.md index 0b512b8..d3d3cf9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,19 @@ -# ESPAsyncWebServer -[![Build Status](https://travis-ci.org/me-no-dev/ESPAsyncWebServer.svg?branch=master)](https://travis-ci.org/me-no-dev/ESPAsyncWebServer) ![](https://github.com/me-no-dev/ESPAsyncWebServer/workflows/ESP%20Async%20Web%20Server%20CI/badge.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/395dd42cfc674e6ca2e326af3af80ffc)](https://www.codacy.com/manual/me-no-dev/ESPAsyncWebServer?utm_source=github.com&utm_medium=referral&utm_content=me-no-dev/ESPAsyncWebServer&utm_campaign=Badge_Grade) +# In this fork +- SPIFFSEditor modifications +- Added [extras](https://github.com/lorol/ESPAsyncWebServer/tree/master/extras) folder with (Win) tools for re-packing, editing, updating and compressing html to binary arrays embedded to source +- Added a [SmartSwitch](https://github.com/lorol/ESPAsyncWebServer/tree/master/examples/SmartSwitch) example to test code features +- Applied the memory optimizations from [sascha432](https://github.com/sascha432/ESPAsyncWebServer) fork +- Cookie Authentication including on Websocket part, based on [ayushsharma82](https://github.com/me-no-dev/ESPAsyncWebServer/pull/684) PR, new functions added: + - For Websocket: ```void handleHandshake(AwsHandshakeHandler handler) ``` + - For EventSource: ```void authorizeConnect(ArAuthorizeConnectHandler cb)``` +- [Additions to this README.md from jendakol' PR](https://github.com/me-no-dev/ESPAsyncWebServer/pull/770) + - [Respond with file content using a callback and extra headers](#respond-with-file-content-using-a-callback-and-extra-headers) + - [Serving static files by custom handling](#serving-static-files-by-custom-handling) + - Added LittleFS choice for both [esp8266](https://github.com/esp8266/Arduino/tree/master/libraries/LittleFS) / [esp32](https://github.com/lorol/LITTLEFS) , and FatFS tests for esp32 see [SmartSwitch](https://github.com/lorol/ESPAsyncWebServer/blob/master/examples/SmartSwitch/SmartSwitch.ino#L16 ) +------------------------------------------------------------------------------------------ -A fork of the [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer) library by [@me-no-dev](https://github.com/me-no-dev) for [ESPHome](https://esphome.io). +# ESPAsyncWebServer +[![Build Status](https://travis-ci.org/me-no-dev/ESPAsyncWebServer.svg?branch=master)](https://travis-ci.org/me-no-dev/ESPAsyncWebServer) ![](https://github.com/me-no-dev/ESPAsyncWebServer/workflows/ESP%20Async%20Web%20Server%20CI/badge.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/395dd42cfc674e6ca2e326af3af80ffc)](https://www.codacy.com/manual/me-no-dev/ESPAsyncWebServer?utm_source=github.com&utm_medium=referral&utm_content=me-no-dev/ESPAsyncWebServer&utm_campaign=Badge_Grade) For help and support [![Join the chat at https://gitter.im/me-no-dev/ESPAsyncWebServer](https://badges.gitter.im/me-no-dev/ESPAsyncWebServer.svg)](https://gitter.im/me-no-dev/ESPAsyncWebServer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -55,6 +67,7 @@ To use this library you might need to have the latest git versions of [ESP32](ht - [Respond with content coming from a File containing templates](#respond-with-content-coming-from-a-file-containing-templates) - [Respond with content using a callback](#respond-with-content-using-a-callback) - [Respond with content using a callback and extra headers](#respond-with-content-using-a-callback-and-extra-headers) + - [Respond with file content using a callback and extra headers](#respond-with-file-content-using-a-callback-and-extra-headers) - [Respond with content using a callback containing templates](#respond-with-content-using-a-callback-containing-templates) - [Respond with content using a callback containing templates and extra headers](#respond-with-content-using-a-callback-containing-templates-and-extra-headers) - [Chunked Response](#chunked-response) @@ -69,6 +82,7 @@ To use this library you might need to have the latest git versions of [ESP32](ht - [Specifying Cache-Control header](#specifying-cache-control-header) - [Specifying Date-Modified header](#specifying-date-modified-header) - [Specifying Template Processor callback](#specifying-template-processor-callback) + - [Serving static files by custom handling](#serving-static-files-by-custom-handling) - [Param Rewrite With Matching](#param-rewrite-with-matching) - [Using filters](#using-filters) - [Serve different site files in AP mode](#serve-different-site-files-in-ap-mode) @@ -526,6 +540,56 @@ response->addHeader("Server","ESP Async Web Server"); request->send(response); ``` +### Respond with content coming from a File +```cpp +//Send index.htm with default content type +request->send(SPIFFS, "/index.htm"); + +//Send index.htm as text +request->send(SPIFFS, "/index.htm", "text/plain"); + +//Download index.htm +request->send(SPIFFS, "/index.htm", String(), true); +``` + +### Respond with content coming from a File and extra headers +```cpp +//Send index.htm with default content type +AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/index.htm"); + +//Send index.htm as text +AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/index.htm", "text/plain"); + +//Download index.htm +AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/index.htm", String(), true); + +response->addHeader("Server","ESP Async Web Server"); +request->send(response); +``` + +### Respond with content coming from a File containing templates +Internally uses [Chunked Response](#chunked-response). + +Index.htm contents: +``` +%HELLO_FROM_TEMPLATE% +``` + +Somewhere in source files: +```cpp +String processor(const String& var) +{ + if(var == "HELLO_FROM_TEMPLATE") + return F("Hello world!"); + return String(); +} + +// ... + +//Send index.htm with template processor function +request->send(SPIFFS, "/index.htm", String(), false, processor); +``` + ### Respond with content using a callback ```cpp //send 128 bytes as plain text @@ -554,6 +618,43 @@ response->addHeader("Server","ESP Async Web Server"); request->send(response); ``` +### Respond with file content using a callback and extra headers + +With this code your ESP is able to serve even large (large in terms of ESP, e.g. 100kB) files +without memory problems. + +You need to create a file handler in outer function (to have a single one for request) but use +it in a lambda. The catch is that the lambda has it's own lifecycle which may/will cause it's +called after the original function is over thus the original file handle is destroyed. Using the +captured `&file` in the lambda then causes segfault (Hello, Exception 9!) and the whole ESP crashes. +By using this code, you tell the compiler to move the handle into the lambda so it won't be +destroyed when outer function (that one where you call `request->send(response)`) ends. + +```cpp +const File file = ... // e.g. SPIFFS.open(path, "r"); + +const contentType = "application/javascript"; + +AsyncWebServerResponse *response = request->beginResponse( + contentType, + file.size(), + [file](uint8_t *buffer, size_t maxLen, size_t total) mutable -> size_t { + int bytes = file.read(buffer, maxLen); + + // close file at the end + if (bytes + total == file.size()) file.close(); + + return max(0, bytes); // return 0 even when no bytes were loaded + } +); + +if (gzipped) { + response->addHeader(F("Content-Encoding"), F("gzip")); +} + +request->send(response); +``` + ### Respond with content using a callback containing templates ```cpp String processor(const String& var) @@ -723,6 +824,41 @@ response->setLength(); request->send(response); ``` +## Serving static files +In addition to serving files from SPIFFS as described above, the server provide a dedicated handler that optimize the +performance of serving files from SPIFFS - ```AsyncStaticWebHandler```. Use ```server.serveStatic()``` function to +initialize and add a new instance of ```AsyncStaticWebHandler``` to the server. +The Handler will not handle the request if the file does not exists, e.g. the server will continue to look for another +handler that can handle the request. +Notice that you can chain setter functions to setup the handler, or keep a pointer to change it at a later time. + +### Serving specific file by name +```cpp +// Serve the file "/www/page.htm" when request url is "/page.htm" +server.serveStatic("/page.htm", SPIFFS, "/www/page.htm"); +``` + +### Serving files in directory +To serve files in a directory, the path to the files should specify a directory in SPIFFS and ends with "/". +```cpp +// Serve files in directory "/www/" when request url starts with "/" +// Request to the root or none existing files will try to server the defualt +// file name "index.htm" if exists +server.serveStatic("/", SPIFFS, "/www/"); + +// Server with different default file +server.serveStatic("/", SPIFFS, "/www/").setDefaultFile("default.html"); +``` + +### Serving static files with authentication + +```cpp +server + .serveStatic("/", SPIFFS, "/www/") + .setDefaultFile("default.html") + .setAuthentication("user", "pass"); +``` + ### Specifying Cache-Control header It is possible to specify Cache-Control header value to reduce the number of calls to the server once the client loaded the files. For more information on Cache-Control values see [Cache-Control](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) @@ -775,6 +911,53 @@ String processor(const String& var) server.serveStatic("/", SPIFFS, "/www/").setTemplateProcessor(processor); ``` +### Serving static files by custom handling + +It may happen your static files are too big and the ESP will crash the request before it sends the whole file. +In that case, you can handle static files with custom file serving through not found handler. + +This code below is more-or-less equivalent to this: +```cpp +webServer.serveStatic("/", SPIFFS, STATIC_FILES_PREFIX).setDefaultFile("index.html") +``` + +First, declare the handling function: +```cpp +bool handleStaticFile(AsyncWebServerRequest *request) { + String path = STATIC_FILES_PREFIX + request->url(); + + if (path.endsWith("/")) path += F("index.html"); + + String contentType = getContentType(path); + String pathWithGz = path + ".gz"; + + if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) { + bool gzipped = false; + if (SPIFFS.exists(pathWithGz)) { + gzipped = true; + path += ".gz"; + } + + // TODO serve the file + + return true; + } + + return false; +} +``` +And then configure your webserver: +```cpp +webServer.onNotFound([](AsyncWebServerRequest *request) { + if (handleStaticFile(request)) return; + + request->send(404); +}); +``` + +You may want to try [Respond with file content using a callback and extra headers](#respond-with-file-content-using-a-callback-and-extra-headers) +For actual serving the file. + ## Param Rewrite With Matching It is possible to rewrite the request url with parameter matchg. Here is an example with one parameter: Rewrite for example "/radio/{frequence}" -> "/radio?f={frequence}" @@ -835,6 +1018,20 @@ Two filter callback are provided for convince: * `ON_STA_FILTER` - return true when requests are made to the STA (station mode) interface. * `ON_AP_FILTER` - return true when requests are made to the AP (access point) interface. +### Serve different site files in AP mode +```cpp +server.serveStatic("/", SPIFFS, "/www/").setFilter(ON_STA_FILTER); +server.serveStatic("/", SPIFFS, "/ap/").setFilter(ON_AP_FILTER); +``` + +### Rewrite to different index on AP +```cpp +// Serve the file "/www/index-ap.htm" in AP, and the file "/www/index.htm" on STA +server.rewrite("/", "index.htm"); +server.rewrite("/index.htm", "index-ap.htm").setFilter(ON_AP_FILTER); +server.serveStatic("/", SPIFFS, "/www/"); +``` + ### Serving different hosts ```cpp // Filter callback using request host @@ -1261,6 +1458,9 @@ void setup(){ } }); + // attach filesystem root at URL /fs + server.serveStatic("/fs", SPIFFS, "/"); + // Catch-All Handlers // Any request that can not find a Handler that canHandle it // ends in the callbacks below. @@ -1343,6 +1543,9 @@ Example of OTA code ```cpp // OTA callbacks ArduinoOTA.onStart([]() { + // Clean SPIFFS + SPIFFS.end(); + // Disable client connections ws.enable(false); diff --git a/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino b/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino new file mode 100644 index 0000000..3381b9f --- /dev/null +++ b/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino @@ -0,0 +1,257 @@ +// Defaulut is SPIFFS, FatFS: only on ESP32, also choose partition scheme w/ ffat. +// Comment 2 lines below or uncomment only one of them + +//#define USE_LittleFS +//#define USE_FatFS // Only ESP32 + +#include +#ifdef ESP32 + #include + #ifdef USE_LittleFS + #define MYFS LITTLEFS + #include "LITTLEFS.h" + #elif defined(USE_FatFS) + #define MYFS FFat + #include "FFat.h" + #else + #define MYFS SPIFFS + #include + #endif + #include + #include + #include +#elif defined(ESP8266) + #ifdef USE_LittleFS + #include + #define MYFS LittleFS + #include + #elif defined(USE_FatFS) + #error "FatFS only on ESP32 for now!" + #else + #define MYFS SPIFFS + #endif + #include + #include + #include +#endif +#include +#include + + +// SKETCH BEGIN +AsyncWebServer server(80); +AsyncWebSocket ws("/ws"); +AsyncEventSource events("/events"); + +void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ + if(type == WS_EVT_CONNECT){ + Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); + client->printf("Hello Client %u :)", client->id()); + client->ping(); + } else if(type == WS_EVT_DISCONNECT){ + Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); + } else if(type == WS_EVT_ERROR){ + Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); + } else if(type == WS_EVT_PONG){ + Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:""); + } else if(type == WS_EVT_DATA){ + AwsFrameInfo * info = (AwsFrameInfo*)arg; + String msg = ""; + if(info->final && info->index == 0 && info->len == len){ + //the whole message is in a single frame and we got all of it's data + Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len); + + if(info->opcode == WS_TEXT){ + for(size_t i=0; i < info->len; i++) { + msg += (char) data[i]; + } + } else { + char buff[3]; + for(size_t i=0; i < info->len; i++) { + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n",msg.c_str()); + + if(info->opcode == WS_TEXT) + client->text("I got your text message"); + else + client->binary("I got your binary message"); + } else { + //message is comprised of multiple frames or the frame is split into multiple packets + if(info->index == 0){ + if(info->num == 0) + Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); + } + + Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len); + + if(info->opcode == WS_TEXT){ + for(size_t i=0; i < len; i++) { + msg += (char) data[i]; + } + } else { + char buff[3]; + for(size_t i=0; i < len; i++) { + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n",msg.c_str()); + + if((info->index + len) == info->len){ + Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); + if(info->final){ + Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + if(info->message_opcode == WS_TEXT) + client->text("I got your text message"); + else + client->binary("I got your binary message"); + } + } + } + } +} + +const char* ssid = "*****"; +const char* password = "*****"; +const char* hostName = "esp-async"; +const char* http_username = "admin"; +const char* http_password = "admin"; + +void setup(){ + Serial.begin(115200); + Serial.setDebugOutput(true); + WiFi.mode(WIFI_AP_STA); + WiFi.softAP(hostName); + WiFi.begin(ssid, password); + if (WiFi.waitForConnectResult() != WL_CONNECTED) { + Serial.printf("STA: Failed!\n"); + WiFi.disconnect(false); + delay(1000); + WiFi.begin(ssid, password); + } + + Serial.print(F("*CONNECTED* IP:")); + Serial.println(WiFi.localIP()); + + //Send OTA events to the browser + ArduinoOTA.onStart([]() { events.send("Update Start", "ota"); }); + ArduinoOTA.onEnd([]() { events.send("Update End", "ota"); }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + char p[32]; + sprintf(p, "Progress: %u%%\n", (progress/(total/100))); + events.send(p, "ota"); + }); + ArduinoOTA.onError([](ota_error_t error) { + if(error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota"); + else if(error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota"); + else if(error == OTA_CONNECT_ERROR) events.send("Connect Failed", "ota"); + else if(error == OTA_RECEIVE_ERROR) events.send("Recieve Failed", "ota"); + else if(error == OTA_END_ERROR) events.send("End Failed", "ota"); + }); + ArduinoOTA.setHostname(hostName); + ArduinoOTA.begin(); + + MDNS.addService("http","tcp",80); + +//FS +#ifdef USE_FatFS + if (MYFS.begin(false,"/ffat",3)) { //limit the RAM usage, bottom line 8kb + 4kb takes per each file, default is 10 +#else + if (MYFS.begin()) { +#endif + Serial.print(F("FS mounted\n")); + } else { + Serial.print(F("FS mount failed\n")); + } + + ws.onEvent(onWsEvent); + server.addHandler(&ws); + + events.onConnect([](AsyncEventSourceClient *client){ + client->send("hello!",NULL,millis(),1000); + }); + server.addHandler(&events); + +#ifdef ESP32 + server.addHandler(new SPIFFSEditor(MYFS, http_username,http_password)); +#elif defined(ESP8266) + server.addHandler(new SPIFFSEditor(http_username,http_password, MYFS)); +#endif + + server.on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(200, "text/plain", String(ESP.getFreeHeap())); + }); + + server.serveStatic("/", MYFS, "/").setDefaultFile("index.htm"); + + server.onNotFound([](AsyncWebServerRequest *request){ + Serial.printf("NOT_FOUND: "); + if(request->method() == HTTP_GET) + Serial.printf("GET"); + else if(request->method() == HTTP_POST) + Serial.printf("POST"); + else if(request->method() == HTTP_DELETE) + Serial.printf("DELETE"); + else if(request->method() == HTTP_PUT) + Serial.printf("PUT"); + else if(request->method() == HTTP_PATCH) + Serial.printf("PATCH"); + else if(request->method() == HTTP_HEAD) + Serial.printf("HEAD"); + else if(request->method() == HTTP_OPTIONS) + Serial.printf("OPTIONS"); + else + Serial.printf("UNKNOWN"); + Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str()); + + if(request->contentLength()){ + Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str()); + Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength()); + } + + int headers = request->headers(); + int i; + for(i=0;igetHeader(i); + Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str()); + } + + int params = request->params(); + for(i=0;igetParam(i); + if(p->isFile()){ + Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size()); + } else if(p->isPost()){ + Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); + } else { + Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str()); + } + } + + request->send(404); + }); + server.onFileUpload([](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){ + if(!index) + Serial.printf("UploadStart: %s\n", filename.c_str()); + Serial.printf("%s", (const char*)data); + if(final) + Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index+len); + }); + server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){ + if(!index) + Serial.printf("BodyStart: %u\n", total); + Serial.printf("%s", (const char*)data); + if(index + len == total) + Serial.printf("BodyEnd: %u\n", total); + }); + server.begin(); +} + +void loop(){ + ArduinoOTA.handle(); + ws.cleanupClients(); +} diff --git a/examples/ESP_AsyncFSBrowser/data/.exclude.files b/examples/ESP_AsyncFSBrowser/data/.exclude.files new file mode 100644 index 0000000..a1c4278 --- /dev/null +++ b/examples/ESP_AsyncFSBrowser/data/.exclude.files @@ -0,0 +1,3 @@ +/*.gz +/edit_gz +/.exclude.files diff --git a/examples/ESP_AsyncFSBrowser/data/ace.ico.gz b/examples/ESP_AsyncFSBrowser/data/ace.ico.gz new file mode 100644 index 0000000000000000000000000000000000000000..49e15bcebdeba0b55db396e5b6266b6e72730070 GIT binary patch literal 6307 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 literal 0 HcmV?d00001 diff --git a/examples/ESP_AsyncFSBrowser/data/favicon.ico b/examples/ESP_AsyncFSBrowser/data/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..71b25fe6ee6012a4c26602977262d217af885520 GIT binary patch literal 1150 zcmd5)T}YZ?6n@3p3@y{hrv0dyWg4`Ks8LiSs1Zp~iZo)Ag)vw}5=AXod1FBkBZ8nH zm^Z-|?V=!w1lNUBASeXo@J`0^VlWvo2dii2d%G#v{l>?6f6jZJbDr~@k1-K_xw(v1 z9ebI0x7Iqot*#Mb_8XCpMW( zReHVNRa#m)qtR%dYqeVa%E}7s=;*k^yt%pgaZOFlCyT}Mt)ikLSyomSAdHVNiTwQh zYlT9AoSdAi?Ck6_l}cqxrBb4{wllAZC#W|h5(!LCPa_ZrfO4a^w-*$T#l=O$<8hpvoWSq* zr+q%3e_~?7OnSW+IMa^f<71qjo??H0AF)^rR;v~3>+77){QNxD*47Y-M377-5sgNF zZ*FeBB8@*378YW1auP>JN7&xpMmQYC!NCEBhljDWw8S}YZEay}Y>emI+uIY~)4^cy z8F70`_|(9_00svKF*G!U(a}+OJRTk|_-LM-)6~=yc6N5SQH{@((@6bGii?Y1E0xNx zGMVg3&{-mpfX*l>DM4Lb9lE=_xgNW_yPVhI;UPky&|8{|m^5NE!wk}(ie_b}IlBq} zMVOVKdwqR9$B&PX3*3JY_m9Nk&GPc{gN==iJO5F2bv2uvofXmS?P|3;LfBta`3zy6F#O-#g&(F`<>gww4@PB>= d7!xdbpRqYH(Gg7acUp7g|4wmf`3*+E{Q*gMMA`rV literal 0 HcmV?d00001 diff --git a/examples/ESP_AsyncFSBrowser/data/folder/image.jpg b/examples/ESP_AsyncFSBrowser/data/folder/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3224d5aa7952d8825f61de9ac1d8834792b15d4d GIT binary patch literal 6071 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 + + + + + WebSocketTester + + + + +

+    
+ $ +
+ + diff --git a/examples/ESP_AsyncFSBrowser/data/worker-css.js.gz b/examples/ESP_AsyncFSBrowser/data/worker-css.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..6bab483026a8fb0ef25353f10db64a75d38d99b3 GIT binary patch literal 32927 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≥U|#lf@UA#CUp!mp<(1LEKhfB^fM~*fDD+;^3+k_t|j)| zZbHa%SKeIjtC4}rQ#ZG6)Js~;n_RFvq|^LRi_~4&d2IXEqOY})erribB{{Thql+!w zWZGKTE{GZprzW=Mc&+7Z7Q|R)oIdOZ;ar!ctwv{L9%z$vej1$CJ}vPr}^d&-aUkG{RMhJ3e#FJvd?C&34^t z3~>?V+~PW7S!wSKuLUXL$jxhADiV|4c0YIPmtoVfK>oA?+2A6NltY5P)WviRZXhl+2 zLo2S|VmsnS;%O0%=f6M<^ycp49+sch&ObQS%m72qh-l;~EW?JdE34OoG5fh< zw%2=p8?XC!;I*NW?>(YX;lTmfrpVgV3Hlw|AZnbiRX{PzuZgHg1mn=H3BgX*mJjC# z$tY-faWgJvN7mr0q+21bdr*_@mG<)^<=)Z<%*Xfl0JmGb2>5sgtvr+wA} zv-}RTRyJsNo~)dcrz>^?K5*$QF@j@S=}^8E+;d5fQMPH(t5#gA-)$0fyI64?#?aNN6+elDLFaVl`^PCO{pc=OFw`X?$F zT~S?l_{1*KDrj#CP!&Fj;I9(J+kZgu7k+&j!DXcy-(^oK{DNDLssWfEn>a!24`Z68 zpL&XgQLCGfPfe9Fwel(_zxI6~D-mA|rihv)KC|NX zfglrQuzG*sU237l1@nBQsphtVqmy6uj*kxX44)<=TbE4Yk!XOIZX5|P5bIyo2!5}-=z zsSulSYD{U5_odU3JQ`xk~~L7eT%Ft^VD>_FBSimLLJ zg@)~8;5a1=6Gx>EipvoW#HNLzo73)&b69g6>#B94D6>KGd9y)kSfBANPawvk=6J?l zO&>|EZG$fvFa^5Z9J6DMA)T*Zf}pMyGL>41lJhx(y9PMp z2X$lv`x1B=I7=gZLJO6$$ppp%gfuq!;c3l-flia+j!yQEUmpxms`|Uwzlo$B!0hqU z-mCo|Ok(9EzBn5k9{uJezeyZ6Umq?eKk<^kQ+qy-V#B52WC`;*UV>zjkr1Eb_z-7` z`c|EE9e%No^$6(Zz9j!NI5^t#(i!kh2o6tiN<7@#_Y2XV_g^|C(N^x|z-NX|O-1T( zb3%B|FBVHfni^Lj{N-ry>q6VkgKytw=?89J6nsl}Qf+u>Gdi|SDNUfHz2XGQ80DF- zdb~)!GUvxkCG1oyCu*-^bwrXdpMoSvCmspW*+xS4ydqI@GLblSY?LroMhO_(h{Sl? zUy0WHeW$A9*LH4nCHnib!QLxWr&FFw3gh;g_{eSI@xj2(GKt4o+aWrAaXdJDwSRhc zGC1=@!}=}7{qjkgH?k}x_Nb`GmK3V)xqFmnN8kV87ifKb>h?CYw4T^Uw|N=3wdgRP>ZhZFgX2MyP+bo8 zX%$0FTE&Xc63dP1iBYLv=!5}}R5);{g$19w$%EJda~BvCY8D=eR#3}<{rg!^8=|?>4kj`Q^+N6+2d|v`Lqm4% z~T< z1@&;J)7Vv?52KR)kmdh94c3E5$IK@DNq)yP?({II)uxvUPtY%b zY8Au0$)%-IuGyWJSTdczc`dy@dY%res<(|TqJ}ROx30qHsfd0Tp26Rg6@BWS5;8kzm+ZdG(0T}E%CchOb!KDuE~w*?>ECt^bC1+exfTcMyu z3+EOw`Y+t%pFA>Oo-ksx@<5v^545TBK+9c>E}}6ja0*n`X0k__$RyEUmj(Soc)+ec zeBRquHg0ygXj)3Pc5Q)I&WPQFXgiDx<&alp^?mc|FzD26oe`d}9aoig(i=N$nV|u< z1s#v-$gi;R$A2|`+Sk5@!KYhT*5iKZdfcDxPSEo$9{0;ARUY><^EVgx&*!in7O$ws zrM|6=P`@*?=eFn}{pqiCsLvv>8n}qtRW88+DDUF~d9}xW9`bvP8AXkj4cz051}|4o z2<^is1IGjDwwNHQtUKrl7gWmM*&<_j8rd$X*B$%O{~!C2>cx@j#gQI+D%oByr_y1k zPl(t41J?6kBGw{f(xDI9J9Xq~s1{>4!Ejg!BaAV)_{~bC>hxj-!JG3Z9Pw7I1uz;f z6+uYfXu0Y*9e+>Ehz1#n8FP9*8tM?eCffjI;rhB=s&0#DbWD;IRpkk74gwa#+{{=Q zPb9tH8UKIT8>`+OtKJ>oU+-k9piC8%-J*BKA`=hEHK5MDq8gX#IZpNkGK|SQD~=iH z@w#ny0CsQPA{f!a=TkwbF6Tm+c;lun2j_Nov|B)$ro2mc zWyMRFXBL3>^{u+cYGLMdY=DS(e@cOm?bMfwfXP{emop4ZR?1))Ui88~q80cW^oj|O2!QpXSCMWT!t}w;hPZ-cwLnCez#qW3G71u2yr#H2j$fGosYQLk-=3++7KC z<1`fhE5?CD5Id)^|>6V_J z-bq$AZb2>(Vb0c}8Umf6Q_L&OPhkUHPNJ_!f-Vjirb}~x<5EO{N4r6Fbv()`3_h>Fy!v@4oEjnXZ5_Jeh28SR@)uc zK&xio8GJIh*HNPM(J#JdKk|n69d+I36aj^`{2R=xwQ^51&*YMS$O^?dr%}ETKw~Qh z>~*fg43v_6rK=c}+^w#e{^1?txarx?Szh=tBK!m+VF@6~SDtR)l=G5Y$xbS?)`DV4 z3W{}77f9(8LsD4GOXWE-4pI)@DV*r<)4jG3nft3|HL8C??V?H@qGf*!I*C^{K3LODc=eF;m7G9 zkNec3^QC`yW5dqi$>>GXuhY9u_~#xqgQNtZP1-lTUR(0C<#;MiWZDWE6>C;fXiM7) zzA1d>&qhD^bzV0QJ1mB4K1 z^n=f35Cx1mALgj^kAXZ|ITx_;_=39GKk@qxq!TW_KZ>scGoHjv;A{4MW5Q&^eZV%v zF{)kUz<$(NC%OstSEhg7#^WFobx^LPHV7(dHQQgrU@|VLyT+=*o5Tc0?4O8JKUi@$ z0`^_+`tjv$V|9=Fmc_nk7&P}HdiNHvh#n=%2QQ9GAl~-;!=7_@b4d-T;oj2}rRBr) zd1@$qapSZTJ7H`8Of2YKC&8_DKLq+|uIX)k;iK6fRlV)iujiyWHknUc0oZJ=i{S!} zu5v}t&|o1)9F3>kr+uLr7noMGn(yIN5WM2nmqx~uiv5`BBR!{=kvCaUYaT9$Tj{qM zU3b{!+RqJhmK8I5t(e(sW@bAjb+ENpqzqRV`J>59f?53*ZE`tPen3Kp)o;yo z$oI^2ze`jk@NHi3Z@umllW9gQt4*0|ty|l=|_dmOlV2Mee0aRaKBe3@ib% zwb<6m!F5tas>;vB4L1H0sZ>=()xs)XeY{&_H*yPpjbnHD-V_xaE)t$RO5+>gb}@km z$*LA4F44(3C$rochsdNpM(P^pNB0yiXPTnb-H}R~=v7QP{_{BDzb5?Wr&faGcaknj zgL!m6={GOA?{LhStoxpm1mlLdxNn zXV+G!!PoH}n1U2`@A)KF@w2i*;`20l9!Y0NIVDM_Y>S+Xj3t3w6dV1W3{7+wrF8OB zC_RzbOJ@M;bzwd&jg4{%0sj0tU2g!&frSZJ`b$9Fq+GNWjeHoa z*MK7hogvasrEKjnWqQT;2FJ1L`r^Dt-@%5y$5ZTP>^#GSY#6rK|elS zpxYBX@KOmC)=Xe4q%^7lpXM|a094%j&jn#E^teGHhArsclIim-8kKZU)#JK5LlTwZ zWL^W8*gv5JmSg`W6%3u~+q=bt=LPL=W{hnL*o&*$NAbHE1&-&BB${PqS*?vXbTP%F zvzS1?U4jfw3PsNpM9(BxVP`gar$OYjGSHIMTPcD6PHHt9_}0HRNoHXO&l^b;n-yv4 z=$|-wPq}29dVDq&+{0r*gSM|n~CjnNoVpCo`x+7PPC@3w~Tl0*zruvCE|pm zd8{dB_Owhi;8Y~yXOdXWgc27Mki1+&PR-LX<%6;zQ_rj}`&zBJZzd7ID&de$QihrK z%bM{A8O7?pPh)BxxBGoZK_ke^MRm};QGq|xpjz~Ig7wYkRwvRG!3okP(d5JAd$T7~^TTF+#WW~53WmZtkVha&jh`Eq6KvdOkLXVI$RNACo#^vlfX-uWs1tioSp)8j@JOlDJ=xxWmR_f}h z`06RKu0WgkZ~N*(+ku^U7iLx86gZ)RG|#X;cq>MLh=@HJE-DLeqN-|PiY+G;NNhhtz-G=qZHa0mkrUXgD%!`T-fSjoISv{X$sQEY#Xd|3v z!W-+uzh+0H_aNnss9q7WiU!7Fm0 zILK>%6gGZ<*5-g53^0gm5(#FoV4Apdyn_6T7g4({oA8Xgae~76E5>;?JWlS!Uo_0k z#+~^D?>V)3=qaauDdR2o?IM%uq2X62MwLsjz(C<))yDkDOMz&ur)mT1k~Hu}D?bh( ztY(~S%OvAa*oO84zyx(TQ%PcbL5u-rUoUJ}k0fMCh>6K%o?ZI^eV$*g@dB<%x9_Qw z?@q72c+S|vYepY4da<4K#A5%c4BztPDWhpdz!G((cTDkkP185iKQ4_o4p%kRRc^*p zs4np){Y@i=lia;2kVktSnT}~aZuiz5clOA8!JRpqu2UYsuO>>cQB~apGl_?sn&fO- zmR{(-Y^-EomRsZ=fc6q+{b=6}Be=~Q$=KgP7{veOQh2G+%G&!xxuh#WHY+B+=7gGX zrAJvg$KS7Xulj@%;{+2gVNOiyy4hOCB8ji}Cj*AJY`tU4*1=+0G}klG+ug%-wn&W4 zhOS-k3&a{VSBqn36`p8oW3pjFA3UJQ*^Wn&{f?_u*%LTgS2`Nqi>EI>%dg|Apk7C# z<$ArEo}B#h%P$iuC0BGBN%Qsuac*x;P&Ea`I^NphV^#Y&xZH}$CTMuZm_&h*ly&COh8e%6nq0_6|q`ba#Au~ph^(YEBTz_0I7VAfixHMV|1t_RHL9Kz@GW}Q>Es1X5{(>?#nQ4 z7FCX?e$G?OZKCAORy@=|$qvFF3+scb7o2$jLvQ>X3(Nn{@;p&Aj;rfLzY6W{?`m&d|t0jqdW3g%;QEE2^zrR3=gba?5 z&DpkBgP7tb^B2rp5MJERv@fKvL6;S_*be7uP8m^hoOTS(M1%%T+-7grXJp zs|(R)lahqR8m`5P2MKN%#7>RjePs_8=Nb54mEsM@$FQb`h3FCefSZ4+A+3_x1lK@u zJ6ck(k3Bemp!i61IsE*UK8>itu_!_T_NS*?X{c=_QIJ?u_k2X3`|N4UBVHzJeyWfs z0#J2N6;>ajc*=S$KpF#?QapFXk@cbgV$sNYw+<$pG7!mz8|u@_g7|MTbmYLxsp7p@ zCaQc;olD}8HffHfQ!C!Xp(3gkOxPOBoot!Et#xxP69sBoNtORnKTA!Z&QCbQt6t}h@z2H%R51TO94l`y z8tN=9Ce(Y-goUb&pAa+SB5rAxz)kP0JH4xPb}4&i4QpeEGEYryDfzrxf|W6KDUfC@ zC&V@$#r$@K3Yz&&@R770!tV7OAFaUa%cVzX8z$iVNYx~lRfA{cBN63_FrP=6jD8VC z0TR3L=MX*O*Hn;d7=c4P>v=Ajz%*S`R0a-5=Kdt&U=3 zB3k983Q8wOu?}brnNxx#93{pX!ff~M40J}s!L)sM%7q^(-@UiBo+(O zz`_U^Qp_EDdPHi8kF#4lRqKk(arvbS-j22gJ66r&!FvNE`7C&OJD87Wv_N|>jy!Q`2@N2#GfY> za%Qc!Smq3!?8$B44AB+MFb}HP&9rWY8Q%i{$QrmanpJ_-U*ibkWqHFE59%o&%CjwO z9Dir@kN*|rjGb{vorUkH{OPa<~UxMQXy_ue_eqlVJT!1aUfL9%tUs!j`&K5kAhZt zqa&Uq*#~aTNBU75viHZEeYTsSCeI(7$$ z9v9d^gy3D9DILTHKci;EP@98(bCIE6f2QpGFyHkQ!&7< zIvz^)pcsRl=*SW^eZcZ@R;-p;jJF)}$!cTS2=jF@Iw3=h@%7R8YNRznC|&WZl*!KI znKSh6tJTWJlT0|ILOn!z>zif5y&#)BBxo^c+`3%eH3uXG{Jslsn{`!1kLgBH`5_jh$&&Cc$;1c)`DznP zp}9(!Lc9N^GrX$?-$2+4YKYhidQ$~ZP7?`0eHRnUIpk7^b?Y8mvwrf(Oe0$+JWS8{ zdUCqbV63(0lY9!+M_3?Ik$YA#t{&kYxz*Z~nAFF7#S|F;)|2S1s+1(i*7+Hn)#P(r zI&uxbyu@D_uJz%2z)Jkhay!jVw^R@sL;&=b+~mx2a8=0nl7m6Zy#5lkMQ(=fL0{~z z4szfE)em3lU5o8H5O#6)nNJo?4ILlAL=0mYk4rK8QS!7Y*DIuzV5(|&Wb!v08K>}q zqhg12|C8XV*yA+xjN6?KIQ@fYOc4U502E0=f{9Xgl}$}Y2H=8^Dph{)V(m*(-$8%}gGMFI!w(Q;-`L-BRfpUW%k2i5gW^{Y5w~ob7RXHa>*vXI+{J_4&74iw)n+ zu_Vw>e_`@6ZIF7RI^Y0QL(%AqY?0M@^wLohy#;%BxP}L~?TTOG6I`;LQZIH(dC-{I zEIK=zoKgEm9tIhliNyAzf4_f}OWIMve!|wZdrG|};8E5S$?zTT-aJ-%(n;G*`{(lz zIeqXpBW_cXJpo^s1VeflV>d`YP$)o0{{{;Vq79#@6~~`3;K=97dSjEZ6mE<8Mlkms zztR*^wQc$VchIH~FpVvkM76+b-d+UdhvaA~=uxmCbTFjA-os=h{PCb5R}Y5R_>-H# zwCJCCH($Elh}?nm3BmfItD=aY?Nfq+n#-O(?f)t^p^n4pc*e&l~fVwaR@=Pl}t>c2alJa=(?lEg81){6Wn z52K%ILsG;Xl~);(k6q$9@xW!kN;OL0%j{=GH|J~VE%)}N7KfonqZF*yQr<< zl9QnF3|Nq<2cFPOa`1H!@TT+7ESqWuXIoxFah5d@VSHCjuQh{HCr~4gSxd+#M?T^D z9LB54g7qOZSu@x78yBZ3tJSz_L!s0YI|Nh>Y9*+;txRLQ@HQnQeHL9sKj*T+-l5Qw zHyVXJ&gLR)Zroz|{=d;dpIyp%jm7t-9Tz`My*WiOa?8$Bo{k4JiMq+BY;9-v6q&OP z;S@P6-k1HNdAUohFL$d3$N~HT!OKtBK)hj(je1XrNqn%#fCZGUF{TDS0ky4UYM#ze z21}`m^0KG#V|;)4{qSojH!Skp9`nApkZiq$s#LbE*{dz@AUs@J@1SPScTlta9h9X_ z_Z_4sj6AL39ppcYJmm9^0wS8Qp{OdkY%fw0LCsq&3J1fn@=c)&(h7S)nC!DDu%jQ< z%<<>HKuL@f`k`G@n4V9wgyv-0Y)A|05c-();?8$jW|Ov_rAQQ@9S@$&G1Ng1x7Z|?R@+4;D}B=&IE)x%8PwtiULDOmh0APnSUSwYaS&hNk#a%DTN(gs@K7W-0kx14 z>!WA^iOM@F#{5DQ^M8O1i4VPuD-i^2CnAPv5{}KsP+o(jPH)E||MG{p#%xm9kA{q%7JM7Q=t)N_T&0C(i_i__#*Zs%^>FELBP>RHj+I`eKhe=hO|90j z&Mw9=22I1TE?n%zv=<3b4{V+#dbPyTbvep5BV;FoNwqzn4maZ1G;M6rO z!C~Yn&gThyn2UqyONPWnT&lG=r z@e#v05vH<9BDzg8G(p4NDh#oOQMd`cEnvX3wbMIoV{+-+i*(IN+V&?M>yvA1TXNYl z5(%tG+LkBo)6}!sW1e?Rv7O&^Pyt{UD{FC2E>kbp@VrvSA`Si;7Sk8QETLlHL}3ih zhHnY7FF?q4M`=1Vi%`fo_UNe4V5aHPWeBHyM%6~6H9Jn0WYTr=$~Zi2Pu}McSoG91 zA-U&T&V|h8-~su=v1;R86CC%w`z6ly@x<{h*IRD48;(R6c|hSDa&Dw@J*nLBYp<<- zJ=nfLJNk)D00!T>kh$3;afpj`-I}70w{+A>Az-%tBb$_}3Hfgf7&-9_lp^RMFVI1M$1~A3njVHbz zz!R>+PZC=wBej5Or@2UhKu8;I;d>_fxOWbWi!tmy801Tk8_Du{`r`%q<3;-8CHmv# z>FEIXeArgR(Z@SjIEiD@w5j0ZGv?WJ*>xkuuY;q(9UQyyonsD#3>{_=p?aUAvv6AM zD=C_J1!rR%JDtsjHw`%2z8)S#LH_5%vpv~^Y%84=H6UoMMX8rD|JlG5=@wUNk6TL>}+L?VorR$D6maFm19~jlJ`_!Pn%B*Jq2}`HR=?usM8ptPUnUC88+a0!9hl(Nc0n^7bzzW z)uQ&}YKOaI`feLcd2zTdw{a9RHlinnuU_yDU@@U6&Z2)wiKG~wfRDu(yrm>k98V+- z$C$u8!Q=2f@iZP}0`tU=!}r9~Adv~o6F(9^CLZG@B!37C9vc;qg0}>xcI8goqA;HR z#aG>f!312GN0ho}UwwDE+FkU%-d)CRrlBPhkn6#**y>0`^zLX(^fij0>R){Sc4Dmm zshj7=L`&kcbz{B78tW~_8&+RCPCt-iw>7|4?U#p10yj<$j})+Jf0(4Na-lBb=(@#s zlA&xtyQE{?xw99}-zE-3CE3Z^+>Q96>lp6_U5O6Bmx|wKS&Ksj=r1peIGtcQsyo?& zHqP9=)e6tv$l|j?&?$$Dn4*p{;!w$MP50O%o83cZOH0k1^SSez=carV7T(I5&_n!W zW5lrJV0aP>%9ad(=OpFP2y(NbQ`*vWCd5Gcs{>D-iu04vv)=27VR3-IwrCGDS#kd3 zQZ+-N1J|7w4m^GT!9qtKI(MiO4}1+E9RY2i(tj0Ha5GrQ^q1ej))Lo7gTbeN)HO zu5|4lm*GE%bBCkkkx@si@HZ~y8r$3QdYjOkgTYduuN?P6o{35}g~>x&P$VNN3Q{@N zkQyO610h^GS394`_b@ZIx(yyw^b^`~5LTC#Y>|hlNv$n!wX&o<JXHA1CDG+^)y{EXc326Hx^Q!6NBuK9H0Zz=B6yWVIJjEWzBXX>BMu=m%u|)u{`)Rc@ys{i1-6L$_piP2+(cU-IX3m7l z%OL-H&1Kp;thOv-Djw}Wkzn6?aQEi@UoX}iHE3Dl-(ku2xTgyDH=VE+ z!K0?-oHF)bTL0=5GFQKF3Y|V#DmMqVoO9$=X zD8;tzj{92tmsS0yoHbe7%bD*!gQ!=QaXb;1}pmZhl zGecPsiJJ1Awmtf>dAYgX{GP?;xRvJrGV_0#IeD4!&T1~qChd(|_W}948{=}8g}Yjp ziP>*%1+v>$W{MA5cNJ?2?Euc&sSra@jF9fLx39he-&oTbWY z|LErPPmjwk|5m8$+{u1MT_sr7fD~`hjl|`)#LL-WH+EN0+~$3I`;?x8cxmNh9f=~o zelO>Mf95*}h53bJ^B)LM5{32|$poHzs32)i{hYiGDSidi*QPuPayul>;n+7c!j*}l zfQEe0Q|bdPO95n#3+@2b2BZo1-j}=tcZxgwkSi{xrtOvqVLrJ{Pdm zW&GJwc5DXizy}YyRYs{KV+7Ruhh!|UV&`h%U~7MKsm$Am#-dtcr|T66BZ+quB;C} zueY;xyqTO*c9H=Z%6To1>bl8j38kf|cX}{7Tep7A6FS;HGpRGTq9Cc2qzw|gAjERg ztbd9Ns?vqy#H6`}?2y@F)vn*A_{Dz4)ClNf5&mJ`8PV>B{hN&N17x;2N%0)LWGtM6{LPG_Q-99uSNmE;?hEvLJq z*eKqJoRJ6rJyAKMiah*L$%!Z#m1UMK@9%ica$%voRM%p?#9{>h%Ni`n_UiigWCf4?JM$9vg)^`1X6o^38nIu%p?`MU2{lX(3YH> zQtT9MVDoz}w$1&t%#Pr^ec)p8`Ws}MmL~Wb)8r8*2rt=f-DbBtG;4wTivq!L1PwK-P~q$ zTdAsGCvu`e$ec;p$TGI?D=CsD=#rL_2tjNU>g_KXKGA3XH^MTFc|sKxR8meJMpQG% zPPvD@?JJmV^SS;mv+>@mH8~kco4ZPWr1Awpp3k!| z2)r01U`Q@#G5@vU!ltDtbH3s;d>0wAT=;Pmb)P%kFD}|?3CmoDgEAQ?Ki|x6E-xuq zq=Ux+FH`9C&o`IrneGcDC!g)&L_^|6f0|fwWGgQvh3}4aZHCj7JF|(plg<4^u=~kp zI=*>!-^kyXod4QR9JicIs?CNSR6A)z{c4gQDv1pKVoN7{i@tUel3I_|a^P;Gg&W;L z$NAp$wb$I#n%0++7T)8E8}cm_@3hM)2Kb!)d1$0+%XYr2HmZ@Ya^hhmb{jLJI8}=v zBN;R~>Ou9gW)sy+>ZaOGvYFGhDOJvCmqAFl#-+sD?;^k%oP}bNH#7T55-PqeIUO^) zd^l0Q*P4F6ksQv=n@DF}b{Z0bs;iQLxH8opM^uuB5SV$*#I3q3%Xd~e(tx_MsHUN` zLw`{!s>)P%LW&^^WHWd`LV3OJ<0sRG1aGeoM%B;<3O;bLLYYXSTuc`y=jfAgVvz}u zmpL98%^W4ZEWd1R!^Wc%FyLIcf^bt{PRoB*1|D^ZRSZhIy5lX3mhwB*tAzko~r`%88=maL`7-2Qj>FXjz zsQz!J;+L3?I#b{1q^B`6%D07zv$Ex(^?jP&*p^YOdBR+&z~W?A13WGg2-P*1pO(%| zX1QbvwsApg+-cfNJ#)MHH;GQ1xU>|rzM5<4NCHXZ{Fj#BimLWN$_*M>vKmW9gS=_> z`$}vH8sa)M*CcJYv=<;pVQ4M+gQ>I$)^Jk!QT!&FdoghsMK%lA;4u`yyns{G4_O5x zyV(h_smrO4()`Q)yyH`dyAe;cOe{289hvnqIvhH;xg;1UCS?e%Hg3T5@{gkWbyrU0 zAxqca3VPfz$yM7+6KHxoF!>8=D2oYDe)IBIwo&tqWR*gpiaqoJ6Bf80bxkS|=K83U zi3t>DsVA>udPVOc$bK&<(0BayC|&zxa(2Gwe{zwkG91v%kK(Yf0%06PDKV_IENufa zMm<$m;`Vi1g;1pIW97bPuBN_ywbshm>FPTqv258WgI!Y zJ~~VBTrS0IW>V(!>yqs2rh)t8 zJ_yCE30s_uT#zUCQP=NGctv(*H)d0 zMP6r7rLz%;vZCdcR`-YItLktzlIQi;?AGN~!qAtMQGUJ3V>Ss-rb^WEJGO8BV1vSv z>Q{CZ#9rQ}i5;sO$fQ>$fmyq$4(vO2``Mp|f6n>K{CfV@Z1wZAhf_`-uW#1a7Tv7L zf4piamb{-$P?^g~6R9htc7-A&c!FE0UD}I_jwyoBF(wch-N-2)xN+b=Pz<~`D$d#k z^ndi50K(WbFEPclC+B!KMW!g}sBZ4xR{HPbqdv8&k9&c({ealP5tXyHRh2|J1YNxpz$vLlUvNS$KD zrZpkVFT-GD-)W~8lk05O)l#2E%?1k0vi0Qc7XcfB9Bu?e%*;v$K&Xm~c06VdWv>r| zOh;KRK$t*{io;Svg*BB*@02j5lpUr*>qv!DOpovKYL)kpq(PEhq<0DhZB|#sg5V41 zZ>zW8DW0Nqh*yPS@!mTi?%MNh!#hjhGp;afnP=PcW%S87k0>a&&M|&Px{P$ghl$ex z(@WirYDcR3AS~#LUWeT%Fkof=UY)2P7-D-q_A&L@NH(j$CmgK`z4 zX+Q{a5*Y(pO|P&`#4fTU!u0=lIpa*x`>$D!Ynl>_vYa~Vua33iU+U?KV8w|_+YR=sQdE>^eH_oB0_f8IKY6l!)wEptRAoS>!n&smDk z5^Nww6%*F-3D%w>GM5A9ah17~&ECutt-gDWYK$VYKd59CeSXR2Nzbp$dWm(S{j%|-m}yr`NUWw$J2W-1 zvu`BSsjEZFVsZ{uh-&LC>BfO96Fdli>uR(WK5h{ z=aunt{RfBnZPRjt6D1HTo&GfS}2E!qR zc0|EWXygn(4Q@|zYCvz5NS!^=0PaVfV1hDq>ollibJ{(^vlj*4nw(An$l=dK5t8bNvyDM@W zmd1l_Sf$b}C~$Cl5w?ZO6EpH6v$ix!EWKyS#4}UPzwPShH5+F-*(I);SdOie)Re7B zRy%f&Xt`|78&k_%6T7fw-b_p9Wfxt&VR4Y_#)o`b9=pn!g9)qNULV6v40vM5GICP( zuF2$L+0S-6m8ql*a@Pt~r$x@m_2VOM3*7Cl_nN)r^?6npbDafdwrs*(I&Km)ld^U1 znXuW<7nGBkw{EeXrG4DpxM`Nh@>RHO*Uz>@CXmRJFeXu4Z>XvnE|6g7UE z{F=v7<}t?LEDd%2P~BD<^u1~h2lM{qMB4$PyN3T(8rc?YDd$Fs692cnJ?I297u#bK z(l3S($KD)jp>pISQ0Pdgg*$nlS7KW;*#dtQ4vJ7BhWxG>au?o_;x6z^K9l%Pi5f9djpIUW**9Vm?NnZTLn~DZk z4b5|}@3O&7!-GJ1$nA7ajM^hXwT}u<=#?;14WjASy3#W`(QutUx@yixV~St|pL$1* znIU0@jAlrfAuxzi;TZ7j?0S7^q#JlLOY3U{Tp$1_;bd1D%xSj2MF4B#B1AD+svtaj z-m*Mh-l>wEj2ruH{M45zTV!tvV`aD z9%blR9k}_SIpich*^vIphfK}k)*R{0;o2OVH9)MkTT_L;L{>7vIQSnv;zPP){l&!@mzk^h)?d!uE#WeYyJ`uGnP6(R7zD?!!hC? zM~X6iEWYyNGVD!zo3>(z03EtFPN5*P?mAPfSlGyThD88*$THpKJ@>mjd(h!7rDWXq zC@r6c8WC3XVgCcq!Qy79{%J%5lo(69Kxr_I0jMTZ~ zm1p{J&?EiOe2Q&N;1iBe!lpg2^?2vl`t6aUcxK~a-}&GrS0_ya5BKhc#prbI925Ao z^!oW4)unsU>-NPCDQO&OyQ41?BS$nQ%YNSXF7D_QA)s^-8`Xo^tF!z-j&C4eZUIwnRAMwD_0K)^zY-0kK(TAqq7M$AWdNRBl-7;Ng(%k4I zg`VFck8TC?EGpGy!FoJO%p@HE?THXiNI2)~(RELJddpsvT|pQOUz%lXPF8NP2Q1yI)`7sedMK}m- zlY_vK${~tN=Zifv9rdkx3Pl+^~Y%ZX#^ zUh3H>oj+ziT6fsXuB@u6%sq|0tS-qgcBb!%M|U^!Mm*j~^U6+S#PKuVr{XC#7CSI` zyb+h7-k>V7jk9?CGQk|-;n!00w^n)NKrZ)WX<1Z9)p!PKrSJoXzq;9$`X;@9roGZ*M*;MWLm{+X}XSr{~6$b_J6j~S0B||qhZrFG%U+#UjqO& zMi!Dj8aG%z3~9?U{JL@2$^L`$03J*B0rPOtHVk?of_m1GkB|1#eE<^Wo+C~wk~!qp99TrR#ibq>CGz+`N7roVpKLywP*kyP5@3$o$z+K zHch|Tvgr_ z?c>vJ%U!4);po=(kS@Vb@~E>c!{wJEt1dXmGHWikCI?t`T>+{rlw(~bwe=j}s9cNY znl9Sbgu!jtR&zi&rx(pU9#gDNQEzZm2V&{S2!5#?21NCGkX839B*}ZnZe4GArLCP? z_FoQRYrD)$ajHR&nS0yzp?a6yn8G?};++ONt6ImovH5QIbh)#q`oQZ);cDeD63^c~q=flm+m zOdu7`Y6W+yV6Y@&BOnXPU>78Qup)a_2hS;LDf%*(`4ao;Td8b`{cTlKNt=^IFWRN0 zFA%tNnd!e_jn@THEWPvbSjsUggBH&zc_Q&vK$Zz>YU0YL5+b{gJ_p z!_4(e28a1gO;B)>jKtnRlLzrpvx;Gth`rbI?Yai1Lt^XvLY;FVlp>6xT1XIgT3=Be zlr(!)Sn-Ii+H`;es>?=n8PkEi-}GUgast0dU>cOf2T%s4-^??EP3&Ur*=VQe5KElN zl746yb|)NnaXt5FORyWY!mSy6>cDP@NO45gC{LL04mhf5booA{9l`yU}mY zBl%6H+&=M`8?2;!YpIdx1xmM8w5qH^WiPUe!KW#x7c}}5iNERgU$G5i0(jLvhV+va z>vohFN@ZSvD7xLk&$=Lq!jgo3;ZC~P=6oly1HIXqJ`+n?4tvBSTIcI*yM4O=h~~*m zCZQ%yS2rA#BG0_D;RhII`Xz7F84&t;l(}UI0WA>`>79=9u=Q2(A2w;iC@Jlm(w;n> z=6QAyg;LU-){YmO78v+3@6*6UBF7)IXHpgAdZKhzf(GM@x#q;&C zm=*xBSQlA`@9w+wn)05n$7*r-EOuR_^!%Q!SLbE&08UJ~CsH`qk7rq-l#qk3>RA^I zaBc9!qrz@>w<5(LC3^glSa(BJCG;5PSS~p|U8>%)^mf>l5MC%)Az{voN*^bAUa%A3 zDLoNS8lAlEba&kj+)1dg-4#J<>{rdIIZ_3KPRMAbm~#ecPI$rS){5gR!6(dTsJ~TU zYHkA|jY^inCRHY zZ?6e7c+c2oc7FcnpMReH**`0`cjwV`Iz4|t)ti@D_~WIkub?j0!I4cdoVfvCBpYna z%~&VfKX#Nl88R^1h4XisTEJ-w?7lNUp0mk0PJjHLFTdEw-#Tkyp=g1%v0Apk7=37A zl6OxYX5D*Oua4#-4#V)gd~>&tdgwJ2-2bolh&H9=!iBPofxxY+M)oTvkcJ9x*L6-$ zo2p)Q-W|zqWzkq#G`<^R)8XC~4?t}ai;4q{y}} zPhaxlBjdLnV?}N?u{2FIEW)d2kkd&9awO`05b7ZsUdZx{4pxRi%NX) zR0aeV?5iTB{NWq{!VdGPC}%;jTieiTWxXHvYnFevC^q}w&Z;$THhyy4_{n=cy`gLu zlaF_AHFI{1$Ey(Yn78#6AgZdsrU|zJEP5IO;Mo9m>wFF}m5e&ojkrKZ@CQY62$hzk zi^>-Bao9dG8gQ|pdXC3dY}#E?BOff|)vGy&AC64rErA+P-zT7c5V>^xkh5&{jkuHM zMrovlSl>x<)MJKrcc*)BeveZH@04FAxP-MC7HD3Tf>Ks&d|x+m2pwwRFv{XBQR1ce z!x(o*V9Xd@TheRSD7e72TF$dbZcSH({6a__jUM{#ShQ{6H@2Ep@&3p)P=7Rv%t67$ zcy#^Jss9n$_2YR+e20CI(}Eq1VA()$pOjzi*1yp$P0?P^tsKVJO`427rTgqDMSDt> zJ!PcX0mKL<1pW@kI`H2*VGP!+lIlG#^37jpD#&G| zpZfg-d{bvb7g+)`oCtd`F-;B1p%XXv?W9CqQMDXRK=XBy*sVP=QC~GX7l~ffW;}ld zjpkBR<*z$51FppI?nFM9Z z%4W}4|C@Gc+*Xx;Ogp0dfu>yKh&ex#lKGC|lh&&$c&cuL*j+HUJMNdH6QbL8K{``# zitsy;-+#&P59RmIwkLZej%5SKXO6eohNIFuqUfs)dlXd8GFqBI`0ISL1CF6TuVGKr z`U*@(=FpW^MVBhTny(A(jE{Dk+Gyb9%g>Ls?Y#F?Pnt?8#o+hgll z{}SVMSNP9@Q2vVx9^c+s5JIxEPrv?58;tp?OBOP#^B%}-!NXit;vxJ^CQszw3;Fld zS}E^x=sDiX4*;Kdl!q+#=3?ddJN^?=#;;m>kwcq&isM(lMJ6|%V0Q;3OVb{IemYwS z-8}Zd(eK?AtVfF_Xvu0$F^2-VCs7z|NTLXMkX-x(gh1X1@^-=hMNtK~H{QY*x=PKn z&x=>G!P8TopF&|n`@_@I^nyfDG=Ts8r?f{9I^wObiRVS(U_2bgr>TE=8HIiq($i6JM<65a zpQZp9_2Y29B=XT>Jafl$l#h#)dh6g$zO~+-Z(iU*;dJI5m!Ae75H5dTfCfss&fp}a z$c+wAropmud**S9?Vtuxc?)T07SdKNq@7uCTP4)`Xw+KXtZu>Hz`sEJBU#DLh1|%A zanC4~x!7kE(T`W&l5B4tZ=qix27LY?hyM%U4G2IPk=USstvNREw)nEOBU?63--nR*A5KDbn*lpzf6igiQ~{%r zgv1jCn)F8l1ytoQDPjFk7mTBc0!9ir2xA3{O~F_L`v%w#6>wmc94O$>0uB{$q=4f{ z*B+aK0}a&d^oP3bsZ~(1GYECT{zSnPH<(ngSeKhz`@CQ`u20>%m$YeDuk%;;t?(ZGQbWM9E7eukj}j*K9u3Z~e> zq=FgEm`0`=HXi9)IJh%?Nw~G-?#FQ4AN0{_QKq)mu|?^Kmz+Q;NDuf&KN4T@n14cJ z{ChN*js@P)Fbu~4BVfb%A4E71fPNH?L!Rt|8prWSfTyF8tP+o6=o=>47lq^TXgo2= zsYp)yP{JgKJUJLn#>3Dg1r5V^5Kl%XITp#u6x3~!eNFFhVv?e@aU4#j1CtzzHfi!Cv~oxums&a>s9JdzjeuPUZx5F-iW^CjlX*Fh5Y3_ z@`T6I_9enmA~r%St?u81~)qhh+?NF@g%-ZO7@ zoE#3VC2r#O979UG@Oi#evuC051N^8Iv664T$vA6ywtSuwn^LvH;;J3zk2{L8ahTO=K_}HXE9! zHU2eiU5qf{D>Ey9{~+&Dw`;hA+^KowaA!x#jQaW=eXm_`CT1)+)VKKiLmNtee<9`- zEyoGqigP|Yz_Vtl=qF{J-qoDXeGJM~x6 z-QL~m_8ga{;vKRc^N!+22yjCN?&cEPqVnOn)a#-Gmj~(wsPM~VLfse5RcXg;h41?k z$0W!l%1}$LOgFNdxBFD6OiHF+2h7Jz2-Ck?s-f~6$r;qO@|5kLJXOtE;L zL?E14!iD-z<0!=%xJigVFjz}eOGrwK=L$T{4lm#1C*uj@vi%A2 z+5QBXZhr#PoRw@Rjs3v|^%0cZh7zc~{q}eE+uz%7Kepfg!Ped9Oypepxl+;1JZOw2 zIRGs`kEsf<)H~)pcb2e7^|BuQlh-%3F~d9v7W4qtI_yRmYpmrS-vPe|a{<1Lu1UPt zNobriB7>Uz4UaXFp``)yGg!aZX;VmA7XdL9-xLosLei{(ror}r84DYy8R_tQI)f=D z^JioX?~56$YPlWRZ-@5ViTyURhjljGpj)RHQPB>VbM@GCuI!V+%I7<;vnB(&&7Rb_2Z3ayGOhHR-oKQIt!2a{q8tMOMHZ2 zWV9N>C76;N#>c1Qejh-49)AFiRe(rz2Jl%92zpPQk>v5++NyoofK|{J;-H59=hj$B zo!YoCj<_;Ou%YVm^F%U`$S`1CHBVE-3dkIqPUoltdabsFAK|tzp987AVZv9Kls5|; zqxWPWSF6>0#6MwCEkG_Egiiw%!9D5k4Wa}L37hq0w`uTktIM9Z`h(7S3#<|ed#w}^ zY-Vr*+x5@}LwVJ$KzrHWvQaONx+F;`i7?>IAPb_M!+OPpgMNjo@*MEq?PA*J0qLES zUcY**0KV)aZQTu$uwRd7hADW2s_Z-Hd{K(h5I{e#bXea%v-FFNGLrnzi|$ZO;f znakm^#}by)8JG$xU_l3|M71HZh>NFBGEe`?Jw18o`L_0?K}kfj&?e#Y?FIuPKOs{q zbq#Oz_Q@>*-ExDv9%SH7L=0ChEQOi0ARFX?#zhYNS|3Bd>C`wJh7GiX_VwoacfzDW zDU*6OCfUOk!2cm59Qr-SPJ1UXmh^kxzs1ghq^~PG`;I*eZS3sU%uYMQ&X-TMZja*BOjMV2cJpK-zj=s8g#G&mIKmLzK& zu8OgX;MD@u*4v>DbT|cS-?-y8RKs4H^;p1h%egQin?zZ$%}s>^qo+wDz(h^Z+1x~g zbwhZ{P3rPln_#_zk8w1Y6lZdJ_dWrY0><&hH}*m_w!N^%OgFcYVP^;^M2(QSzT`*kSwyE>HG#Ox?8J9}P-xd1Va#puiPTP*K8*XBHv@j$t-H~`LkO(pppg>N5 z>;^AXGn#d%Jio(9OAIK9-K-tojKF(yu}DW*=rdSabA?MZSQJeMTjX%x^L$J_Y@ zgOhnDL*`9RUVvObeRT|8JF9tMyqFQ(O9x6Cogq;lm+HACD;mwiaw=`Rk{@bLa>{oP z3H`DrUuG8&qOO6nGqR4$(^k+~H{w+d9*)`X-6{{q0kb!CI5;M1ZPJCn_d< z_qoYp;D^4|-C2_9NM2rE6^n8LUAevGip&b`1`hSpL9hU(psj9CKl+L@GlOIY`dc}EJX>mh9Nq(d=$baGFYqzPmBZ!Z ziWHzaSaPpCyxO?>lY@unh9~u5T%5tDhGj0q?&(qvUa$R49p}3oyi5}PHH%uFbz;&Q zkR)lP7oD($C%(5j;v|O|yy?KYGF#+&v9KrQd<9vm3m+`wbR7ugTFJ2DN9juHcb_X= zF8oA4g|IJdT^?f*W4hhe8OEHG)SV1q1?;wLXPU+#sz0H@u@F3eS!gGJ0oau=YvEu{ z$ez0knTeSQwL=VZhlaR1!L!R6y7@Co+P3H3B~yS5ET@8nG=``=Zov!XA;+eJ*@tK) zK4p|nkka~8juYQD@mz0bsjaALn>|_e_{Ee1svQk6g8G{UXezUtCFiHA_0b}Z%HU9? zwO5cS&(WTUDV|H(Y37)zct0JIfhfQAc+!07gZ^+B5IWy zBfN*4UhNEvKTBI`#^g495s+})Y;x2bwEM?>6~8RcDD1Z7T{v(B4*=}40{{owcc1WXS4GbIUvhoyjoBA6MA1*g zek&*-tLhJSP9i;^X#$7o+pGmY*h!Uu7PV<>jo3xi3L9PomD7(8k zb+@9OK3xAdq*g=vdH!+x3Y(i-;*hC2&wt~@T}9fe+rR3trC8`M{%*LW&d8f?seSD_ zHR{d=r%DaH_pgcY8^B5sLf0xc#EBON5v{&zqt#TIYKKA^`i0F zfV7ZmNFggKLZoQp2$cTj# zzdOx%+}MGWuxfVL74&CKv#S_@?`9aVKyj}o>Uut`{`Pon_0-GGgnpet;MEAFh+Hk^ z!i?&Z%;{wuEoHHc<5S;e230LNB6D8nXF7i>L+Rg%d6eGOooQ>-HYMY$lMv6!J?TF< ziC3R&pLlESKS5TuA|VK?tB%SRMoiI?!VyWIl{<)WWU&rkmwuX5`RQ%uIHM{I*vCqh zFs)8OIojgCg8c%oCc3(JB4vo{+y4{0zaZMbtRhVUo^un1)c044# z#K*RLv8{w$iZ+IWtc4}u%76puoQY(j=uD$uWK2rVW^8+cSnw#;&PW?Sgnw{GnjEQ` zg1GiIVK4;HCGnYOZpA%|%#Tv(_Lq4ufnP zDt0+byVprBNYaX8@B+KozL#Cum856g+X`_I2w~af{b;0bPd$6Hcl6%;AG}xy)t7 zKF>>+eRJ(LNsFh8LD-D|a5r^sT5qq8)d6ERW>m;d!O}EmZAiLo1ds1K!J$9v~B%LReLpWyUzP8Cm&6mWfiXxoLti_x$MyV-QApw-=F=$*5 zl;3D?F3OW5x=-Y|y%noh?iiU{0Oh#3&nhGOeLy3~ZwA}LFtR?~IQ4Uk7`rjTovL=N z*U96}D2W~2+gk*!%6yJaTD25g4~g8UqZT7q=&G%@zUuliZk!#{6KD@Tb>eA&hn)I+ z9rF0t8^iPW-f8pLJA=|wS{gv$v^0d$tA(I^#ZZNXNYzdDT zrT-o`iX;Zd;><~EOG``;{QE}C(OnSJisUqVRXv@OQ_1#RD$Z8s4V!hY8M=iuaFZ_9 zIAtWDx3m(VPqtjnB2rABiIGdfoZNAGOUoTyKZgr)riLZX)G#l|!=)t^2=d*C=7OB5 zYUR62l{jBYK3klrv-IENhFxOJ@&9INi3x&#--vm(l*BZK(z>;|TwSlzX%Ag;K~Nnp z;?y6+h@Fk!4&ik9w|lhM$Kvj9NBh4YwYyM$xA*qo@aQ9bHiEwoUqTW)`t-sn0mTMO zErV-I$>ld}f(0v663sVF^?pYB>OTdT)gT5VA8E&>QCazP~kTvg{}uJ<<0 zA(u%$&U(B+?m%Z1;;~7!J%c}kbzT>e`5<* zbuovg%++H%4th#>7ZvcXrpSP&Vtw=!ceI^Y|0F7v$t@>(&O7~JW|8+$2L6boFWeN$ z4H$``FPh-?cS-miN@QK#oFNi#QZ!X&_oZK<#1u^Mj$Ze;4aTMuU z&LqsFI46qME=_4CkwZfX^^cI)GTKYgB7yAxgWkK#VDyr7u;OcSjrOK3^Hnk1*ET7X zw7*Q?m_W>W*!}{oe1tg4j~9&L$>tZY#nYmDn;xNGroTxqNDQ%t)IgWirq8wdJgE!} zU%D|P8|Ne>G1%yX;b;($9{c<~!7*Bw4I#GM-|mo&=|0-uv;u0kA-i(!2_`0NJo5EK zU@Y0=3~dS)LL=6GJdzaQVVs-#CJNz9;?EjslL*z8si}B4w=V(l$Vml=X8ddh2+r=E zNUuZz5l3BYX3f9MlExC)n9M&Wr>A~Z1qMs)qpg&_pri>vvsAfgAb2lcM-O<-2Yt-a z3D@|6w@&;mN1zg&i4xARm+iXhwlJq=r^_EVh|yhMwVuv8f@~1%rqIcM*gMkZ)@k5h zN&Nwmsna$*&IZG9!wfg&m?>`G?T6WL=lH4eXdLjRH^3E=Fk$0nb@8Ivs&-Vnq#X)VpH!9+@-N z+#1=RgX}qbVEJg)o8vi8jv5T3MMF@zG6rLGXK<#>7)?^5IUwb^(JdMu?sQj*9WFV) z7?3&}kow$!)F+3ewj2E7Xqje5%kDY;fKvxV9ZlqF?AE32Z%?k0dYO1ql zi>gGGB{FCDf_A|g&^znAtXPEul@b|VZoi87tHE_}ktc+<{mO+GAhbbpy-3$=guz#5 z@LR3VNJF@DNs3#U%V#T=<@w_X%m|nP>T;2#4XcUL49hHLjwM@;X1Y|pe!R=mx`T6< zb(ihOPKNuk!AHY$>x5KqiV>Hf@Hf^5n^^Gs^dS{|hUd45=cgwNQ#s?@`@;0%$@IDB zX%40MmlZ^Nl4LS3*pr~<^gOll+)T+m= zsGJo7HPY-67ArJ%W$JZIK#X{GE@{EibzX@MwJ;`|9)a&)<1#iYz>TaW48RZz+(93-v4reSM!b;w5wu2Yu2=kC1fw&I8xV=+Ldh zR?C#UFu7WW^<7`h7B!Ujc0TnIz}{d&oH493KI}NI`szrpu^HWR7kdC z3>SiQK<_4~Ty94ueX}$VBvCx1TL$@fDIRa%bMGkFCINe^3R0rrE=wsi_M_hZVqW zg9_nfNbNtGy4!+~ZU2F35`X+Lswvg&-)>2@Guqiyh3tHNgTYc+ zQLqX>_)aRNt3BxCtT0F~5WyTwT1QU8!IE9n^z7_0J#`D85=j7r1?t_YBfD+fuw z<(bLkIJ)Opub+ml)3DUB7g&Cp!dF^Yx`m327l93vde&KDj79{x*Ut5^53I z;pf1{?@dE!3?kIg1)a;AY-_!-3_(oloH;NJjm9x=Dp z%tA+ffnb~#RXLqOlq6FoEsQ+r#5ds!|Gx#R<;}Yqqi;UUiXR}G1cqc49|1XY_zlR0 z+h97|NAT6B+p@x;*R%pt4bh$X(bRdf(mIX6D+={%wXE=HG!dC=i+9t3dGqV25&a{o zMWd;Aue3wInVclk85jwUi645mJA|)o0ItjR&P8!RfRg4o+%U4~+M;9U6vy>%X*xrk z2zFzKqQDQYk<e<#?QBvYdg(4G+dt( zX&nH8JdW^cMgy{~GJq8!;oPSK9dv)8gR3PAlzpu<2O~MYW7gEv04FAbEo9jmVLUYh znUh2q60f(jqGB6QE<+t=0taYB=K_LHAe0L|FAViA6Wqi6e;S+9Ppx8W4U0_ixMSJB zs2^+@;l!(9-188trId!NMVc~TG`w6P9%WomI9d}FZrENl1=SEqP(~b02y#X^3>0m4 z2;O;Ts+5^R;Wrh5Qgg&!`?0pb6wZIfoX<%eJnd5~n4M@?^VH02M((u z4@{PJFo7R~_HrC}k3SEZwX{d`@JWQAA3Bd{gx;yd*4wY2_Ia4w2hGHc<=L81$p_9j zA7wSa^M2W#Mm`lX{D5~!vihYN)S8#3lgWrC>KTb9>IFQ_K;|u)tS2v;s%J2o>Y0km zYGq7$@D;@%!wh#hOez#8iVfc00GykqDGLKD|Bm9HS8EOYX0-;|(wmlx1V5nxE2Bwa zs>@dCossJU`~)Z-@in0M8O1;k09a}ul@O2<%h|$oz3^|qRP!aaflB~@uk|`-jlmrM z{wS^BxnL%`E3~cn?8#N)zkR6kOlSBos~dC^MDcQIg*G;5x?EP!ygCW(e)cIOz*t=5 z%#u)NOAGi0Z0#TT3o$fp!7!AY!k5s?v%Iz>WR(s0U;*Y7cAK$$3Hrj8atCqXsAQ~Z zn~GWBWoacI)rJ**SCyMJh2uVt1(+l{<~CZrIYDoUQKMi9fK%J65>UfAUqlPGK%G zdINrbQEsXQyTY46L1g^Hm!rXdd>JyF?@W!(ZB-Ouhi&QkG5p^&>3-H;UUDw(pR)m< z*nrR5fG^m9FIs?F{ZM;jQRXhV(kV1ih=!*4SICW=$7!i%X$PYkw5QxVz$|s3s;uC$ zBbZP4H~ezmAzl9E&ap~cw7?hizK1(w0{`m0D6Y&-vHrXP$hr;b-%4=A{jAl}8Wd=E z)lRn+^yI6u;S{Q8UK6UOT@z-^xgXGRNIDbh{QmTDiG>a zZ9pQ-Z$6Sd#CY_hSuRzwX(Ccso>AESOu|eBNK!b2Ao%};C`d; zK9*R7QoI4j1M23Jg0(Y>pKWOuD2;O^V3F9-JJ z_?RqV{nl6&B4lY?_lQ?fQEhG>k&vZX&7l@U>WaHx!ECyY z@+^7^h8Fy_#2vt8gP)E0xs9`=g1h$OI%!K{7YAG>dP93&z6Mdj<#Z~l*(6dYl;TC1 zUF6S3OM%A#ftbA;0%rdCO~uk5wi#l{>MuZ2S(@Vup&L`Q3G@j9lFJ#I0E>rcBJloU z!-=+#b~qn>Nc#gr^i80o-)Nh5I8BZLkk#ViOt!?DScPpj4juwD;46GYykQ**?2L(G z9~4ewE=uva*C0A&jAm_YLh-bZk$Aup16=*R6*iObEW81FWbr6_JR}mk182_^7#&w2 zG5g+P1%>3_G70BWCtFppHLGPz5?#_(8EIEKevR5kd0<^GHD93Hb20!nK*_(n;RPaW zd*f4{aqcKPkrv!A2gpeb-N1=XxN4%w>qAALFrg4kfI|!_HE2hALM`e*`Pr2Rk(%90 zF{EQtRh^O&X3#n)Z^Xm@$Rhn-Y zy?7~GE?E(Ey!}iBis8bXkc>=U0_{sZ!#dST99+^|_VOn{zzt3Um^9Z|kI;%glq~i7o{|x_d9P zZoMrcJ(X`sNr7J%(JkTZ!YKJDu3X9YRpd&_(;JqnR2s*LHwCZ8^~5=LM6gdrEg_BE zLlr5exuN4xM-UA-TJZT>d!H)s`;)r*&3OiaaHKcf{jsbs1bb*GsSo3uRWPc)3HPSbvn_m#q-O#(*5Uo- z`f0~wLWE9Y6^P`0O91E*C6>k+wN=jmqRBvV9>^bF1-X-gg#Yg*&?<2p<(XHnUCb+V zd=`mqSES+|(83g2<9S@630iiAcUng*`gbPmyA3YH#)|pQ8#2Y#@VpkL=XIaKqi_%t zOUA>H2=&m`MX9ID?>BXWXg>N-@1%_jGZhLmP!eXc?iw=D=pnJ?ibJ?$_2qM{!G6cp51HVal&su3lB2uM;u<5Te+}o@JqM8(m)ky(3f#_%Rmy@%LWV2L0-yLXNa%LZ2hArX+2TNe(kL-IBhC(4dMKxPDpvZBDM3-QN@N`|Q~&U$ex%?7D$M79PZLnBya zNRJJjj5vB}?Z`HS&;!36pfloARRPSzC-_-ouTB+3_M!#gmM7K7NM=i>=29 zCj4k6F~G$~FzUfUm4``?Rvaw%J;#U111CF9l2p|+!Bp5ZRjO!5($WssQyfjYcfnce z!dBVf-bqhOj?Q>Uw9%O{7blAX>D;6xeB@~mD{b8>sw z10ojMP{h0C9s1(U5`UI^)c@jnUG%wNy}=h!OfL5cAtam)oc$0_r<;XNe#4hvt^I9Z zoYn%!BHAu=Nv7TUhtFTQg%q~HqwO?Mu~T$<7=<@gZ~vsz)1mwhnRYaNx@5rkd>wh~ z_G6KB**kJEriGT~X^Jwv&FGsKb*}K~u{1z{z&nSKTIf{LRq=1hZ&8y568-C`Mfi5! zY2nkYqnGD>TW!ccMgONfG zYy2P0S#e+~j%xfL4+`VI>$JdsnyTbz#5rO7V{^lQu{5`X@n0l-ga2buXi;(I5CSj89OX+i46yvAlNk-*z@!7GCRB?A}JacyuSY3p(4iUX`N&H`7ox1vd>3(=-} zq^JXjjzcZ7E8uCC6Gs-DtUds&cU6k)e2PbSefh=yGAd+R%6q=iuXp@gV!*AK7QX!a zgCq&q|He2<@Ams74yeepJB<}I=8iaUf=$cq-Nv_DK481NpXRu-YKyi?v1l+G;@BNn zV#JKJ4gEbsKt%ZLe9pB{g>T-A6K^=tJL}+4Dze+t{)U@cDx#yBCbQTZ`(lof368F; z*sytzLRRRllJ?s?f6npyZ#TEMx65c7dd@!X*jdO}>w0O&bVITQ8^`n_K+A2-c-b;O zo?_mzFH-j{mIHX-GC1e#Tc(ho`nz%Og~tF|*;>r+@5mNrkT}6L>)AYvFpmhgPTi z;IMjzKO<`+Q1$6Och`nfhOL<#919pAyR`-rK$m|h^p1Vup`xGe_b?ELxA_kicg|~>V5sz?QE(cx40t< z6f(vux{rW){JH$bS@$WvD(H3GEx*kR&o(TxiowB#1~2itDorBsgrD~j-MFv(%#>Sa zL=(kr-OtoJR&Yha53Cx8UAho{6kh3<2_;o)m;tng6QbSePGUNA=pzqS?|JZhiljQF z>i#6&^})q9=Tu)>1V9KLM_hFb;NEd*!@#>#ltUfT%3>ffh#XU#6}j;ygy!sp)Gw+W?80}cdX}Cn zoiar|6xvg8dTvvPkl%hA?|BoRodrssBA&dj6W*6)+~7l5F3Zw{aKE(^K7Ejw z#{pqF#|!Wm?_HW*^*?vyL4^x|{$$bR4Gxh z512TM7TO&D?b*wc_iYucac|FE2~8tTB%67&a{dz>AR+{LB4W#C#-l{|R8h%w284ASih zHNFsQWt2~`g~?WwW)ZBhDtKw>r;$3z`{I3(w*HWO?7scEZ~$QJ{yvQ)rC}KvW510X zB(1~F15n}8Ljj~m)Ag;1$;M##nqzO7hKF*71me4TvX4oFx&K}l91!$Rr0HEc4R0^f zxrwqS+dt~oE{8FqGXz>9t~a%;Z)r)06nm4@Tal~%bDmQHN;1ZreZss3%(Iy8_^5!~+2 z$GT08S~ZSpkA00>e?eK{0W_QAqI+#ek5f%k9Htt@(6U|JVbV;DD-DPlko!-*J7#8C3G<@d<=3@b<{2oK%L=0a0Pt1Kfy@2wIaiNWB0y30zv|AfEJ z?>gg8Q92g9!NP#zeWD0gZd6v`x{Y#0#Y99z)`jRqbE_9j4O|iaD}B+2-gAOtqYBDU z9f0G%>8mEXkjQPgPa3h19vAMEM%f+gljfZ}AUchZ>hT6U&hB4T=D}&@l@7j1j8Ndy zvRdR+$!a``4&Ui_Odo#kJ+%3#XEh-BjB@ksnP@Td3O49yxiZQ4)6yc=>FhE_@f93<1$%--M( z)m?U>6wrZ|0>Wix+iuCh9$;CW-wU92Ad3Jg#3f2j}3p8JhYqXuJ)1;nk zEBNc6pqFX_waO}Xbvf@HWaX{8Z;+qoiCpY=TW{axHbvQU-AO;euKhAvmoIE0q$Y=w zXgq;am}nm*o?fqtQRAw8)Ry}Gc?v=Fm%T;rdSkxdQ{A`%nVju}EdnlaaRSV|KoeUK zTkOE-#3P4D>Hc8X`}a6gTvZucj+$~LOOJSg5im81PT6UMA;;o{qw~+-_!=L|9j%}; z-QZ^buqY^dOfcFiMaxGkPjc@g0mY=-Uo=$2+pWSjdIY`F=uHx}o5G*7`kdXp^D_j< z|9X8feI=d#GJSfwg`skn0Xvp!r<-daA+Bu;N`oDLrm``~`g#Etp)diy(u2PebW1+n!J^ZeQKCNb3s zZyIV2fQ$ned!lg(8>dVtrMH_3CcnDjZ=L{$gh}9`D3`MBOH;0)?l#u)s;GfE_vywIu*(8=Cj{J_saRt_uTza z8Ld;bn)6OJXVq#>Qh+okn7W+uw_t!Q;g4}CD1D&fdx%BaA-clTIrJ#OJN3?1SuxK2 z`PB_f@kM+$iCuaQtL-0|0o|>H5yz|AN`KgeIq}PFH$Bs<#n;DWGg_?$GPaB?Wu&d1 zVliTx==W$7X+Y`c&y%PqNAmr1p5{2$9)UI4WN9ulnP-*P>2Z0n1>CA& z5^3jFgmoTtPiWKfexyZFHk{Du&#N4gZB%j^5r!9mLcPvwR8?_gN0kSLG}*wA<|hJ& zQS^FYS=n6LfHk>%axTZSKqyACDWgl_+7J(agWEf8Qiw>k>^D}eZY^Eq(WTBRAPR?> zS+Qy4Rv_87u_)Dkc)o=L)?;l90MO-IS>G-f$g7c8LUd*8%?->RA1txL#~Q3g{wFx* z7wj{xmQ94%1`?Te;kCz8R=1C>_Z zH?~{Y+jfoV-f!YUPLU(*HF9l)vt?#XmmONQ8PY;E1d(}GcQ}QH5lIjpK;?3&FYvu8 zr4)y;PG*HRiCilmV3J1SA2v~*qpsQ5#0b$FV#M$eyZq*C#ZB43icu7R)5ZdAZq^@F78of*WHFE-B$D)jUMf6&fUeLe z^EQtQnEoH2^{?-dC|vG>X2MzGhA_Wv+93}X7h=ifR6&>}cGWVSiF&MK+OB1B+Y>@5 z#zo?nqF9b*woXu>Xa(7F|IQ@1XDyu3WpL*06w+-;`-SKXf|@v+SY@EsDh_R_DOKDd zHos`pI9&rpYN%b6&V{ah3bxa$=3XzsepC7)K8PuB+*v7-W`esjVGuz8RTBqUh{Rek zn0`l_-lVBEbUN2N$%7_x(i!Y#6&(>K7BeC%q&#Nt*m`8}Ix%@KH1Qaj)K6v-;JQ%A zu8pZU^m=N3Enf*~)XN^FJZh*)u%TE-MI7rS#IrKYpE@n*z*EICEx-p!##?aN4)Imjx9HMGCPuWXuxQgG4;zxP%> z)4)!H%G#7lV|X_k!@H^CMI60#-d9&rAf-jpLsVGHJeB;mdk-t>O~pPg)BF03>IYbC zFEi{YmI3i(9@uqWZOo2SpsTJ*m==r5X9SRiaWKzb!%(y7RK=J1#gg%Mt`q2L`soeU zI?q_^FZ5NIJ{C-E0rVRhh?TN)l2kfNA?yW+c*6#?3Z_KCY+8cpgw$}Ot`am-2?h7clb~IRCZ4q^B>V7# zDN`K_RhIE04vxBFIu&!rb@5aWCy{CZ&V9lVrq<5Hz&P!^#=^cq~?1tW@@6fP|Vqlo~z6hXftJ%kK#;2#roMaRq zux{zN?!V)QUcYFdEmyn^h1g><6o|W?2Jf8UwICo$Q z4rt`-jxdLZSuzH#i)2pto>AAYp7=3|Az*g*L>&Q>jp5$F_(JBJQxwe-Tblaqk|mZ?NWDZH|!7EqHSR^>5)<%EBf7ccjTE;X(@`g0!2#R<9Em7 zQ#3`%+X)EmP=wxJbw6quy1q*Ibjt~4`km@b!f$#_W_uAn=y%SsJGeZa{M4{_Dc66* zPg4E~6G+TGeMovAkIg5AO1^}+tw`>`%Mc5 z3xEoy`09JbPX}cNVL|>RDZsxw20e@5k>xJfMDbIBp$CKl*aqI^cfv)wp#${^*-=a*F=w+p#}p ze{}f8*dLrfI{fRJ}Zm$T2|mEre4Yl{G2P8 z6!9yDbM*`pNFno}Yl}Oill@D|dhTj%G(^YSQkGc>k_y%QFR_&fn2e_k3xF*wHr zQn11$Q6O>5lqpl5F=fG&=S;Coxkk!D*3K1DPs^GZ&qMwhj0vQyl=YNL zNJNS@d8A%JhB(Hqmry;6dtz;J$TRb~Q&id)ltS9t6pbjngj|e)TdP@JO4|(ht3cz3 zdpW}pC}1K&Rg~o71pcRdZKrjq^vqK^hde)w7&^`mOrL#$SwN!hVX@;->Kc0uzAYl{ z!pgi*8dQA#xzB?RCS)1;J|Fow_xZMuDQf#Lt|U_nc4vCKfOaBk3onw!?Ca|bRN@gh zYDmuc>!3JGV<2=*&ccA)JL)4VDnnFDMOkY`q*qOmp-g zjV+{YED&4vSTa^Mi^ZB|nKlgTQ_aW zbv7&OHTWcoK<215@JIz!Y`omkd$nj3{2l zDw(fTwZwVZ=PoG+Jbc39*^M$h!MQ5W)lDJ!&YS#{bI8N+V!?eiBt&lg|a$g)OM%KSSx-_4d%YgPJ9EnGC-op{QtKzTC0Ph{>BnSYE~Nu94H z#0}HOI)5oO&UV|D{P6bp9eu}I&Z=5gaOClwU(z3W`jas)`ypg3Gj6W#kGl5lNFVI7 z0Xws%>^HzNI~l;Kq8A+nc7uM<@!h?4OLN-`jRLztL(h1?ZIaj#{C@p0uvg{LRJsN- zl3KXH9sv91^1^RdYy=q|M}Qu9Wd9d<%Jkq9e@6p=rQHS^x6+%)#O+0ndle-68Tm|@ zz5*DUv6|>4@ksRd@OTdo-QT7U-PHk38MeaPE3h2d=CxtCc;X5Of(i6dH2SebIQq3@ zEW*3_xwtK=rFi}6`T6}g^{1FQf<8Z%?@s7raDdCbfi5U(AmzVa!t z_u0N^2nsKVIF(!+G*Pmd&9r|VK2sVxz&(1vTyb(O0#|tMhef$KC%Cdy3t48jh0e{b z%ML&P>hlP9MhQ_nRtn-m*Q+T+Ypi?~s1%e%5f8NwYTEb}}w;Y7jV9ImkF6H5V&Z+<|~K zh19usqFO3(a)^#q)|5_I=(Y;YeqatmWa=t&YE|H7h)(V11r<~25YW+gBLIrmfwU2u zcY&l>taKor8xLvb0-y3kphMH$CASL*0kcd}ViKv4Jc!F?q$;!Nxi_8oKYN`rUMZBrBDl3(9S+$fp zbHzeulB?;gQ4{pLi1@w{0J2Fz*wn7YN2zRTVHZ+W2oNO6CzSNz82vEfn(fDfT>wY# z|KL+s58jUvPwf3Pxx5g$Q4TB5)oUCv`63rAdf^YBA+9^v-)6ttk~6p@M-*I6riDmv z!0C@m5JoF$XawDOhV0SzpZzfEv%-C=6Z^Gh)n@;C2$Ck4A((M=8@zS?;$}0qw(h}$5(4?LA$ux}Wfr5Rl|fH_yVnM(_d)mf zpcHKT022qnb{*CF@7knR+x6eBFjk3nw>AJ8Eqhy4L?zjzB_v*_!0hi}WD<_8J_&Yi zYP>5EO9+^wA$@=p#U5OMH0p%K5hKDrc?9fezsFl`JfwRJCgb(RF$L;~WV@0gY*-D4 zQLooM;5T~44?Xps0{2(@XC3ex@Lam3a+$GN&M$7pZZ*oX5sm<((-$X`w=d5|2ja?9 zJgB#voJzg${&53BWb|>yFRM2F{3Q67W$0iKX+01`z4#cwf?R(Qy)V4oTA9*50z=fr zUbf#ZG^swK&?AT@NmF2b82kNW)Zs3Yk7+SO1vxxbF$8H#6Knu>wYjL@SZyoNr^nt9 zso2i0j37n`N?E{PSqgvgRcv(4_R88lE6%oaKScK$eIP&!MCpMaKBJ|eTnSCc-q82! z4^nLug=21PJ34Jd_C3^tu{de^*^`%W+!9)Ai9V;;nT{sJn%zx^^LFAfgni{ zBqIX+)5_wxu(me5O^#Z`709L=9NV66waZS1<+<`r-RKNKGHVPrLjuJ1@9?pEs%T+5 zFRZKLRgzm;Ur)n3>uz`)aD17pRmIjCtxWA$tfBb*CxJ#~r-^~?MY(V2|3U-~X}_{8 zSH{s*usWAEZ&ukcvBZW&fgXlxrp}bAQVp~ho-_cUFTT_!9SuaU3IWH7-BrVFccWSgC-vxf||!MeRWT9 z=qfHd3HY)SGpTVzD|9IJrMXdgmxYHQQEyc^s?}J=OHbh_^+~%_+(r2guR>TIg7kYy z=__CQpw#dRQdj+kaL*hm(skS5qpbl-OuUYe4k}sQ5*ZETxYauYR-ezHLh|C&;Qm*Q zyHwRDopJDut{eBzZK38Dg&Hl%r0-YqH}DAI344=?Sjy42sec(Wu+WcmRgI$u~Nb)+w!f@0X@7yC1#R-`11hU*7?gK&z1I{RO|>E@%-;Vv^?@EiLDQS z@win7AhHtm-U%xWMgQEoLm;5G2ATuOU5xdA3%_N8;XsNDw?jKZ8?jH}<86dZ3qkL1 z3O?2q7ZlPe5f&az14FvP@GdZ54VZk?W|vL}YH6$n;19q}3)1&#*EYDP#i|bAOebVf z#gQ}6<4D-|b=0&k_Z#Z!h+U8ojNWBxL@34Xc~D49q`@Byz1yc2w{=0U#}VuH0dmRY z(es7F9XtT7-R$#}LJytPM+Z(MOWvbIo&L6wfDdgP{RS{pz3{-_9h^7k_ytT4y}t9% zX)suh+uKP)f}37PcoHi^D0r@5zq`w_PGV^Hf~5_Y z6&~4m2N_CRGHVT5XbiWNHtO!+?PRC>yIK#&4WIVXjifHn;Ts)~#O>cS>c>n2O@ksf zQhsqgfh7r^41?6atX*wy(=ZVJE8`Q1WF`iPmxO2=wp{caq8fmyA$;t=R z|BmnC<9u<_dJ^9n+xO!0**?3;bN1f=2kBJ%kp)%LsTXF~mWy^MArmYw5-SOR;%qVn+ zjjFjd4@>AaT7}&T8*MgejMBch?@-up8Y&yM=~YxTKqU=0dh4de3cnHWd;uQLjqKo| z@|+z@4(!Z7c(`Ti*MQ2mKeuZh4tBcXMWJ;&2Gn_&o0ok^YKA_omq2UZ3__q)`~iJY zG=#2EG4$7lMa~dw;E>!7fKpEIo$f-5$JT=I8aY*a4{6pz|KLEIBZ1fEQD<_yB-MtE$818W9XaHfXIWKziQp z+du6-eH@)knQER$BAC05|1kN*oAaZ$lFyO=N>!=qem!ohvS{$9ht*=*f?xRH28aEi zD6z!hBz&|0Yu2W9Q3slhK8&P3H=s|iSrO>IXaW|;?~cxoj;EvZ33FN8nalX?$?5sg zs}G}#&+o?5(d6vtc*OkHch~ClqwLtvh+#&|7bdytkPrcwTnEHf+Iad^5 z;e0vk#P5zOs%?>1!-AAh$l)I1N|j(wqO%yV7Rx>@8pve+?fXB7bm(C$__4+9Zietn zDVPDl>p*at%Ptw&C92~bzEU!?zUi`V(p-nEcY`L|tuPK+I0XLf0~Y>Yxb4ag-7t20 zV5bCa3!=+@^JqxlTJfHWeC=jZ69m6*ers)#QXz8Ax?J7XZl6^ZImw2y0B(nY&sSm~ z%75hjst-64vQipGF)G)FkU2~yMs{e{G`^v#!%7$l+XhBz(#(V^#OC0j>I8}6Q7C##LXwq#mI#0v(P!qg6!hm_3rD?Ltw&tWMYFhw`M@(JUAsMa@~?LDeeVho&yv9Gy&}`Re=* z8a9E3O>p$(-}z#-*K`fyJf}0E(%f_p+=@6+f$TUhBXUgoW`a(;MZ!tCUEpL1Qh}7G zOA|~N6ER)PJy4}Ewy_b_!WMT|u3^l<;D$pFEu@$JLdr*nT~}b#aQFg@Pa%K!3MTWf zZ4}?vV2%HXOY8N}(&}qX&4%_qcd~o!jy>+qi--odJ3P$^BJW^j>F05}&9~~dQOh_s z%K>$j#)f#VC`lDQeX2_Pvo$8tFfc4#8+9&? zyep&bg^}ZmB0V2Wn9wf5uI#pD`;3M*Rsfj`2{YkZZ=IkLzpP!&Zrd;new9L}4e$d0WW`XRC;}{pUiJjLI1UpC8-l`h zn&yyqFDY53m{N&b_Y#0K#g7u{h@ukdIL=AOYqtHf^iTJcb*phGt1Bpc9K<7^2JtN_ zOmbi_vRJSF38lpMGu(crue?s#VVwUCWBiA!K^`8x9I6*XLx&Dy98D-FyF1%My?+k- zOUyI4IHf}BU76DkQgLAisU?oKe;l@H;ML-{vE=!;;5X0-HyyYf6u$Gq^wA%EvuL+& z#$CQP@Z`XaM7TNB&o`9P%B^ zhHN)1D?1kseG1~QTI!-y5e4uDrf{dviCeXB)~@4wPn;T=MSDH|_N7h~oak^W?p-{O zDA(R;Zo@U6)_>O1$4U$%GN}kBfdCqUNXCTrI3<|Y3D%S7gq-XJSOTa^0m-xh1e7|_ zPU@PbQ0t@qy?O?n0N!c9x5-Lc!m!F6o~eN-7ZVynDi|}H0J13{?HWmj z(=zo5zEZTkcT`Bi#)hLhAp|8#2y*%~+CNhF&|bPGOokJ*Vrxa`M&K~937GALb4Vd!Dc2ZBBYBLnh6gYb0$g@KMJf$j4^_09A9PvDH8_R zOYb8U6|DX~r6o8N^ylnHMMRHPU50^D5*pMl`UT&8>wnx>l$Q_KT-41T(@b+`{_gX< zDNN=$Oq*JW0J1!XX|q^i?iECeyrfo=RS~Q4WLZ|=$n`*P9KGb{*r=*1Qr+0L8SF#N zj=`j3f#ny5ZWio?ic|e&XjkpOerzw*Zpew)G1;2<`D4rcEtG;Ek<&X?hZd!T|hlbjB4B zpk?7gM;#aHIL_$GO$ec7425!O)n9LNaxT#7d^3J|@+O>yaB)*TMZq>ioNebnJywyb zBHDP~34C`s&Z8JkVq@NqDId&AR87o1< zs0ACwTF^2Y!IrTRJTY3qGh@rhrKgdmg(PiBZZ%nL#kj%>k2~`&@qdsO-jGFu<cK0?3j?rSr)|J`0ib4>VK)1FfT>_d zJaJt@I((5Sl~BMM$20Q^e*M#LmWO0ha}(xRI@ieU#b07ks2zswBGywBYKK|Y-tip1 zj?l&yRJG~09yE7b=)Rlb(p`9mDg`K_)6`3?%`YE3as39-j&tXDYpJ$G5C4;br8B7t z)Vb^VK#iEJiwXKRsMGVAG%Z0VzK_^L80^7X%G6DyyKRtEQoyhsm7F@+U9PUDUj#M5 zvPBsBv97nC9u33dKHZ+6L`TMs6J@L+U1jR#=Ly z5>t_eX5f99Bxs{sXT}t9>3S=QN13lMCt``X=n1V%ifGH!!9%DS?iVVnZuWia$URuy zx~n9QxY?oxi-XO_m<0T#r{RuNC2%C?uL3vxwVS7-t*K+au6iObv?izGxU`&l{`-;a zW3RLALcJz??1e9TWl;DWl^O?~S!xu?&?rZeQ3G)0tu>Ch`)*QXO-3w%HwVsd??RQobYKO@4``IDP z1x$}R$l1Q50&=Kw_cnqc*L0M@)qF`8C;&gPah_L791PUFI){*C8G>CNX!Ck#5%~RC zlW;Lm@7o~P{V*a){Uhu=mu9D7Fnlev0S1Oi-E8Q+_clYvNgP-R-$HhmI@~+aYs-@2 z1N?yV>5(iuw&U*XOM1#(qLUjf>VSS$v%RJXXjoPM*z^I8PS6lgnv(Psp~zDe^x8{| zO?BK&5kj4=ZlRx>^f*4g{mtdov?0tz;`#D6`=S6|B`=#YkTm|R#ty#!So|L{(wWFg z`E$)gRytsbR&}%}So!Ic2GHa_5S9^2oA?a{!ZLZm_=f!+5l9o{<8B~c!0M(_JuYLQs%NNM@AZ;%ybH=;|5@nT#&ptF+m_Z*sQ>iLKwLXkSr3^ex=yi5uP6O*&N#DlZ(n8Lqf zdelSW?=K3s3Da*Q3Xj>428r=8UP-NF9f03w+~=_(Ae;| z6Mp;hdcLi1Y_;jT)h+2wiAI~jZC(C&8K1TOfWF(Frd^Yn4c3s0EBr62{Vi+xvJ0g#>fQX-mBwa;OMlh#{%Oen;7 z6A8W+oe_tGeon3?FdAW~;lwdOjnEq1epZ8uCI)4>a%3X%R6}nD9WEgC%*W{Eye6YI zkc&8$QO3=bY?sha>4C<;mOuP2^vzVsA>o(XD12tF7X*^AT@rvTu7q*jrFHQ@k_?ky z@6j0@L?wNZd6GN{Tl_Zm{jy*Ms7XoWk7c_A8c~f7dvf1>=Q-;N^yx2KRKjY}3rj~J z$??8MFaZvMUJ!s%SN&sABBl+n=4f2R!WeZe3Dt)F3*4DvIFb#`Sci zUH2F4exg;%2(y}cs|texgqC8qCa>{E-nW*2d|D<6G*SvrE=?TACW7$>+mDOi5ze)=gD+%$n*PHBWNS0KN#zqt$YY4REcl9`EFH5K)50ck>*=``C47V+;uO`nXQyrj} zk#jMP!9(p1?5W|nKK(3qh{W?K<>;nt^?d}C?`K75$y0`s&wYtLSKBUgV8Z^e>WACMT70otU+`I1Pqt&x}Yvhd4Jq-F} zaF4`QRw=2gREB)=vkg=#O`ch8(the!GypHUHDx}u97Ys*QfaXYJSkR5IyDhPV1F6 zs8lAkhrL#YSW{FX%G~d))w$y?SEmOmqi%C*^3-u4U2E{Zu6Be_7J#Ptnt@F7HIlo0 zXb;N_52)53sYbJfoq#rga~h$~2SjjP&p+}QB&5uul8_$l&w;F`v~e>>Fel=P+*H3i zw;W0T2-esY5sb=oNvsMJ%#-HIa$P4P+YJnL*qu zYU!?oR}DIZ+4WA|rvU-aifB4J)H@1lPe5(q0$~{;w29wPAS}b= zlDr;*Oi#rKCQA}~ig&l15ll`rGiO(|?*KVqS=Nvxsur?|3R$erOqFH-#e z1YD4bWSZ;X#N;AbsOcnLOpyn?bsxXZZ3GQEH<1Mxf6vN!lQ)qC3aJk`ZMB(XmME-J z`wfuH64Yxte&dk4zmKrL4}YJeOv0N)y}PiBp(Jv5p1Gmwk$HJT1z#C%JK)tV zvKUgp!TN$hu=pQn(C?|k`K8DDl=eJTHl$yadafF>GhPphLIve%{CLG zX@rqM6CqjHJ{~BPIhS90GO=hTE4^D=Ruz!iEiMt8Arow5EfR?qxki%JK(Z>xKm+83 zPn}Ln;wwq)ATH@)Mp(04O#|d#RB*@u;vn>>GT!xomvLm``apITdIWbY5;`YV36nH7 z0jfmu@;er5DQp7MJp* zh0HFy4&o~*@fGABk~tE1rz)NU;B(Xl`XnDAOM&-6|BE&N08u7t7~t`2d0UJ^%y0{j zdd>AU+*4o8O535`Dc;6#j7wCMuilo$hU`Qc|4DgNiAwwHRFIFTrrM#N7p)oIb$Gk7 z_Qs)PRC^O@6f#T#0!TUdNMtsI`g&FGNC%)!<97~(#Aok+{JZP+4<+d12wwX*f~%>u z-|01iDL7r;m-&9*0_jn!>qfA3SD6l=X5@JcD34w5mf5 z%@IuPb~Oa_=2jCeWU*>OvJv~&q#T^otC@7VKd2Dikd}yd>s9s{1YtkI&}BKL+^7yf z>nJm+p(m6zjx8l*mV}KYpO#@OppWQ6x5>Njf4q3T%vQAl{$?QJKI@gK8RVzy_p%i^ z0G)rNRZeHt`1+{98mCpEWb$UIr!?#12ovm9$?&3VVY8n8Jl|cnCh2tN&8gb&^RWkt z4_M~_E;-m@G>duR=`HHW>h=>>u3z6DBP3v2!3MeYhdz_o)IdLf@9)gs=^J)IZcA|> zBHw>9CVoSKL>VR{J3Z9o)GV`YNd#aK_R7F-1b{_&kYUY{0*G86Nv}pRHJ;-Y6{4jO zUIhW5DImv5n=t?^lEFNiSMik9^aDjCHN7lJHVa`ilMjSta%4>Wh60H)Oit{yIYK znj*wmNa>l#+5Uc-0MELbl|a`~-m}30NwEx+BqfhQ@4u4;%+O3{`+GyQT&;UpZh^hN zBUg=8uwLByJtL;xlX}<*7yz=TJ7KJny6i2|Kv*V|yk$lk1FUQ5#nux5y{FPf z_DUjsB$q@QCch?BM+73yuQtE+oxiezg++LsZ$GMHIgpViEm|nOa<)A`$t)p&sQm^= z76FDYdC=+pH}wDl$60^R9$~3bdn7B9%g6&wS|V?4!(pkcZX-WxG9)7F)ddAJ)BO5CRu*-z zk_?6;k!wf#EQ38+Wf^=V`rYdNU2;$8Eq%PYB^!Obx+M!eSslqjPgX~=$V;gry9@{G zyp-_h8OFu98IXr0@nJs71}nTX^|-OS)GJh-C${bYrwAXjce;MHsB>z(IV&WWJ;w>lsYV zFbYJcfJf#En2H!gd6@!2&m!Y#pyg*qDMdfaSyHx=saoIFkzJP*vI4rgQwmx3NR~lE zuuAjaDEkDa2rfd>Om7*~th5-3yr_vMqOSgST?Mkn*~(um!QhJ^{pdOTafsxyOo`2j z-4dH9|IIFRjbvNoVP)C?L}1Yv5R!c3^bb;M23O2#L%xVVYrz|X@w#uBGBFD)gdRbnieD+s)XILqRZKTR)bG^P0^PF1S z$=K!xi^hYF0o74eT7-Pb<2U+r8Gz&LQ1&SNoHT38PPZINrOgkw^qE$lOG=rPd8I0nF0WF@oi0@ZPGlaWG8$WJUimKdYoUB(1>8ZFwYet90#Mxhoq-8Z z?+hFRu@+`$pqqj0&Oj+_O|TA7C6fCKV2P!VmY3avXB)9z-aJI+f5AZl_M9lN&LvuT zMp4_o24?IP>M4#o`&AA*!zSy5kRJUU{b2x7hxKOo|LLTcACQR#H3iW5cA;N)@Eq|V z*do0@)B|u0H_#`!gDm~_G3bBM1^^&pV)lnnu4g@T9zpc#?gXL+WHA&qj5hx|Ov3fi z<6M)6If^&weMH@{OX<=w^}mO9(fLpA=gak+@EGwuLL8z)iOZ_)9jb@J^UvAcA2(G+TtI^@b(#)NEMxAS6D$&2F#TKjiu22;TlUf~z#L2#|HR7=bYgg<{8JJI=M}C?*tADY!Z-2S0Ya$EgmzbaUgcRy`Qo_c4pXlHObrl-$! z)kL$;Ss_RFv_hQUrwpr*GpBJ)OFFb&0l*>*ru6wZNa}T&i-1zv>mctwvk-{L_v3cb zAYaa5#H6g4Omc@Qp<5~lM-NZz{Y3>vB9>7u9uEN1D%-{c?tab!ohQE}ewepcjDpY#fL*PqXFTg#KpEv@{aHYITgBDE$i#WoxP_k@1L+nKwS@0#_< zriPJ04Uqm0Ca$Daz_O*=L)ITwq{P*T)qYP=^Yew{fdd}eS*O>V>^U6{Uf3mdIxRzM zHe7yAZO~RTNoEOZvnMU-+I`PP6#DjeO}S^*#F`E^1|4Cg*Tfp6)uIEC{@4LrWnVjx zl;|7e72=TAXCecUYsjYcK{0!^57$=>kY0A}K=it6Aa+p&OxDZ_h~`LkO7y$*0p`=M z{vK^vF)01V-=D@G|5JVU?^-(0dvA-~H`ywni@-OGF>;lBVQ4p>vQ|1rSWiPPHNWaFX*Ns>+Um$V|e`i0zazdVnZ9p<|Gz1ROw$ zJ5)A34~K!ChXa@`jX-p|CJ@yFwE$|hSsrnbLM$NjOwsy(o3V|=&i`yy*(Fb#X^W~V zMFdPt^70iit-IV4>o)|k>17FJrz=lGL=Uv3@+?9j zFVauHq;2m4><(~SROfa^bu0N$U`7~V>96#cAdw(-MS7DrF$plvzjIRsg?xhqbPDv} zF9sii!T#P_AFy4KQ!Ab)xFQn z?mXlNXk*FU^H`e+eUI~PQH`QjhcI{be$bEq?C55jUlKh;nt@Bo!Fl4(C_^EYHom9e=S6?IuK`=t8w7d0Np+3Lk7C5c z|B}C5(A*2t+ARC%>)I$}BshTRk>JcWGMt+vu#C>Eiw}icM|$KlF!2dZgf8-|Wsr4- zM8v>U-26ZkI-LxUHSl&8{c6WkOz&O(dg@h1;1g+>{IWxN6s979{DM!>>E;9MXJIwi zZD4S0B1mf*qw18kyCai(G$NuwvaLNRaPEGzg#-c@wost?IhnQ*NSY7EP}1B-a?kby z8k^=`Q^v;q^}EH6w9F4e(6?*?VHshx$-JRJScZw(Zbdxy1Mo5?u^LIbAGHo|lzv65 z3gL7=CF^c@cak^+5f%1<@TXtTX@q|O(jPzQi2SNQ78r6HSbsj%jX*DJgvdTMRvyS$ z%?POPMye>{wJSwl*T>5mAbUFBgDo#8vk+3Bl2Q)iMu{eNXF_RK?X?cb80)m_&tH$i ze=|#1HIQy?4 z2g1{`Tn=eW_pe_;9<_m0 z9pTKcKPPWJi1{KkkyRH4>IsXkZD5cJ?+9^9>M6)xwq+V7=XuZ4)l0gkM{<&&{)yF8 zAxLHk>eF}Xy3hgWEXfSO{!m#5_G^++f$X=l-^<5ohz*z%4?EoI;}>TO8VJh>qfO=w z1;R2+&P&R9L~lF(tuO*%nZnqPe?x&p879~tcXC_DW{E;5 z^}GR+qXhM@^5WMu-mG6e4jAe;6l|4EhI(RZ57gE}6Z!l2;pp%EB`r6HuQAYAn3F?Q zfMk)NHbdn$z`ZPeq(jfMn>&H%Nz(?l6yYnK7OLK4rcff+ko`J_cJHAeoxOF|9FButtPTnAIC@jh&)F5R|ZoHKp!cW4OSre)cK+C z6xB=E70pgdnO?Y0HGsge2o+lc+N|bxEOGKzByVZ+`?sjSKnX4Jy&@$BLA&&v> zJid|w)iDslsD#+x(m`D_q-L9oEy?vxl~g3J?2?!zP=ANNK>q2k@PolY_z41#a36*z(D_=U7mmGMm9LpLzKHhaaau>5nZvpS<^Rg!E^CtGV1q8Lztj zs>X^Pda@7A>6x~Hr9mywbQ)6~a3H%|fHj~xfZW5o0!W3q%vVL?nYcER#T!4XzPCqB z9{`ImSf#D(JGe1d`9SPdzN!E-%b<~PFr@H91suZY89JW9UheZi=5n6{GMD>CAbq*7 zX@TtJz9y#Nn#@pFR*g#Z7Q01R5OdwnA?*f@!RmBQRpY?qP9Io8P;=oA{$JE&rj%+@ zBD2gDz#4?>;@>R6;44V_3g8H0uK@bQZp`|EVm1ev+9R1+gbHa6GPQVEi#i~E1+WLX z4V>Z+Wq=u~kjM>WeFd-sSj_D{I5gJ+Cnl>!`nDgk&bx&{IR;?912IGC3&@%V~|dJIR-h9 zbpoiHpz4YBy_bf7zV|Ygk=zm~m@FySNPfRRr@jk;L>{9o*V74LGvuDvGJDqYy-eGF z<(n&&1juk^Jz4AQlEBz-B>COUItI-yXQm|I`*vo>>U&<#Y$vVGZ^pH`Iwdwe%&U3% z6V_KWrA)2z_OmWrsP1)1vr)SI-sH$y{BIYuXJvk&vge1-Z%rOVBiAM?hIuxoht4lf zB6EeOat&oBIlmZICT!82{y{cR#N5}KK=ger*qHlT9f-bXbO6c5vd9oU zmW6kF!^i{K^(mApO+xJ_fBFtN86$o){w?dzeFL=H%&rKUD?n%~M^x+E z;$QZQ`@>JnXJqMZF?U?G6!arISf_MdEE)(6`l(?wstN0n9GSt=p@5A+C9G1Q z5f*70I6%}35EF>nmxnB~;s*ZA;LF3rpcz)DbxZ^i8#00DDYy$nB0B(>DR>XGtF$$s zGV724HRLPFLgWVW)|?C+!ZBemwh^SfI3PLpL_3VkiS{Fio@@kSdy&9KIgGizBP5G- zKmR`OQ~3Mxo7y?-fv)!U$|1tL9r=f@b6Iv8hQaWf*Wd+c>LjOKG6M`Nn1P-(lPhHg z+MJehdwQbZk)=QG*)Zsne9Lj_*p{t7X`WdtI>l1%g6OjIhvH4;vZE#ubp zCL!EU%9M9%u1_v1^*$)M8q#)(;%26$lB*$mBu}=rQ#7#ju1uqnA*C%8k@uy8!&7E! zmDwn<47Z9jL$X7LY|A(9V>EmY`TGRv+1>XcWd*OCqcP9a^GE_eXW_pV-mOVx$QyC$G zF&WuJsmHgu;ycmmo|`E+O|WkZLPn_-@ndXBywvm!*wres7r?$6rJzgGD~Zv44xe7Xc}wIcFLYOJ<)Ca9P%KaHp-)%X+;`n? zOH&!eiWNES)3PCHER|NQKPU5H$!J*T?B~5rz#DS;HX)2L|CR`KmP_$hn`QQqNY_YK zG37M;v)#Bb;OXXH|9EH_#_)OYt7tXs43sr2-W%DVSiiPY2|3V}NHy|dgs%Pj+aEi4 z+<}~rL(}Jn(FarJOVfCf9?5N9dSfIezr2yjIHO2ZhKU>g3S{fRC>DM=REx6@Z?YHI z`pdNkN#{v5hz*6lLi=xwda-hgsOTR6DoPq}FwO)(MdV)w7_Mm8iY>d`&(ARul_epWj5CTvWijzP#%P}pvEPmh;XSJx zU5khYbG-I0q2a=igSaDmy1;NJE%Sc$H98uR7Ua8+WyCDVP#@F)i+?vFNSTizcuEzw8+(msi%2yizY=p;su|9?U445BG>rTpiCtBNoL)c$$ z`Bg#VS~PoP*tKXFZnOk!>A)}A?tgA_9e7*#(SJ`_yBsb`V7HQd=rsp?O8<xH;U^ z#5%mK)#}SAwGMbKvKe@sm_4y}#aC-0?RT#-pkDJ@kZ4}v>FguM z$Lu540_!wwwW7-pla(!z#)$3)eH{ZlTw(uZd&=YGCX(cD|BOjDqKQNqUJlZ&?3gBj zZ3hceI}4Z?Qo=@@)UXgAl*2NlhqmP?MgfUkfozb(703d%Kcqii!t9zr&aC(?)>g1{ zxTs+5!?}gE4`+b2_Q3<}v=dICO}_EzL5>m}B=wpbR=lMM0ilFFEvjH;2EfY}Ru%1u^s>`_S;Ig<0}%8Sr;Hg4{q1yZ@4x+~nQuB;T_CxDn!v@7`S?%R)hwwE z!{Ap*a$w@YO<~$zLS3f+KQrylbbDhsq(K3`9 zI)3cdeEuX~RjqPAIY@z9uGlfiQA-+jY{0gSikeIs`qW-Y1)J2eWs*#7PTDW+&39-} zHJPL+6<=_8cNa_ZPAX{uCAPGg)z_9jB&E!e-i28SONy_sefxW#+B2-}dVh)we@-Z1 zOUP z(|d52X-@nL34ZUPw6F=ZVYb=_ls8FlL3&=BNp)95BW-heU17IMYC z2RZOyHMcxCkT=}eqWnp}YOo=Cx$H(WmOemmcSm!_Gn_sVBH=pIKS!{ghe-^F5W+Ga zk$AR14Mp`;TUD4(zDI=!`DIba_kb>xFMz>7~j^l@u3EHal_o8-6KP07l zzH}{>2M5XF>%!QNSp2`~&>+zvxmCJ>*M;%4LCj-v6wetQ<&VwrfB3eaK+e)z?q#;IJ(7K$sOunL&V2nO#If6b0Y=uV1MO(rT+#SJWz zC{3n*JWW{U9*MxFsa#TjluqJ+wQeSpIyGF;qw0;p$)eEHa8SaYd_w}`F`|DFlJ$)D z+D5IqEz|{?Qh<0gu5b=d!_bn7`4($BI?F~t>b@L%jP6K**S^JJ2)f@MxDglG*cImL zR?$t((AWdl!cv3Bf-<69oOf=~@0^wzyfiK!d+HVx5n%KAbUdE3{63>{BKsG9#uk26+U#=2!M%l&;7$!oZ;#~- z*M#~;U;eXy=xIXA)dFe*N1q|u3?1Ci0kn)E!u+`Tfcv#OA_sNF^?N_+$Q zv-^;Lx6NY>#6n>ad(myZ0m?cYDQ(~WohR<`Vvz)Npl$&6f9LLSKx?39_s}Hp#tyuB zz|hEzF**tCu{nxr`L9!o#aS#wGEl}IUH{LDIFF1-2G-b+Tl_|xU(4QP#eQEOeEF^7 z**Yt=!seEq_M;+fn~eE5YcTYzPqKE;*oCS2L#AYP)+E4RKb`v2pW=?S$!!|=L->+v zDA+`KUCW~mZl<&cg@M9MTVO~-$BA`0Q=fff%RRzf{yV!X$&&1(EsuejP9v>WtJP|? zyILt1v8PS8H8$v#*wr^TE;2UDc)7A+6&U}42y5+DX|=$3HT8J_J4-uXiIKfFebMY= zjPdXGV|;7YTpMOc0NLFoc^Htlaz@O;VBVKIXfQq9rn4;1k2F;xNuR?L=g-`Ba}4>o z&tl*xL)AN#Xd7}}3sFSN6|dzk&;Ah6+1?1ktcQse?#Fk)*;V5dyvcdowk}UrA@Aef zCEQJ!msRZ`-vQ(uhBsiK&daOES(*y4laWOK_)`2XMUe&-@W-D84hpW6S4X2vD8xbkYnf4tck=R%ZcamPHT}9>Ixz;7KTRM4u}VQ&yA&&! z-9F^9bLiof+FYI_U{T=Tg8+i^R#>J?_Q{k%NVg;vPIhp>4Ygy zz(Ha!qWmos5Y;+E?e$p*zVhbAX-Ea64l;_ZsL>1H$-C<909JTP@_i7P*(b5o@n8gT zpDIU;*%j0}7qF#?9M~`!(zhv5W*PXD5QF+BNV3;Ug}!eHlj$!FfDL2B=&OT7@aXtP z5-A`sBQ#-LV1Q2vz6AJ+t%!`3&(#t60L_6Tkt>wQ z{)r+9ZGijMsfYZPi{G2&^Jfpc9lmut;QYMhy%nQk+`6@c?O{NA!K=@wMl8tW;%}`` z(Hbc)@Z@bhHEfahjJs&4(b$Z%sH8Hr%dvE+OB>Pvk%$O&lN!<_(1xB z`C#%ZyJ7E7wwy5s_#pyby!gH|R!N4a_0Q83Z#gKW~3O8Ry2Gb3G%6Q6~Hs>@iKX2y4 zVHrLSBv(YiUWSWWDbZ^~%C>RvieaSN8EegT*7r3qdqQzUz#fpY?Y-dV<%Bx7Pc{Cv6ql_|nSL+($5 zIVBgO4s0|7Qr?*@yg!-&WA&oJ5acq?qyqc<-Ky9CGqn3~{9Bn73R55Uf)gAKA;Whg z)Tb17MTuV^ZStfeqB&WLQsqV=+UhEf**nd=j63##QTn57JFsAxjQ)5q`sL-y6sDtl ztB*nkbQZ7#rJ3D~8`C{H0SXSAC1>bq7;ujr-qp5PSU{F3L~OwIX~mU*`81B zmcIYVbWxyn49oFHXbvC)E5Hv#)Jys}E`pus)=AW=^io#SC%`S% z&cV_rArZ%|iM5Dpi-;JMjU~N5KHe9pl?xkD%Ly9M_87+<5s` zf;x-);4rhM-5K)x1FL&;b3h?1(5|3`+0`PLzcN0|h9;Ja@BYf&g6;OwW&ZQobit-< zXgdV6X&Cuc+xLe+83KXXK3WMb<0Vi;*Y>zhUYEGUz26ghk-1f++Nn{Z?{*I?YzLC0qk}+ zxpNEmn9baDF2rn>!MPaI37p2}kMMrXrgNNmC`vP4*@OhI<4RKlTWzjGtv%0pH~oZa ze)~4leu>>?=)sEnaot9F^ZF_SkAxjINiEpznnk)z4^SZ!E%F z1&!kSK#gkd8``yTz3qMunw&JbjN0tMK5QkM#6V&N!ma0691cNv>mb2Pfrs$1D2H_B zNg`bUIk&Pc_q@PFNF`u+;imgCC*M>CYH4fwkSf#oNcBPlozH8t*$_U?0SmL<4%PzG z39!di1K>mkAao~KN_!0|++?H8Ebb}Vppbea>bi|CTGm_Tb|yyiIYMtvQz}Y_Q@TX5 z%78+~+>;fW2EmO}Imcnv%{DK$-d4bfi1HP3EQ;6TC*MChefjA0i|1e6+%UW!iqT%s zyK%fI4Z=AI7_vJd6ao~bzQKi%WsNB&`s6HQVMupjK;J|da*RK`i=8bCW(%5qs%Kv~ zQ=j|t2Q44mPNM-RJLbo5*YEMJV$daQl2p{N=WPxtZg^udb=P2y(`Y&4CnqbO$t2G< z(ee&IxwGPEmn*zgj+S@%$z5nJ@Q)Wl^;3TG>55;SXHo$2r~J;n72j537cK8ise<2k zc?C_T)*#+ps%&;i0hLcoCxNvSs$C>om~R60kEvdX6v{Iy??j%LS5Uo!)jci7O6TGyR8ig`en=Jc zGVv=as-*t6R5p2>_yJY%k3MJk^Str*RHug%bQ3wA)XgR4+b0IfRGQ;ayky^?gxQz$ z*!sJqg8v^}R#ZkAe$y26e~$2G3;)B*VTM14A{qYr*lYOzk=U>m>_u-IhSyrd5ls3$ zBJBp3%-^stLX^I_5kuZhnT5Pfar;*zWF941Tp9Y7qv$3!tM-C@4yvAupo05#u`HI= zY86ZMId=>_d0}O?fR{;ASChO1*d))^lcG$;%ZoB?KxZdwyZ{mvcoiR>6#$hZRUN6< z9<`66&8ZQMC?`|L$T)yaFP7}ZB|RXJtiC<1emQzYyg(MbHrS~ zMl9|0+*VHpK8}uJzH{4WQ?GL^yyjkX zS<{;x@i}B`>75-^b@cHJx~u4e!4bTv6fA$si51+-z9cUqV6ay7w3oAc44d zCrJsenkW2h?(0V2=?!dvxrsQ*$+8e9;o>Og3zrf>9|{3PAJ+uCdfL*tnwzb-?48yY zGP0ui@OiOGn(evdgQg%4cb18CpqU%cFyjxydEu%&x_O*N6BPcts0;x*RPILhDsmpo zqQcs*aK5IWSf-W}w}rct@X+oYMRO`ArjHGj<1RzIrURHtP*kIt3ZRpCHcvjU<_Vlb zYREawR*pOq@F;H7ScfVg!ixi(`t`px%2{0K_nPP)&NMCEb=r1416-dU`|8S5+9XYl zR(Jdqc_fN8vp^o$I=SxV?4Z^(g>Tb!?kOwC!7%Z`2iQV;DPRs915My#Y(@2RK$I3 zj<3t^L&~o+khzS9=HM_7cn8;s;{$Yu;Q-q)+(Z*tXX{)HtVzcO78hl;8|1KS2C0zr z@@fnRfI)7U8h{!h>^Z2sP`$eLIS2=`1e3F=1a8(GqrWlZhi4IT{{(1rsC}~w5#m&7N$R7RUt1xeG8PGJbWw+_kVYfkV-hG#j4flSn8K;h2o(wO?%?P|NTBz-r4=FM2TDjty+z~iz6cN`RErs%kA1)IZE($!*Q)oYbMwMg@rI>w-V*kzh=G>8Q66M(uY9c->?45LB4}$< zet1@41lIhL%z4FU;Xj(>@g1VDALO|cEcL^b-imt@qsHUhg}rw~_A$hwWBj|u^n(wM zFF6f-h^SgcjA7hvI_(4qT@i&~P-Ip#LV2dXNCGRtV;DV}yfZVkPkURT4S){Ym_q9( z9r0S7IflHnZ?0EugnC4PeO1VhYk;QpmQBCFRBeh;W406>x_X&md+0qdcpy|N*k~!P)9BMiRux!fWU(%S*h4Nw$fSC^=da4Ngts z7yQh5b|#@2f*pLxjqe`a=dA6EBHou?;1A2$M+|8ALL(xz`kqnQNYKYA;NU4`EHjyl znCUDF1BfnSR8?Wp8`J{|VCP?hFnNVBT}B@pp$cbb_(|T63TxmoEBriq_iDi~ZIB09 zJt#^!&?zQ-h=ikVuF|-7CBP<(+RoFgdbdFc^}rBj$J~3QB))Kr0^AR<9Y?Wlny z`^}9`d+l*MyMlwTfYj;BD%m1Wf$*BcNVf-eJ@HOUh4GpwFMz6A`o#KO*g}5-d=~#R H;4A|GFx8L> literal 0 HcmV?d00001 diff --git a/examples/ESP_AsyncFSBrowser/data/worker-javascript.js.gz b/examples/ESP_AsyncFSBrowser/data/worker-javascript.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..9cbfd2049f4dc579c777e291376a775707d0a573 GIT binary patch literal 112558 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

Fc!=jWPu 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 literal 0 HcmV?d00001 diff --git a/examples/ESP_AsyncFSBrowser/data/worker-json.js.gz b/examples/ESP_AsyncFSBrowser/data/worker-json.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..fec1f65b323b3e5e21bf3b6a4945fe7623628312 GIT binary patch literal 6923 zcmV+m8}#HKiwFox=B{4?0C#V4Yh`jRYIARHE^2cCq#9jw8#VB+oNt(N!s^8-Je{k0 z3Ur3f(4o`9Q))UFTTVpJIwQ%X#kv2^>Rb0=Qs_%^TJ86)Rx8OlZ?mJMnN)&pRKA?; zj(nq7%L|H5{yS3z#R{GNszt^L#e(Gd^6r*3wBQ!Xh`QqICEFG1(}A`-0FYesD+*j#7?7RF`MZfecH6!g&48(LhvyZGj-3!Go%XkLi>dsgmi#`S+*?# z;{j@D>5}lWsik_!xAfyLy8`G9t_0l2m*`s1`omHHl0066QiViwfw>+x45TiwM4eNL zcF_h}-Z8#y?`9-F0_Pp$belhVM9XcvIqoS}P75uHf(?HjnV@>!;`&)yZdxwehTh*7 z;hO|MTL)6|T!{Kpc@V8?wS1!+pw~@P)Z)g-lX!uahgParRLc5>7AK8aohDQ>$WFP_ z-p*Cjj#;Vy;T_~rrEmi-t2o}YO(n2Y_2vU0nE#zMinn54H|%fvs@)z_4}yGjf*A0U z`2?8dXr^OtoohmWXqYk+OBd=9M_?qb7Hc#Itoiip!+|ncD8Iie-(6f_V395! z2fRq3SHHizSkLubAnAOz^A3l^js7&TWRR_l2n@bEHjP@j>Q=OO8K-yI3mxAg zziY(@D#|}(=C~Cot2Y~ZP%>+I^C>G1wV+(R+~SOFVNPZtsr6bVBX=7u-0BWGmU}ZN zub8Pd(w7nm-eZax@+~Od8I>Xh6fqRqA8#r z)YlEoRGT$zz0LBu)3qh4V7Sj9BwXuK;_lJ^ z!k6WjuWi^^bOJ0m7p@@O6qs)L@5+EjU1C+E(ynfq1fxY+9}dl@!VKf)Bb>GfHoHR+ zqk&HHj;YP9{@T=%20JRhfi5*T7*z$m9mGsKOXKVk!d@R66}SL@sIVbR6+|kqAPQmH zbunAYdcW1#GtMR*i|;|;Z=#VTwPFVaLi+(k0e6&ALeF3t2T%W&LJ<_hy^)g`iX3X% zMZ>Ny=wFnp_jJ#cq5|sO3q5{ehgeKewCy2Bn5Eo1Z*&3^C9JT9>hyJyLRkMdTk$n) zN4>3Ya?{h8IcD2R#a-F*(E2`1Z*0pk^gLm&RKTLM-2jVC0>Zimvu^3!WZETDu#F3( zaibvgA> zntz4gcYF#lx8jkO+0;_%$gG#q;h?iD1VpGaDT8pmaSLXUe;BG?zjH#TJng>~=y6L0 zQ*w|dpy}~I#e1SKjR`=0x&DK0RJjqfR92zSijEg8G25T)#JLtNxr$o(f=)-=p zZC#3z*6sH0vC@CTRX%3jOe;$ ztk#YNlP~@})=eTIs1-yQ%?KehjvhVoLc$z;yO~I5B|Fjxh}0=Y96A$J`_}B*Q8}+$ z{zf~!%C7QxUrXJl&PNK&^L6(4S-=KC4mScKX6~dzda0UmIUO^Hve#XrnIL4*;S_3A zOo(meg78^WvG7g_`xxmlz4J_#u--_w$!s7_%ixrnnx5=SmzkOLb{BmjSmy21B?m@l|_zS zPDWvYspxgE`~F^g%>2Fd4CM>HJsa_DVe+ z1>2N?XM+&vdQ#D+18Tse5fdPQHr_Z^>KPeJSyVth+($qk;$aaHWcN+}@^z(EA9=km zOt-=O-6i~fG@YSVTU*E-Efygc>hQ2^JSb+?7ZVbz9ny|XP3#;R z3Fx>}l(7%&Eu4Bj4rfxGA$S;?rD+a5OhAj>=|)h>&-8gD z-n#$lFkiQl8Js8qVg4W@NDkeK)zBH>_tSo-==IyTf6?zh4f1->El=(Aa}tB$kis~k zbRC*F+^4}ENKOqHbcxv66AfU!W=|3^g#5pQlqzko*u*i;oXFpAX`||g4|9Gp6W*;L zvVYZL=RW$12C*odGP%=c)^wSkDq$8g=XIN}juNgR!#)Cgb2Kp;rcR?eHRB z=`<{BGoF#0aY=>BfjYtj)#(B-Q7D`nFSyBUf0Qb_rrFn)?(3`-+1D2T>l}ek^*e~n zU{=+9qq{)!Fm!((Sy`08spb|1sEe7h$#;K0Qzp|>73|anfK%Fopi*BqA$N)7I4q3^ z-LguhTTtNO&LVURDraWpMP`y1C6?YZB=O8l^Ot@7yk^r(vt8n<%yN`YQcI*sR=akO zMEYzkT2sqPzpJ5T(awnTvWu=husFz7>q9;x$G&prV#2Doui;uYGvLgS<)~Bk63XNv z8D_iP%2ZMYnHzEs&Ev5V4k!#G~BTr5uO&Jp?YdQ^zM32`cgal zB5TaD@w8^uHeb9;c5Vp%S_-gkx0)850%}xwjSGQyj|Fr<6PoVUJsQ*vuA-)|nLqPd z%DmE$;nfh-^+SDAYtUQO9uDSVs>5=G=@&w^I=gHUA3QhRtE9SXA}7-1UmV7>UGRR{2fAR~NH~h47mk3vc%dE#=HS-7{Z=B)&u)*ThO2Y0KUJwX+{@qyA8DZyh1v zd3#0~dsYXoJhX=b#kU;c--1MH4zuP6Zw}Mu*sKA>db>4M=w~Js;i&v4#&hMRi0SYulOoIa(T;kDz9=Kx_k|@*u(>}nE0r8D+1uWZU5D>^Hp;) zq-g}i%-X@@wswhPDm`x+uVMeLmQEM`Gm9krzzN|AB6t#>);^`1WDJy(@IGyaRqp|p zh^Zq5-`uvJy$1tPnLhg(z{4-cx@CQC1Wo7iS1teH)|`6G(2vS%h?ud|`Jq;-h8~V0 z|Emd3(qECS{JIQh)4`#w8Y6%X{THWDkZHfq2}pWggxevCQ^jEg$z6fQVE zf+{Qf9%uaKjO6}oTG65geP=zaxg6rn3vLar&0TA&Uuh~sa7@`AJ=<>d;{fL3eG?;f z?t0}beL3iner*pfLB;NcF>AVheGG=1P&^40kMuoC3o zq7m*Tz21Zf>yt!rfVr>KXht41cp12gVZ;MV0}Q{s$Tuc%IX<<`wqn@6{1s(7pu#@xvcp!p5AmN;^C;OiGn;iO#^aa6U_}R3v1zNd< z8*U>P_$)4zn~**e92uvU8S=lwf@hh97qEz=3sgBE4M3*=+_4WpWWXu^DFnsLQ%|(l5L$CQ7wvE2j^y3tY6(vLAqE$0 z7Jw$|N1JM-;XCHk&5yMBwj78LXPjE-#zM=<^Jy^V7-yokJ^hVm*LB7WKJ~kw?L(uX9g>IZ`qb$gXhm^rI8GlXs1P2~s88Oy%smEn z`ijjpigGO*i$GpVWPZCA}4Ob5)? zb@jI^N9j19Ga~=tfxzIj#f)VcA5(xrg2>#Y_sm7+L)^9~+-DDQrFgvXs5mv*BjoO& zEgp2&2;^x&K0N53<_AiAzuOuI8cD^vvQeAp3?*u2Vl$|nkOMbfuW2qlekhQ!o?-o{ zXse{cfUIxy0*AHHd0Vpc&zja``n;xAiJQjDFt8-YX>UvxS0R=Vjs>AxF$|)IS#Rt{ z2e)N0AScAceScgcI9}xVuf}$JA1(&!!rOC)<#@nNO}?+qjSNH3Lo!)!1>Ognz^*wJ ze$9g{S?u-A!kv3=i4^F=I^+Rg>o`z(;gAgc zIpFA18ZAn(Pj%sOd$#Q!FrAC@ah=L3wx_7%x-hO>M-@2pTh$|86yqMC?bspF8ibCm>lFK{%8fcixY8UwF>!Q7c zO^@*`@oPF80In?{UlckJQ1OnhdCB;)*y0`R8>oez%OrFB#{WkR*@E@xdoUy^BT1Ym zrKJ<4(scRlf259`DkhQxu*n&z*EI3QD6)}G8#NeDnlMwUp)c%<#%Ikr6`+?i(~;dE zSOJD?{%6kYNwsOCV2dJhmU7`C3F{!%Bg|}bBY0UCfqr)MNH(hr`vN^al4!U#{0CPO zJC1b8YjcUi{P9Q#7)f4Yf1=Bs_=NXjf2j;DF&8Ai8)a-U;JPAJ%t@z^_VdgNAqx7;L{)?iZVmVr>bu3u_Pq zXSom`dWPc-Cw8vqxkx0ti6Grt;?*T~BO@ge*$BRnEM9Ovv>x-lYjiaCZBg5CmlINR z;YQhwzAg(hV)$BR#kBLLShLM~QbtA(F~>9WO~Dm@0sz?|0cvkPKqv~MgY@rxx_;q&jruMaHBKbDQ==FlsSgtF~78v zWo!o-E)9>&szaS2@S^d?dOY6Y^n7@T3e43hZG^U_I!8VVrA3Kj zs?9;crz>{Kut5G=zWikNm`v9mrJ`2I{>H(cY<4%#(WiS61+gKCe)!7)vPPVLv zSz;uWc>_^QCJn15kVF$m!d-o1Ol*I?Q-+D&^2D8qm0J=Km(WhH^ZD?y?9%b_E8#8l z9zE)4)OR%LJFzRmuI?DoVD?M_MInlnD3gbI{+b|pF~veUq+1}6?k@B`d~rbut9bR- zkr@9P*PC?L-CL&^hEw(H>FL~d_oA&{eI*uq&K6p3X!MQffO$`=%C@>~R`>eT>R9X3 z5#`_$Xu(vNPXwPpON&IES0!*<-FO@Y8K7=guc2OREGt5HcxbXm=q30Vkowb;*b|x) z44b7%xf5dbF+dBS$Zlfzwu3?HrEmt$+(l}~Cva>t<^rU9F2I2zrPFkIYJf@;>=%Ih zG+8eV!JdHED^1RU2ENHWNvRP?_XW;NBKJk}yj&$mayR{i?xr{k5t`GoB)-wt`0C=E zy;H?g`JMM`{X!bjR}2Y+39F}x%XzN(nVP_&yDe7&nOdLzz1njMmtUQ{HM#ux>88)w z!`1Z-t_r%oVd_xs`srB~p!@vA^RHrLqz)#6d4z}5_VCTO-=AkeX=X~_8I&HG(hmlu z=eqR0>0EaYRsEa}?7mqnIw8}c4a~)eH_1b4Yi*Tm8imDQQgh{gSq=H@h8yqB%3C?< zwO&dK(YE65V@%b=6i`{PgB&1JMw>TpQ)7Y54{~6ZIk~l<>_zoTG;4{m#MvE%2>ZE% z>~3EQb^BGzTeVuY9Qk;ZA}0*obdrL)7K==Ri}~N>#j$c z2M!O=7W%`pEVF?$w=8~G-9h&iT{tUplZ2+~!dyvfi_OI#i)g&6z>mM52L7Tkvt{To z+mBfetitS|FuU{0>dS6YJY$>jJ_dB%1edxoZOm=Pu}E#@1L($>;~Ku#UHL{~{32`w z>A5B$xp|`;50KNIJe6t!`9yg)JHyI(>jX$%Kz#Rz11;X2nxkSr_oIRJ(4yaw-(ttx z)uNCm#@mxTKpv;9r018rTgjzSxhAv%4H_qaa82o|-Fhmf*Td(`ndHsxlq=i;Bu;vvL|L7VYKbfG1eWd752o!N0lr(yKuWsd)h z8MmOiD6%OktMelJAY*b;RDdw|e43jTQHZB$fJ#8et$N!+z~9W{eFW*?Mx|dxONPoaAp}ld5N|CB7=PwiVH;m+(W02w78;WT zY=j)F@!l3wWmW2M;5&1PF`)3dnvq}Bl2G%r_n0C3GrHM|7OuMpwSDXCy@}}Ii5at- z0;c2ye~c-fxBC99z&W6+2mPgg1`S$MdGCNLqPNx(#>@@iu-h3~Srk3L4P|A9KuiB1 zV8>(iR*zpQJzw#=XiC6Pb)$KuMwcG^HW*~@?4S}aT-Zs9Vb(_MDrbA!;0M>3 zo&1%bL6rTOTCbblq1$N6HY3XVuot{=8BkU%bAnc~nW4^jLodtjo4;!MGEcPfUaMNk z1tXnv^vRn17HH&yKg9h(b_B&ki-Ak}KxCEg>pjJzabvx$xC(hCe51*y zE4nj9pvo34E!44tTI6h;hc{Fxmw=ePBr18rM7ESR>T=~NuV@wU+6sUx{cP0yfxc3g zx$8KK;L6O)(7&g>$ZkKtY%XYSTu`C$5d}v21cnw!U^|Ab;Vp&@gVCvT-QudFEv&i;-gWbBL(EqJU zUbUm^+Kgku$Sf}W@ z;6K|DrX#=Z_^%zbj{xTpx<~*=PbUN%;-sVJq@%R~5Ks$@pss(Z`|k(cA$kVJ!yrp6 ztl$mR$3XV!=?{U-GBSWlqzeXr2N*aRxz1kFJbc{rHj|Jiw`^$gt0U*GR5bIL^%I2U z?mP@*X5r;K!7m^pDt7*YxV(a*lJaF0t*hEPx_bHsH*T6+SXx=zINo)-=j`I@=H>0< z>*pU382*7nXWX>b3RT;O>An^^yp>^HeMLAefrW5B@lOD?)Y zeqf{LWMDjd=`fe3DbsDw<3h5bN4T#fzp7|vJ||~J;JNd#pM_Ug9w$QlCEDL4`_Bm$ z_Ww(=e+u^Ra*YFQ^mO3h(Q^V&;9w{><~;CwE7QWScQi`OlsG_AEviP{^N6A!9A9dR zq6-__EK;ZJwc%_TTo01k7fiT*-urHN+x*iRpY2|X0SQq^u^?=}eqPl0-FL^PBcrqf z@%`NMEiyTXL?;YM>Oq|FjC(3cXQl;koFzS^MN@PCE@?s3SOJ;~?CwD$X%# zuDLXz#Tn(~Q)+Kz>yp&<*49SfOI}fl6Xh%z^o(uPOJAawErU<^@%tQ?$n;iQ_RdE&<7f1-ssvt{S4Lb|vge%Gti3f$RcD;B4NBjiUbRlY>u zUuWos6jQDoyhK6?qqERZBz^F~D^I*hl#-?IKGHXxdRH+P;q2wRY1fq`6rVn#H@iHb zpY+yT#GjJdfg%{LGaO3;q1_9T{zDX|Xn#-`O9Sqpnf*6sO(Lm6ZkdJguZif0ZO9s{{gvr9C0@@jQFSS{ zHa!SBL)TliMrJ?Gad7(Hh|ak!Onty~d!{_z29`iQ?_b}dSQEHbRy2dDO5ZR%P+z-M zpRo8{@}aF9t{^cuf7$N5*^Tq|dTuMl83a^IEcA%~s2P!eNC9!fW<)+%PN%7^(FHYN z_Hhz(gC|D0-^sV(dA|7D$7|zJhdE6DVC4RG?@hIzjZQbc993&E>Sef!uqEK-_c;r=%dQFf>S}r*-2H4~4fL7GD zMY|)FO07xZ?Up$rwS?Xn?@8lrwII|1Je z3Ylu$&2_@m)xE0v|3tiG%QiB-@hr4_aokd%xv ztQwm>49cvnd6eWfkXgSk4RjrPU39Er!u|Be@AUHTI+$G@+2Q!e)#O#cA7zu7jXeup$K0#FbR|~=g$>g@%l9duyzxXg;UpvWoBPGyZCILH>u%GaRz!J=4 zNZgHX@Sy=L>#a~iBIQEgd=NV$MUDk7;9kz3LIYMuA#QaEh;znzbD2ERdDYB9_gtL; zh$b9MxDKT=Azz|6lAhzNt2wxBDaQw@1t)_HvWy%0J#N)i4RpL7k<|@gc&L5p37$}}{4PR5TJ;;|X$E5`1S2PS^iuEa%opPD) z*~%yM>9J!{gfC)Zk^{syyTqPt50E^l%*nYVFRK9$zV>lUPd>#CL&C(|&x0xAr(63M z?|h$S`V=>c8dl?PO*=uX%=5YV6qQ)1RLz!Du}zT zC8&Sy*24#HJL$_Lz9MfT+_)hqu^mII3M$w&V7FR#jv6`ium1h2|d0mb9Kr&fMU~ z-tFavJ1{g5s1?NU_T7=90@37xEV!~{NUwkqTN7e5-77#&l9~0=rJ@-9A@S$dk^OVT z&js3@Cx`CNrF!HntK&Ys2uQ8Zz!=$lf4i$DIba>S%b8V7+{m%gAc4yA)+n4XvVxQs8q_Mt#_{7@Ee6 zK3b!A(SReXIYPDeS`XqrBj(A6J|p74J)T-6pMN$%uk_T3;|FEJvnOC740X$1rrFd# z`8JWgnFc)0G8n~lnX$_XS|M~wY7Xhd$g7&)QIx2-{3$8oj?VljVPVz3i9g(`e~sc) zQXYmhVnrcb^qmi7UvVBxHA!n4&`eRzKBs@pO;*G%lKH7dDH6geJS?y+XkgLQGx>00 z*Y?e{u9Mi#QeIesM3kVzNF2|2W1VaH#8|ys8NTUDcP$O5k$JMsuB!c>Fl$nF%C=2F zCsx>!cUQ%(hOjIvs~K42$%1+JPWP_QX}kIplIRParIukN)}3R6$m0b|H8fztqSCNn zML@BLd&l8q0ku)GS zZ*_Efi@lx(V3TM7(Pzl?kCWK3a_pj@9}PgAr2+Uwvcm2Gy*mw9pMz5DeYmeP$?U+_ z_YY6ffay;tQk_OmFb())0!!ZGpaFdL+T3*A2bpAQXf0}Y145Nftb(EX6xXR#EgH~1 zYN`!9qyhhzf&aA{ka&~(h~@nMe1l#_&D22%wlZ9(W?5tqp%B;mh@vz@?iHX|zL(&| z&f1PiQsi(X?Y4^nwNip-ohC0hdnhoR&&qmmi;-h&l**z>Hn&5Hkj7?ZqHOq9duL4; z{rPYm<@jE9(ge;jDt}mBaMI>8M8UiJF}z4@FIC#=NXO8bOJYBUXh7H`^(*8A)TNi7 zq-)%Va-soGP}O`b@3)rtt`GP$20}UfBek%y*#qB}Ipn1n9=4r5dhCNE3*n_x6F9fR zz!}=i+@wr74y`Vam)3wRp%^i!SSXvqI-|cX&Zsty50>m+_7Yaru-l;2pY-+a`-my-nhNqm zyUt2|yl&F-aQWpcZ#(AerpFVhN3S2e)nK6rkZj4Cnq)0 zmCq@t4t1i!Wj@p=UU9DC1J^UYU5i0Q*6@wcp->Cx%u5tO50Xd&PGM)JpktjgG7)P0 z@Ha>^Qc&5_?*7lD@yWOguG|(XCB|3RFFyGc^h}5ItKZ!R%mBm*)ohHtk4~Isz<5M9 zogtlrtZwI#j<@k1cYrrZld$Ed#0&=WZ?jrYyzYK;SJoh2?m=1J=ecsh1|{l|F&e-) zPI^LyhfHdy9H2F%T(C#n8?C<$Bx8>?~++5KkW1>i?jqg zh{a({&rr<{*qNsg2=!9PH*A$|JC>PpfzY|eI5Qog!CBF_jg81$h$=0SV*D;8*CP=d z?HD=$lcoD`Ei1F1A-U@qi#K#89YQcDPlN!_nfD>`q=i|Ta1> z+EB-ks-qSi7LcUdF!bi4wjAyn|kG>`P zbcP|N2-DX|RqWYAHmBo@mX$actCr}m35~nPd^usKkQ6_u#mJRD!$Mx5vX6t)6i&Hw z5E`OL9kv;5H(|5&4>BQT;{{o1z|k(=VmQ*{cFe4~-<@}Q^J-EErygm6`cbk?H{ zI+jIc-X;G*Q6i1K8C%?$#+<^`Tqo(Y?2?TkOl>{qPr~HAr(%_5Gy!b~M2fHMY4EOp+@gLE3UyNJTh983B0aP9D!ttwkV` z_qekmX}tf)U)AD4grFqpR`c>;5bF(Y3SrW!ZQM z*x{uRCPJoSsZ-It7U39CVB!;AMu?U5yrr^arT*x=F#XPznDZ|W{cmg>k*JxP>Dtb= z^)W~@nw`Q&5FKr;OYBID$$b6lAQ4{L-ZV;9y*BuxX-F6%Tb>Ej#+xTFzt}zWewr7Y zm912I5{fKL?V+k>wU(BXVs|3?-97G?-f$T7W*0Q78=Q@DOX@9h^E+nSKKEU89d&MiO!N2xVwo;xR3FFs_~(UXH0=wrLP) z`ey7X%g?gsEGWyJD4az-LPr>BovB`LMKIx=JD^9Astvn(L_#(LD{1f^(01UEa(>0Rq#8A|{$ah(f}uT-PO~ zUydNuhC?yr09-aMWqpm~qzliu5|?D?&PB&o$}Q07gn?0icok`1uzYNH_V6pQmc*m} zUhNw4iW^IwNvfbV(3T+yG>HQrEtlAeOqjGK+lN~{QF*PU=M=cK$C>*$K zG2LpCE|}%Xb(b|2y)jbELlvH>c`i@nZOLHv^Ky^yO-}8mzZCxd&8|#5l%SUw0eT6f zIazCYzvjbiY!G_fR%-ymalAD9$6MXohtYg#tk#EX9R(|2e0chqd6BOGxJAmNvK+w6 zk*HBMIzq2G02<0uP+hRaN=f z5{}RSyZ3gX=xQ}>5PiB!uqG9G%|Z@Su9I+ta+^_kc8S&;Q52JZ0xJ&@(UiqvJJ#(t zZ>wj4S3Y)Cq~_v9od*Smm()38pfkx3CW`()d?v+(r1hGj zH>k#pgGSb&B7e$9za%LX`_FG2tYbb&i-N}7`HNb7r7Dl~#pas0RpA33!YGw}og_vm zq%s%Hu8+YDN1KEpbQHaj+|lY_3xrNrbuUI&>S@fmr#45-nZBL1e|@}F|EukT-SsdU z@DBAj9u8>}%V-))L;NA%yZ=6QbDt|5W-_@lfS zfI>JZgU*yePB!r(kCGbSAVo&8I7Q;uRI*{><2upjcoSCZ@n%Q1chHR6?uf#kmc5pX zwa1?(MVx*5Kqqk(gk2b^MD!Y%^DtT-pecMa>Z~S%8uS#s{`J-E*sK*f5i%*Jw{^i1 zTN#7s##mR6py}r&<)Wh`OY(znl!9}bJA`+oxNI-yEa?e^A`Ic5AuT*`Y^pk}?hdJU zM=uug+C7Yvr2&Jc_UJY&NhGob8V$uTwL+sL3heydW^pKraH(^ie}ELGN6b7GhEc4G z8};lwl05G%@;JFma9#Bo)&L-)$NZ?QqchXvtUIL;rfn0(@BWVMO8f4wik9wmb~r$Y zSLIl_U8SXd8m9$#?x;SB`r(+x|E=}RBNl2WjNo8$G-MRY6T(bFQF%DpdKs5s7~ZUs zDSrw3;etV@>S5=BtL4GGpQP`mD_o7j{kSUm<)!F=unM|LiE_*jhh1%)O^mP^$s!8Q z@+b- z!j5z%Mz&3{6VXq8Ht_l2rdi#lE-Kl0#LCN@(A<%d=F8c*Oam%qq>ZXSw+mLbp6R}S zJIOcV8%Yox%y~j@8;p0chAKz8L8QmQA}NN1T~ktV!Ajka4z!Pl7p_>ZZ5rWHDwgRo zh8Ll{{^J|HU@N^T5*(`V;HDFllY>Z&3jc1rUz;F|o}}tPu#BXr;wK%tyv+xzU4&!i z2TYwD*_t6=9y(cUhJ;wR=oHUE-a#nG&>hnpDA&70ruLQCAZ&yRv{hXTR~q^FCy20W z$Y#QAJFI?$ispRok=&ZA{$gs|_FDVIE3ZZE0Wh6f2ajP8~tQkhSRFM&}BU2)%~3|t(va8$!oZWVD#h~kbXAt>5SzdwraH5 z2u!6(j5DZ66`qb)e!2eitvja$2N$s3Da-I6RhKnnH;N_pJx|U24cp z8ou=RLz-;@Rf0oBQZ#DD^57uW=W<#bNmq#8X5=+D%~z zSOUQ$9=2twP);U-;de(72Zj6i>~+Y7sSou{EGMz%JWe(-dU@rA4z2F~pb@UK89$wuL`%jWK4m`x4MKkKQWG&56A1M|Za65L* z20=+ry|4UvJwC1G#ZkEgiCDzSPJH}u zSp#+D_3-e|#=1?M^G;K7q1%)Sp>()23Ta+$7`DwuMG~<4PQNX*;o^IXaV-hysyIe92Ml1CvjBXfC z)vE_SA31Cp(y=!6)2?)R&?9s7p&NBmza8uQX+HxGZS8^JEvk`N$6+b&YzC`68}+m= zL1no$1k8R^7~cl7zOc*A-NO*I#Oh~{)Mh(r0KIn_Nn=X5Zwtm{<;G{j`@C55^>;hL zn)sj9s${vit8x7*6BExi4ubP|H3w#`<7tzFTwaal}#?{v8%_q zE;VwT=8)p#7^lHEn+lb1_AYSFDK6kVXvn_`ErSozY z{Sbtg6n}Vh0{@!$WUYNjuB&*eOTDqxzE#3ORqe(lvw>pw&z}s=N?sP>%VCs>R&x%X zRljF%Xfq;H9k26%A;WJs(Z}-)J-~k|_Tuc z3TJfGF=TP8$Jap{jw@q2A6~8W2k~@jiQCjUVq^B?NJhb=E$IVhNfI*w zFJJAp4e*Xy%MWAP7|!3Y*PK3cs@cre@ACsv)5g@!*LiiD4b^OoOYHgGzAGXnj=o%q zUrlx9aSt>cmtAY9qVKCJ$dW2)ZHo26iCu>2Ry$p_U+iDba#ScCjj!-}!4^>bWO?Jw z=hD&4dOsuepVbDL1|z!;l+F@TOQhV3^J7h4yR3_J;p!sdrS+4WIwL>ow>|h*iit9~ zh4}3}yi|~by{HlI0CP3F^r&(2h`x+<8vea8}8P= z7awS=;yhX4g{fR%ul4K*ybBiGciv+c@=?2e<@wDs)UpDeD%Vo3${#U{DU(XMw&)89 zosx!eKZwGE!}YZn41FiY3W|fc{v-1RlTZ!-tykx&7!44MCoE7~RzOEO)sXm4+vLzp zrnBiP2^m9kI9A7(-HkPqtLsqWju%R*df|OtCDp+=__bxU2Q?VvT96>K?(8-VPqrlBc5+$xOS@jq4z2ZH-IZ=iP!(_}W3I z4rWL!RjrUMsYNJBCYA<7=TUjlAU#Kr-ffT`k1jZ$1h2cFp3d`P^<<@a%BpXB#eY5WkPYTBu8q5I!Ny@CyICz^=Acw zaRP$6i-)X2z*wZ~e_nCW2~;B~^8a+bS<1thTu%#T{}{xSDz@nJ!PToPuYOUPNuw7k z`h5z&osXS8b*?S7A<(zz^>mlO&$~4r^sRNTCFK)u+*q+IM`up?RTMyrHf5Z8T)^`Gl=82DO?J`=)-lWw*(`4=Tdiz$lZxau9UiGwG@w>oq;v z|CsMT_ipb65|qpDlbR8Eq$<2~9977cwA>+euFWtg$O-Nkc*8!$@L4vWamw_%PAv9w z^2DwV52A#eX5!zZPIwACF27eD4{y$le4?8uUyo&(7}sW|w)Z9fWLtUgHuPm;7yPRK zy}hZM&f^m{I)-X(S5jW!zKl1fq_{5muY|ZtOj1-t*L-dvRi9)#8}nS|@-;S=HM1EH ze7Mm*-mUM3|4{O?$(4W&``G~Z@j9B}%rlg3kqWcpBDN)Ia{Wxv^*ei$F0`vlqH!x=ZaaHjl=T7GPPqpE5p@xa@WUq;`K8J{+2tA zNBT?G4O8=dbGkFK{3pH0;}VPe6u&vm#BER1v{3k|_tX;s$|sK+1vBH|Sf+{b)^a;| z6E|6XH$v?~q4pg+!M6IE`T<6=KJWD8nk_v2-u-|#b7e&ADW+C*TnPV=k3IZ)Q)(;9 z9mZ?08>=vxkm~I9Qb=gxj|%lT8sJiEUlmzf%PJ9&TqCS%qyE-;_^Dk{UusR(gsm9D z98;f2N~^2)>c`b_y|{gY^TeiGNqNCsxs$|lN($`rdOvKw9(u&y?ewXkY8Of5q>_${ z#r^|6MC}XfJKt4sF&95E90HU-eQlrqxXxwepGnqzPoRwK=VUn_edWi{q1@Bh(7|~! z&N}Q-2cC2E%qKb^JfUjGX%s20A+$U$7V}e3k6;ojIX<#I*&S;&^C4pYn2E)mk=$b@ zHD!4Qf9N}DbA~oGU_E~yeIDIYR33~ z9~3mGFEmEW){XSK+Vtu=yW70zF8nZUo-wxgil1{H^9L}u6Do9&`NLavx zi6{ZwAkz=lBwYHIc>_;9uXvwnbv85DxMS>||BKEuFhwUxo@RzeIzgFpJ|-MBu`1eL z9w#5_Gbo9_wYb(P372&KA(oO*cuG_G%&|XqWMUw^YD$n+EXPuM6NKOqT@bNu?D7s?Mp|Dh1bAZoE!PIhh9fQuVJd7> z#ZK(qvsP;fDt2zP5R~mu{#xMT@^oBZep<35ZLgpty?8P)t^Y(x9#CMMbNY4Zpc&$I zhMN222S+EqyxoGau^bd0{n%zb%$vX3$Wkk_*Qj<_tY75At@x9c@8Sn0D$E`%%RUHP zyYCElRBhMbdQZ@e_V5n2>ALS@q~crip(fRxboWNYjW8X}Ez!pCtE5mz-1=hynMX)l zAKCF`n~_FGe7%`~VX3GtwbwT2;5kD#1M%97kB{~2j2^rnghG{CGHctj4b5ss8_rL0 zWwq5cj>aJtE~$4$A?%yOKUv%mUhYejKFfJ9G?B02a5b%0a+A+k|7O9L#sl*KH|hRS zdnae7(upTIbw0Y04-_1GjB6zhrc!<&F6(U6?Rv-02DpCCGh5myru5E~M+9cH8Lq?z zpKh7LmEg$QU#h-qI(xuR&(#0Oxu=)M`1~f{?etrR^$!*M*Ejp+&=DE-9jXgKJb0Ox z?ALzgM$%_~ertV8F#WYKGfxX;2xIr1t{QoBe{1@fRn03LZ`Spi8l8U1^(KdmQgJ=& zDzACnoq$|KLS&#j`~-UdSFES3>Eihg zP6%KB)SjTRdD=R< z0yF@P*@n&Pt`>mUM7!8N8yEru|Jp*p-89YDppK9zFgS#|yuv54kbFIkEvZC2XJ8u{ zY^k(047d(4FqSJs316_3W75SAUJcX{M%cJt<}PIyI#8R!tf{J z4{r{{APjbF9R>^uP{`MY6QAWIee8k_hR=zoJaknaUk`GSTA%+L%Jb)r@~EeFL6j$Y z3PgEOYgp16h;BJVQgrM_smL2-P`0kq&XhmYGN@tV2cYem~@6Cjn}fD``9m zYPY}4m#V3YHVk3+gqBFhpWZ+Y5fxG=bQ$xeS0M>#!a6oyi|RV^51wQws_P&$cf1i! z1@}&&h~prbSWG=94F^?!;b0JC3v@nsx;g9?r{#Ji4LI|k6jb+L<>a8AIc-P-G-^6AU ziUOqCM;{?IeY{lp(p}5e=2CRj4KHN~qi=xW{9gz5yo2n$BJ1mgyC63y7f7tBN`6tr zyR9@J2?_$J(7PvdSKm$^y

(-c^| zJS}70yCy7q>Y=7s907VHSj`elyRg)+i6kUP3&ey6OaRNlO+)3~nG)k51goC}t~nZT z2u6vXLA80{P4@k0z#}MC??C4_rl5c74lC`FM?EX51+G5|Giu{3xM2eu4PBb10wB(O zZd;HFp(jKRwxdWAV6d_HTUV41;Ea9zoMRU(WP+386S&r?!XT)NBGH2rI&sM3&%EaS zsk4=hDa(!7d(_3AKwWUjIZgBW!`n}bR)K|=Qn)c;Di3x0;FW+d6hRie_&hKAMZIip z#$BV;;@&g&KCJk|TD|Y)S$M_zRnMob!Ix*&`Qri2D&L(6lRY9-$bm~_x1_Qy z$mkdEOr%p2%T}&bILHv)1*WYEk4!h5%E_3{9Q|2qt17om|0m7-2Wqav;<@fZr@?JB z8DJs96NC!>dk%3~)eM@#9f?cqOpNjk;T!N!fE(GGvhQ5QR$T0SxLgn;5%ve-ZQJ1v z&(PFIsB`cU=xykpnnxsbhYxnZyS*?!#WRPws8BrMWfmtQvM%=4sJP4?Gqkl~!v8*; z^I2c($j$H0%I)M*RReuh4aBLOoZ#LugY&uA7beSnf5}`6|AXac3cXJQNTOlXVF=Gz z;ypBenxyM-`m3tyd(pwBv6EBQh=hE-C&q#d50BE#zS!fST;?zbF{}*Gec{0MO-Y3f zo|NkxJ1Tgg6-PXgVBNxLq}(%BfEco&n9PM-B=kmm224rtJZbg1;`KClXr?TyuD?rR zQ@2&#^7}MlPTi6k;{X<;9+PRn28gNrb|DB$x1) zzz3ZFbG<;5GTbd~egkVfR^J zBt{eJA5i>pqVoYAmU0y2TofrI8;}fEZvF2x7PrBw&C@>+;f6$^#oE}T+2!#4uFyjJ zuXX8)FO@%DNPM>CKD_?_Ew<;K_p?tfNg31#?U)%(zQLsYNbg^6n#D5WrUhdFG(LnwWNB zze=CWI_6-_BgX_^o|sQ6A}Y0=7Relz%pdibZzQW+PO^=>W3H6M%42t^?NHnC&=;29 zKuh-9ko;wgPJ}4qY!puE-SP1wE2xa`>;`UhP;+Yi(ML%GjUooGk868W>m!0-(@Q-P zfmjKooOW;z=+d-?QHurOAd*b5G(h;5v;FgxQ4h-11aP2V7J!EP=CAMw`rmQzbEbdca`2lw$lm;+^&R{Nc9eNK%67Hm&pN?0NiLHhSN@MES z;ypc_JqiS2vi5Or?Z5PHl&!AO3x|HguJF8h5pL1g*_8w3>{<4=@Vit_-im5CnWg%a% zC(aTQBh{e!(_M^lei<1yv7gK{uS}T9$CX_yPHB6Q-f{Rl8g!PRGE~xsU$HG1WF0Gvf~G)80?JUl{DV#k1x=+p zxAiuL0!CfGa{zivUE*=-6BHx3b)FAO@l7N>QPZR(gQlPl)#idr+}ndv4(TqL^XwIa z)$}}4GziXO!JR$pv1qEQ?q9eeviOJZoudJvAa)$p-wN5>K#>>{2i{6-TK<(%Fr>|7 zpNGN+rZ{%sM*ndr9^7xap$l3N5Dwp;Gf;pB8=}20CNiu26;qRNNBr=q`p8A?O zkY6*fdQZp6_ts~FwKIrwz7IVyo3mFJ9ODonJk#vrv%&a7jUjO zGvvo(8idm(D(jcZ?d#EA;0qahd;2cGmp}GEPr>L)15$g2psSotpap3}4#Esk%{HjH zO&<<2gEeYV1|~ncqss)wXo=wBb(q~dN0Lc|&gFK{fYC7;uyhT4)o5R9?jO-FMFKHY@Mfu2puIG4ygH-*Z2iECVw-Q@?XL3f%vDNNw?#}{y?Lp|9*jxPt7LB2t_!%? zBt~NFrLCWik$m-kyfYPuh<@#pa>bVae&vM)xmn0JxW;KqRK1_|#uc`4g{;a59 z5X@0l`26nX>mvMlsP85Hf)lkOCyEsDsgwF;&Js0QKP+{vppNw`I zjY)R(O_eS{-0PpTeLm4WZyH~=+@}CdZ66xY@8Mtpq76b{Ob&w3 z)RbO$1Ze0z9@Btw3=P=AgnS0Oq+Cb6Y}V$!PWLa3={eHHRPo1i}%YB~)r9~LM{972iST&JjX&zKxATS7?J z-B6Td-QT{$G);B?wF8cAnMmy7p+qW6B&a7O7~vhQB!N1-V%|yR763yhVbi}}vh2HQ zO0985ZSh-zbu<%7>wzI|eILjJv%Oc~a{Vtz!;LC^K7DW)j8>adX~0Dq0KV8keRLkQ zwQo=xV!c?xicBbUOT-R^(<}mGNo~mQ7lIkJAuIR%z&te#MYu}?zCizv(uX&i8GCCT zoY3?Qa1Xo;8_7try4c)1Y#wptC!zU0&z)HLvbXK}f{&QkbRHN5Zu6wMi}tMC@P3Pb z`&rh)btu(HBVOrV{5y(Ba$k|a(1V+K=j&e=HOr6mCh($ literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/2.PNG b/examples/SmartSwitch/2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6c02cabc7a16ade2e4e4e7003a4aa9ec145b9eaf GIT binary patch literal 12835 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 literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/3.PNG b/examples/SmartSwitch/3.PNG new file mode 100644 index 0000000000000000000000000000000000000000..258c51cc9f14df2753a0a4e82cb97681b53d81d8 GIT binary patch literal 26824 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 literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/ESPAsyncWiFiManager.cpp b/examples/SmartSwitch/ESPAsyncWiFiManager.cpp new file mode 100644 index 0000000..4455258 --- /dev/null +++ b/examples/SmartSwitch/ESPAsyncWiFiManager.cpp @@ -0,0 +1,1177 @@ +/************************************************************** + AsyncWiFiManager is a library for the ESP8266/Arduino platform + (https://github.com/esp8266/Arduino) to enable easy + configuration and reconfiguration of WiFi credentials using a Captive Portal + inspired by: + http://www.esp8266.com/viewtopic.php?f=29&t=2520 + https://github.com/chriscook8/esp-arduino-apboot + https://github.com/esp8266/Arduino/tree/esp8266/hardware/esp8266com/esp8266/libraries/DNSServer/examples/CaptivePortalAdvanced + Built by AlexT https://github.com/tzapu + Ported to Async Web Server by https://github.com/alanswx + Licensed under MIT license + **************************************************************/ + +#include "ESPAsyncWiFiManager.h" + +AsyncWiFiManagerParameter::AsyncWiFiManagerParameter(const char *custom) { + _id = NULL; + _placeholder = NULL; + _length = 0; + _value = NULL; + + _customHTML = custom; +} + +AsyncWiFiManagerParameter::AsyncWiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length) { + init(id, placeholder, defaultValue, length, ""); +} + +AsyncWiFiManagerParameter::AsyncWiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom) { + init(id, placeholder, defaultValue, length, custom); +} + +void AsyncWiFiManagerParameter::init(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom) { + _id = id; + _placeholder = placeholder; + _length = length; + _value = new char[length + 1]; + for (int i = 0; i < length; i++) { + _value[i] = 0; + } + if (defaultValue != NULL) { + strncpy(_value, defaultValue, length); + } + + _customHTML = custom; +} + +const char* AsyncWiFiManagerParameter::getValue() { + return _value; +} +const char* AsyncWiFiManagerParameter::getID() { + return _id; +} +const char* AsyncWiFiManagerParameter::getPlaceholder() { + return _placeholder; +} +int AsyncWiFiManagerParameter::getValueLength() { + return _length; +} +const char* AsyncWiFiManagerParameter::getCustomHTML() { + return _customHTML; +} + +#ifdef USE_EADNS +AsyncWiFiManager::AsyncWiFiManager(AsyncWebServer *server, AsyncDNSServer *dns) :server(server), dnsServer(dns) { +#else +AsyncWiFiManager::AsyncWiFiManager(AsyncWebServer *server, DNSServer *dns) :server(server), dnsServer(dns) { +#endif + wifiSSIDs = NULL; + wifiSSIDscan=true; + _modeless=false; + shouldscan=true; +} + +void AsyncWiFiManager::addParameter(AsyncWiFiManagerParameter *p) { + _params[_paramsCount] = p; + _paramsCount++; + DEBUG_WM("Adding parameter"); + DEBUG_WM(p->getID()); +} + +void AsyncWiFiManager::setupConfigPortal() { + // dnsServer.reset(new DNSServer()); + // server.reset(new ESP8266WebServer(80)); + server->reset(); + + DEBUG_WM(F("")); + _configPortalStart = millis(); + + DEBUG_WM(F("Configuring access point... ")); + DEBUG_WM(_apName); + if (_apPassword != NULL) { + if (strlen(_apPassword) < 8 || strlen(_apPassword) > 63) { + // fail passphrase to short or long! + DEBUG_WM(F("Invalid AccessPoint password. Ignoring")); + _apPassword = NULL; + } + DEBUG_WM(_apPassword); + } + + //optional soft ip config + if (_ap_static_ip) { + DEBUG_WM(F("Custom AP IP/GW/Subnet")); + WiFi.softAPConfig(_ap_static_ip, _ap_static_gw, _ap_static_sn); + } + + if (_apPassword != NULL) { + WiFi.softAP(_apName, _apPassword);//password option + } else { + WiFi.softAP(_apName); + } + + delay(500); // Without delay I've seen the IP address blank + DEBUG_WM(F("AP IP address: ")); + DEBUG_WM(WiFi.softAPIP()); + + /* Setup the DNS server redirecting all the domains to the apIP */ + #ifdef USE_EADNS + dnsServer->setErrorReplyCode(AsyncDNSReplyCode::NoError); + #else + dnsServer->setErrorReplyCode(DNSReplyCode::NoError); + #endif + dnsServer->start(DNS_PORT, "*", WiFi.softAPIP()); + + setInfo(); + + /* Setup web pages: root, wifi config pages, SO captive portal detectors and not found. */ + server->on("/", std::bind(&AsyncWiFiManager::handleRoot, this,std::placeholders::_1)).setFilter(ON_AP_FILTER); + server->on("/wifi", std::bind(&AsyncWiFiManager::handleWifi, this, std::placeholders::_1,true)).setFilter(ON_AP_FILTER); + server->on("/0wifi", std::bind(&AsyncWiFiManager::handleWifi, this,std::placeholders::_1, false)).setFilter(ON_AP_FILTER); + server->on("/wifisave", std::bind(&AsyncWiFiManager::handleWifiSave,this,std::placeholders::_1)).setFilter(ON_AP_FILTER); + server->on("/i", std::bind(&AsyncWiFiManager::handleInfo,this, std::placeholders::_1)).setFilter(ON_AP_FILTER); + server->on("/r", std::bind(&AsyncWiFiManager::handleReset, this,std::placeholders::_1)).setFilter(ON_AP_FILTER); + //server->on("/generate_204", std::bind(&AsyncWiFiManager::handle204, this)); //Android/Chrome OS captive portal check. + server->on("/fwlink", std::bind(&AsyncWiFiManager::handleRoot, this,std::placeholders::_1)).setFilter(ON_AP_FILTER); //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler. + server->onNotFound (std::bind(&AsyncWiFiManager::handleNotFound,this,std::placeholders::_1)); + server->begin(); // Web server start + DEBUG_WM(F("HTTP server started")); + +} + +static const char HEX_CHAR_ARRAY[17] = "0123456789ABCDEF"; +/** +* convert char array (hex values) to readable string by seperator +* buf: buffer to convert +* length: data length +* strSeperator seperator between each hex value +* return: formated value as String +*/ +static String byteToHexString(uint8_t* buf, uint8_t length, String strSeperator="-") { + String dataString = ""; + for (uint8_t i = 0; i < length; i++) { + byte v = buf[i] / 16; + byte w = buf[i] % 16; + if (i>0) { + dataString += strSeperator; + } + dataString += String(HEX_CHAR_ARRAY[v]); + dataString += String(HEX_CHAR_ARRAY[w]); + } + dataString.toUpperCase(); + return dataString; +} // byteToHexString + +#if !defined(ESP8266) +String getESP32ChipID() { + uint64_t chipid; + chipid=ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes). + int chipid_size = 6; + uint8_t chipid_arr[chipid_size]; + for (uint8_t i=0; i < chipid_size; i++) { + chipid_arr[i] = (chipid >> (8 * i)) & 0xff; + } + return byteToHexString(chipid_arr, chipid_size, ""); +} +#endif + +boolean AsyncWiFiManager::autoConnect(unsigned long maxConnectRetries, unsigned long retryDelayMs) { + String ssid = "ESP"; + #if defined(ESP8266) + ssid += String(ESP.getChipId()); + #else + ssid += getESP32ChipID(); + #endif + return autoConnect(ssid.c_str(), NULL); +} + +boolean AsyncWiFiManager::autoConnect(char const *apName, char const *apPassword, unsigned long maxConnectRetries, unsigned long retryDelayMs) { + DEBUG_WM(F("")); + + // read eeprom for ssid and pass + //String ssid = getSSID(); + //String pass = getPassword(); + + // attempt to connect; should it fail, fall back to AP + WiFi.mode(WIFI_STA); + + for(unsigned long tryNumber = 0; tryNumber < maxConnectRetries; tryNumber++) { + DEBUG_WM(F("AutoConnect Try No.:")); + DEBUG_WM(tryNumber); + + if (connectWifi("", "") == WL_CONNECTED) { + DEBUG_WM(F("IP Address:")); + DEBUG_WM(WiFi.localIP()); + //connected + return true; + } + + if(tryNumber + 1 < maxConnectRetries) { + + // we might connect during the delay + unsigned long restDelayMs = retryDelayMs; + while(restDelayMs != 0) { + if(WiFi.status() == WL_CONNECTED) { + DEBUG_WM(F("IP Address (connected during delay):")); + DEBUG_WM(WiFi.localIP()); + return true; + } + unsigned long thisDelay = std::min(restDelayMs, 100ul); + delay(thisDelay); + restDelayMs -= thisDelay; + } + + } + } + + + return startConfigPortal(apName, apPassword); +} + + +String AsyncWiFiManager::networkListAsString() +{ + String pager ; + //display networks in page + for (int i = 0; i < wifiSSIDCount; i++) { + if (wifiSSIDs[i].duplicate == true) continue; // skip dups + int quality = getRSSIasQuality(wifiSSIDs[i].RSSI); + + if (_minimumQuality == -1 || _minimumQuality < quality) { + String item = FPSTR(HTTP_ITEM); + String rssiQ; + rssiQ += quality; + item.replace("{v}", wifiSSIDs[i].SSID); + item.replace("{r}", rssiQ); +#if defined(ESP8266) + if (wifiSSIDs[i].encryptionType != ENC_TYPE_NONE) { +#else + if (wifiSSIDs[i].encryptionType != WIFI_AUTH_OPEN) { +#endif + item.replace("{i}", "l"); + } else { + item.replace("{i}", ""); + } + pager += item; + + } else { + DEBUG_WM(F("Skipping due to quality")); + } + + } + return pager; +} + +String AsyncWiFiManager::scanModal() +{ + shouldscan=true; + scan(); + String pager=networkListAsString(); + return pager; +} + +void AsyncWiFiManager::scan() +{ + if (!shouldscan) return; + DEBUG_WM(F("About to scan()")); + if (wifiSSIDscan) + { + delay(100); + } + + if (wifiSSIDscan) + { + wifi_ssid_count_t n = WiFi.scanNetworks(); + DEBUG_WM(F("Scan done")); + if(n == WIFI_SCAN_FAILED) { + DEBUG_WM(F("scanNetworks returned: WIFI_SCAN_FAILED!")); + } else if(n == WIFI_SCAN_RUNNING) { + DEBUG_WM(F("scanNetworks returned: WIFI_SCAN_RUNNING!")); + } else if(n < 0) { + DEBUG_WM(F("scanNetworks failed with unknown error code!")); + } else if (n == 0) { + DEBUG_WM(F("No networks found")); + // page += F("No networks found. Refresh to scan again."); + } else { + + + if (wifiSSIDscan) + { + /* WE SHOULD MOVE THIS IN PLACE ATOMICALLY */ + if (wifiSSIDs) delete [] wifiSSIDs; + wifiSSIDs = new WiFiResult[n]; + wifiSSIDCount = n; + + if (n>0) + shouldscan=false; + + for (wifi_ssid_count_t i=0;i wifiSSIDs[i].RSSI) { + std::swap(wifiSSIDs[i], wifiSSIDs[j]); + } + } + } + + + // remove duplicates ( must be RSSI sorted ) + if (_removeDuplicateAPs) { + String cssid; + for (int i = 0; i < n; i++) { + if (wifiSSIDs[i].duplicate == true) continue; + cssid = wifiSSIDs[i].SSID; + for (int j = i + 1; j < n; j++) { + if (cssid == wifiSSIDs[j].SSID) { + DEBUG_WM("DUP AP: " +wifiSSIDs[j].SSID); + wifiSSIDs[j].duplicate=true; // set dup aps to NULL + } + } + } + } + + } + } + } +} + + +void AsyncWiFiManager::startConfigPortalModeless(char const *apName, char const *apPassword) { + + _modeless =true; + _apName = apName; + _apPassword = apPassword; + + /* + AJS - do we want this? + + */ + + //setup AP + WiFi.mode(WIFI_AP_STA); + DEBUG_WM("SET AP STA"); + + // try to connect + if (connectWifi("", "") == WL_CONNECTED) { + DEBUG_WM(F("IP Address:")); + DEBUG_WM(WiFi.localIP()); + //connected + // call the callback! + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + } + + + + //notify we entered AP mode + if ( _apcallback != NULL) { + _apcallback(this); + } + + connect = false; + setupConfigPortal(); + scannow= -1 ; + +} + +void AsyncWiFiManager::loop(){ + safeLoop(); + criticalLoop(); +} + +void AsyncWiFiManager::setInfo() { + if (needInfo) { + pager = infoAsString(); + wifiStatus = WiFi.status(); + needInfo = false; + } +} + +/** + * Anything that accesses WiFi, ESP or EEPROM goes here + */ +void AsyncWiFiManager::criticalLoop(){ + if (_modeless) + { + + if ( scannow==-1 || millis() > scannow + 60000) + { + scan(); + scannow= millis() ; + } + if (connect) { + connect = false; + //delay(2000); + DEBUG_WM(F("Connecting to new AP")); + + // using user-provided _ssid, _pass in place of system-stored ssid and pass + if (connectWifi(_ssid, _pass) != WL_CONNECTED) { + DEBUG_WM(F("Failed to connect.")); + } else { + //connected + // alanswx - should we have a config to decide if we should shut down AP? + // WiFi.mode(WIFI_STA); + //notify that configuration has changed and any optional parameters should be saved + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + + return; + } + + if (_shouldBreakAfterConfig) { + //flag set to exit after config after trying to connect + //notify that configuration has changed and any optional parameters should be saved + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + } + } + } +} + +/* + * Anything that doesn't access WiFi, ESP or EEPROM can go here + */ +void AsyncWiFiManager::safeLoop(){ + #ifndef USE_EADNS + dnsServer->processNextRequest(); + #endif +} + +boolean AsyncWiFiManager::startConfigPortal(char const *apName, char const *apPassword) { + //setup AP + WiFi.mode(WIFI_AP_STA); + DEBUG_WM("SET AP STA"); + + _apName = apName; + _apPassword = apPassword; + + //notify we entered AP mode + if ( _apcallback != NULL) { + _apcallback(this); + } + + connect = false; + setupConfigPortal(); + scannow= -1 ; + while (_configPortalTimeout == 0 || millis() < _configPortalStart + _configPortalTimeout) { + //DNS + #ifndef USE_EADNS + dnsServer->processNextRequest(); + #endif + + // + // we should do a scan every so often here and + // try to reconnect to AP while we are at it + // + if ( scannow == -1 || millis() > scannow + 10000) + { + DEBUG_WM(F("About to scan()")); + shouldscan=true; // since we are modal, we can scan every time + #if defined(ESP8266) + // we might still be connecting, so that has to stop for scanning + ETS_UART_INTR_DISABLE (); + wifi_station_disconnect (); + ETS_UART_INTR_ENABLE (); + #else + WiFi.disconnect (false); + #endif + scan(); + if(_tryConnectDuringConfigPortal) WiFi.begin(); // try to reconnect to AP + scannow= millis() ; + } + + // attempts to reconnect were successful + if(WiFi.status() == WL_CONNECTED) { + //connected + WiFi.mode(WIFI_STA); + //notify that configuration has changed and any optional parameters should be saved + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + break; + } + + + if (connect) { + connect = false; + delay(2000); + DEBUG_WM(F("Connecting to new AP")); + + // using user-provided _ssid, _pass in place of system-stored ssid and pass + if (connectWifi(_ssid, _pass) == WL_CONNECTED) { + //connected + WiFi.mode(WIFI_STA); + //notify that configuration has changed and any optional parameters should be saved + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + break; + } else { + DEBUG_WM(F("Failed to connect.")); + } + + if (_shouldBreakAfterConfig) { + //flag set to exit after config after trying to connect + //notify that configuration has changed and any optional parameters should be saved + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + break; + } + } + yield(); + } + + server->reset(); + #ifdef USE_EADNS + *dnsServer=AsyncDNSServer(); + #else + *dnsServer=DNSServer(); + #endif + + return WiFi.status() == WL_CONNECTED; +} + + +int AsyncWiFiManager::connectWifi(String ssid, String pass) { + DEBUG_WM(F("Connecting as wifi client...")); + + // check if we've got static_ip settings, if we do, use those. + if (_sta_static_ip) { + DEBUG_WM(F("Custom STA IP/GW/Subnet/DNS")); + WiFi.config(_sta_static_ip, _sta_static_gw, _sta_static_sn, _sta_static_dns1, _sta_static_dns2); + DEBUG_WM(WiFi.localIP()); + } + //fix for auto connect racing issue + // if (WiFi.status() == WL_CONNECTED) { + // DEBUG_WM("Already connected. Bailing out."); + // return WL_CONNECTED; + // } + //check if we have ssid and pass and force those, if not, try with last saved values + if (ssid != "") { + #if defined(ESP8266) + //trying to fix connection in progress hanging + ETS_UART_INTR_DISABLE(); + wifi_station_disconnect(); + ETS_UART_INTR_ENABLE(); + #else + WiFi.disconnect(false); + #endif + + WiFi.begin(ssid.c_str(), pass.c_str()); + } else { + + if (WiFi.SSID().length() > 0) { + DEBUG_WM("Using last saved values, should be faster"); +#if defined(ESP8266) + //trying to fix connection in progress hanging + ETS_UART_INTR_DISABLE(); + wifi_station_disconnect(); + ETS_UART_INTR_ENABLE(); +#else + WiFi.disconnect(false); +#endif + + WiFi.begin(); + } else { + DEBUG_WM("Try to connect with saved credentials"); + WiFi.begin(); + } + } + + int connRes = waitForConnectResult(); + DEBUG_WM ("Connection result: "); + DEBUG_WM ( connRes ); + //not connected, WPS enabled, no pass - first attempt +#ifdef NO_EXTRA_4K_HEAP + if (_tryWPS && connRes != WL_CONNECTED && pass == "") { + startWPS(); + //should be connected at the end of WPS + connRes = waitForConnectResult(); + } +#endif + needInfo = true; + setInfo(); + return connRes; +} + +uint8_t AsyncWiFiManager::waitForConnectResult() { + if (_connectTimeout == 0) { + return WiFi.waitForConnectResult(); + } else { + DEBUG_WM (F("Waiting for connection result with time out")); + unsigned long start = millis(); + boolean keepConnecting = true; + uint8_t status; + while (keepConnecting) { + status = WiFi.status(); + if (millis() > start + _connectTimeout) { + keepConnecting = false; + DEBUG_WM (F("Connection timed out")); + } + if (status == WL_CONNECTED || status == WL_CONNECT_FAILED) { + keepConnecting = false; + } + delay(100); + } + return status; + } +} +#ifdef NO_EXTRA_4K_HEAP +void AsyncWiFiManager::startWPS() { + DEBUG_WM("START WPS"); +#if defined(ESP8266) + WiFi.beginWPSConfig(); +#else + //esp_wps_config_t config = WPS_CONFIG_INIT_DEFAULT(ESP_WPS_MODE); + esp_wps_config_t config = {}; + config.wps_type = ESP_WPS_MODE; + config.crypto_funcs = &g_wifi_default_wps_crypto_funcs; + strcpy(config.factory_info.manufacturer,"ESPRESSIF"); + strcpy(config.factory_info.model_number, "ESP32"); + strcpy(config.factory_info.model_name, "ESPRESSIF IOT"); + strcpy(config.factory_info.device_name,"ESP STATION"); + + esp_wifi_wps_enable(&config); + esp_wifi_wps_start(0); +#endif + DEBUG_WM("END WPS"); + +} +#endif +/* +String AsyncWiFiManager::getSSID() { +if (_ssid == "") { +DEBUG_WM(F("Reading SSID")); +_ssid = WiFi.SSID(); +DEBUG_WM(F("SSID: ")); +DEBUG_WM(_ssid); +} +return _ssid; +} + +String AsyncWiFiManager::getPassword() { +if (_pass == "") { +DEBUG_WM(F("Reading Password")); +_pass = WiFi.psk(); +DEBUG_WM("Password: " + _pass); +//DEBUG_WM(_pass); +} +return _pass; +} +*/ +String AsyncWiFiManager::getConfigPortalSSID() { + return _apName; +} + +void AsyncWiFiManager::resetSettings() { + DEBUG_WM(F("settings invalidated")); + DEBUG_WM(F("THIS MAY CAUSE AP NOT TO START UP PROPERLY. YOU NEED TO COMMENT IT OUT AFTER ERASING THE DATA.")); + WiFi.disconnect(true); + //delay(200); +} +void AsyncWiFiManager::setTimeout(unsigned long seconds) { + setConfigPortalTimeout(seconds); +} + +void AsyncWiFiManager::setConfigPortalTimeout(unsigned long seconds) { + _configPortalTimeout = seconds * 1000; +} + +void AsyncWiFiManager::setConnectTimeout(unsigned long seconds) { + _connectTimeout = seconds * 1000; +} + +void AsyncWiFiManager::setTryConnectDuringConfigPortal(boolean v) { + _tryConnectDuringConfigPortal = v; +} + +void AsyncWiFiManager::setDebugOutput(boolean debug) { + _debug = debug; +} + +void AsyncWiFiManager::setAPStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn) { + _ap_static_ip = ip; + _ap_static_gw = gw; + _ap_static_sn = sn; +} + +void AsyncWiFiManager::setSTAStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn, IPAddress dns1, IPAddress dns2) { + _sta_static_ip = ip; + _sta_static_gw = gw; + _sta_static_sn = sn; + _sta_static_dns1 = dns1; + _sta_static_dns2 = dns2; +} + +void AsyncWiFiManager::setMinimumSignalQuality(int quality) { + _minimumQuality = quality; +} + +void AsyncWiFiManager::setBreakAfterConfig(boolean shouldBreak) { + _shouldBreakAfterConfig = shouldBreak; +} + +/** Handle root or redirect to captive portal */ +void AsyncWiFiManager::handleRoot(AsyncWebServerRequest *request) { + // AJS - maybe we should set a scan when we get to the root??? + // and only scan on demand? timer + on demand? plus a link to make it happen? + shouldscan=true; + scannow= -1 ; + DEBUG_WM(F("Handle root")); + if (captivePortal(request)) { // If captive portal redirect instead of displaying the page. + return; + } + + String page = FPSTR(WFM_HTTP_HEAD); + page.replace("{v}", "Options"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + page += "

"; + page += _apName; + page += "

"; + page += F("

AsyncWiFiManager

"); + page += FPSTR(HTTP_PORTAL_OPTIONS); + page += _customOptionsElement; + page += FPSTR(HTTP_END); + + request->send(200, "text/html", page); + +} + +/** Wifi config page handler */ +void AsyncWiFiManager::handleWifi(AsyncWebServerRequest *request,boolean scan) { + shouldscan=true; + scannow= -1 ; + + DEBUG_WM(F("Handle wifi")); + + String page = FPSTR(WFM_HTTP_HEAD); + page.replace("{v}", "Config ESP"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + + if (scan) { + wifiSSIDscan=false; + + + + DEBUG_WM(F("Scan done")); + if (wifiSSIDCount==0) { + DEBUG_WM(F("No networks found")); + page += F("No networks found. Refresh to scan again."); + } else { + + + //display networks in page + String pager = networkListAsString(); + + page += pager; + page += "
"; + } + + } + wifiSSIDscan=true; + + page += FPSTR(HTTP_FORM_START); + char parLength[2]; + // add the extra parameters to the form + for (int i = 0; i < _paramsCount; i++) { + if (_params[i] == NULL) { + break; + } + + String pitem = FPSTR(HTTP_FORM_PARAM); + if (_params[i]->getID() != NULL) { + pitem.replace("{i}", _params[i]->getID()); + pitem.replace("{n}", _params[i]->getID()); + pitem.replace("{p}", _params[i]->getPlaceholder()); + snprintf(parLength, 2, "%d", _params[i]->getValueLength()); + pitem.replace("{l}", parLength); + pitem.replace("{v}", _params[i]->getValue()); + pitem.replace("{c}", _params[i]->getCustomHTML()); + } else { + pitem = _params[i]->getCustomHTML(); + } + + page += pitem; + } + if (_params[0] != NULL) { + page += "
"; + } + + if (_sta_static_ip) { + + String item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "ip"); + item.replace("{n}", "ip"); + item.replace("{p}", "Static IP"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_ip.toString()); + + page += item; + + item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "gw"); + item.replace("{n}", "gw"); + item.replace("{p}", "Static Gateway"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_gw.toString()); + + page += item; + + item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "sn"); + item.replace("{n}", "sn"); + item.replace("{p}", "Subnet"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_sn.toString()); + + page += item; + + item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "dns1"); + item.replace("{n}", "dns1"); + item.replace("{p}", "DNS1"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_dns1.toString()); + + page += item; + + item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "dns2"); + item.replace("{n}", "dns2"); + item.replace("{p}", "DNS2"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_dns2.toString()); + + page += item; + + page += "
"; + } + + page += FPSTR(HTTP_FORM_END); + page += FPSTR(HTTP_SCAN_LINK); + + page += FPSTR(HTTP_END); + + request->send(200, "text/html", page); + + + DEBUG_WM(F("Sent config page")); +} + +/** Handle the WLAN save form and redirect to WLAN config page again */ +void AsyncWiFiManager::handleWifiSave(AsyncWebServerRequest *request) { + DEBUG_WM(F("WiFi save")); + + //SAVE/connect here + needInfo = true; + _ssid = request->arg("s").c_str(); + _pass = request->arg("p").c_str(); + + //parameters + for (int i = 0; i < _paramsCount; i++) { + if (_params[i] == NULL) { + break; + } + //read parameter + String value = request->arg(_params[i]->getID()).c_str(); + //store it in array + value.toCharArray(_params[i]->_value, _params[i]->_length); + DEBUG_WM(F("Parameter")); + DEBUG_WM(_params[i]->getID()); + DEBUG_WM(value); + } + + if (request->hasArg("ip")) { + DEBUG_WM(F("static ip")); + DEBUG_WM(request->arg("ip")); + //_sta_static_ip.fromString(request->arg("ip")); + String ip = request->arg("ip"); + optionalIPFromString(&_sta_static_ip, ip.c_str()); + } + if (request->hasArg("gw")) { + DEBUG_WM(F("static gateway")); + DEBUG_WM(request->arg("gw")); + String gw = request->arg("gw"); + optionalIPFromString(&_sta_static_gw, gw.c_str()); + } + if (request->hasArg("sn")) { + DEBUG_WM(F("static netmask")); + DEBUG_WM(request->arg("sn")); + String sn = request->arg("sn"); + optionalIPFromString(&_sta_static_sn, sn.c_str()); + } + if (request->hasArg("dns1")) { + DEBUG_WM(F("static DNS 1")); + DEBUG_WM(request->arg("dns1")); + String dns1 = request->arg("dns1"); + optionalIPFromString(&_sta_static_dns1, dns1.c_str()); + } + if (request->hasArg("dns2")) { + DEBUG_WM(F("static DNS 2")); + DEBUG_WM(request->arg("dns2")); + String dns2 = request->arg("dns2"); + optionalIPFromString(&_sta_static_dns2, dns2.c_str()); + } + + String page = FPSTR(WFM_HTTP_HEAD); + page.replace("{v}", "Credentials Saved"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += F(""); + page += FPSTR(HTTP_HEAD_END); + page += FPSTR(HTTP_SAVED); + page += FPSTR(HTTP_END); + + request->send(200, "text/html", page); + + DEBUG_WM(F("Sent wifi save page")); + + connect = true; //signal ready to connect/reset +} + +/** Handle the info page */ +String AsyncWiFiManager::infoAsString() +{ + String page; + page += F("
Chip ID
"); +#if defined(ESP8266) + page += ESP.getChipId(); +#else + page += getESP32ChipID(); +#endif + page += F("
"); + page += F("
Flash Chip ID
"); +#if defined(ESP8266) + page += ESP.getFlashChipId(); +#else + page += F("N/A for ESP32"); +#endif + page += F("
"); + page += F("
IDE Flash Size
"); + page += ESP.getFlashChipSize(); + page += F(" bytes
"); + page += F("
Real Flash Size
"); +#if defined(ESP8266) + page += ESP.getFlashChipRealSize(); +#else + page += F("N/A for ESP32"); +#endif + page += F(" bytes
"); + page += F("
Soft AP IP
"); + page += WiFi.softAPIP().toString(); + page += F("
"); + page += F("
Soft AP MAC
"); + page += WiFi.softAPmacAddress(); + page += F("
"); + page += F("
Station SSID
"); + page += WiFi.SSID(); + page += F("
"); + page += F("
Station IP
"); + page += WiFi.localIP().toString(); + page += F("
"); + page += F("
Station MAC
"); + page += WiFi.macAddress(); + page += F("
"); + page += F(""); + return page; +} + +void AsyncWiFiManager::handleInfo(AsyncWebServerRequest *request) { + DEBUG_WM(F("Info")); + + String page = FPSTR(WFM_HTTP_HEAD); + page.replace("{v}", "Info"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + if (connect==true) + page += F(""); + page += FPSTR(HTTP_HEAD_END); + page += F("
"); + if (connect==true) + { + page += F("
Trying to connect
"); + page += wifiStatus; + page += F("
"); + } + + page +=pager; + page += FPSTR(HTTP_END); + + request->send(200, "text/html", page); + + DEBUG_WM(F("Sent info page")); +} + +/** Handle the reset page */ +void AsyncWiFiManager::handleReset(AsyncWebServerRequest *request) { + DEBUG_WM(F("Reset")); + + String page = FPSTR(WFM_HTTP_HEAD); + page.replace("{v}", "Info"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + page += F("Module will reset in a few seconds."); + page += FPSTR(HTTP_END); + request->send(200, "text/html", page); + + DEBUG_WM(F("Sent reset page")); + delay(5000); + #if defined(ESP8266) + ESP.reset(); + #else + ESP.restart(); + #endif + delay(2000); +} + + + +//removed as mentioned here https://github.com/tzapu/AsyncWiFiManager/issues/114 +/*void AsyncWiFiManager::handle204(AsyncWebServerRequest *request) { +DEBUG_WM(F("204 No Response")); +request->sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); +request->sendHeader("Pragma", "no-cache"); +request->sendHeader("Expires", "-1"); +request->send ( 204, "text/plain", ""); + +}*/ + +void AsyncWiFiManager::handleNotFound(AsyncWebServerRequest *request) { + DEBUG_WM(F("Handle not found")); + if (captivePortal(request)) { // If captive portal redirect instead of displaying the error page. + return; + } + String message = "File Not Found\n\n"; + message += "URI: "; + message += request->url(); + message += "\nMethod: "; + message += ( request->method() == HTTP_GET ) ? "GET" : "POST"; + message += "\nArguments: "; + message += request->args(); + message += "\n"; + + for ( uint8_t i = 0; i < request->args(); i++ ) { + message += " " + request->argName ( i ) + ": " + request->arg ( i ) + "\n"; + } + AsyncWebServerResponse *response = request->beginResponse(404,"text/plain",message); + response->addHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response->addHeader("Pragma", "no-cache"); + response->addHeader("Expires", "-1"); + request->send (response ); +} + + +/** Redirect to captive portal if we got a request for another domain. Return true in that case so the page handler do not try to handle the request again. */ +boolean AsyncWiFiManager::captivePortal(AsyncWebServerRequest *request) { + if (!isIp(request->host()) ) { + DEBUG_WM(F("Request redirected to captive portal")); + AsyncWebServerResponse *response = request->beginResponse(302,"text/plain",""); + response->addHeader("Location", String("http://") + toStringIp(request->client()->localIP())); + request->send ( response); + return true; + } + return false; +} + +//start up config portal callback +void AsyncWiFiManager::setAPCallback( void (*func)(AsyncWiFiManager* myAsyncWiFiManager) ) { + _apcallback = func; +} + +//start up save config callback +void AsyncWiFiManager::setSaveConfigCallback( void (*func)(void) ) { + _savecallback = func; +} + +//sets a custom element to add to head, like a new style tag +void AsyncWiFiManager::setCustomHeadElement(const char* element) { + _customHeadElement = element; +} + +//sets a custom element to add to options page +void AsyncWiFiManager::setCustomOptionsElement(const char* element) { + _customOptionsElement = element; +} + +//if this is true, remove duplicated Access Points - defaut true +void AsyncWiFiManager::setRemoveDuplicateAPs(boolean removeDuplicates) { + _removeDuplicateAPs = removeDuplicates; +} + + + +template +void AsyncWiFiManager::DEBUG_WM(Generic text) { + if (_debug) { + Serial.print("*WM: "); + Serial.println(text); + } +} + +int AsyncWiFiManager::getRSSIasQuality(int RSSI) { + int quality = 0; + + if (RSSI <= -100) { + quality = 0; + } else if (RSSI >= -50) { + quality = 100; + } else { + quality = 2 * (RSSI + 100); + } + return quality; +} + +/** Is this an IP? */ +boolean AsyncWiFiManager::isIp(String str) { + for (int i = 0; i < str.length(); i++) { + int c = str.charAt(i); + if (c != '.' && (c < '0' || c > '9')) { + return false; + } + } + return true; +} + +/** IP to String? */ +String AsyncWiFiManager::toStringIp(IPAddress ip) { + String res = ""; + for (int i = 0; i < 3; i++) { + res += String((ip >> (8 * i)) & 0xFF) + "."; + } + res += String(((ip >> 8 * 3)) & 0xFF); + return res; +} diff --git a/examples/SmartSwitch/ESPAsyncWiFiManager.h b/examples/SmartSwitch/ESPAsyncWiFiManager.h new file mode 100644 index 0000000..deecf4f --- /dev/null +++ b/examples/SmartSwitch/ESPAsyncWiFiManager.h @@ -0,0 +1,283 @@ +/************************************************************** + WiFiManager is a library for the ESP8266/Arduino platform + (https://github.com/esp8266/Arduino) to enable easy + configuration and reconfiguration of WiFi credentials using a Captive Portal + inspired by: + http://www.esp8266.com/viewtopic.php?f=29&t=2520 + https://github.com/chriscook8/esp-arduino-apboot + https://github.com/esp8266/Arduino/tree/esp8266/hardware/esp8266com/esp8266/libraries/DNSServer/examples/CaptivePortalAdvanced + Built by AlexT https://github.com/tzapu + Ported to Async Web Server by https://github.com/alanswx + Licensed under MIT license + **************************************************************/ + +#ifndef ESPAsyncWiFiManager_h +#define ESPAsyncWiFiManager_h + +#if defined(ESP8266) +#include //https://github.com/esp8266/Arduino +#else +#include +#include "esp_wps.h" +#define ESP_WPS_MODE WPS_TYPE_PBC +#endif +#include + +//#define USE_EADNS //Uncomment to use ESPAsyncDNSServer +#ifdef USE_EADNS +#include //https://github.com/devyte/ESPAsyncDNSServer + //https://github.com/me-no-dev/ESPAsyncUDP +#else +#include +#endif +#include + +// fix crash on ESP32 (see https://github.com/alanswx/ESPAsyncWiFiManager/issues/44) +#if defined(ESP8266) +typedef int wifi_ssid_count_t; +#else +typedef int16_t wifi_ssid_count_t; +#endif + +#if defined(ESP8266) +extern "C" { + #include "user_interface.h" +} +#else +#if __has_include() +#include +#else +#include +#endif +#endif + +const char WFM_HTTP_HEAD[] PROGMEM = "{v}"; +const char HTTP_STYLE[] PROGMEM = ""; +const char HTTP_SCRIPT[] PROGMEM = ""; +const char HTTP_HEAD_END[] PROGMEM = "
"; +const char HTTP_PORTAL_OPTIONS[] PROGMEM = "



"; +const char HTTP_ITEM[] PROGMEM = "
{v} {r}%
"; +const char HTTP_FORM_START[] PROGMEM = "


"; +const char HTTP_FORM_PARAM[] PROGMEM = "
"; +const char HTTP_FORM_END[] PROGMEM = "
"; +const char HTTP_SCAN_LINK[] PROGMEM = "
"; +const char HTTP_SAVED[] PROGMEM = "
Credentials Saved
Trying to connect ESP to network.
If it fails reconnect to AP to try again
"; +const char HTTP_END[] PROGMEM = "
"; + +#define WIFI_MANAGER_MAX_PARAMS 10 + +class AsyncWiFiManagerParameter { +public: + AsyncWiFiManagerParameter(const char *custom); + AsyncWiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length); + AsyncWiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom); + + const char *getID(); + const char *getValue(); + const char *getPlaceholder(); + int getValueLength(); + const char *getCustomHTML(); +private: + const char *_id; + const char *_placeholder; + char *_value; + int _length; + const char *_customHTML; + + void init(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom); + + friend class AsyncWiFiManager; +}; + + +class WiFiResult +{ +public: + bool duplicate; + String SSID; + uint8_t encryptionType; + int32_t RSSI; + uint8_t* BSSID; + int32_t channel; + bool isHidden; + + WiFiResult() + { + } + + +}; + +class AsyncWiFiManager +{ +public: + #ifdef USE_EADNS + AsyncWiFiManager(AsyncWebServer * server, AsyncDNSServer *dns); + #else + AsyncWiFiManager(AsyncWebServer * server, DNSServer *dns); + #endif + + void scan(); + String scanModal(); + void loop(); + void safeLoop(); + void criticalLoop(); + String infoAsString(); + + boolean autoConnect(unsigned long maxConnectRetries = 1, unsigned long retryDelayMs = 1000); + boolean autoConnect(char const *apName, char const *apPassword = NULL, unsigned long maxConnectRetries = 1, unsigned long retryDelayMs = 1000); + + //if you want to always start the config portal, without trying to connect first + boolean startConfigPortal(char const *apName, char const *apPassword = NULL); + void startConfigPortalModeless(char const *apName, char const *apPassword); + + // get the AP name of the config portal, so it can be used in the callback + String getConfigPortalSSID(); + + void resetSettings(); + + //sets timeout before webserver loop ends and exits even if there has been no setup. + //usefully for devices that failed to connect at some point and got stuck in a webserver loop + //in seconds setConfigPortalTimeout is a new name for setTimeout + void setConfigPortalTimeout(unsigned long seconds); + void setTimeout(unsigned long seconds); + + //sets timeout for which to attempt connecting, usefull if you get a lot of failed connects + void setConnectTimeout(unsigned long seconds); + + //wether or not the wifi manager tries to connect to configured access point even when + //configuration portal (ESP as access point) is running [default true/on] + void setTryConnectDuringConfigPortal(boolean v); + + + void setDebugOutput(boolean debug); + //defaults to not showing anything under 8% signal quality if called + void setMinimumSignalQuality(int quality = 8); + //sets a custom ip /gateway /subnet configuration + void setAPStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn); + //sets config for a static IP + void setSTAStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn, IPAddress dns1=(uint32_t)0x00000000, IPAddress dns2=(uint32_t)0x00000000); + //called when AP mode and config portal is started + void setAPCallback( void (*func)(AsyncWiFiManager*) ); + //called when settings have been changed and connection was successful + void setSaveConfigCallback( void (*func)(void) ); + //adds a custom parameter + void addParameter(AsyncWiFiManagerParameter *p); + //if this is set, it will exit after config, even if connection is unsucessful. + void setBreakAfterConfig(boolean shouldBreak); + //if this is set, try WPS setup when starting (this will delay config portal for up to 2 mins) + //TODO + //if this is set, customise style + void setCustomHeadElement(const char* element); + //if this is true, remove duplicated Access Points - defaut true + void setRemoveDuplicateAPs(boolean removeDuplicates); + //sets a custom element to add to options page + void setCustomOptionsElement(const char* element); + +private: + AsyncWebServer *server; + #ifdef USE_EADNS + AsyncDNSServer *dnsServer; + #else + DNSServer *dnsServer; + #endif + + + boolean _modeless; + int scannow; + int shouldscan; + boolean needInfo = true; + + //const int WM_DONE = 0; + //const int WM_WAIT = 10; + + //const String HTTP_HEAD = "{v}"; + + void setupConfigPortal(); +#ifdef NO_EXTRA_4K_HEAP + void startWPS(); +#endif + String pager; + wl_status_t wifiStatus; + const char* _apName = "no-net"; + const char* _apPassword = NULL; + String _ssid = ""; + String _pass = ""; + unsigned long _configPortalTimeout = 0; + unsigned long _connectTimeout = 0; + unsigned long _configPortalStart = 0; + + IPAddress _ap_static_ip; + IPAddress _ap_static_gw; + IPAddress _ap_static_sn; + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + IPAddress _sta_static_dns1= (uint32_t)0x00000000; + IPAddress _sta_static_dns2= (uint32_t)0x00000000; + + int _paramsCount = 0; + int _minimumQuality = -1; + boolean _removeDuplicateAPs = true; + boolean _shouldBreakAfterConfig = false; +#ifdef NO_EXTRA_4K_HEAP + boolean _tryWPS = false; +#endif + const char* _customHeadElement = ""; + const char* _customOptionsElement = ""; + + //String getEEPROMString(int start, int len); + //void setEEPROMString(int start, int len, String string); + + int status = WL_IDLE_STATUS; + int connectWifi(String ssid, String pass); + uint8_t waitForConnectResult(); + void setInfo(); + + String networkListAsString(); + + void handleRoot(AsyncWebServerRequest *); + void handleWifi(AsyncWebServerRequest*,boolean scan); + void handleWifiSave(AsyncWebServerRequest*); + void handleInfo(AsyncWebServerRequest*); + void handleReset(AsyncWebServerRequest*); + void handleNotFound(AsyncWebServerRequest*); + void handle204(AsyncWebServerRequest*); + boolean captivePortal(AsyncWebServerRequest*); + + // DNS server + const byte DNS_PORT = 53; + + //helpers + int getRSSIasQuality(int RSSI); + boolean isIp(String str); + String toStringIp(IPAddress ip); + + boolean connect; + boolean _debug = true; + + WiFiResult *wifiSSIDs; + wifi_ssid_count_t wifiSSIDCount; + boolean wifiSSIDscan; + + boolean _tryConnectDuringConfigPortal = true; + + void (*_apcallback)(AsyncWiFiManager*) = NULL; + void (*_savecallback)(void) = NULL; + + AsyncWiFiManagerParameter* _params[WIFI_MANAGER_MAX_PARAMS]; + + template + void DEBUG_WM(Generic text); + + template + auto optionalIPFromString(T *obj, const char *s) -> decltype( obj->fromString(s) ) { + return obj->fromString(s); + } + auto optionalIPFromString(...) -> bool { + DEBUG_WM("NO fromString METHOD ON IPAddress, you need ESP8266 core 2.1.0 or newer for Custom IP configuration to work."); + return false; + } +}; + +#endif diff --git a/examples/SmartSwitch/PinOut_Notes.txt b/examples/SmartSwitch/PinOut_Notes.txt new file mode 100644 index 0000000..a55977a --- /dev/null +++ b/examples/SmartSwitch/PinOut_Notes.txt @@ -0,0 +1,56 @@ +This application: +D2 = 4; // DHT DATA I/O +D3 = 0; // BUTTON - most modules have it populated on PCB +D4 = 2; // LED (RELAY) - most modules have it populated, on ESP32 is with reversed logic levels + + + +Pinout ESP12 (8266) +D GPIO In Out Notes + +D0 16 no interrupt no PWM or I2C support HIGH at boot used to wake up from deep sleep +D1 5 OK OK often used as SCL (I2C) +D2 4 OK OK often used as SDA (I2C) +D3 0 PU OK pulled up connected to FLASH button, boot fails if pulled LOW +D4 2 PU OK pulled up HIGH at boot connected to on-board LED, boot fails if pulled LOW +D5 14 OK OK SPI (SCLK) +D6 12 OK OK SPI (MISO) +D7 13 OK OK SPI (MOSI) +D8 15 pulled to GND OK SPI (CS) Boot fails if pulled HIGH +RX 3 OK RX pin HIGH at boot +TX 1 TX pin OK HIGH at boot debug output at boot, boot fails if pulled LOW +A0 ADC0 Analog Input + + +Pinout ESP32 +IO In Out Notes + +0 PU OK pulled-up input, outputs PWM signal at boot +1 TX OK debug output at boot +2 OK OK connected to on-board LED +3 OK RX HIGH at boot +4 OK OK +5 OK OK outputs PWM signal at boot + +6-11 x x connected to the integrated SPI flash + +12 OK OK boot fail if pulled high +13 OK OK +14 OK OK outputs PWM signal at boot +15 OK OK outputs PWM signal at boot +16 OK OK +17 OK OK +18 OK OK +19 OK OK +21 OK OK +22 OK OK +23 OK OK +25 OK OK +26 OK OK +27 OK OK +32 OK OK +33 OK OK +34 OK input only +35 OK input only +36 OK input only +39 OK input only \ No newline at end of file diff --git a/examples/SmartSwitch/README.md b/examples/SmartSwitch/README.md new file mode 100644 index 0000000..ffafef7 --- /dev/null +++ b/examples/SmartSwitch/README.md @@ -0,0 +1,19 @@ + + +## SmartSwitch +- Remote Temperature Control application with schedule + (example: car block heater or car battery charger for winter) +- Based on [ESP_AsyncFSBrowser](https://github.com/lorol/ESPAsyncWebServer/tree/master/examples/ESP_AsyncFSBrowser) example that uses embedded ACE editor +- Wide browser compatibility, no extra server-side needed +- HTTP server and WebSocket on same port +- Standalone, no JS dependencies for the browser from Internet +- [Ace Editor](https://github.com/ajaxorg/ace) embedded to source but also - editable, upgradeable see [extras folder](https://github.com/lorol/ESPAsyncWebServer/tree/master/extras) +- Added [ESPAsyncWiFiManager](https://github.com/alanswx/ESPAsyncWiFiManager) and fallback AP mode after timeout +- Real Time (NTP) w/ Time Zones. Sync from browser time if in AP mode +- Memorized settings to EEPROM +- Multiple clients can be connected at same time, they see each other' requests +- Authentication variants including [Cookie-based](https://github.com/me-no-dev/ESPAsyncWebServer/pull/684) idea +- Used [this Xtea implementation](https://github.com/franksmicro/Arduino/tree/master/libraries/Xtea) for getting a fancier Cookie token +- Default credentials **smart : switch** or only **switch** as password +- OTA included +- Use the latest ESP8266 ESP32 cores from GitHub \ No newline at end of file diff --git a/examples/SmartSwitch/SmartSwitch.ino b/examples/SmartSwitch/SmartSwitch.ino new file mode 100644 index 0000000..658942f --- /dev/null +++ b/examples/SmartSwitch/SmartSwitch.ino @@ -0,0 +1,750 @@ +/* +SmartSwitch application +Based on ESP_AsyncFSBrowser +Temperature Control for heater with schedule +Main purpose - for winter outside car block heater or battery charger +Wide browser compatibility, no other server-side needed. +HTTP server and WebSocket, single port +Standalone, no JS dependencies for the browser from Internet (I hope) +Based on ESP_AsyncFSBrowser +Real Time (NTP) w/ Time Zones +Memorized settings to EEPROM +Multiple clients can be connected at same time, they see each other requests +Use latest ESP core lib (from Github) +*/ + +// Defaulut is SPIFFS, FatFS: only on ESP32 +// Comment 2 lines below or uncomment only one of them + +#define USE_LittleFS +//#define USE_FatFS // select partition scheme w/ ffat! + + +#define USE_WFM // to use ESPAsyncWiFiManager +//#define DEL_WFM // delete Wifi credentials stored + //(use once then comment and flash again), also HTTP /erase-wifi can do the same live + +// AUTH COOKIE uses only the password and unsigned long MY_SECRET_NUMBER + +#define http_username "smart" +#define http_password "switch" + +#define MY_SECRET_NUMBER 0xA217B02F + +//See https://github.com/me-no-dev/ESPAsyncWebServer/pull/684 +//SSWI or other 4 chars +#define USE_AUTH_COOKIE +#define MY_COOKIE_DEL "SSWI=;Max-Age=-1;Path=/;" +#define MY_COOKIE_PREF "SSWI=" +#define MY_COOKIE_SUFF ";Max-Age=31536000;Path=/;" + +#ifndef USE_AUTH_COOKIE + #define USE_AUTH_STAT //Base Auth for stat, /commands and SPIFFSEditor + //#define USE_AUTH_WS //Base Auth also for WS, not very supported +#endif + +#include +#ifdef ESP32 + #include + #ifdef USE_LittleFS + #define HSTNM "ssw32-littlefs" + #define MYFS LITTLEFS + #include "LITTLEFS.h" + #elif defined(USE_FatFS) + #define HSTNM "ssw32-ffat" + #define MYFS FFat + #include "FFat.h" + #else + #define MYFS SPIFFS + #include + #define HSTNM "ssw32-spiffs" + #endif + #include + #include + #include +#elif defined(ESP8266) + #ifdef USE_LittleFS + #include + #define HSTNM "ssw8266-littlefs" + #define MYFS LittleFS + #include + #elif defined(USE_FatFS) + #error "FatFS only on ESP32 for now!" + #else + #define HSTNM "ssw8266-spiffs" + #define MYFS SPIFFS + #endif + #include + #include + #include +#endif + +#include +#ifdef USE_WFM + #include "ESPAsyncWiFiManager.h" +#endif +#include +#include +#include +#include + +#ifdef USE_AUTH_COOKIE + #include + #include "Xtea.h" +#endif + + +#define RTC_UTC_TEST 1577836800 // Some Date +#define MYTZ PSTR("EST5EDT,M3.2.0,M11.1.0") + +#define EESC 100 // fixed eeprom address for sched choice +#define EECH 104 // fixed eeprom address to keep selected active channel, only for reference here +#define EEBEGIN EECH + 1 +#define EEMARK 0x5A +#define MEMMAX 2 // 0,1,2... last max index (only 3 channels) +#define EEALL 512 + +#define HYST 0.5 // C +/- hysteresis + +// DHT +#define DHTTYPE DHT22 // DHT 11 // DHT 22, AM2302, AM2321 // DHT 21, AM2301 +#define DHTPIN 4 //D2 + +#define DHT_T_CORR -0.3 //Temperature offset compensation of the sensor (can be -) +#define DHT_H_CORR -2.2 //Humidity offset compensation of the sensor + +// SKETCH BEGIN MAIN DECLARATIONS + +DHT dht(DHTPIN, DHTTYPE); + +Ticker tim; +AsyncWebServer server(80); //single port - easy for forwarding +AsyncWebSocket ws("/ws"); + +#ifdef USE_WFM + #ifdef USE_EADNS + AsyncDNSServer dns; + #else + DNSServer dns; + #endif + +//Fallback timeout in seconds allowed to config or it creates an own AP, then serves 192.168.4.1 + #define FBTO 120 + const char* fbssid = "FBSSW"; + const char* fbpassword = "FBpassword4"; + +#else + const char* ssid = "MYROUTERSSD"; + const char* password = "MYROUTERPASSWD"; +#endif + +const char* hostName = HSTNM; + +// RTC +static timeval tv; +static time_t now; + +// HW I/O +const int btnPin = 0; //D3 +const int ledPin = 2; //D4 + +#ifdef ESP32 + #define LED_ON 0x1 + #define LED_OFF 0x0 +#elif defined(ESP8266) + #define LED_ON 0x0 + #define LED_OFF 0x1 +#endif + +int btnState = HIGH; + +// Globals +uint8_t count = 0; +uint8_t sched = 0; // automatic schedule +byte memch = 0; // select memory "channel" to work with +float t = 0; +float h = 0; +bool udht = false; +bool heat_enabled_prev = false; +bool ledState = LED_OFF; +bool ledOut = LED_OFF; + +struct EE_bl { + byte memid; //here goes the EEMARK stamp + uint8_t hstart; + uint8_t mstart; + uint8_t hstop; + uint8_t mstop; + float tempe; +}; + +EE_bl ee = {0,0,0,0,0,0.1}; //populate as initial + +// SUBS +void writeEE(){ + ee.memid = EEMARK; + //EEPROM.put(EESC, sched); // only separately when needed with commit() + //EEPROM.put(EECH, memch); // not need to store and retrieve memch + EEPROM.put(EEBEGIN + memch*sizeof(ee), ee); + EEPROM.commit(); //needed for ESP8266? +} + +void readEE(){ + byte ChkEE; + if (memch > MEMMAX) memch = 0; + EEPROM.get(EEBEGIN + memch*sizeof(ee), ChkEE); + if (ChkEE == EEMARK){ //otherwise stays with defaults + EEPROM.get(EEBEGIN + memch*sizeof(ee), ee); + EEPROM.get(EESC, sched); + if (sched > MEMMAX + 1) sched = 0; + } +} + +void doOut(){ + if (ledOut != ledState){ // only if changed + digitalWrite(ledPin, ledState); //consolidated here + ledOut = ledState; //update + if (ledState == LED_OFF){ + ws.textAll("led,ledoff"); + Serial.println(F("LED-OFF")); + } else { + ws.textAll("led,ledon"); + Serial.println(F("LED-ON")); + } + } +} + +void showTime() +{ + byte tmpch = 0; + bool heat_enabled = false; + + gettimeofday(&tv, nullptr); + now = time(nullptr); + const tm* tm = localtime(&now); + ws.printfAll("Now,Clock,%02d:%02d,%d", tm->tm_hour, tm->tm_min, tm->tm_wday); + if ((2==tm->tm_hour )&&(2==tm->tm_min)){ + configTzTime(MYTZ, "pool.ntp.org"); + Serial.print(F("Sync Clock at 02:02\n")); + } + Serial.printf("RTC: %02d:%02d\n", tm->tm_hour, tm->tm_min); + + if (sched == 0){ // automatic + if ((tm->tm_wday > 0)&&(tm->tm_wday < 6)) tmpch = 0; //Mon - Fri + else if (tm->tm_wday == 6) tmpch = 1; //Sat + else if (tm->tm_wday == 0) tmpch = 2; //Sun + } else { // manual + tmpch = sched - 1; //and stays + } + + if (tmpch != memch){ // update if different + memch = tmpch; + readEE(); + ws.printfAll("Now,Setting,%02d:%02d,%02d:%02d,%+2.1f", ee.hstart, ee.mstart, ee.hstop, ee.mstop, ee.tempe); + } + + // process smart switch by time and temperature + uint16_t xmi = (uint16_t)(60*tm->tm_hour) + tm->tm_min; // max 24h = 1440min, current time + uint16_t bmi = (uint16_t)(60*ee.hstart) + ee.mstart; // begin in minutes + uint16_t emi = (uint16_t)(60*ee.hstop) + ee.mstop; // end in minutes + + if (bmi == emi) heat_enabled = false; + else { //enable smart if different + + if (((bmi < emi)&&(bmi <= xmi)&&(xmi < emi))|| + ((emi < bmi)&&((bmi <= xmi)||(xmi < emi)))){ + heat_enabled = true; + } else heat_enabled = false; + } + + if (heat_enabled_prev){ // smart control (delayed one cycle) + if (((t + HYST) < ee.tempe)&&(ledState == LED_OFF)){ // OFF->ON once + ledState = LED_ON; + ws.textAll("led,ledon"); + } + if ((((t - HYST) > ee.tempe)&&(ledState == LED_ON))||(!heat_enabled)){ // ->OFF + ledState = LED_OFF; + ws.textAll("led,ledoff"); + } + + Serial.printf(ledState == LED_ON ? "LED ON" : "LED OFF"); + Serial.print(F(", Smart enabled\n")); + } + heat_enabled_prev = heat_enabled; //update +} + +void updateDHT(){ + float h1 = dht.readHumidity(); + float t1 = dht.readTemperature(); //Celsius or dht.readTemperature(true) for Fahrenheit + if (isnan(h1) || isnan(t1)){ + Serial.println(F("Failed to read from DHT sensor!")); + } else { + h = h1 + DHT_H_CORR; + t = t1 + DHT_T_CORR; + } +} + +void analogSample() +{ + ws.printfAll("wpMeter,Arduino,%+2.1f,%2.1f,%d", t, h, heat_enabled_prev); + Serial.printf("T/H.: %+2.1f°C/%2.1f%%,%d\n", t, h, heat_enabled_prev); +} + +void checkPhysicalButton() +{ + if (digitalRead(btnPin) == LOW){ + if (btnState != LOW){ // btnState is used to avoid sequential toggles + ledState = !ledState; + } + btnState = LOW; + } else { + btnState = HIGH; + } +} + +void mytimer(){ + ++count; //200ms increments + checkPhysicalButton(); + if ((count % 25) == 1){ // update temp every 5 seconds + analogSample(); + udht = true; + } + if ((count % 50) == 0){ // update temp every 10 seconds + ws.cleanupClients(); + } + if (count >= 150){ // cycle every 30 sec + showTime(); + count = 0; + } +} + +#ifdef USE_AUTH_COOKIE + unsigned long key[4] = {0x01F20304,0x05060708,0x090a0b0c,0x0d0e0f00}; + Xtea x(key); + +void encip(String &mtk, unsigned long token){ + unsigned long res[2] = {(unsigned long)random(0xFFFFFFFF),token}; + x.encrypt(res); + char buf1[18]; + sprintf(buf1, "%08X_%08X",res[0],res[1]); //8 bytes for encryping the IP cookie + mtk = (String)buf1; +} + +unsigned long decip(const char *pch){ + unsigned long res[2] = {0,0}; + res[0] = strtoul(pch, NULL, 16); + res[1] = strtoul(&pch[9], NULL, 16); + x.decrypt(res); + return res[1]; +} + +bool myHandshake(AsyncWebServerRequest *request){ // false will 401 + bool rslt = false; + if (request->hasHeader("Cookie")){ + String cookie = request->header("Cookie"); + Serial.println(cookie); + + uint8_t pos = cookie.indexOf(MY_COOKIE_PREF); + if (pos != -1){ + unsigned long ix = decip(cookie.substring(pos+5, pos+22).c_str()); + Serial.printf("Ask:%08X Got:%08X\n", MY_SECRET_NUMBER, ix); + if (MY_SECRET_NUMBER == ix) + rslt=true; + } else rslt=false; + } else rslt=false; + Serial.printf(rslt ? "C-YES\n" : "C-NO\n"); + return rslt; +} +#endif + +// server +void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ + if(type == WS_EVT_CONNECT){ + Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); + //client->printf("Hello Client %u :)", client->id()); + //client->ping(); + + IPAddress ip = client->remoteIP(); + Serial.printf("[%u] Connected from %d.%d.%d.%d\n", client->id(), ip[0], ip[1], ip[2], ip[3]); + showTime(); + analogSample(); + if (ledState == LED_OFF) ws.textAll("led,ledoff"); + else ws.textAll("led,ledon"); + + ws.printfAll("Now,Setting,%02d:%02d,%02d:%02d,%+2.1f", ee.hstart, ee.mstart, ee.hstop, ee.mstop, ee.tempe); + ws.printfAll("Now,sched,%d", sched); + + } else if(type == WS_EVT_DISCONNECT){ + Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); + ws.textAll("Now,remoff"); + + } else if(type == WS_EVT_ERROR){ + Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); + } else if(type == WS_EVT_PONG){ + Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:""); + } else if(type == WS_EVT_DATA){ + AwsFrameInfo * info = (AwsFrameInfo*)arg; + String msg = ""; + if(info->final && info->index == 0 && info->len == len){ + //the whole message is in a single frame and we got all of it's data + Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len); + + if(info->opcode == WS_TEXT){ + for(size_t i=0; i < info->len; i++){ //debug + msg += (char) data[i]; + } + if(data[0] == 'L'){ // LED + if(data[1] == '1'){ + ledState = LED_ON; + ws.textAll("led,ledon"); // for others + } + else if(data[1] == '0'){ + ledState = LED_OFF; + ws.textAll("led,ledoff"); + } + + } else if(data[0] == 'T'){ // timeset + if (len > 11){ + data[3] = data[6] = data[9] = data[12] = 0; // cut strings + ee.hstart = (uint8_t) atoi((const char *) &data[1]); + ee.mstart = (uint8_t) atoi((const char *) &data[4]); + ee.hstop = (uint8_t) atoi((const char *) &data[7]); + ee.mstop = (uint8_t) atoi((const char *) &data[10]); + Serial.printf("[%u] Timer set %02d:%02d - %02d:%02d\n", client->id(), ee.hstart, ee.mstart, ee.hstop, ee.mstop); + writeEE(); + memch = 255; // to force showTime()to send Setting + showTime(); + } + } else if(data[0] == 'W'){ // temperatureset + if (len > 3){ + if (ee.tempe != (float) atof((const char *) &data[1])){ + ee.tempe = (float) atof((const char *) &data[1]); + Serial.printf("[%u] Temp set %+2.1f\n", client->id(), ee.tempe); + writeEE(); + memch = 255; // to force showTime()to send Setting + showTime(); + } + } + } else if ((data[0] == 'Z')&&(len > 2)){ // sched + data[2] = 0; + if (sched != (uint8_t) atoi((const char *) &data[1])){ + sched = (uint8_t) atoi((const char *) &data[1]); + EEPROM.put(EESC, sched); //separately + EEPROM.commit(); //needed for ESP8266? + ws.printfAll("Now,sched,%d", sched); + showTime(); + } + } + + } else { + char buff[3]; + for(size_t i=0; i < info->len; i++){ + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n",msg.c_str()); + + if(info->opcode == WS_TEXT) + client->text("I got your text message"); + else + client->binary("I got your binary message"); + + } else { + //message is comprised of multiple frames or the frame is split into multiple packets + if(info->index == 0){ + if(info->num == 0) + Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); + } + + Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len); + + if(info->opcode == WS_TEXT){ + for(size_t i=0; i < len; i++){ + msg += (char) data[i]; + } + } else { + char buff[3]; + for(size_t i=0; i < len; i++){ + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n",msg.c_str()); + + if((info->index + len) == info->len){ + Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); + if(info->final){ + Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + if(info->message_opcode == WS_TEXT) + client->text("I got your text message"); + else + client->binary("I got your binary message"); + } + } + } + } +} + + +// setup ----------------------------------- + +void setup(){ + Serial.begin(115200); + //Serial.setDebugOutput(true); + +//Wifi +#ifdef USE_WFM + AsyncWiFiManager wifiManager(&server,&dns); + #ifdef DEL_WFM + wifiManager.resetSettings(); + #endif + wifiManager.setTimeout(FBTO); // seconds to config or it creates an own AP, then browse 192.168.4.1 + if (!wifiManager.autoConnect(hostName)){ + Serial.print(F("*FALLBACK AP*\n")); + WiFi.mode(WIFI_AP); + WiFi.softAP(fbssid, fbpassword); + // MDNS.begin(fbssid); + // MDNS.addService("http","tcp",80); // Core SVN 5179 use STA as default interface in mDNS (#7042) + } + +#else +// Manual simple STA mode to connect to known router + //WiFi.mode(WIFI_AP_STA); // Core SVN 5179 use STA as default interface in mDNS (#7042) + //WiFi.softAP(hostName); // Core SVN 5179 use STA as default interface in mDNS (#7042) + WiFi.mode(WIFI_STA); // Core SVN 5179 use STA as default interface in mDNS (#7042) + WiFi.begin(ssid, password); + if (WiFi.waitForConnectResult() != WL_CONNECTED){ + Serial.print(F("STA: Failed!\n")); + WiFi.disconnect(false); + delay(1000); + WiFi.begin(ssid, password); + } +#endif + + Serial.print(F("*CONNECTED* OWN IP:")); + Serial.println(WiFi.localIP()); + +//DHT + dht.begin(); + updateDHT(); //first reading takes time, hold here than the loop; + +//Real Time + time_t rtc = RTC_UTC_TEST; + timeval tv = { rtc, 0 }; + //timezone tz = { 0, 0 }; //(insert) <#5194 + settimeofday(&tv, nullptr); //settimeofday(&tv, &tz); // <#5194 + configTzTime(MYTZ, "pool.ntp.org"); + +//MDNS (not needed) + // MDNS.begin(hostName); + // MDNS.addService("http","tcp",80); // Core SVN 5179 use STA as default interface in mDNS (#7042) + +//I/O & DHT + pinMode(ledPin, OUTPUT); + pinMode(btnPin, INPUT_PULLUP); + +//EE + EEPROM.begin(EEALL); + //EEPROM.get(EECH, memch); //current channel, no need + readEE(); // populate structure if healthy + Serial.printf("Timer set %02d:%02d - %02d:%02d\n", ee.hstart, ee.mstart, ee.hstop, ee.mstop); + Serial.printf("Temp set %+2.1f\n", ee.tempe); + +//FS +#ifdef USE_FatFS + if (MYFS.begin(false,"/ffat",3)){ //limit the RAM usage, bottom line 8kb + 4kb takes per each file, default is 10 +#else + if (MYFS.begin()){ +#endif + Serial.print(F("FS mounted\n")); + } else { + Serial.print(F("FS mount failed\n")); + } + +#ifdef USE_AUTH_WS + ws.setAuthentication(http_username,http_password); +#endif + +#ifdef USE_AUTH_COOKIE + ws.handleHandshake(myHandshake); +#endif + + ws.onEvent(onWsEvent); + server.addHandler(&ws); + +#ifdef ESP32 + #ifdef USE_AUTH_STAT + server.addHandler(new SPIFFSEditor(MYFS, http_username,http_password)); + #elif defined(USE_AUTH_COOKIE) + server.addHandler(new SPIFFSEditor(MYFS)).setFilter(myHandshake); + #else + server.addHandler(new SPIFFSEditor(MYFS)); + #endif +#elif defined(ESP8266) + #ifdef USE_AUTH_STAT + server.addHandler(new SPIFFSEditor(http_username,http_password,MYFS)); + #elif defined(USE_AUTH_COOKIE) + server.addHandler(new SPIFFSEditor("","",MYFS)).setFilter(myHandshake); + #else + server.addHandler(new SPIFFSEditor("","",MYFS)); + #endif +#endif + +#ifdef USE_AUTH_COOKIE + server.on("/lg2n", HTTP_POST, [](AsyncWebServerRequest *request){ + + String ckx; + encip(ckx, MY_SECRET_NUMBER); + + AsyncWebServerResponse *response; + + if(request->hasParam("lg0f",true)){ + response = request->beginResponse(200, "text/html;charset=utf-8", "

Logged Out! Back

"); + response->addHeader("Cache-Control", "no-cache"); + response->addHeader("Set-Cookie", MY_COOKIE_DEL); + + } else if(request->hasParam("pa2w",true) && (String(request->getParam("pa2w",true)->value().c_str()) == String(http_password))){ + response = request->beginResponse(301); + response->addHeader("Location", "/"); + response->addHeader("Cache-Control", "no-cache"); + response->addHeader("Set-Cookie", MY_COOKIE_PREF + ckx + MY_COOKIE_SUFF); + + } else response = request->beginResponse(200, "text/html;charset=utf-8", "

Wrong password! Back

"); + + request->send(response); + }); +#endif + +// below paths need individual auth //////////////////////////////////////////////// + + server.on("/free-ram", HTTP_GET, [](AsyncWebServerRequest *request){ // direct request->answer +#ifdef USE_AUTH_STAT + if(!request->authenticate(http_username, http_password)) return request->requestAuthentication(); +#endif + +#ifdef ESP32 + request->send(200, "text/plain", String(ESP.getMinFreeHeap()) + ':' + String(ESP.getFreeHeap()) + ':'+ String(ESP.getHeapSize())); +#else + request->send(200, "text/plain", String(ESP.getFreeHeap())); +#endif + + +#ifdef USE_AUTH_COOKIE + }).setFilter(myHandshake); +#else + }); +#endif + + server.on("/get-time", HTTP_GET, [](AsyncWebServerRequest *request){ +#ifdef USE_AUTH_STAT + if(!request->authenticate(http_username, http_password)) return request->requestAuthentication(); +#endif + if(request->hasParam("btime")){ + time_t rtc = (request->getParam("btime")->value()).toInt(); + timeval tv = { rtc, 0 }; + settimeofday(&tv, nullptr); + } + request->send(200, "text/plain","Got browser time ..."); +#ifdef USE_AUTH_COOKIE + }).setFilter(myHandshake); +#else + }); +#endif + + server.on("/hw-reset", HTTP_GET, [](AsyncWebServerRequest *request){ +#ifdef USE_AUTH_STAT + if(!request->authenticate(http_username, http_password)) return request->requestAuthentication(); +#endif + request->onDisconnect([](){ +#ifdef ESP32 + ESP.restart(); +#elif defined(ESP8266) + ESP.reset(); +#endif + }); + request->send(200, "text/plain","Restarting ..."); +#ifdef USE_AUTH_COOKIE + }).setFilter(myHandshake); +#else + }); +#endif + + server.on("/erase-wifi", HTTP_GET, [](AsyncWebServerRequest *request){ +#ifdef USE_AUTH_STAT + if(!request->authenticate(http_username, http_password)) return request->requestAuthentication(); +#endif + request->onDisconnect([](){ +#ifdef ESP32 +/* + //https://github.com/espressif/arduino-esp32/issues/400#issuecomment-499631249 + //WiFi.disconnect(true); // doesn't work on esp32, below needs #include "esp_wifi.h" + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); //load the flash-saved configs + esp_wifi_init(&cfg); //initiate and allocate wifi resources (does not matter if connection fails) + if(esp_wifi_restore()!=ESP_OK){ + Serial.print(F("WiFi is not initialized by esp_wifi_init ")); + } else { + Serial.print(F("WiFi Configurations Cleared!")); + } +*/ + WiFi.disconnect(true, true); // Works on esp32 + ESP.restart(); +#elif defined(ESP8266) + WiFi.disconnect(true); + ESP.reset(); +#endif + }); + request->send(200, "text/plain","Erasing WiFi data ..."); +#ifdef USE_AUTH_COOKIE + }).setFilter(myHandshake); +#else + }); +#endif + +// above paths need individual auth //////////////////////////////////////////////// + +#ifdef USE_AUTH_COOKIE + server.serveStatic("/", MYFS, "/").setDefaultFile("index.htm").setFilter(myHandshake); + server.serveStatic("/", MYFS, "/login/").setDefaultFile("index.htm"); +#else + #ifdef USE_AUTH_STAT + server.serveStatic("/", MYFS, "/").setDefaultFile("index.htm").setAuthentication(http_username,http_password); + #else + server.serveStatic("/", MYFS, "/").setDefaultFile("index.htm"); + #endif +#endif + + server.onNotFound([](AsyncWebServerRequest *request){ // nothing known + Serial.print(F("NOT_FOUND: ")); + if (request->method() == HTTP_OPTIONS) request->send(200); //CORS + else request->send(404); + }); + + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");//CORS + server.begin(); + + //Timer tick + tim.attach(0.2, mytimer); //every 0.2s + + //OTA + ArduinoOTA.setHostname(hostName); + ArduinoOTA.onStart([](){ + Serial.print(F("OTA Started ...\n")); + MYFS.end(); // Clean FS + ws.textAll("Now,OTA"); // for all clients + ws.enable(false); + ws.closeAll(); + }); + ArduinoOTA.begin(); +} // setup end + +// loop ----------------------------------- +void loop(){ + if (udht){ // 5sec + updateDHT(); + udht = false; + } + doOut(); + ArduinoOTA.handle(); +} diff --git a/examples/SmartSwitch/Xtea.cpp b/examples/SmartSwitch/Xtea.cpp new file mode 100644 index 0000000..97d99b0 --- /dev/null +++ b/examples/SmartSwitch/Xtea.cpp @@ -0,0 +1,48 @@ +/* + Xtea.cpp - Xtea encryption/decryption + Written by Frank Kienast in November, 2010 + https://github.com/franksmicro/Arduino/tree/master/libraries/Xtea +*/ +#include +#include "Xtea.h" + +#define NUM_ROUNDS 32 + +Xtea::Xtea(unsigned long key[4]) +{ + _key[0] = key[0]; + _key[1] = key[1]; + _key[2] = key[2]; + _key[3] = key[3]; +} + +void Xtea::encrypt(unsigned long v[2]) +{ + unsigned int i; + unsigned long v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9; + + for (i=0; i < NUM_ROUNDS; i++) + { + v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + _key[sum & 3]); + sum += delta; + v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + _key[(sum>>11) & 3]); + } + + v[0]=v0; v[1]=v1; +} + +void Xtea::decrypt(unsigned long v[2]) +{ + unsigned int i; + uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*NUM_ROUNDS; + + for (i=0; i < NUM_ROUNDS; i++) + { + v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + _key[(sum>>11) & 3]); + sum -= delta; + v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + _key[sum & 3]); + } + + v[0]=v0; v[1]=v1; +} + diff --git a/examples/SmartSwitch/Xtea.h b/examples/SmartSwitch/Xtea.h new file mode 100644 index 0000000..fc8fa43 --- /dev/null +++ b/examples/SmartSwitch/Xtea.h @@ -0,0 +1,20 @@ +/* + Xtea.h - Crypto library + Written by Frank Kienast in November, 2010 + https://github.com/franksmicro/Arduino/tree/master/libraries/Xtea +*/ +#ifndef Xtea_h +#define Xtea_h + + +class Xtea +{ + public: + Xtea(unsigned long key[4]); + void encrypt(unsigned long data[2]); + void decrypt(unsigned long data[2]); + private: + unsigned long _key[4]; +}; + +#endif diff --git a/examples/SmartSwitch/data/.exclude.files b/examples/SmartSwitch/data/.exclude.files new file mode 100644 index 0000000..a1c4278 --- /dev/null +++ b/examples/SmartSwitch/data/.exclude.files @@ -0,0 +1,3 @@ +/*.gz +/edit_gz +/.exclude.files diff --git a/examples/SmartSwitch/data/ace.ico.gz b/examples/SmartSwitch/data/ace.ico.gz new file mode 100644 index 0000000000000000000000000000000000000000..49e15bcebdeba0b55db396e5b6266b6e72730070 GIT binary patch literal 6307 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 literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data/edit_gz b/examples/SmartSwitch/data/edit_gz new file mode 100644 index 0000000000000000000000000000000000000000..be687a3942deeecdc96ea3fc3a2302c7b73408b7 GIT binary patch literal 4503 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 literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data/favicon.ico.gz b/examples/SmartSwitch/data/favicon.ico.gz new file mode 100644 index 0000000000000000000000000000000000000000..0cab430e3937861565e9a75680255486ee4df01c GIT binary patch literal 4314 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 IB`!Pw0Np(IrT_o{ literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data/index.htm b/examples/SmartSwitch/data/index.htm new file mode 100644 index 0000000..2a9d283 --- /dev/null +++ b/examples/SmartSwitch/data/index.htm @@ -0,0 +1,626 @@ + + + + + Smart Switch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + +
+ + + + + +
+
+ +
+
+
+ +
+
+ + + + + +
+ +
+
+
+
+
+ +
+ + + + + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data/login/favicon.ico.gz b/examples/SmartSwitch/data/login/favicon.ico.gz new file mode 100644 index 0000000000000000000000000000000000000000..9e605465c6e22500502ba34a11be2488bc508355 GIT binary patch literal 5806 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 literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data/login/index.htm b/examples/SmartSwitch/data/login/index.htm new file mode 100644 index 0000000..d17ef7f --- /dev/null +++ b/examples/SmartSwitch/data/login/index.htm @@ -0,0 +1,36 @@ + + + + + Login + + + + + + +
+ + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data/worker-css.js.gz b/examples/SmartSwitch/data/worker-css.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..6bab483026a8fb0ef25353f10db64a75d38d99b3 GIT binary patch literal 32927 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≥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 H;4A|GFx8L> literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data/worker-javascript.js.gz b/examples/SmartSwitch/data/worker-javascript.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..9cbfd2049f4dc579c777e291376a775707d0a573 GIT binary patch literal 112558 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

Fc!=jWPu zH;be`mtC$qpqn87L1n)%LoRpCD`^uo%d<3ko~e2iZ!LTEz7h}(3U>!IkJ6i>p zgoRl-m&#NDjpc-gvb+?cxf2OAPo+L_zQh-|UWm~$}ClA`(w~|B|9(C?v z_A0mEO3!+pKZ*kG7pu20$_*TrXmO{t_dJ)89!M{iz;T1qK-wlUmL$^twT5c0{t*Ld zQEu7GwbHbVVg+Z9{08kB1_L`cMgNx_yO18VA2ZTT{lH9+$S+!4lWdzdwke4j#q-F zXD3m!NWeK;e!{4G#iA~?>O`k9%8MP}+buV|N>1_c&dQ79@}9LMWn1b^Xs+iV%C0n6 zl5-gD#0llqk>DM_RByvUOsy!uWn-UlCPi(jyU&PKDS_>PPpsYlt%bKIHA zb#Kbz9E_p9whD>yCxQ%BO>!Ap?_5vLqxx{ayXoos3&9dP*1opAN|81S^#^3HeB&K+ zRS1^qweXc3xxrwUYHw|E#YUje>qPK-8Sh#S@7E(YF5pG52}q~dXhvwgY$c4)6BO%h zNexcx;>*|OJ>p%K{DMHZBFw^}GWl~X4Q+Ah)At0VwX?&*+fF8$?~_z$uex`skCv9M$_Py6U*~02 zH;BJ|hW9pY#>WIv-s@+^Y|8uXQ?kabe5r(eQT#-WT+q?G?e9SxA9wAx&c{@(UM1qw zswSdBPdtQovC9QtG*GqB3s;L(aILQF;fuFkDUCqDtOe5 zdl#FQb`_pmlR&#?Io}PBvt`4qUNXY-w*E&gd@~0GR zB>Z>>c|UkA@ZR<)=UdFXq|IE&E3K1xhFx<;o;ZA7@GyU>_X(NN0b$x}lAx@w7-x$d1&^ zrX<(0iBT_l+@j(58*LKtrqdE=ybag}Q4k3RLLGEf#2qr|OiBFtf`uygF|syx^{tsTaz5_h_3 zM2WWc3H9=Z?O>T4M57Lo;6_+cjo!;sK5_P<@rctQscI_>3aw?a3Kz%y? zq%QB}`#A(C67J;A69_u5Zg`R2wy)X4l{xy!mA!F!s?wma;9xuN5vxtEBk|{l2ZB3T z+HGo{8k(&SII{K_c$G=o>%NmeGHG*6D#I!{x@ixWH$j2^H(7Cg=!NE3$NGga-Xr;v zn>?4~R!X&tbYyuA_RyURI?>pPE6AlyWCM& z7~FMH$(z)|pwW{Xsos`y5Vol&fFE~o0t zoeH{)W=nlTzB#vfX{nAn=N?t%JWE#oU7RRWO-F^*?Ml$B6~TJAF59qZtE> z?`fLh>jdNcRc%wHPw{tE%23Exo)C-aNq0E!KRun=F|yJmm$RD2EVWJ|%A;L$=gth* zxh3u9BIn*s&GpWugOamcQYi^tA7fg_re>Gi9s4Cmqwgr@J@5WFl^0+<#pI%x%ibM4 zRlW4caZGYDdNp?n-K|?mbhwgyC*SU!jOyEu@otD`Yf4`awDa4q`q)Uws5NOR>WLNA z;fqO^;x9!t*DK@^K2E-nqMUNxkS0;XL-t~F>x+xeGv!oYNhcg`HEKy#ZGU{|a;yq^ z?4il_M=454vRQkx#va+~f4KPKLV~)V`YqW4p~1r!l2uaAq>3#R-(1PFD=&Rpwptjc ztJBx}K+pnThQokXO|&U!7bmJA22 zT4PSvc7k0bI7E08m8BQNNy>bQ0ZSl~C-TlXCgHlW?&=Mx6ncXyT!Aesf7+XUUf zQlbaR0un_udR~kuuoFW=1sZcX_o2i`Ac7WO5Wy}kt>Y->UAv71WH{7B?ceSvVL%JB z?J-2Ew-g`g_U|Td_n~BYN^GYf@kv~dpdjY-9 z5}@weNFGMWZ?_LHiuQhn7=&=?EHUi(Hu>f*rB)*(4y>SFzF28CK@$imSJa+`ScA0% zQcbWhn%)eQ(r#D0LFu*k0Y5YgWB@v!iP%4tVs(v@-MlX8_Cu9uk}*ny)RJD{Nj`mi z^MpE9*Ww};muxMH}Tf2Y{g13)0SvARLE9193^qM0Uts zc^#v=+Ijek)z=Tf%-QEc_p64O9JLxem!;o){r#hZSN$~{R3^i1==iT!e?F6lhF?=1 zSoF*^AzN%L`MFfPS#nD3ShuB6%LO^pTP+tA zoiaaPxO`IK;!^aYc}s$RV*XyEWNcrt$3{u&#mb6KHgzo*d|pM2CBL#uiGOu_EM7cy z&hSZsx)J8Dp+wK{u@@=P$=Acij9w&#v@@$(&hyn#Wwk0_mRwMlQ`IC9YE`+)c&k>!4`{}^g<4xLdFAKrHEOm;&u)l;3fFz$VJ;L}S~7gXpuX<+@%^!qjlrim z4a||TE1EoXHUsx#kDb4PSS}_ zaMKiMiY_CUq1@|M(dYDxj=}X*ET0-fTOPK}Rg)HON&rouR~FpV1$w1|CeTX~OS9X? z4$mK{M{$%+1T$112r-0iIs%%6;U;>}Bm_5!gQlBUzU`S!fh^2mSuFYN5YKU?z3;j& zERcBP>rhNsq8~Q{DZ|+z&#k(tE8&OdAL^;DtRLF_et1s(;W_GuXUVO)OoA$6tB#BM z;aM|mt6ekvhvy&aKFuHccm2@6>xcebKlJYs00mw}c?6oEe&xEYVsKGc*6yfL>!Ee+ z#BT+Y1qVR2T1*#7(x(Y&d-6~KxKWyQLqHuZ`HmPPC1HAoPc%ixh3+H;f)tU=u zjqSgJ0-GGSQUmpWL)H9KRK22b3MW;2v_%O>LOOid?AbYqDx*LJQQ8mGVW13>bSbtV zQ0v@Y)c}j;xQ{SkoElvvp(;-IFgK`jgi~t;m@VBNR2b^MTdfwwqC`#x5>1oxYvSvlH&1{E;9B#Bnxn5nsAxd!k#c{vd#xTf?@>iPNC`Ntf9g zwY92=!)iv2xGD`@f6zDr!_?{9n(-}~5ZBYByeW5avj5QHO&(Aj^H{X%;3Yn-oSv|B zaCC$I%?$zkca9_b3XU%Zs9vXrf_Yg*`E)!cpyt{u*`QN|HytM_H6ys;9sK`nJ zh|$@hxBrAPChTi)h@rEKn|bH#%<6kg%HU?Aq(bM1vI@629CV0=W|YSy9U3xk5_l5J z9R$HQ*N#Bh$<4R#Y?U$WuOUt4I-iYSfrx&p@6b6Y3wnIi zU&0+99G{Lyw_40fi7BfwXh`H50b!b8SSPDwN6mmoV=DsvU&!k3)pM4Oa9ugN&Lc(` z1tDW&SAr7rdGn{d(3;1!tpCm$JjcvK@f|D5^OihJk;NzhF=)_kVqv_Cd31nA{y=Cm z7mtRla!UgWkOb{#rlfX2+~Pf_lc9vz#w#F%mCyvnvZ0Wp#?s563WkA!Zz7`0(YJ($ z;^{Hwp})hUvbVRt%nT?s5-1DB5=x$U6-1bsI}{=VI0c8|_qwgOp?Zl*Vl83D5Zjli z0;77o&<&W)Wp6+9jF3_VP!kdjVCcM42-&CGxC>0{or(tlGsF?veBI*USy0wXOWWX9 zjSHzHr{D`M!Os`l%OZ135-Ba@4_0!(~;xSv(J0G z{ph`QIS7Tn-hCIKwCT5E`dWZ``o!19OKec(1G}({iN)H#B8= z|B@vcH%c}$=}Pa)PNR&GiP~Et7hUR=ODkiBtI;k2*ijfZO9~I10KgvjNn3ds;FE+$ zkON}oVBl#+n9>n9AC%f8I4P|y&?TgoM?V0z0bmLIR2p=$S9ZK5vPG@-vi(+7=0X&Wi3E&2LtuUP;%CtL!)%7$Z;I* zMe{o`1^SA@)C9paaEzf4LprI1BHms%FOM#O|KC)L>QjQ2;GF_VJV@yo%TAquL`w@) zOd}&2_;=Mpmhm0tt>Ta7-UnF?HQSch`|W^?|7Cg%c`QHzEr2U2h$~7AX`E{Z-eV1D z^*+kzEDrvM0Vv~?<^y8r2D1TcnuT@Oe`E?6r6nr-=+Iz|Ui2}T04+z91Wq%<78eGj zgYpQBZ!p2YW!Uy+sVx5r!+(nYIUsl_VqpCh?apX|0ZlIe!A`)a0BwZ;2)v;mw!MnW zEn5--0{_qc{$Gs($P1R7Puj?q+X8~`1DYIQg5vSEpg$N+JBHG43W@>kS!xih#eKm?U>{xzkb9LOi_ z{@*hLN^})QMuhiAbHD$WxqSy@!P74AghfZ>A-?%nk+@<}xXqgZzO}$pF)X#^ z4K0jBCE8M4MxmvU4)z(687mhM8jvPQ07+o-wm&2EyCJQ zGJ4kEe9c~8V}Qx}Wk!`i_pBeYwy$xgzQ53-eWiHu>;TQc-lZ^oOvjcR?{X_8ht%`~ zZWa#EAA3a$AZxk*GKD~;&=g6-vTi!{tG5QOFzfjj7p{k`zjHm z&7=9&2Oj9sZo79V$Ubj{-S)X{`*Gc;Dm!cK?CIpGBgzNk7vZOY&!3JK60`Z#_01_e zlJU4z>sjaCX{qeH&U?j#G&G=H0tR073N5>qaa2RfXmy4^j8oXF=IkVc7H)9Gkj2W2 zuJRh4*KG{k%vsX_2t6&=twLSAR_Wle`H}FG(Ky`Elo>NiQut7OH4{9e6X@syKRHiE z0yIltG=w0_P$fY452(_d6vt4HW!I~wDy`kxo(@fXt0bCh6)Md1cfLJFvkJ*3nUtse zByqLgW`re1S_9Jpp#f~S>`@X~6i3U&tR6^65|+>^DJ;GX_-U_8jKKyM?_$O zMn_PSaxZ}%KqUoWcn<)AC+&`5SPYYZ3VJYN9s`s!WrT!kwg|@mx5?3pEHT>R&=Iy8 zVVJL$AuyX5%uEMByhYW&sdFXE(Hk#)>pF51G6E!|**B}}j|AovrIt`sa?ahOaaVEV9i&nd6MxJDYM zfJlnKhymD2Oo2X90eUAG{T6Lg06iQf;unEdw)X@3`Dfz=z(r99`6xC_0fPMi!45Dm z8wm3kZ5za<%PCtX3QXdEI8M!3wCA98I0?`L+H8TkiUAO~CaFUM5F#*%zw17z;9COY z>JpBDAG3f-m;&wp0}ip#Aqq_BC&BA)IK*0x1JEHd4zX-L4n%^CL(KLpBJ2D>QC{O4p zEB|_Z7OEHWDd468(4-AdQBpt-LmltI=mh{yTo~sic)%19jB^s;B!HW`KobvkikhBv zggJ0oIt?Tf4e%4gBozUksbEG|0i)tDqjsQ41a4Y_8J)9JL>hqrK(7eP*$jxj8!$x( zGvx%BVuYCz2Tk;F)9Nm)_Eri+{yKt9XBcY~AOzUmIy~=Mmp6a{dy4=x0jcJ|18jf^ zn&H7lb{=Ma3NY^sPq8uOgD?WKvj9CX=sJKCNcAdAQ9f+rayh_p*26~x2ZripQkKmLF^RA05 z=Ey!8eI8MEZFXi3RVGr&Q8pKSqC zJK-iX&_shJdvN+ZfZl+iW?+tJfRi5Pa}`KU9L8w}nzqP*1vzIY0-yr$fE>`I2;-b0 zfthjwOfkYZ#X-{+88D421=~+Hfx?uG|s~^~`DPUn0fF^C2#*(W@o2ewy2#SzK@Y|E2 z#W%{6r|UIP>+nCaQ#+*XboDfBvdDPa<`fOmc2tLSz`g|H0YU*=5orYGe+|LrDwMr{ zF(>eV41-Y8VFXbY+Cj$D6IVeK2=+@LUlfDbO$sNvD9{9Q-#Se8TGs;rgOAaBQ-BO-n8uB%Gcfd@cD3aKZJv@CK;j?dqn;A)`+yf@*fT?n zJxp2XlEVTgXoPaMBjN}UkLE~o(1CO?k3u?_oBg#=2(4LuvHC7Sn1i0W-=2(m_W&n> zKZthF0{(A>3OmJP*wPHMTK%I%)?ZAizivlJFS6{!;nZh?P{yW!Q(rzp8QTxxlr}|! zFb4%xe=45Vm&E+}?S>mj2fQOl+Yvj`2oT>e`9EG9&&Qk;6Aom>-M%lZk$&HCgE_^C zr4NVFib&bWpwnlAbIKiMUv)E%7D9&{*ux~CGg_h02{RHHSO9?9ybfw6q&(2sG#*Sh zxzseRoxxreLo-$@FY0vW(%Trcpp$4|64PBUa1sD1T*46`@B0X-2g}r0~Z0)(BcK%t>ydS z1F&380oRg1u15e64`wwA%qs!|C&5T3FtP;OEvs0J9L6u~1``(zCZU3X*#LMRC=*a_ z3xLI7B&>6F?TbJnNNJi8@FnnK;o?n83KCLchfX&>WcLDgcTDAP{R20B-3VJ1=z53~N4q98G|>Uc z3cwPZ{AYFj05~E-ktrErO=K01;loxM0mSv&snL1&w^L&)hOL12lO)INGI!PynIN`Z@~LGgxA+1HBr5<&s-@C|JhV9VM6s_MU}Xg{PYvN6OJy?`(Vsg3skRZjgE zHT~PA(fc$%-xUBZ{rS8BLXoc(ahEefe0%0L;;|Jvu7llJLuLagpk(nh;^7;y1@(MS z40;n0+CKTcq(-kjf0y6bz3l(D_sJ%q^IwR@4R!77h=&d64HUvvpEuG~Uozq;DEu$2 zv$BfAuSgmF;>PhU#F=RSOHBMf_CjkZjRo;t-4BQ>0y>9}14&s6;0 z`~H7r@B6`@3a*_lE`Q;K&Y#%*{=HE)7>~^EiMlq}C`0U^)bG9TUkMw??|pm!DX0D` zhwgs6^e<@o$Jbfv+UvuCT4s!1t{jAHf<7A==LTciBt9qV&`MD5gRbt+SU9Y_fNm4D zF)(rSFlRw`sv^qE2M6P!gMQFCzudw*EzreZED*YJivdCh7@?DosFBbO-Hf9W8d}gt zqOjevY;Qql+=acoYM^gffqwrihAilCGKLZ;W?{*MZsD4cl7&J?G@)Bnb$xwvbIRg? zIOuLM76{$1!T_Pyo7j=ieJm`4(8VcqH}!&i#4$ko;t2Bq9W_H#56qkGP!`9EGXlsO zx~+`WK6LvGVu?w#bfyyvgzidXO$Zi0>NEt@ZMdglFyYfH$mOw$f-X5? zwFq5%$7rzw4Bna0HN;yU>SpMVqh7=&Wk>{i0+n@mEsTjp+7Q*axmz~C6+Ddc0QIk zKsoe10xS@^r;i10c^{w+I%bRR*3#Yz-Al*zLw{ltW&T$IThIj|EOCHxNdVlU9QX!w zG!ly*x+I7eq0!_R;uxTJQLyxZas0D!1KOoS7z1>G6lo05y=WvgEwust#5~eWJVreD zB_kP`ylUi9HE#i5ssr8)eNY4wBCeUKi)RpL;&=UxSyujUslQ7W-I0n+ z&^u;?;|BCj4PgvLh+{x~9tz3bhX9vJAH}DEL4uL!d=u>q_ZtgrP14=vpVb@!Al?uH{FtBv<7XqT(BwUk@T-kb)4PJx(giX0ruK&$%qJH%y z4s?+Pvo<{T29v}k6EH0;i}AnszKrGzrV!hBiMEZA`u}hc1Ulyu)dOmUpDA}C74KAkoOeU=kj7(L+> zhK|V8UxurU=w?urv4^#EV>Dn>{y&!+3!4978@S!s<_4^~UpXq&(taFs8pQdS$Y?Di z>d;Y?3m^g>9$^(E1{$%R!(v3W>k zsDmJb3ek`OtqY)zE-k%*nfmtbKbR3_SGctp8rt*({ra}V$l3u~5WEE9#-651u=R#a z#O_aRdTb=qL%$b*;^s-k%9o8NI##H|ST-AwJto@vC~S6OY!1^%gg)J|G)z>vB!H3$ z)bqkc-Ye+nb@5k@bj6QhLe1!dY1H?&FebljjQV0Mg71-_2yF{R=S#bfqU>Dl1z z3+Q7~Sj@i`K*r^MuaSNwSs}lIK^_D0E0}-7u(E{xjASfFSR>tzoiFAUCvM1{xpG@= zvjO@E;|MS4W2~=HKa@Gn8^)=H{*_|X5B-Lse&4tQ0EYpP339d?)K3^Y0bofv^u^dO z4BT0^3-!9ZR|?U;gDeV9@(*K(!XjhNvZR%#=0W{7voIO-_4w6&pr0S;=K!;x4cO`iKqnYz3xHFAE$qC|CmF>t3_@>UmJr9_1SqKllt{n= zz6xYB4S-TGP#gf4fZ(u{qkdf&BVVY#J_`B`!2L{t-J}B9fJsc5VbyHeIWXl#ptp4_ z;n3O1XfO#P{s3)QY*B&~hAn9#BBeWPS=L+5|4#%amq`aWY;FZVD#YW)2gKt>E8=lu z3ULhI5sw?zh{p}dzZEw&)*Ya9%$)V}$bqoeL9xjWSvf)1YnLLC4u6OL*~kI(x)nDb zBOW)B5sw>Ph+|klJZ=mj9yc73^#`clK-l9T4AaO;X>Rs&G4kP66u9BP7aU5)mxJ1W zSK!d{?{@_bQp?Zt=>NYJ_~r%zt6r$eN4Oe*YVaP!7eg13uLc^xTJWD(M}RQ2RSjH3 zyc)q z|K2S7=eMW-e@WDqh%b46ZQBEE>PNh2azK0wMGO?>|GqZ>z4ZJ?UfKM;&0S2D@zW*g#Tc-3 zMd+1{5#lK#3t^8?FSw03hVKYV3HrUXD8xfk#h;2B&_RMf9W~|KyQz)2F^cebj01&~~Z9JJ8W9=%tjn zS7-q0#I=Ue(##yR^(gEmH#v=cs!8jzwqJpcnMIT*EHY_HK}V^EERvkShyi$nDFCLH z*HocSJacC`!6R)+d6?1XkXxnz`X2a6dv%L|X}Gc74jwBE#ts3X7)*KxAY>ROWD*dv z&WNRVrDy0U=!g)CtR)6mIzBcm41Qib z3Qyt)cqj%V{t1;t0VyHn8U_EZbd(TbJ+urp7l7wQAZ@^Q0gxTmE{?4-Q%9ev9$Kn0)fspH))vKPJNd&z0!AopVboKq!@1p=6-~ zp4lI{T)Pt{1}T{;vKKye zeYUM>JapGp!>!!p`6I@)C8v!!tGmW2hQWWP;zd3qgH`4)$6ZYQd`QAymY|X{8arwu2_RqZ|b|qjwNc1B!kNR(H}2xvuLUvc+HwY9QUM3`QX$cM!%k` zD%^gD@>rUEJk;khJd<9{KTm(0$7fJk`(dVq{_MH_OVS20#CkkV)7h)v0)@i^CqD(s zR%)_;wCvx#H^TB6W$50GL-Xc)44qkMm!qnSKb}S-S?51^tHv&P7{rJUF+AWM8X{p zCA4lc9Z?t64|x{PVJLdw{jjXvp=kMt@f$-F^~7^WH=X64p8oo2xs7da-F|Hjsl)?~ zVpAK>^JO1gT-sx#GI|$Zz^`$TNpXw1srCNdFnTKbm@pifROvX!Q=j#|5mCy?3 z&ht)r@Bdi3xvhlRIzZ{kyf2Aj>xGN9V#yyZcMa&~(3733kSta@#XCtz$nPnLJ19pG z7c!%#sBa?OYcHp8o^|A={YB1eb^V_cbLa#}cwczG8;)iA)YdRw_pD3gDuMZd6VFv2 z(Jk5Bj=#=%L&@milarYmJviq&O!hS*g1eDEkx+Mo(Ipu(=u9 zDQQVOG-EvGwBL%bTApJ!fzR3S{vaiZ><=Xd9QLR3iagGccXhuuX4Ek5{B+;NJa*%0 z>Hx*V+5@{(qw3w+HRdn5DZEeRT>iu#?|PlTKVMdc>Xu|pzvhw}lwGIB^>#?(&3CP=4es6eVmPk)q)lGXo|9eUK%4cWM zlSfF?n5>9iJR}tCJatOrn~d4smX~F(=sT2q2m^^TbL2z0XK5af@0_G)pK9fISuL!6 zc<_A|i&^-!ww%n(j`PR&nOY5e9glbRTU+c)S2o;9B$vLk?CsSXMpK^0g;ifH4a0Fgj2ZQvzO(+ zwk{EGj1m#q@9BDgk&`4FCZ4|wA)HXBZ>Gg(Z*ss)5avDh5vLj|R#jKYdW zuv|n@Q7{86AT+9@Jhl4-#weJ89?kPqvXk1{Qsx!XNdFOJHO8PO8{532vI;DOIU-cq zvDy4!KFtkXvv>KLiCHk!{tu;O?P;#Gd$%KXSuy?A&WRB!opTK9YrQZv_i}WXKev#& zR)r~dXanZ)LCb8cQwhC5V*{|R8&x|mvkpa9xl=rqxVdD3xxhV(XVtb!j<~#ByP|Qr z{vfK&{2-6fTJxV8eDG2{*PsgSWcgpTky<)0n!P^&IlwHNPPrt0IVv^V7c6Kl`sH*A zGN`SG{m8eQK7nxIDr62{#D_s;`j3!9Z|R;G`yuc%eo$#9$DIBGmw!Gs#@5M_L`q+o zt3BiO*!IQffSO#Fdg91d^xY>FUD>&RtAirNZmTM2R@mi#9EW5#1~+2&K3#7l8rqaD zZh(@I#xsC6_iGN|K*E0%^(%k?9)iJh)4+NU(4_?X>W?av{1Q2mT-_xIq}&CLxJ{0a99ZTaHbjt%y<7Xr{MjPIH|?%p-(7qeRi zA}n48G-FPFx^;qb;5+6l>ezv_=3bEB-_3H@8%e!zeh0Rs( zrTwkgeMf3=8mLulUQ@tb<4Ez=jgMlBb~wPf$j8srw~8ZnyXEr7avnRKEM{NlMA!M} zyZrM$|NNAHzR5o?^Uu%u=eFc_X>(havooBfqL`oLM5BgkmEyBg{Hu_>!n29m#=zrnqWYCmV1cF3EoU0~+}7!OH?@nc z^jOmG&Tk}38Yga9&c`2h?9nwENuxPi$4c~i3TtbZ2+L9|E>E+nzg&K7uFi~P+6>Al zo^M7{4)Hry%;ds0o$bc%Fu&)~pW>bClDo^(a^8HLmL(L;qMu|ve4U(VKf=jLKhC7V zmRWAt=IZro;9nc5m|1A}NdUrp!-&G-soJ|xdFRD)St&aSjR3R7=&rr#4+>m$=hS#F zz?`McuDoaEWd36%4R->}+h^G1jCkFP=x$+F7rUGuJuqirLo-$QQOtnCdwWG6t;0>f zS*A~S?|L1)TzY{_%97#m9q-rKK))}%q=G}OWin>(;BCGzxafYEIf5;lkuyC4alg;D z)tTNk&zYft_rAWJ*SD~&nRVgeJ>2VMbUx5isc&c6u6)~Yt3zvFW}dtH#?17yR(%2 zi9zm-UF#m4!coJ)xbp!@J?LX|SOJ`QAURh6nLCK_g93EsL7z4g0Q9+sewGzkmEvr& z;wxYLG`#}g+ylPWiwfAahZ*4suuBj7rYbM*rtvzBf-Vud;Jn{FE2-aZY#vALtXgJvl!9Wn=5@ zK@xxheD}UH@_&9v{*4{rJ4yaSgz!+6R@YVvdT7J)F<`xw9gp^!iM9~S5#x#lkxC^C zIL>?a>2jTJ!m>00=8^AQg!RT*9sL@A6$3{OCb0uFTzit^u;^lpD z20Ct;DT?Rx?oY9}Qu61(P@Zf^-&o=w%!Gl4;@mCGS(Slji)%gOs|MRA^*-)Qu;bHt zCN7m!N{1goVZKn(_sr&JP^rb8l5>^J)mC1w;e5*QqNQ`#+$afc=U36Uyb%-Mw=i&4 zd_J?E4Lb+u)`Gye@p)uF8+HuP*92-t6n!&OfcKPy0C$6dU+TAgynUtLp5bj*zun^P zK))T~?WvMyD&ZTMP3uI-rz&}>wyx9p0z_t7=_jm(aiYj?l;BWrz?Yx5ONhYo<2H=; zseG{lt23NFC7!I0^(&y=V;$NOHr96*#>RSOVQj1)l=yLdtnUHs9&5vvu(7_dFgDhg z7RJWS?J$bua?)z%{3ZSdy@|giWQ{WK@Q@YLqstXJ4t*?7ab?=tT zBM&+v(0&L6EC=y&s+WvOp@9WE;aUzqdzCDb7i2Z?Fq%yjHkxzQXwG{owlmdJa<;gdheCGS0rE%f0Ozk~2e`3wCad}$cH4^2-6`GH_FVZv zlG}hx>8Ipyw+dujaf_5z@L~6Q78G!Nk^Qe1G0SM1-rR}peBwy}VaSCcGR4p$o?uOe zSP2+Y15cY_d=QugYMB=+fH6g3SDHMD%#ix}8v1RQBK>tsk3MQCgh!qQ?BO-J=vI&y zT2D=xLG#b*$2l`~{uAo)%RiwVf7O93w-})>P{vJN%9(Gw>%(8!0t}N3n<0}=8@C$4 zs^yY?HY;Z;Lg2(^6i1GZZ`b#%kBs_Y=2lOY-G&Xn8L=fG=Rl%1i&*hiPYrq0nB)h%+Lykr&!&yaeMA`t&(X#tuiOg&PBg(T~p63 zFK})KcuXxUxelx=>m5)dc_;objL%$YiH;jfMYIh|#kwt`meCe+I*~>kAteME-$={K z=--Z%a)=g-PBTLKxEW#Ap})^b?W_k&{B1z$KEvl^b1)s=PKKKwrJJ)Uz`1x1@bGjp zjLhd1eU_;4f%!h~(oL_W4a66h>k80?ymX2MyY%+|_y!`zQ`Mw6vDeoKKV1nA>{1ae zTW(*EEHX9-?LBHr+eT9Z+e$Cb6Z0DMJ%)V@8aoucYl4EMD5eN+vJj-8Li3+t=P)(U zb466b%Hi>xU?si{st6XymFWekAJB1)7ETMuK{Gy*5QxbhIF_ZS`JvD^Yj1qk?P{4Sg_|7sM?`f)@!#Q{BlP7F_C5EAkI4($9 z8|sLGQ9g#YfYAR6-b?A4O>zijtIn!nY)R;)Ugt83x(a=N!>OzJ&L7oe9}zXX=Q5-k zM4`qUGXU~RBVVr|@8wAfJgS7-A~clW9X$Qyj)hjhWCzfhJuPQ+(#}0=l-bDp>(A{_ zyn@L~>6V+^qWSf;t7{HvtSElBB|{0dE_S6p28+v0-09vdz6%YhK(Y$!T@40?`#sH3c;Q&#~NNVvju_N?vGwV#IEdJ86P& z2EJSufzF^&#{~`az!)&D3!|!~4i6pqc6C>~nkFXbiPlbBVq%gHK7(j0Ra#Z6-5;6A+x<-(W3bCBXeaVX&=iz;0d*@A9fdUls?1~C;_qe{guSE7Fl_Ph z7k^ef)o(qq5SV*T1->PN`*sLs|p7BLuW(!58V(N{v^o8sBu(_+iC5 zVsCqqv-etPt*7DR%Vh@}_d}elg787ASBUyl#rJe^a#_4E5H=fk&qqes} zy+cu~m8?xX=OgM3mg097hATk`(3tM75k2q*($Yhw?mlQV>7h_O#Gt)3hHJd{ zFgWPozKsl~?E-Novt#6elLTDBS4NjIToo67v+hUjaY`#fi(JCUt*RjOn%L5}Wp3j40xL?97W z5xc0%B!Jv8Vfr9mo&`0CT+#(qucgB|C!KllW)HP( zgsRn@vo=yIZ@$zwN%P^GR;pV8TP|(Gag?+rU<@7m!;lbDh;!=3ZGFDY^3?(CG{sQ3 z?LYKw1J-pEtB`a1`X4~npHB#T=&utA#YZh4oIx8^)?|Sut(&cha$!|c6Cs#ov&*}#-W(WMLRk+9nVOu91Ny% zF-h@bm@n{JGnF}_~IPacyNv=7KSe6c;OjiDz(@%lSNVlsTP0YbfhSLAqj$Bsq<~*3>0g!g;JbO ze8)xd1m|@|IMt?P77AAS)wtX4BPJxHN(~>_`&6R;~C(lBix< zKCxU5U9PSQS2R_nQ7(Y1Bw?@WN>aLL_ZZsGr1vaXey;(=KR+NKCy{efoN{+p+sZ{D`+rw zaLt*+@wG=+vz^(z1P(zxD8ub{!cn2M&TyP3wOkCMxRi?y?ekeP?)tnNE1eg;AZBnG zzGe;rBEv$`?2|gSJP??qlwg&b0xOjO9AV?fC>=zG6%d_t!hPy!BnxvXlKw#{%IJ49 zvg%;&tEs>+P}E+aSMdpC4THyE5jV?XmT3{E__iyQx)rh`Ji0tzE3a8uj)EOdTRM|4 zx0wtAHO{n~#;RRyiR>)P=Ru%0vv3^PtVGx@A9gYQYh8`>5?BzMSD2}oMXeXmV`l>+^hv9)SoSs)T{`CLdA2XgI> ziMD0fXr7fk(X~Va_J`QLmXFS#F96VGHmSB~w5wMBm%@wAi_AiL9Nlh5%BRXkJF<B3C8|LvQ+RRG zSIKEvVjvJxlwit~6ipH<&R>n6u9nQAqq=+|6D=<~U%~w0+|w*1{EDz6xAZ#&@y{m0 zGdsxxBR)95>vp`sBu``K^j;C>4RhU-Pl-FkXxHLr+F{%ILUo%}^*CIy5j8mfqkaLh ztiay>M?Qfs|L$b;T!fiY=bXM}BhcMuhFOuQi#4|j#AuSyAx7h;E3NV~+i&M$-k3!H zuKl8nd58ZKiU*FqW%ujKkkZGt$yP0l#km^41C_e%{VEvYA`q@3!mYV8h=QeroK1I7 zxvFrbAbAQ!F|{pcvV`x%SnDw&!u`EHNq^ONINvts8LD`Ef3lfP{&ktjm@I*3)3U9a;w-wukvH@;B z{7|tM1tUV=B~ayZW@Mv zl{LI9pXV?o^1>m30G(UcFPg3| ziG@(vxEX1$j#ZTnS(hk4&pgWoC79F7aq$L(u#FX3x2RVc{Nd@}WNdx2OdYj_cg$=m z>SyZX;%I6<)W#V((41S^{{sm4J`S0-(S2%kztd>D30SvYs&c=Q)*OZ;a%!W}VaI@& zeud@qR(i|&q$l=ghkjb|JuM3+l9qiKm`vZ=LvDH!jLyrUWguF=NC&E7434b< zm35@K~Fs058N^Nxc_q^rbOvHw!F&C{pjZd<3pdVLtri!dq*^-v6ymvD9kCd?*MgtU6IW%sU1Jz_SECkHk@VfR z5DVi-oHKFEnC?#sjcrzncP3S68tZb6kBB?tV4TRcv|EXOJd7chkTkqGTONUcSZ9Yv z?LZ;gzxBNp*x$ES$4*9=3jra57H8UhJYwg2m|RDUYjfFk`!$=GwO8-Y&j;`Fui2Z1 z#5^N*$rXH>uS)ms$5#Uv;XPn{vgurGv}tYblqKtRW*K#biReA+XH|PmeS%2mBKvOV zzU4fV_phg&OW^yNLC$X{->O3neO~AS$+Jvu^6DTvTKn=ydoq;^dw~n_+06NZV+jzaXbXYHsAvNy;%Z90g4KVV?G=Wnwxd zpdPAI;6RmLmm}+cH>|HA5=T}4R)P0yFrw+VaX!LJ;UEL54&cK(cRwCxcdb56v2H^!w#}mRG9k(p2UqTCsNNxaB%9`GlQk&32w8 zOU>yICiu7^wroI@Qo1{j7oT*+!bxf8Mpz~p1^wh+dQIJh=-(*pMs~zFd*1J~p9&lJ zzjq*G8^ewM>n=MOqlfc(Gfan*y2day+ZesnQb$79;|P#_+8`%$nP={fM9w?R?*g!{ zuvaKAmtU=7st$r-*T`oE!x)3DIU;}KFE|Dd4!B175(ZXhp3J9woE>!45l21~=<8c> z?2!|Qfi)>=;Rgh9pA*5Ms*oIRC0yiLiMgG-g0IxCCWGSONAd@(DfBZ!m0mJMv2zeA z*TsogC<(B(D!P5`?=@I;_Fi1sw=sycvpOqDk*u`}W`N3DX|$cu{W*{GN6qJt(5+<7 z_P6nZjm^-eMqJp)Y2s3s^~mt`t5I2i^5?OH+~SgSPND@JkTcD< zB-~XH3YXfVo$277&cL-mIu!AejzI2o#! z5a;}Za978a-#O9!hG@d9oKkt5@!BwW*kV5W7Gk#Aze#j^?e;NO8UXc& zMdIT@@B~9CWNVO2S}1?i8IVj;zvJ_BpW*TsYt*|~P0{-}&%Y1nTqCT^PbfS$6#SHe zdlbAG-9+%uMak(mDgB+3J0DTx4;#6^K8h~XS2}}+@?8z4MQ2}Y4t>F)uMqlGV;Pw$ z>z{|SGk=;*Z-4S$ytQ3#Z@yX`C+~d<{z069>1)>c%;!q}ax44-?zzft$7{)Nw^dc4 zn}8et$h{H*_=8Y|P(=ZafTq9#uT?%kgnxa)$4KB`^szvt+uP?i&$p}dZGCPFoZD;w zr>+J@j#^u-D!Mf|dKhm-kQ<|F+TQR}~1lZ3!R+b^$F-*1aX zrScSnXx2CHkcXgA$MQnUGZ1UX93WO+>cJr2)I#puylbLCy4s@??`G6R%Xa{HIzHov zdFy}E0|%{d!9yK%N%VjL5VcuF&On7h1sDAyaDyPzO!?I&PAR=?K|#M04m4*!gkUEZ zR>?w>69=}*Vs4`JNVyYHdZ7G4DBV$2UYmvvr%zN4`?mCL z`+1e8FS+@jIQ$k}IZ1y~Fgi_tR`ovIAC;b@9h;7 zguVa(3r$~tQKn>ao90H*3qz?f3hD$?(72@9pv9^-X$8Fx%<$;fOaK{v3ynN*22>a| zpCC(Z82f2SS&BLR&cMpx7p)x}PJojIssn*CxlVVDB9Rl=wRCROLKlCgQ~SHfT?p;( z8%x(}V3gvAsIwryPr1gR%_!U3;xIijihd4^vRg*FXBboLNIc!Kk!JwXCL9|^PVT-x zF%~g!Bz9u^^3+9tK$j+ZFHgTkANCjeP5Rg<;%d`pj3w^>L!%s{n?5({AU`Mxjo%oB zl@GlBP60rier6PL$i`rFzN5sQazVX-7c!dY=_8|bzDMNywZ&LjW5O6U*`*2g6s_c# z#+Vf7C6#+&6v-5z>Y^F;H3h+;@M^1Z^Mz*mbBm3y2v`hb`Ze_wv(lvBx0mkg^a}zT zV=?1keqwU;@K+xKOPc0dfp;(VD8$G_bE$#6ufXiAw1S5?OaQIi@~qQRD=Xqi7h3V- zZ7IFHfNt(;Rn(AFU^UJu_~g$8ka)Gsq|Bt;OTCf-jLN^5Vex zKXEixS5p@Z-MNGcuF$Ir`eUCVq;&Z#p_4Qel%5~C13*o&wcGemqX{IGHo-kd>Jk?= zah{)WeC=6&0;ErDYL)NVT)Q@28z9~0VtUoe|yw?NG%2d>17()+K|;>(fTvZDp;fXSN?c=VC*+#qmRsJh{!#&MBF5fC#a zmY|q@OQ-)NMJjP_hR(n@>}MafITRW1pcQEO6kGGfNWss1Rw&3YtLFWIlDB>EA*h%YI~^+ zXt})|N*Exzi0}Cem;I-*nsF7oz}J(_dvRhb)X+TL3rx5S%6eIZucO6yW~`z+r24fNxKWcvcA7AY|ZWL4qGvyu+@U7GZ}S3&ce zNLL-)y3iBECh5QLXl0^y{vNIE0Khl%qBcrQ%-^5(5!BwtN^E98(WpppN z!GMBHuhDA&?mLM{d=Z>9I`3gkad>X)!FQa+W$u;rRw!gd-4!^Zlb~wTsXCTluny&e z3SL{qf~*nx1A~_$50I%d-D#HET@KUKg&Z*j!hGiCeQ|kJ zSTs?cMFEsHUBK%S5d6T)Tdy*kH&XW#Q33WJxFcI!uLhU7Qw5G0(|wN=j);$cg3&Pk zBS&Q8*qlrMks}g=`}utSx&~zY-NzHfQMTujP|y;b`MNkFJ|6Ca(JBwzXCIXrJgG;6 zHj_*e8L3%-Bw$doNs)5~Hev27qstWMo`7YinAX+R}BmYcZ9a$Ht#^2%j!G5NXnlZ}Gn z!|9^%9}o=M1PALsaYP!&b)Ucy)<=*wqjR@+`Nu0`KG;}aC)TgDkIC1dg&5v?3O?_Q zlpSgG)#jIlHdc(QsAy^{B1XEx5jn4runUjd$}x&5YzuC{)}UC8-n#*2U2BZjS_H2C zIE6kLvn+*nKGkX`g)<{>|A3=cT|!9}(<6Yx6)dE4A=^PFr+d1D}jpRqP51HDv_&#kQnxsMH~9NQXr4kO0VIEmPdsmU~5 zR2BIcabvp3+*r=DvtpJ;F~gA9!JG2T;1NWaejqR^W-QonvubMsl{ySj+)SB>NwQGP z&!ss@8GIk9Fr4#a$C@ccOzw>dlqJ! zatu}J2b{B-!6-42IO#E9gO zH((+0IHtyqiuErqxIyrO^khK1y$ycw&i1ypj|XgP(t`B-Ik__-IG@=mJM%X&cI$-R z92-*1yE6`I;)_KnAW7km3KIwCLRu=u6aA8aCcE;n&6WJ%8*piI$c zDdm%T9>kQ-s`RX|1BeaNsj6F~Me$dKoYxr$xcQOo#stK#OM9leLyVS(t6Zb`3mxlv zVyhdY-qM+qKr<(pTG9!Y%8AZ55lhmV(kh|j!=uLzM6S+Mi#)n;Tbb}*N9<>vShg9H zqft3RqugT2x?Rob#4wB|ck250o!?#K>b9bo7i<#Y66tLA#I+ljHqQ$JzO-wpi8X4=}BBo#Hshq7j>;m2Gn0m1T77_*;O`$ujG2=}rW^O7J zOQ6SO27lwi`5IY3=M6f+0tu`9R1{}%f(y^`L$hy#B-VtmqhRf}B`-FBHY5A&orVG@ zocvZ$gUKh8<|0YtYGemdA`sTKj01rud=r+2og~dNGH#>yENNW zA?6zsarQY<+e5ods(><&?(v6^G6>?q-&jP$Ms^HyJAExd!Tb#jwd{=lIC4%6-Fn3Q zm7SFZI^?m^KyrLb6`#_Jy<0%Eivy zm#x7{%!doRGET~!iauO)pu{UXkUtK>D66*FK)WS0JdpGvpY_UIXA}us zFMPm8^r!KJ2K0`z-@8X-&1b=$IlXS)b%5P-zxUnmNACB5`~BGcZmbK~56ZXb ztZL#-JD}4N1$WjrP`?k}Z-XDT!3S;d<7+l?>kg>sC3stgA&C!9F`4}#fB7UcPhxwd zN+343Z+lh#%3*t~D!1;u0^@~E&oXGTCKf5T;Iw&rm>$wz2OYmIQ zDVv?9etY}{AVKv!h%%={HT7obo0kB14l&FF)$Q~RbR_-6 zc&N2{^Dv(l;Kg2qU%GHI^EUwON;of==v+vLxbkqyW+23GS7Z=l-AL~8uT;1o9;j@j z3)#?Iw`<4joz8><+L?`s^3$&%`#)0c=(5nH{_`J3fWe0^L^zFHF1=fvAi>zs`FU4k z1kKvc;U}8@j#s|ovtOWudsnO#RS_XC=ue#yG|nbQl~^~~Urih%LUeG`;CRadh|VPI z%9Jbxy5F5~>L-+gcvNuXpqo43#Y40?ldCXoC*LbH)L#dN)HA9KiZJm)%_S-(vWsK> z0`i5$?EKt^NC=ncuoUHvz4Q9;i(bseI_sq|@=|+Z0gN~j-M zB01D^pwijqs$$u9t8I(ed6pwCm@IahgXGzOBRWkMCR#8Mjh1B-zjSbmCRE8L4tYuE_yDeT3ocjsWIm{nhqwnm8w1xQr7oLQO z2tq!hD0hG^(uMI3#Ru=aSMrONRS32$r8_GRwX=YSX$@+XutHvPFo7NR7k;+IX!EJH zRY;UeWnZwO7k;lC+@bt_ON%^j?lhdA3njjPp)f4Ubvh24QRtXk{^Nrv=EB|+tBX2b z*2hX0$lLQPI6jCoPkpScT&URf0qq0ceTV;ICxwex;9Z3EAwFFB$}uV~G|xRqOlf?$ zFsQ%_nt70W3eO?rDC`qGlzS#MKBSoe<89jiuSW5OgT?!9QSLX1QWlN@SLN{!&K+U% zWWng)0o`{7^h?MQ!s5bAPRIh8ZABWZ1})sRh+LUwg-5PHsZ*mW{_FgpUko_l{Iy*x z)bP5vFAEuPanQLgn;Quo6>jPjGd$CcjSQ97v{_|F(i9WaV`~*v?aa&R8x)mAv~&TC z##+HEv;Uuh@rn42nCLAw35q{-@n54Pm(b-Bx>5gbeI58LdEzm6 zkItl0Ow9JwlL~TI67Wp05)>yfGnc*VD@PY7+3f_YtLTD=-?|kgtyX-#sOg`lpZ9Hz z%H>bm`a!kGak5C@VAB?+ zD*{2P3%!1@Z*oPAc)ASWuKj#l?o{=fg_FDc}Z3tq@Pt@LZ(k?VzVT!T9Wu)!`g0&>foz$`0xM zJtPhv-f2K+8}E04n!g@Z0ZfUD1iZTl+c5nl?#vUKz$s!VZfpc9Dr`|T{l=MF?C<5 zFw9Giy-E)azqZ3)4SlQZx86FR2X8Sr@|1Z3h2tHaQJD^j2#ApI`DOxR(+1nE>583? zY)hG=Uxq^9v$Z#9q9?}l`hLnkca_+##Y#u>f}yun5=d=kYwZVlNZ#h#DfX-&On0SG zYxa{fruy(h7T`T9_MRfU^5vWvYPIGsh{Q$1Wv0PH0f)iVYmF~k_z3mf34d%P?hGsd zogCebdK83Dm}T9MO=#rg01-B9wgS_)R1#UOQ8tK*Nb^?&`IJO;Bmvt$<2lkqb>|t^ zp0~KR@4Pywg~nJ5qm!ZnUP%Id71e1Ent?TL`<9Pgdu>yBW|L^Y?38HKeSWCeBYR)@ z%eJ+-lXEtiy+qK(FPx`Qf0&KL!{>;(%LNEM#&srQEFO7L-!azFRKH-YR1+_ z^ovG(n4O2+y~7Ro==~3ysKXV4{^=hMnz{YixX(E`f?7o6K@&E4pA%R5<(8}0@Ao6&QyHxqC zNqh0s*7J&##LhEh(fIa5PtcRMnDKUH~=qy6G&VJjCsF0Mbe`C?4xeuq$5|7Cd|RZhuPR$LMW7U;@ z1p8W89oF?D+A1AfjqY$(0``|g?F`hhUb{X$f-lrYipBj#6& z$-auiNgfKzySfI6GNrTrT)K!7`wkf$Azb!ZNjtun^2zuqn?OA1tT0vsbdnm|>7=#9 znABh}&;l9~D6UPN9~9H`^Vh&86d3=gayGRCT7W?LoVA#Rdl;OKa++0$qx?K;G=|Rf zewMkRpbA6Fjyhwa!<=Eo5+naRD1ZVgE34dVsZymZ^{H8dP=(wKs(l$JjrJ7fNH6u1 zHJL1EI~ibVYT^ixZ7J_Lnc*J(PCk#llJd-&TnFgH{@tO}b1H*76S2D zLv7{tZp?30+y^wzvD%8HdRkz)Jaq|OEBlJI;0f9q`81b+jBW-n=UKsn5;19s+RMyU zNSBP?d=6(NgluNLmtp^6PjU)Ar$nYz_Gb;699VkMG4DVA8JoBz5nJFclfH z-+9x%XcRQ;pzi@AMOMDIZ=G4vkL1W%8UHL|4*Yo{uLoHmR6i@K9FQE*1yuVCt+*SG z?)9%edaJ>f^6%Id9berGV$5UQzt9hki$@b`W6Fl%A0Hf2+I8nZtATtL!wMQ_IX2?-v z*Jp<0Gcu(I>!D_AM|@H5o5{(yozLIpRpTvnsgcqd?x#gl{jKSeW>7OJaxPl5JfBBZb9^{-y-Qz+&PvN0$Lp zQL`k7Uj#35gLVM$)kvx%-UqMl(u#ZC`^X zo|VROj!UxBuKh^$?QmG|;pGY|naMteXp1-eLJLkwON zGcS&M*15@L1({|=$SKOv(+}sFXcQHw@8b@$(myeOz)db}lZbh@6d%XSMMD;V8+*C7 z;vu@Rhf7?-qlGLgA@D{02vf-iQL?nF0H}oyx$4ddxNb+F&WTKmggqqS+#r!VE_k)1 zG2Bx$#!j`bg$}4Lh}Qazt(2(WgBHF?Ikwc~W434j0jld8e0SdD)eY+;EoxdxMKw~< z21XCJgw5n^5lOLX{i_D-G7Z=Q>B?_*RwOuujsrVz@`3Cv8 zbcYe1ZG^J0lI~WPFFs%P11r!a#4RIeapaJA?^^bNK<={I+JnQ=RenLMd>I20M@w5& zn;3o$H8PM(sdOB%ocSe6DeGE8^Ny5O!Ay#@5He`1X{zB zn5yVzjp$_zQv%xML=sy`w-w#R(SEy$-5ZKk+lhoIw%wV8=wRS{|7Gx= z>BxAEj+kHUVv`ir^8D7d2pL8u8{0bT3*}jR%)Mp9i0s1yxfGn-Y!cpMI$e<^P^dnl zVdqMh&MFeOSP7&JCLx%^ClJ(lgLB&k;^-RiS*nAatV4DX-h}{8nBi}yYkQ5@xBmabFuodYJUn)q;IZ%a zF}}8-rM@U7pZ)G!yjkyfT@w~MW1X2arX}c9O{Alx&W&AO-Q?wo-<643;atxS3e`HP zYubFbj4!W#|F!iANLyigne>e%f&&AqDpo`e7nW`IONZ_IiddA^ePF=f8QF*e8R+K@ z(@nyRsL!wi3qGkkL&AOzx*n9jChfjOsoc>Iql-tkP8qt|os>94$EkMA! zFV6C;^YUt^OMr>@9SZjob;dS@>4viIDAFzW4F)_;Hb~Y2qYe@kWFc%>!p|zso*(8K zxCE)@#kEwVmRONm(yD2^+HktM>f{*q@$rC|oPm~X0ae{9p@jt|=t<z>hOBUSVHM*xvPCgu;3{9aH~S%IgJwA*C(Z1jbd&4llc}qtZY!um%Js@! zBXlypdH3|O6)F6Oaj^Q|$*^!di=4pdZkJpS--ko~VQwgF+}|#_!NZ)Bzi6lDo_lHU zolY4hRvB_k2*(WtJ8FD}%!VOS1QBYrZtymSYE`K9i}*}j&~Qd6m(3hMuO&`IlPki* z;4+rbxAix5SHj=6ZN3%S3BfPc1Y&zjBCvi#lNZh zX#7=E zp4NOT$MThba?Hi}sJpDiezgB~s;$QRai*s~+lHa4%q zF?wwKZ|s>#v8czpkQXz(j0UVm-}X(sVdH_x~Z)Ks;eY*I0vJWN~Mnk6WF5g$s|4(wTbi0W(V}aCD7m+RNGNR&o&cff$E`?Fzna?LHVE}T zT)jb=s;e<2DY#=}CYrEXngnk3SgTbs(R`yupVi0l`^-v-j#LE|KZnFulyCy12|<$p zSHe5UR!wYHG*FqX%t1|4Ra45bi=?jBn&6WHz9ieZIpS^dh6lik%RtLR*39{3q7MZ< zo_RF7#Mas%>e0Vc^ReNg_2Q~F@8qIaCd@{lB1W(xM{re9e^asC4t=+l$mE&h%cfe` z+p$Bo3R0iIEQATG?&oCYlEYGko^Gv1%Ukms%u)a?K+?az;<8pA(T(@pC=T}Tbh4?% z!NzV={T~FHyZY4@IYQ2p*_$<0VU*(b`pKinl3NuKuP+_FcdGp}*S5N*;dCZvrwd)j8OrfZ{P6XX%1uQz zZ-YTMdxAP$(-9$5~KIU9%MST$ePK|=bESut31^`x0xL&ZIS+?!WJEtc(wSGtA_ zA^*nHyxEIKU3od+heNH(6(|<1RcNP&yR$eFmnD6-HM{$5w>Zj2?R4o0trFBZ(SdG( zk?l|+;bB|$XW`MHBLT;GtB!-AbP#KUv~;j2x*OV-;f@O1R+@6nOe#yUdCNpoF8QNU z`U3nyKeDc~`w}&W@P%I$n7xk8oJw*Vv|FkVku-NCe$(no7p;)hDyhj~WS^Xw%f9|3 z_7(X+0*4a#nFM|;fuBg=Rs!Eh;242gz<*v8!13Im7WU_Wjo5estBZU@Au0_j%}Ulav2s*??s}J;a`-sw9Jt>VzHc!(4E@T z%%SQqI1|~}ypTNfp3pU29K}2Y+*%xn{n{m?$;h%AC3^2m7aU^M=VlDra&P0_xvS8! zSJ&5zy(FtdWRKt9urIFp6Q9N>7tZu@ZrEDCCyz_b{jMu8nZ~R7JD#u2-FKQ4<3@+$ z<}A&8zk0mx1Q#S#7mh+icUkE!Jhe7+hNs zo8ZF1esk;KID&G=qwYHTsKavCXMN$9GrwM}bJ5oOggQ5r%I;H3rHE9~w7XI!@{no! zT-pVTDR6pOhP$|4<37|f0j%<{KF6u)^=XsSKk4x&=2$ung!w%2jl5{I(yG(!Rfp*~ zT8#TU2qjqWIl9cASg0|A2?3doHkaOlGX`^9#w=v7b=&!DS2n3Dd+1ZlR>X9FC}Ns{ z;(}gp+$qzG{RYVVytDiLj{Yk&Hvn{RLM0QHlz73nR)=V8)@W>bw6Bt8rt4~6!J@ow zY_4m07<0XW2{}6G0idsB{=)zycrmOsyC6tKreIZ1!74Zf>kU&NkPnu^fv=Zh7oa{W zB(TIfdqrq4M>qpHz9I%8!fTmhK&yE^8jDqIup*2WM{wSVT-3A10nK0S+BuIQhaGLQ zd#(lka{LS@r0B-B{v?m_X+Ee###TH|ObuIFkiuD6 z%Mta2gErcJ)Tid$22%N(ku5g|%qGp6S0q_n;Ycd)$iPo0m9iQ)ypGuV+$2EIHd}v9 zL6(`WG{)ztMrltO7eZ?jVdQCT`UM6qQMaqg_lA*03|MXO6HW~s#tA6Iy#J^}f{P<`|vA)h^ z4abN-i5nqNg!N`4qV6Z5gianX^skIQSoTk2DTsK$!23CjPC4&nU8=3ZL-Embw=D2g z6UmIufMjwanKO;D8+D&;!7}h;Bf=rG+gl(5aC1TSbW1DIuxCdaL@sz8*=1>jOm0-5 zr$3^G^Z##m-T zc}eD3Za8Pyf0aS9jl7+Pc!fqQtB~-Iqems8G_FaMre3z5Uiy1SZZs-v=7~0@!!#k% znC?h#Xp^g6VVA)@X~&p;S(dRb&i2UfMs@60lUvm^&brK-`Zu{xdFSpz$E9b4=!}xO zBL3GqFk*=5>0I|u&)m1)Qe^PkZ}m$oY8Ag1-=&%?ZO99Tr3fdZWwJc&Lly&Q^`M{e zccKiMx$kexr7A7mq5BXLmL4GiSPbf`XL>o*U*&gs;;_@Ec|aYBXBA~?$35r14m!7R zzHp}Hqb7o$o}Hxy949}c1-6!P4`XVyppw6~qK_+od`+-)ae@Q{8&@G>EM*1D7nNt$rfRgkfz~f#hmq@6WtV9JWL` zcBq5WH853IbhcAPu2Cqb7q1+0jS6Wcx?cXenCIjEegzU*PAXu>!`gVk2@+NJ zl%iG^C>P)0t3{jtK)YYVf|dR{M{k^I#i#RdomL8!+N7VStw-vAlXjetU>hxjM@F)_ zC0|Kl0a5-5*FYr&uJq4*2#H{HSa^kOuC|VJ6o&>PSARLrKfAvR39(L31JR_c2IG$1 z$*mi#Ee=E`K1y!7YP`MeER$IyR9-QO9-CqMGZOAt$1r)K3nzqYY%4ubUpUvU&44bQ zUSgikS|{(e`X2gYO?Oy*llNPFfO*IATfZBecrg!I(5)HgE65}DeKmx#jtTnZN+E zzEDrq8_mUjmO$lyFFX1|J6!+bD$|sUI-_{}S&8vnPS4(gM0;~J>#0iGY@&>vMpTmz3;>8utdEp4XQk1DC% z`#s10(VDf%3Jum~vUM7>P0XFO8A}7s164=qnSs^YxXp_}^`df>C!wB09Kbb~#J-R1 zon7oZf$-1|M_~za>k6ZcHVB<8q3T(N?5D2PEOojqUeoUGbfm3Gd;Jcp%Z0>HiFg&I zh#kO6yasC}#<$Y29Nxd*mdzqW|5&1j{ITL>ng&z9DFbBD%Up1L&wR* zI2zw)y2wNOS;WLXGx7NA1R1mNSlp6_$K{qRIvC2*G_J7!bMw>o2I%nIeExyNixl#t zHpu=6Cf9FoLyikA2E8{B4C?f?SmNRp>TCf8dqA%#%i1h|h4PwSF}ISQi8!cZz$LVi zhjk=&hmHJM9eKssW9)Gqd!F6&BHBIo@!0SlC?aP6u~W(XTxv$u-G={YQKfM$%~enH zzjBT1$YXZx$7vHkVu^91O~6RO8le_TFo9bMd?SIA6A3+fREHQ`BB(n1>`0JN*xgt%~Rsv((cY;WAr9)&@iYNZPACN4C84FGl58nF1fOzsUvXafuK z-5XI~m%29opbiiKdWv&UF86iMIlmuvdX4Ujmf@IbVf0GHnnlrAM?dK_iCu-kNB0y! zk%>-AhWB6+LW6;15F30rh#2*aiF%{sKDBW_F>xI0XSznjC4r?ZG9hAY>U%xAz#4r# z{m8e2`r_rq(As$`n#4u30-4TTUN=1sHyulRnCx(a%4uo;qs@WoZUFS-{;sg+ zoe_Vv;j9ll?Ee^mPkQ{tb;*7w5}^Z^#GM!`t|ByeN8DPGbt*QZ2! z&MZVE)NJJ+iE&*&gr{6(Nt+rMLcfJ37DN=R9kL+(g)c?|{pgn9iKt9Ft7j2@cG}PA z=G%#jkk|7p;Iy%F!l%0Y!gRBa722}S=n|-?PEFTbxm2(-%3hPNS9u1(i)wuS+6V}fc!0hJWM)gal zD`luFZaLYKoT|f}rmAbA>S-c0#GQT>KCHX&z=ehbjKhxw4ECf9^`sLR+Ux{rRD~1W zL>(gv1Zo`v1`Zwf+8Ee`CZyGZ0i@w^IfL~Zmry|bM2s7-1iFI~444wk`a} zH<(oWJ=pC2NFGys?=@a;jp`Axrnxk%}Oh5CjG0WoX)|I6*>8Jw_!Hv38jwY%knYkjR^^azUHtcKbepEXc43$AI+2MLLNgabf6r*u*KGO3r^B52sA1I9_i=8ZP84K6h-Q<1%%QX#{``RlmUNc8n4so87P+&HP#=qydtq5@RsCSJVz(S21U}T{sM^( zNhz+uwG9uyA8d|}f!G>XRC@N5w=~`0b*W#*s+Iu&UN0Wh4A6dij%pbR__8?XVE4=F zBYe|^wH4IuI#~c8(HHcG2m?0XgxvW3UvKn(C`98{KPuw5WuO(EC=tHRpC6P3HOX@P z&FSZdf1C96-@)N$-+nUr+3ED~pA-F!UmF#TKRHHcj2E^&L)h#Yl4j2mGkcmm*fYXq zdvq4IXNePW4CnfKI;6|{dhL(~8XFMa<-%yu3MTQMPV5wzh-wiKt;bOSq*MJ8kez1s zp?^|w=@)qM-!6F3ZPaF?H6+J~={IvaJ3dDV`r8~c*B zoV0^QgE2(NJ75OhqXK1uoXzFL2=Q3QdK+&nyN!?A+35fV^7UU|#!AYI1yt>^Z@$#s zZN_5==|Xp7oY7P=>uRxlq%U%hCFX27V&v*GsI<{2IwSF3qty1{fF6*&^F2_C?g3b> z9r3_Z%>%USel6kTk@L~7!wA(M=%Mp5mauD4ci*7__MHd93IX!5$URlo`oaTb=n@+~ zQuGa`c&0U$o_@|WaY$gy%`E-pV!pgC)GUF?$zkMM(Du=3-(xQk^HQyfN|iFBgqqyo zW<0fn9&8I^Nb$kmp>3lTM|(nF82Q@c5e- z=Ler0lT$0#N3_=*MAaeRxyq`3n3-Z+f9Yo^n_(bDgwJVGKFYL=Gq4720icNe#;A~^ z&`*CS&AuZUP_*ZQmVup{7vpJ3yCH@iIqiIMP=%0-{|z!jE&R7%5~6K)z<^GhN^2b_ z60-}%_IW84xC9{B3*gE-XqFRQ<)oFS>ax73Y#@${gib57C@vDQODp}tfI_6PDx^Ct zrj|4(mOxcbxY+3TCDTK6ze~6-yoKUQn~Pu5LfdR0*=8}7Gb@E|y6MxR%c3j=(KMxk z;l4sNxnSy7Vn(qk!X7zXNza2REjp@|tAWp(m!oY@+^ma=4d2b~)kbVZQ~-G&40v8> zyJZ2eFAuzI!Lpv!{GiXHRUn6pg)iLA0OAh6CblNoqLo1iAo;Y(WvhI;vEGq*UsxOA z@_`W%R`}@>UlzKyK^@l+G&*`>6SA8+c5X+dC1b5LibI0_gWg64@8UyFsNMG=yC>K= z9ykFLzj>dY=6Y#4a0Q# zXCGzX>Pax;woIkb7PR{t|L+GxWED%=q1$YQzDiq+hZsZxXxZA)KP0|=*e_= z@!poBFNTzU52mVh($wDf7yA{9E()oAxaRWvyKrP7D4!Ln)#;Og;~F!A-NxE7V~j26 zn)K%lXWlaVzt(rsrbu4poO2l|!I9{Xkp#bod|`NwEj(ko*ARmtuJW3x;eO9p`GD3X zke>1g$F>)eoL4kwFhm}>thlEBaHXtvE9w>wj@6_B;au>dtr>;PSxC-2U>Oj*z0z)f zsEf)=PjGg^yZsed_}Aoq-XWj z?Ijv@Kca~1gywx6Anm72i!2@~xA+ZHX-+S^$to@G>y;Jo#>&ec1UWb< zMlYr`Q;lHg8kUOnl-zlCRhjkl#a;$Ym(1SLbV+9HY>11`9tUd@XVHzOADIN#VLXIIm&s>v-*?@yctYB$>9%n#hmmBgyw zpNKzOEux&&7E!oJEck6z8t^!+w!Im%7HJ-Yo|#Vh1}^LJA3ziku%r?uf&@v5p_QGD ztkCc2e!y1m?QI~kdJS?bY`hFb?_{?{O+Ci*vU=fJ>b`|dw=NqaSZ*=pGF4M)ZBA1z zGwn{SC8W_bhcer)*2_XcizuFu`>4ztA|8TkIvfY0!D;m`i z(FCmWmU!!505^dlcX&-V%oiDtS_ZNUYEpDLpYD*VM!3C)m;;2 zGI74&$HUhd1}RxuKG|H?$Q0sYFqBI?D~A${6m4%zAIY&Z-o}c7w~OYIk?>xIo1a-G zTkY<0nOXNzP|4Od7Rx4sm*m|hXInalN);Zi&eCfm7A%%{+YGgRANs&9w9C4a!Ie$j zAerxB7`IQOjn4CSa3)CY>b=Tqp19jHTTt$YYXX!6$4F1yt?QKpGuZu*A==yA|>snS-E<$0>^JT~sGYdmT~w5&agcxtR(=?)obf_3%%(5X8H_0i@vKqV&LeV3qp?vq4=};x zkkM7^o3j|1Z;4pRSUJ$}I9=!yBW~}k5c>F&=^fZL4VxhCSBZqxW_zsRhbVn|0Mc~7 z7B{ppF42>->U&$(I`Eut7_?XL3yiwo{8+crZ+ztR*F_8KA5CtJBy}*)@vHm*xz+~=GNYUkWz2*;{EqNRYz$Pi~@qS?rKS=)dSCa~@21YeyY1^~R@zGp!)UYM5PxEC`uLTY!;v z3-C(6&T!AYpCNCgbyOX=u?jrKecV+q)yk8%2|5TMrr;YvYTpRpO=GKng;^7Jpg1lm zIDiMG^Td8A%_=$X@ICU%w28MGv~(`D&ysT`DX1*e4JF+`fP%-<#FJnd8E3rkiX9wq zdqvO|hFJ6!q^%t=skHWbu=H?I0rsUgQF^CRuzyLGLWe7STMBE#h7wbLjJL2mgP`A| zrNL6jL>3@mmOz+FTtwrbpGvLTkia6vI{;K{=6SmJPd4-%<2*~M;eTyVh=67 z%+4`aC~0Ngyxy!C0Rx!%i80ob#cxH%HxwINloFjN)^~rkypYl zVKL2^W9(6nx}5KNe7XlFr*Y$$D46N@4|#%YzefXeu)R%Mou6NWmre^nRbGr+^mf2` z+ZWXxU_brs;ExL}B>z_SnadS)sv9Cpi1`-@W&D{XQq~>J&Gow;{f45O+ijs~_<2j* zj7w*v&l~NKKmaYL0~Vf-b{!WPH|mBIP7RGnVuJgAvpR0Q)1$7X5#$n$(94=o3Xd<$ z*<{f!sutS`>APsInU;4~O^epDTRZp058|T;GYNOHO_v=mwl;NbZ;@@%IB-CQG#l{V z%6IHdq}*mf+91=95qc>;(cSG=r^IJ1j;yPU-)52kbqC>zyrikrtF8V z5(J%Gy59+U{m%YC^dU6G(N6vRpmTyIKkB4x2CIQnP&n(?EafktE;QjuCDY<4M&|U4 zd)e(P5V(XpL~WfMo?gg)oghXE_Zz+~#ajK{p3|ahc4KaasV^GnNp+(^J$-!CEc?jm zggdQnw0~t1*3N@QcAwKD($ZWP}CLjS%aCZs5)3Log@AFHj02brqy8F=j z5~|Y7x2mSHPT{ABm{t>ItZcy-$ihy?y3eJioA(uF9YEW0_qD*@4;rF3Dr=q00YBE_ zhg+YX+6zsYrgZCa=Y9K5x~{bbGt` z0FD};8jR!qZ#I^24_rZm|M9cTKTberhE=2Ka)U~(4_j|E4beI)Qj#}NQE=_JqCM_{ zmHW_x@HBT%u_!nWHwz^prxg+6lm|%^?lg$QbW$oV`PN0aw3bBlf3PA(;oB4dC)*Wd zuef(M+U7E2_r(f2FSfy3M{}`^Ks}n*t{_cei}+x;D&uvy~{o*OOVx_`H| z?7lJ;MmzZ3lE#6G0(aB4T6g3;C`gQW>-F|^=A!{4vmF#-9T>gh z5$Qma&)wVouFWk~lFle8TeK5m>33lkBfu<`b->wf5`lp1m2NK+@AeVgej0&5aiim1%9~TVwvY(9& zOUEjJ)d(dM$yAd*^wMR8*nxIDPIGh&_|8OS!FD|*vmgSy7nBzW7G-ev!XFA>`1Ss$ z(TCsu55y+BpN;-;XApG0g-<2hgw9+IfAC1ZgoDFfdtDZMCDbsD2a@+e*R8mqvj8nv zwlmv1e>E28f%x`TbF^&FM{~{K(RPfdXL{Y>Q#|L%*V{6+L9KdigXi<*%bCQdFi+J} zmZ!I7oa~oYEDfOg(UkV>+3;*Wm7ZL}^QR4JtFlyned3#AKV|DpZ3+AF3?W1v)H%})=F99f*?k!;eXq6`mYD0R8 zKUkoC0(VRNyuZ+78Ga6i#<->8&Z%o3>$+nbIYH#wHhGvBS}rrzAzfCk>)MzyT}F5% zr*XAtRk#MG=xa?}9OJ`M#H^U-iEVmq&61H4Z!iH^p<|GyyGGZ_BZ>twtqlSgQMklS zkJi=}o_>%|n|7Qk8gZ?zoyl}{Olq>6deYexJG?kD>Jjz1TY7^_E3W1d#UM0KGhIjG zeN+su`@se50)dCbmG&XsLt%qE>wbaA zTPtIO%ht2v%W&+}kkfT(s;r?YEt#~;+qt?2OD44KyzqmxT#wlb@_V$HzW!D_0{|A6 zBPcZx+2TOcW|xXU6QQrgHIPf%$0i1}@&xW3YOSxe0x|VeYh%W49~+WF1Xhp2F9?WQ zo(@{Anu(&Ny4(Oa1ym@h(WtRuZL&6AWy>UHO5icRudAvdC}K1r#Z?X!7=?h*Xwbk_ zKiEV{8{2W~m;S@t03T-GtBGON#30m!Kn9I$o~0(`)~-naEAV*t+5m$!+zRG_7b-se zzzq_X#PR9ji{lqBzWL;52je5$oKIg&R_n>}rRu$S@ySoLW5P?P2HJjbaLL!Tp^sE% zcAuyeSdhQ$ypQVk}Y= zlLoH^vr&K7#%@Pi8p*f{8q;h@L1ZwD+~J<)lO&gy!Ke75#U$GuSTJ&oWZ-n8mCN~p zv#*|>mhcKYwvRV45b|1Mov&f5HMMs%Y&Hy~(b>;W>2Q4=Nux44`L0W=>&8;a3~z7> zuiDd-YeD?egM$c=I{xPH&o9nbch{dBUm8Q2*QZmQ)K5W6Rq~yx7FF^@d7}7<_kDYNug-EceS>wDc;C0T_Xm)C9&*0FPjJyyPu1tz zv-kH$08H=obdgi>&V|*_?E@i!c$(53xFGn6SZhd+&Zp%x(x5k0ag{eK`tltsvREhi zs_fTRP!vnA>IjW^E4&ncuNt18sM6J#vKUkAv{T?$qEY>;-lIpjjIpw50Ft`W8`b47dB@n-r&6n z3)QS&=6?+Ql!mjP=_KUliR$Geo~*MZmVIX{Y)1;oKyH9@6Jked4yq&(^| zTYJ5*X!Wxrn{|DpIn=y1qo%cb1}t?ozezuz&7J@s=yR;V#P#3Y-kweZb)hjTs5Ff( zdGhPc`*3Z>wsO)uA*QxF>=)@QgEM$EjN_p>$?YsSzyq<#X*&*RxE&b;4$ma;ymn-Ak7 z9K4u1B2ai;V|B}ZiC{N!_(yn8bK#`58MV;%e%Xa5zWSkcUf^@qth2Inkk;Ai<5Kd< zDors>Zn|4cTv3IJNSd3S-X6j&NE)*fC;yR$%O8z>s0GFFGxbNHo!|EV2)fFnw9MgL zm!L4ICMl(86;anQ^y`4o+Ugg55)0Zo&k7y?rFng|7BNSgRZUk`i}ADE+PPk)BaUuFdwiIBkU*yc{IB&LW# z?9Q)EP|mrvs;vKxP(`D2nqC*Oxk`&veU|DB{J@fxHPu=oYgHtir)FuUA=8NR zbyS<8eSMlu=pC4t*vO9RVDj2B!sMLflK)5X3VR8Q5Fcx_Wh=?uyJb#R1n|aJzkQb6 zL~9VMN5=pX3PZK__~=OgXDT`_7H5*Akn1Wf3NU_)uB?(S`OVhp$}Y*08_eMIL(WiF z2`>vvVP|*cMv~;>R2*JSb98UfmEX_AlAQRC5|Su6-_AO7GEs73p>z&W(iESu@Cb4E z5=b3aYt3VFq^6eFoTyfmae@rQB)|TFIRkM7f6cgmfG(4N1Pm5QEp|H70H>cCs z5}^g4xkxvbuCvua!e~8F-3u{3^<8JUNA^e(_ikz`5?-+2>1uj-@%iDG6Y&;;f;xS7dbgrc*}BQCC=W77zRB~t5W)J?b-7V-Pr$V zpH(BJlHKp=+3ZF8*5B7$F7rB?HbTf-=~*!l(v(2Gq}#KjFZ6=@!bF+$V!m9Qfj?@$ z((*}`gTY#|I4LY_Xw=J3bIO=7j~A=DPLe~yS$@4N(E<6=D#BRKZ48s8{a(GC`Ld4~v%m0F;7ib!{+{F8 zMKjS6gKEk6qhn319K$7fmL1mbHitUal%FQcBPQ3^0e1fx>FSGi>hG(>ncD<3Fb`YJ z@J46aIoq1~8hH=rcw{pLUV$^Us+*06>i3nPXnaTEZjoZgKB4yfEWWGE-9*0cDLYy5 zef694?Q5+Q@j#i|WBi$VW@qYGFwh?l2i5o2P=uYO@o-qhJcA|dc!>7qPxXSf(a3Ul z4aUmq=bBF(*V*Gc>(N`RH9WdfN@?}2UT7oool?JSTz!h#_F29aok?goeJ$t{Vl?1S!KBnH(gki$SWOu!qz4VlTN^ zFwALE*aO;BNnLZZ6n`!I!HrjB1l7ydbkpczh|YvtKV?ST?(=ekr#Z8_+_~$EvY0Iz z>UD88&7IBNx>~Wko~3?dT9P}v_|iV=#UOdjF+Gv$v5bPq{*LUg5(a|(o!H;l{{GAUj(hQz)>5`amV~=Pom~&> z3q(kf+FHrFSxJ`rRR}yP^w8g-)*tOWh^l!qf2AwVRP!;_of5ThKJP|~i~#yXlt3D?!Q~feU|L%_m=KT$rCAgvQwKUC*d}?m-HdD zt&{0NX|k7aNO^F0^5`eGKdZgFLM<~Hj74u{Tl1{#AYaEDTf^ucCHn`5Kl|}dZofJ9 z+bVZxVp9Wa8hjyk63VZLgO)|7O~=irJ#*{mDI2Kxl#H2~By$fhst^K}r&5IwkY_s0 z%r|zB&}$HFJy082-m9MalboC{ke0>Q+We)lkKCUh0NlqOqx_f@J&qZ>hmQ4xfbw82sd!M==(lw+Y_~S-Xbp3Lj0b*`Qjb^~E~|x^lc%k_ zvcL*;T3;M^V>N53NSqNbB7KHl^&^L;IVz+xp)M?NxUxM9SvfXyb8O1Oi>HaKM%TWb zU4%@QmFaQ64J)z~!X@rSc!|C4Z+?gQ=0$OEta|Qs5;31J%4laea>jSWGTj_^LECNf z+|-M!l%b^XzR`=9e39aHfUIG%w+ldtd&nIknCjixhs?fSPm_GTt`9$p3)GqUeWqil z7HQ1YOSqniO9iu_*Xdb?n@EQ6*V7p`3*5cN`H}N=d#kJGUA#f#cR za90;mV6l69Y`~m#a$Rnb;h?YK^Btbw;q#rL$|wBsk@nB(%w(iR{b;?NhOlVlkh1(V zY=ysI;@~fhbyHLyVHCy>ErW}dM~Kj7knOcLd994J7#$YVF=DG&R4>IRlc-S}(RBP4 z%WEF922KbV?iT_^Dh2_us4Jq^wFYFZ)>he7R<$U$<7L1x%Tk$+Bp864@-wu@aWna1 zY6h#f2!4$GzF3o($b6+rCS{SiOXS>@ZQov(KDBRIvmy< z!*eIolG1%=U0Gj-QT~e;%f7=xUENzp$CqJa2!@SAHr!+EoX6NueQ{CWFX7x)KZFx! z=Gd#ijRShrymBAp=)1qMvlra&%O+CtE|(OIK5#$pG(Yb)Kkr3iE5k60wen-t(^U6V zU7VH>Z^1Foc&jTz)CRO$h;lg>;N7ll$47F{p#MJb|0o z@f1z7(V?=<#ah@wq5^Hd{a|fhwA()4*fsUKd%-6-k{S5c2CzGH2=~q@=!g_I*MHjY&+Yf$dX`)o zD7*bz)Pu^LWn1!@8zj*XcNps%G!vis`w07tAxQ-Df+pY=0+mla6Un^u*I%b`iXFuCf4wIwA_z}sxkeSaV3 zNX;U`Vk+?K;38Jf#d_`*B#CKA%K|Iy0;dDl&Uqw{L)Cp4`0)}0-VvVn?!6m4FTWxe z!nCmoh}B?f)3>k?DhTH!x#KZOo4Cg!t=y+(0e~*BzVdeEdZ+qdf?$l7Xyyq_U7o#- zr;QdVug?W6ySp0I#wq6P`m?C;z?Q+KxN)tXq`@nI>{@%5}_w4U|`}@HDKC~n39W2yG zA3}Gxm%W%QxB&BIs6hKKYseQM_OW7HL}Q?{G^4rua>Qk!n5;DmD0DAcYF5#Gx6?Nt zX;a+nvMH3Fwl{<3K6qomIIW=-g6ExxAp9tOe{;CK^PM1`Y7pOb280Uj`b5Bq|7q{1 zi2f-ef9mEwZa6;a#pG6@cu(*v6~a-Y`p5F>8W@$*!oN*lKj8>10u||k5J682YN_D{ zPq6TLg1&%?2oJS+V1MsLADg0+t_Ur+XS5f#l5{X};|gyC1aCw<+3Sk|w1W?#jZkqo zYe1)ghgRu@HLN7OLV&HE2O#v=k?STag2QUapsWL2Ois+oB=j4Hqi`h2`29LH40pYu1!3j% z@Zv}#0L$cEn7PJX1X&l2r5HJH3Vc0|LvRL83E*XgiUa zyRhYn0q7MouEFwCZ|CfSng*Z#01Cko!?!&Fq2Mqe>pC+BaPRJWk8QuYbJAsEQDXD%*yx=P1JFPRq6P&MJZN@nJPKk#@3z`lih+nU;S{14+Y{DjaX?;AAgWJ7~l&w4ovJ-P(^wJ zPqp~&g$~X1pEJGjUgNVQ9kPhFVdl5R5s|$3^ z%R{cJC6QV?Ch*ew;9d61S2-43cE0!A^5Ii1{Jp}ie6xREM-{89QlGjbhYq@po@pq~ zRi^(y^Y&l}2-)<7+3S6*qrr~2^nDK}c`8^KX|VCTwD~Ty`eM@Ec+AEJ6d;20_3Uao zb5>zqEk(RlfK9C-PX_XYgP8jQKL-gu!QgNv35|5&xkxn^4I zYlO8dDllc7SfiDEtnocMu?TiTxHo2#X`}v&vEA%>bduQMBElKh0MmB?BiOwc%M1Lk zHwr%bzF75L&6()M`j$_@CITser{G*=rt*2sGRVO=<%8;y;z5swU;^M@v}&#R_g_!4 z)O{z(%OGE19?|s3CFBI2^5Uvf3IqLRG=?P5N%G+S{k!+a;nH#0kb!ng#=Kbm;?u$4 z5I;Zv^2>?-d~80y#3w-2l%D2_a`annZx;da8?OF0$$rf=h6vdCPm+blADKQYf-PS!)n(a5u%8+|7dN<*Kd=1ybV(k|kt#@e_teUZS3gc9#4(h-(G)!K-< zK$|es0v)M^_7@)mtvr^bJqnNPX&psaRdCfoN}E3H`!{XD=nMUtV=92_^c;gz%A7z1os*uA| zyS>@ZMe-HGtSMYIzYU7M5+EYta4dlV0t-QE*#C?9%v{3?5uIRq80j&w>-?en%KlV6 zRWB7zh$rJ`iO@-wKI+99Cppow{UEBQ*`nX!40EuyHUT>queKj$E`KpEVH?Mr%Fi}2 zg0uR)ioF`BEpz0W^zbJ$-=K0mU$^g_iv8}~mnt@Lc7>HmxNJnYMnf>{-cs0pPI zfOfnF)rv^RPp2LF`-KBR?Gy4~IG0R?eNAP$LB z2#}g~vk(!I(j?sccOE|;Cr+9!eK`?&o1L*eGaira@mwF_*4fEph3?pKd0pSW;+Lng z^bQ<-;pofu?CjOE;}?#%GO;hG&R0^k_wm2ZImchHKnfpQRUAs|5XH{v`HznL7CWteBfiZYQfF-8X-_$ykoX^IqIP zl51zPLtGoz_CX&0-hJ9LD&rW**Lob+-(XtGW^B!GUu^8&D%3$AC-xUv9l2SnJr~l9 zAB2J%IXbg+>WG%lcF=hVCA=ttIr(txgPnK$^S4Nu|rVbWlpd z?m7@S`@ZZ_BMjG13Bj++m=bgQr4RveKQDdWv0VD-n;3!Zg4xSln9h4;E;Idm()x&! ze;ewl`^qi$?08x2mGa09bveqnjW0BQleTq}?Ox$AfTLlec%%_gk>J=~cBDa8wKF{| zUk`HWuq%81B)f#1QzpBu1_sTAd7>(6D2%F)!e~LuPPI>HYP&q~&o-uv!Ub+=tm&o7 zEs`PCzN0f7-6>lxJLTU4JABaXvm@*kh@eu!EBUyj1qYk&gw$~hL zgTef7tuVcMxG}b;<6u(=@jo`CLGceZW4u{qx+No^|GqJ06&Ps@e=cP1yxoKb=yRXE z5jdjM4{R}4nm}`P(yRAvHF&fr-|2?;2M51Z+zx%(G~&qHVb|Vi@{R*;;^)<&Klc2m zv4FG1@=27pR*j1LpWi=vHnn}!8YSD`!GYNYrUh;<>3_Rz8SJ!*tmWH|K#b~P*YQ5F z=#7jDxBP2~gP6;pi*4kfL@z#3N-TEcrA;G76QFjF7auX{j@8>Xo_x2(g`f%o^8P~Ai@gL^q?`A*2PyHERuSa)qhr2Wn zU)eTw>EmJOlY>VdC+HmpK6(5VZezlaMLT)qm2!_KPn1XA_xbo+J0E{5=D&ESrQMkN zh>I;Bx?J#ATCBwE?5U-W8fO3(^CeoBE2OgG@wS>cR`S z&saL}Z4xRGK3YeJ3Hm{SE*#LXrM{gYs^BXJ{*?#+ViJ6fZYv7-6$M$JYU;-Iln!C0 z&pqQIGQBPyv(2?~9+i+j#ol%9{M^$DH8wi+XPAYnyhI~8M0h@|jX26;k`JMvE56R4 zVzVY-Aci+TT82HMS1sgJ0bG~ZYm-5&q~>0@62aLz%R<`gpK-y+<8xDryW-M^e671L z@cAv(?WP>4uWD8fdIr>fsBU;@IDB@O-Uet}jPk0;g4u)!5c>)rtw^u4LNR92?|AV*^oo=k5AUd;E6BO1*Xs7xWMY9{__z`& zD}PqFSo*?Rxmfn9VUO;~q)tUu-6|Y-`nkkOow}$&4d$aP@Xrkfc%=890oE|GBc~@^4txu@rfygox6s3sUTO({G<)5f&K^ue3C+Jrg|LC zdMzRJ++<)9oo8ThTeGRS%Kn>bSD%Jn4IU-ox@{g9LCYn&8$~iD`VNkB99VlaBTyW0 zc~IL>kYsYC1km5nTBW-G3V09;5lSYRkv!?mSspbMz@mchAE6`7RWD&^P}&XME$eyO zcjUSs-Zkz>y{U?-)SQiw;1f(u4#GNUY8D9=JLA9#h!&+0Rt{)2E+8iF!%>yxpR}jp z*u&YS`53n+Gpm%Age_fW?eDt9RdC#X3&tdEr> zNZe5O!4-U7Aq0w{j;^h!Y;IzT(X>>RZ&b<7_uVtywm*RGYF=k_?|!_Kn|!I;-+nW!A%f~7!{{pZ{P1`(jw$fMfb-5Z9Re)D0LVmx zhKY_5K}v&8_ouzY)V63tMlmLo$^|qIp#=ZCyaafyIV+!YTeNkTvzC$z)Cf64nhzFS zHCttvQrJ*6>Ey$dsr0sX;1^#>qcLLkYTJl2J5wBe1>-)_ufI^!T+Tn-q#hT0=Otei(hs{4W~|R-HVVyuIPH1 zj?uKW?}0Ij`rLI!4VBmLr|+AorESwE>Z0f)Q&8xRe~89#d}zvyDV@XD6>;LHDA1#) zLCQ*?%@g{3Mb?PRYBnHX^-7p13NvlUDa2{Yuh|Xs$KR+poV6%mvfi03vG>DY5v-5k zl0TUv8;;Uo?@f-??@>;zkaU2`>;~A7YiEp^>*i6ToW(Zrc-{M4LA<4>PZNPzqD>NBP%lsMh9l*L zXZ2oGC;0P~SB*WJ)IC;^wSlxXO%Mf}j+W+cqI}WyetREMXJEX?UPsReL^uqmocR+v z=?Q}rw8S#%ih@?N^eTH{+K9gStK7Z(<_GWUj!+O+pt))SOGL#5h~v+^I6JBt@_i_? zY-jWrL=|~x9p{JSmkLw1Bd#tkL?X&W1p>j)yR_5sa9*y4Ui7z zgGcKw*&3E@Qd%+^G6Fd3p4SnjZVRfEv@7a_TDPo-<0{b9S+Uouimpr>+ElP_S0nT$IWVAW&Xx3Q2&|8yM4p)!hdeh8=M^Z-XxxEQn; z9m>REAkHq!@bHHRU5v;ln1ud}aKm?K>rLq2#S6KX`c3}zHy(evb-U-0>fDOez>->3 zy?&JUg8@F2!_{gS?nB4==@|p*f|ri*B%H53m)l%MwZE9(ubHEO8}T^_z?t&UtzC;j zZW0|Ly%B3F7jsweap0ZUorztaPe<&=nw|Smcfle}H4UvB5PtYW?cxn#y4=p~XsSne zg6p}T8*6>~88s)RfpZs}ndOKqm5MqoyDp3(t~Kp4%2OL_zE@g8V!RlxWi6ri5_8&_ z9a)|hu33a#dh5>>l*rJFfixr>V~K0MpDHQF3N5YfzOFcU6T5)f;k-gHncaYx#Aa+A zCjqHGVssilGN+q4;RrdDJG}W4%Zd|8SznIoxKarNg={m?X_IL&$TvO-^9~AsHV{}MbxNC33U9|$DiK`U}>v=LLykRpd?HBmeso$9I z?bHCnl%<@{qC>7!%?F>IopoO`UAQrAS5&k<$T;sn=Dr0MJfM~9C#*MnrT8e5&c8K)}zkr zpXk{*y*gHkn-Rsw%MkG;*7CUwc^GUOnj$VmroAqws^+SLqRi;jWa@vK+F{tIOgVLC z@XO{=igVtFo^{{4PC*rf5c7v4i6I}D8Ko$lJF$SHI#s7?sc6$inp8Jn&i&;TrL8uFFd11!$|dF7?Ak-u4?Ih+Nz?K zy_yQRMR#!oy0$2U#v`*ry+B()LP9QWx`fjmS>$BHv65bctWcWsi6WiInP;)f_q6kk z34$(TaazJb1(E4O*>xKS?fk6oXsw~G-+<+fB`N64K%Lj;fcr!RhX`GvDp&WHu%P6x z^Bt6%*8K_-$}7>3SDb@f*+^9~^TFcb^WYEt8c4~$c^<*Q-SaZ(;22Sa#b|+QI(X0N zk1gW7`TBdWDmR4;*Q%7(l8bP(X6o448i^PmNh|GD-H??(@uB!wW=54!;R-PRAf3|1<%E6j9gm7`PHyQ-woa;6$#C>vut_C0g{GajCNzr zQF)>zEYe(@^^-`B5lx+0i@}~JYUkp7fY~j2=>ag5qTz}wecVIU{EJtLI`@7n>gv5R z4&v{`rE_5g)r&FgoVK<1WMUjz{0aIjX)$K!V&EuHR2T$E5fmwa+hTi{?LENiYpEun z(SRVi%i0IKH9U&4(q6_DwSCdbDpkUZN^RE&Ax7%#iYJP$#=3N|>f~ms%X66Xc9&^w z+JpzF6>mKtZwIXZVD8$R+a`keSHT{p*r29KN&?sjL(@Q+p_G~M_#-x*B$iVVM+%nR zHaPz7{PwrE(&;Rlv;#Bnh)?(2d+qD)c0VdC&nn8{Uhq6LNSjgJgUMvrb5tzmzxF!1ETqYDcAdBzf>RtR~&pPI0 zl|^AqZRH+(DQ&Wo&CaayFB-M=6%XzrLp0y$>s4XVtU6X!gSyC$tzaDlrgiiIalK4_ zv#AJ@Izeu%oho-y%YMpm>9#gb>Lt?*B(~X`N^=Dfy-a6(?UcYig!%M!u8X>x%kEch zf(D%|){+tJr`ekxbIE15vH2Z5w6i$dCxdpU+UIy`*-3WJE@T(yGr2lVC*idydcqSk zTZy~n-0h(XLBU;Y^7)SXQ!3&aR&V3#GiK`^OE1HX?tB_AlMEI&% zW=ZlFLll01^7LbY`=Sy^{*-?ur0mkGynqj^gh|C?{W)N=yatv4HMFHF!_R( z6uN(gau5Rz5I1R%y=RczqlQpO13GI&w-VtjJ4ld9B?+kP^qp{+g;+ln*Z%YCxdgTA za!EkG>@37JzPCbkz>^%Avm%wc?9fKSREkL8JTD4%_;otPFHsN~4*5{6h>kf&VXj=O zg0I}ZgynEv{+BSf06{00gdyk0;+#K1iCq5y9hqQsIkDdIItS?alnr0x3!UOW&WdZGFa}{z zZsw+QoT&NF%*`Fvu=e^@GM)axDoSLapSO!tdjWoc0b*!&vS3R%EWS$I*k;B6$fx5Q zya7-PA}#X$ZCTbI_xY#ThsJilfq^YbE?!=v63OHcQLEw(Z=J|hf#m4FF|m-+%- zR+c)dmk{DW{Uijmzy-QzOT;X5UZ2gbB+Mn`%2aA?7r_^;E=*R)5-M#o>v(lG&fhRp zuE0emOr_5F++a{=kX7g@rubUcD(kI;;{)lPF-h@~eov%UrTfT*8e_vF-uAbB9xino zL)))DW>J`}cCP6ki8*&-*#*dceiCS9JoD~t%9wY{QXd6 zJZ;;c;Ze9ZgiRf?G|2}M6FD%X9Fw+=O&fbU!@T0j1lD~!DyFz0dfRI|%r2uvHeSkQ zkVH8CSh&D^5|RU>$(iCR+EpQ*x=KG zA9BrZpi&i?TbcvG-X1nI*3o|C4iI{u$_7#g>TpEFU-1w%yFDUX-g~?sDULh*bTcRb z_a20jGjcXbRCO0W`ugJH?#tn$!JVS#yWwb9d^{W>uK2ih_h34Ilw!2xOdpo0VlhRy zi+>)<&)($0m+c{JI?Bgq6UKcpk-ukS{5?cA{(OqRpY0-H@3Zqy`S)PB*x%i~c*viL z{N4YYAN%|`L_zt%#{@S&XigGQ@-rDds=)b%z)`3y(P)g9{&Od2vL@+>Vew7DkflWaDB%?yFjHKvZA7AJ3h^OB$D0Iu`< z-RbYc;i%gg;-Buv!<|PP_bkccL!6XBqMyC*gDn{MC~)4INc=Px%FS=2Fn=oX`sxha zIK|pLw0D<>P5>7`R~@@T2WG!+uY+<_)P}MdaBoiL;nU`1y<&{y1wMpRK`=p3(J4MC z?igGeYnJk8*UUu?PDjqYsk2hO@H`B@R@r&HlYj$QdvcpNJ2rED+N%TUn^W5FuDr^w z|INxSInJlmD2`5(5sagRQ8E+Y4QUgziv=>m5Y5~T$ts3T7yR-YdD9W29jMbrc+@ba zu(jGLP28$niUQvBk7xiyQh0)tbQ5SHswzcFEH6$%Y;>v0n<4$dgLBvcVypuck?Q-` z0~IhV*#sN6MKE&aJ`_5$v*lb;m`SxvOQs>%rx`@y_!g2XTPb1Ew|vM@`D-kX?c1KK z`qb}57Y;OXvlC8*;d z4qfX#W`D3~N>jgHy>GYIJAe4lua`9iOVMf#<82h3<5e>gf?fosZIZ`%)Gk8?$n?=IB=brFFEQfAWblM~@!nqrN!ZN8ppak-$!0 zkgYvh)|mwBXpS}fy3>}kt2WT(T-^8?errnir}M{-Z&9>g_TLFCbk;xjyJ9AlsuQm; zg)Cwf8+F1;oyoQo#>3LCg0{O0&}Ntf^_0AzlY{=GV?*1Gxb0?%+Xphfb56!IhWnPd z35UOGjJ-j{(Kr@Ul!EIlfBpK6h;H*W7mbM}X6{w6}gDmve2 zyLDdryi%J5IRa+X31ozr!MT%Ps0h$IB~ltiek(50cKgUl2tjnM$Y|A{!Qv83hwIoL!$)3Q;`~$l`@;^nXSo zlT8^EQ$;t?IJ%5(qvN-x^Z8F{Ji${Py%_1ji!BFvE)VaDpE}%txAh6(3c7>R-lJXht8A1FOh~ zxwU5*b}M?hmKq zkr&BUu4Q{X#`ciJ=;!V#B+x^@4 zDnQRy8`1Ms1A3-k;9E^I?Y%;3Y+MLyEiHsLNFkgWu|8E$=@6{JJOHo-cRFzx*;5$r9lN#zBl%GE4vqV$7$zhO=m#uQn8Ya)<#bK;IO6kPH5} zki>!>qBc$Qf3}8qZ4K`>uVH70+;7W%NAD)3Q{G?LVGYkvw7!!@Fr1or+ zSf`adiRS?(MqN(^Pio>`{LKICb)IdYCO(tjs+fHAkEnt8ca>NmTCznRPaGdTZIKNh0}(puu?WJAik(_uvin2cE)<^Url)SIx6u+ z>lx!^sqINkae;6aRcnSidQS^rIDf7<-=H$QtT35}pjx~LviU|-KlrheQp?t3rwftp>EZK@&IAEXmz$Ywxr3U;Et%>NEP!l3QUCXZfDi7CG z-ngdxvXnY-*F)yz#q6ol7uD$(>z1W`Om|V5uD__*X|#uJl5AtClXaFlN(cj=BW-DY zrdJq>j##1x?X&h@Rqb@I^$>u{RJ zbd@13<|$#3%p1lkGHb>9s2DY<&>fWzi0V_bSZkT$a057=)i1}na=u(X4{22n)Ka|; zbcO&oB7|LTRm_s@TI2TfQefeSiHJNX84H$UPKy@aAMQ_?| zB-p0C5ItRA$kf^UQphusBgc%5<8@lsZvp92>42YRW{1AdS~cpiRt=kBRRL|&mao@o z-gPt0BOCJyWG|1T+dcT%C@J3=qVn!as6-3#jo=0Y-8CA*(rbhxHr+0IdE~Kk^KL~= zSTH(rTLWvi11J#Lx`8_%e|fJ;k?bfRPrQqG4>jC zHkxU)a?p+miPB2{-(hl{!5-}Q_EeluT$}a_IU^|Sj35X0Er@;dCS=vhuu$%SWbHtq zF|X;W9B(r~i?|or%PEv%FKpG}S7WLDv#8ByYv`{juHFhqS8!>t@BKB;TR=^S0OJ2z{UNP)TyEmD0^=Rg2Hf4% z)dtjx$iB^d<$+M;=u&)W23UHV3TltdWr4DE+EfLnvyzdrt{wX~kR#|0(gvZwm4>_o zb+EojvpBr{ul)lrR3kJH^YNhM@aJRnk*f5b+;}*)4lk0nnpP2!2MdW5%33Rx1 zSdi3A3ksVw6W=Vsv1cq;!32n-RlmCKmgCaPJJ>?5-(1=Hgu&1Gh|=DFXib@yRo~@i z&Q9=Vg7%cv7G@7uZ;Z{{^uVFCN_6U153bEzM+rMF8Yzvj`PAOk<5-rAt79#Ih2@r` zdsVd^j<60x+E1-16zh8WUN+EJ!UHq zrd{)6+-2%|WOWl;P_XZ;=NtX{KY-;exX@Ezem>3 zHS1^h$oiRPJ#0`p$Z>AaHJR_QhC{94V7;+cJu3z_D0;xCaO@^<$!2-hRW`!y2}9-= zw7cKfz4hqFgCuU_r`@Z^A87nR7@w)%CM0UOO%W|It~2R3wu+U!4;y@gdiUbPUJ%h( zSPwlyu!EA1o8b%_?DlIcvDl}pVFKn?#v)$g@aMH2pi6BU5?3EiKjbwSFYUTFP#shJ zRu43S&2V=3ZLEOYORQtS#>*wlVs15nbSn3Z1&$5%3lQM#l!h;$DNU?yYl~hU%Shhp zPbc(yrN+ywUaIU)1e5bN%Pb0!Ffy*>{UE7CoYGlC_-1bFtGaE3=XQD@!o$0#X#pZ$ zdzl7GpVhs~l&N+P3;IRgR6{-rx9x6uE3H9S3GJyoTSR6td0`h=a>VPUBBC z&e|;s20eD_A@t6iJ~QdvgkJu23+dnI-dHBjOQ=xe7jlGDtY$DuC~J&~UA{!`t8Zz)`S zcj?mkd^voE&;1nNjem;o&kgGTPAJ@w{e3zeICm}IE)9BzsGa)#{`#B@<^JzZl#X6o z-zYvBPA+S)KQjL)Oe~)y;_^--2y0%w{e8iHJ6Jt$;V}6?Ma|Ex=D)>Xcgvrc`)+@5 zz3%f-&Ww&st%AE~A*R{^K+g#rm$yv+>`a=GWe-nhpiOwhv`%y`Bs&GQuKycEZsnn=IVPQ0>@TuX6p(2AuJzu~5oo|x?eIr-! zy@CCfE7kFzJ80$M4* zGkpoLhs}cLLx?z=RA4XFu4Dzt^^w^%8(j}(r!ytYswKbvs5QcEsE7L{mB^zjX5hr^ zwHva63wk29OywKQGC8{F$LoP2Oy1?5@_o>G4C?Ieixlk>+4|16P4LXxEk zU@Ndkd=!;NB?-H}hWuVY7&Tg09U;H;21Mh5L^}z@y%o^1l`uM(z;Ml&!~%X46Damr zE9|Jf#Pp5^J_#-*VERu2qDi1aJoy}uS;i1pVf|1+QPq(45_2-IY4Vp~qw$b2hatO$ zP1QyCo6OFu!^Z}`mzZJCR$8JB#O=HeLBOvXT|4>glAz`eDnaWi$PIoYW5i%3uoK=3 zxvx(|z4&9dFE5y8`=Y z0uNJ6q9ZbaX*8s~zjzP(+h-gTPg*g7avNpW6ahklpQdcAuF)%)1Ht*3m`-n;=h+AV zu1lnoy?w83fnbg+_?ONn)(v46vS)&O$B{a5&={hU1?aP}^xSQy=Og%f9XaF>G_NFb zVG#1O*{SHD==$W|cId5B+w?^fb{Z({y~`vfR*;3J$F)+4E@C)nP6$t)esG&>=2P}k z2L|TN&VWkaY(Z%cKW1bdg7qfhG*S(EWj5YL6+VqC1n788!Vqg)GP!!F%+xOFGl?>w z%18RdC6#b+ead;*c&+5i;eDEsMrHEQQJ6-hqzSGZ*MCz){kjkQW}DJ2 z(iT`=?h5o_PZlN&YAIQ!OZx=+44u3Qa-$G}v`B4&4egh-wB<%FVZJFMNHFgJECPG( z>$m_yqa$2EX>BXOsVZfT>dK$jC*X|VSS>WHIdCxq%J03TX)^p^%CJ&WCNpj=q>O4m zZXk%zgAcNCQ5y~t2^)dXU{tUWN^Y6mKekcS+bE&(2Q4D`%1cdUI~_1Lhc3BF-Ddft zhxcq@gpDAoW2K@uU!|z3lBPm1QP+b0v$LOdJKhK817Ab(jJ@!}l$GMZJIMfH|4A{f zW<_Wzqm2$%m5^WLq6OY-fsb2YC&9;R2*IfSo*lfDVJ4U0O8Z}cH1X8}=MNv9b-SaK zy!h}T=&Ic4yUiNm`@7jeWwWv&ckO^D=r{r!{QH3#(MC!zi?^_s-s}y3$y#UUU5gmK zc|SxQCcSv#c;o7x`&&Z-!^KQ?`ms3YIWzZT+gl9zgIzy1LMai~w z=2!KgyHaciNGyC32nK?Y(NXbkyHH90WHhSqr|GSl)?O+zX;#?-vevtwxrN^>-iHe7 zwEY>o&zn_D3wWRzF}nN1dn4izLPYp0;hKHxeH7taD!+<_{P=9WiXsm!g+Inn=cTRI z&JVYs=n%SwpEz&6v72%GM}=QR{0sPv_LLYo^SOS+8S z+2c+a5CCn}34d*8b<{7FZFf)DUK1&W<5n|Sm@~STwujsW0H!4n-9aK8H3~ZdNB9OW zSS^CUN2tK?&ERM3q#7+xXngAhq(cl7{WW4gUDOW*HG)B+Mt@Ltr9Do=K=iL{BP5Di zmhyEWs>&^KQ$U`n>QYNnoy^r&uCKRr+t%*ovcGag8R-mHqEqBY^Ox!b8LPWd`W>ADUMY7(tUNSI>&6| zKE+=>e2`Z5Wbd`@dfUUisCm{kgu&(~`dn^km?WalISG-5y(lVnl4LH+{na-YHUvWlj3TwXE)t*g)rfd>4WRt!o zXwuUJf#22ZOnRys2-Lbp$EL7{bFO<(WVi(*6h1%NhsmM8-!k#LDL&b90UV!xql0Wp zs?*ubVQOWlnF)wC-|(J87GYOLT6_^JH{a-O74%SZbLK-(?>y6{B_L|L!J;k*xmH1U zt~+|HmT;gLq(S6r6@9~YqDYx8ISjTrK9QJNRpQ`>i2s=(W;&jeb$DNOmRfQwW`{ z(A;gM5aZDIk_4(vr$U}r5Yj-CHTMD5I^VP?0G&Mw=w!7*H5sRjXZ>AM&!h_M0-aa_ zIuf6MBy!xC-{V8QgX}LUbm$Q5@_Zxz zTG5}iIf>v$>STUY)9fo6d%n5A-t$zL;9@xL!R-S7XHBE+_J$6tLP80o%8l63xc#66 zZaXcMs`>OwALK*kN<_$W8UBn$l0!Ry=N}GNFebjEgo*AjztpG-aSv86d_ueZ+!of< zYb$jo)cn(u-HK}Lmx^JbIk5Y69-j$!zxa7lVHy`&7K9p_>|O9#RnMiwgnq=EzCZ;v zP(u>Kfi11wf^Sa6O4zQz!J;pL_z*-@ttd`paI&Wi^6%Ib)phu~v2$STqIhb0@%7*r zrmR;7sBcxP|1CVR~z*&dYF>*?jINA>k`di7|Muw5I6yHXxcH71#sdX`AH#2L5*IzRLg zQ!8tqt(@#SGb_`=UFmjUt0plFD-KUWNg3sQ`q&Y4cP*f&`Yg!31NSOrc=L@b>Ea9q91j9Lk~)^9Tl$O|9WwZ>Ioe4RGHR+Sz){ za7{2!=Jurd0OFEcpOA&rBAZO*G&?%TM(t6Sg=A)LEr4uPjIt zMP{o@`;VWVlm8B4n2mO}C9av&XVw9NpwJ~kTAzYO&wv|+QPa&T20p_CO~r;d%- zJR%|)J%$zlZTO{AC9h`IKb~8A0;oo8Fw)f1ch}HHs!QXZLu(FfUU9;hvSN-3{5gpG z{~5kfD{sR!k~7<6@ZEjh?**(?RD{RVMs-Jr);q*nur?i))vSCk@m+(tl2l>erZto+aPD`^a>4>>{!rR!?a) z07Jw&FUKW2n}9w%lEzo((o@t8y@u=%?*8rE>gMm4!{L4;RS^Ab6T z7vRRbV-o=AC_vXYc}Pp0(gHZrL7{V#=4uHLREngBmDdD530R5GB@%S@#ibbG-Kst4 z%I}M^9~t|n22dgldzE2^f?TF5__Ajr$1EO!GPHSJR#+G0yb@uD+3yONF5hXQ+jeZo z5655Uf$J~y`dusoC;1hvh|j7j`!$qH3=(L`383Syz(Ubpc-M@ExXfqxuE8x$kYBmh zU;U)m4CIgDXWPEi7(Glyc^e27THQiyBpu>X4Gu=)*37Wjn$o77(g4NVXx($<~8C#pJducmhE%w1N0;g75Er}FZQqv&wf8TR=Jn2Ns zbN33gjz}KKjj3q~cl;he@t*1o4c#h5IGAHymuIcg6ef@cqaAeNrp z3hQ4ZYE5`Z*-1u5t%(1I&wCt>hko}){2PJ;rK53j$E;{_jz6rxFugAe4i=aklSzU+ z<`pztHG4s2E_$nF~3iyQmJ*`3BK#x(Eg zZZu6hZHB-WU`zDy{eb9F!~I?0^#K#J+{9H&?e7r3N3=`)MvGb~@#Pv%hFJFaTc}>7 zC2sb=BH%vQ0|T2~cuPwvES_6u({n+-uV8?CX#LWc_fvogAP(wT_#n z5~orN(sFmxDMnM}u0uCn;^KSur|s=eJw~iL0LBoN+r;8+;;?QU0rQVB1+qJrE?CXS znbQvU3)x(wI|fxcGMsh`Y_dwmeRk1%2F}Lp#lB^hHYK`ebWO5B2IdreF7&<>g;eHMw_sY8TJh+=}H591mHV5TCAX`E^eP? z%Vi2qCa#DTKZAMzqU_-c_(iXV76i*rCk(a;Ac{?B5IdxJtvR$;b}$ zVzZE%i<2F3l0_K30d{Gm^|pNV!Ww(6IY(NOVaG=75PUKVMzt#z{_kL(dlXzl@;BN@ zIp7p4tGwt)JWaw?yL@A&X?l3`K5P(EdV-L>gdsHa(0kE&N6+U%z_dXZXoxp!R9^s^Dsj1NWzQm>wGC zI(&6JR;~9a|cbg2hS8_3$LRh|U{H>^ZGq7o+ozYUW)d+`#?*}ANR1nD@vy0rcV(0*Sf*jYk3!=MPrlr*i$$~kXTaTMj-Kt@W z;~J{gB76q!Knlfr8BR+XMDMkzHjU1mVeHaDb|q!Dx!0ijtg)kZx`fR&Ea)30XIvr% zS=lzhrk2u(0;6#;S@f^mPu&WPHdYaB8_L&0PYjc$1U+5sm-wv{JBhwa>CMEWU-(aF zF2x>T4+Iy8)u0R6Q&t!~8?G2F>^#(;8Fd&oCq%fJrF+T3nbJBQPcdZja9Z>B=b|H) zT*hA9!vhp$#}%|$Qs|Qs z4`%7fpGTqzuM|bdO9r?tf8glcsV7C^tp@=J3gJ_eA!yvV&-DWa{2(3-P|g%xP-yE8 zkV`#Kq6C9x5e2l<1i+p$eB|0<;)c93g#-;)zieGXE*HA2yYK(*D<(Gj9Fj#Tt9=c>9e7NB1zF7o26bPBz$rn^tiuS={^P#ZwixEZ~) zP4yE`dh5{T-t+#v_0EA+4)w$Fn<4}E%0u~mku3+lenky~Mft|GwgJkRYX(Pwb&%ztmJn(eS9BVrF>waW4-BkI~K(_kSo&lkewg)xN_7>v& zp0RO8_++qn{`cQy+|9L17R01pbs*jzD4?o%ZTiOUw(E&AK^H565al(LT_h-C z4&s&*`W%gNa;Lu_1>zI@nHD2H^DJWb0XjFdE#xT|-h-j~)XL5?BX25((zPZ3sYELO zRB{o3QTD1zbOI>SOBtxCd(a{YfQdCCRXu7+qK$^tCi{tZBA9M^n^}Ak0l8N-4R^7r zm^2OJ_G~F{!cEExgDGpt+rdCYCfQRB-sClW$&s2WOR}ica{PdV_g}n?-W{2?QpGH~8QSGVbORSeA1VG4bCh$iRBYC4nMT z4g(V?TTUo*vf;H`=c#LbZkj&n(jTLI@L(AaFxW{x7FFuy)-PCvRGhGm8W~bjN3}}o z?y(%>uF*kscsP$Bk%sy>o*hMpM|1HdAOYR+m8wXT!5Xnvy2a+LZ&xj_LP`hdjEmB}acUFG8Ze>V61!{l>g)MBGg+?Ny+PR$MDA5G}ti*o0zUcRvjEt8}=+ zHKufy&sOt!Qpw*&%F)%&0hcpb_<+m*rmgGiyZGPH<3!q=p7LDEqjLkUJrVyyO`hrl zcRSDVwKALAqBz(%lPnklyO}EO&cJ2Dl5WdLR_c$zL_R6%yaEp;ao39v`slb!Hllz< z)0h1h)zdD#y}URr_8qtJ+(5)$4kIp9y0E+ZRGQbhh|)eH$dV6$URmdN@OyW>f*h+1 zGdR7|+-oCHQ-M;q21J-TvbK(r>&QYYHiN7zV_8`Vx4mutb+6>juLn`4rn0T6;F`*| zrW!TX`~ad3i&;IlC9JoK$o$$6Y3eK5`f9GPFq|LiTO1dtZxPnB#k^C7t?}BYp{#oU zfQY65Q_ovhk4i5ii2lqC!Tcj`2wu4nw(F80=%Q02Dy9(RqaYof>=7ZoCXttk4G6V; zEq~g6#(5Z-;z;#WK<~%$qjY0ZrrwMc&aDn56Lk5bQ5QrA>_|{|ZU(qK*>sji^*o+I zYCn&&X$_Zmu&IAhVJ5`2-r10P*i3)AgbQ5~C2}M=F#ihTqFPnA7*q-eMs^}YrRB~8 zJc27T+zA-)3%e5#s!HMMG`)t!&;huN%fT|OCf7@M_Qa%94Hy)4bne&}nY&COvcdM`SsI4#u(d9i@bq8Eb)nj>&4OA%S4Pp@{(;_dQS*EB3$SomnVX%1HIcd?UI z&7#Kxz{)7CX!rg?%^*sb#?3AoN%lD9;TTs@yV$I;4VFTOyJ%&!Fba}jRdr(|$)e24 zKyB^q+SKtf1DT7v;%V+KWK%aQvhF*%>8z<18vhJS5dP=WS9Ci6Fhu1_R9rCe#H~VM zB9%p>^_GjXpjlJg>>PVJLCoXz)07^F9yTb02k4QFzAL6Iy zNeWhal8WxLd-Gq>G~=k!fx|L;6jx!ytU|Ekt{_Fzihq?3rW{2m^h94(I}RZ*Vf650 zs82zyr0Tn)-+KnPH?YzOXn42vx8Drh$*1<;8}x~A*&Pg%t@0Q>YNb~C;;yXQJ8!ty z{vyh{HyxjVBhjO#!5D5q@e1eCdd7ra$nI(sVKV4u-p*5-YB^j3Tl#B0ptlA_JGYM zoM{WIOObHx5i83RafwgJ2cVw6$kyQ^SrEU+5TZ+AE^|N|!J_jTX%XIUT1+s=PV!#tJF5ZM)h^bnq{gnK z`;~pKc4eR1C~+W}Pkii^Pr@0)u{!UdqL=p`p}Z_tM&_nT@E8;WbrdfR)K>PxW_cXH z-<`zM6#FS>k$R0Xx@I`XKXRKm0qBGXR1Iwxu^T~BvYZ*3A+PY&4Ot_9m?}D$u z;8Kqoa7~El{i}GEKrHE_K#tCV@dStaNzuWVm01!-o$yWnb7R zr+s3wc(_c-7|VbviAs+i;yu?%10=}`1T6at@;0levdbMZ-51G2d5c;nS^E~XrnjiI zyk5;9_K_CRSGQ5v-8+#GI@Hb-267h1;|^^KZg93Qf`Bl_rCP{-8jc*Pd{Kzy2XuP- zt1VwpgO%6bHmYE{#BOi?mW6S(tM?_w$1U7)L!H|^{8(XV7*q2>g}*dh%xDQC#c&f5 z^YU$2f?4B!7cp4fvhoG>YK_&I3qdZQ(xF;I;*(|%S%(YL3;hrqWkw%MAz3bRoqzqO zF;lHsb@FyHX|s|5-3cIVWcO{)=N zXogkg*&N?7qLA?un zqv4h%O3Ub`0d7%`(98l|u z(b>OWn252;Oube{3p&aX%ocI&Fx;yQU&+EcPyN(M;YTKz0jW$5EQ#-o$qQe`t0osN zUb=kc>b2`PI=w8M!w4Y`qP|@h@7|Z2s@{Is>AkXspDOBcC&3t_!6d^@)IXtYk(#0g z6j9`Nr?(}JXmkuqpe;%iz3L|fk)voG7r%5!*QX`6=G_DB0?2ua0L-4-EmYjr*QtL< z(;sG*xyvR83;d~>QjU@TYEN=KJEeT#)I24rRjR14r!Zwi7RIv@vjYEQT(MdZyLOe9 z6vpCKYTH?o=x+g}h-)D*ClK0E#OL1x#4N4cQ80R|(G&pE3C`|0{$ zYF~X0v-`UcQl5??4Z4P{l;CpEbvbb1k~M`h0fkO$6dshgTivt8Dmcg4Uiq(N82B#z zR-twQ=E_{a*AwRkAB|o*Lb(37LsyYns-+=j60VY9T*Q6g;^4GCBGnv}eE+ zOwPfeheH&KO$|{=kY2|`68P^{*=ID4s0^o0$WIZ?_zXeor;xA^gOD|lu#h9vTwe?<)T%k)U|lr1ViB)YqO z$#Yr=Kfgz6cESUsLBg@%Fp}Q;9>#3e23t5Ngf$y09p=jbwfwX?6;st%@w+ubJO5TA zQuGH+G#f<3?U98iJi7q{J5a+y!BE#Io|La>^P)ITmn(AoQIa70*XF-cK^YX=X6;IN%7X;1JqTV)LaA8YGsysH#Bk0V z1{7|~Mt|Etd7~pmu47-*`TP(xbhiX@Q>p-?-KHe@<#?xxiUC_LqYpUE&TaPL4a!6O zlN;()%qYSB+1wg~42uQd#u9M+U@zCkstVG*0%}E-*B!(hE@>6W&c|y?t`eb)fX;ZH zK0>~u1ota#Wl2B09?*4BpMz~m@zBY{hir1mW{8)P6-=f#X^De1j4LStm~6A**Yq%) z&lj`~yvf+u2w_U_%O}yRdQYnZ6M(>R>7XI{)eZMkFM&7V`w(+Sf?vzkIf%>&F&z3W)6YCUCe4atN$b6aK(RFU6ywv7JA}2iA*XSYiLYRKVZv95 zFjNkPs`s20Yhn3h@O%(Ltm-B0*I&|kbr^{@nYa`nWvdt46*=8&%xq#iAwWl_-f~SL z*!%D&Vs47hU^6}?FdTo^V4*n{|HEglG2kL1IjB*FO2m`NO?94Lh|ugQxh5{IqSad% z&~+v4I>^?UtEa~|vn2EU+s~dEotszVnEg3f3!X*3womgtR7O9~`Z6>`Jl@7B2Dh)0 zHii^mT75G1a8r9iOe_}bu}{?2!^jM9WVBOMek5!$F0f1Jn&Tc%S|P<7Bh=kY%K=X9 z6xyO4uSqQ%r^&HfRIEu7$H{1J)+K%10xd_KjBXf$fNTAEYnnE6MLP~EEwE^cBym&4E-y4OP8TDA-$afARKw-pwlJnbTklN>GEdN4MK0Beus9unN2f0Ph_r+W-In literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data/worker-json.js.gz b/examples/SmartSwitch/data/worker-json.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..fec1f65b323b3e5e21bf3b6a4945fe7623628312 GIT binary patch literal 6923 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,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((s.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((s.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=s.match(/ Gecko\/\d+/),t.isOpera=typeof opera=="object"&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(s.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(s.split(" Chrome/")[1])||undefined,t.isEdge=parseFloat(s.split(" Edge/")[1])||undefined,t.isAIR=s.indexOf("AdobeAIR")>=0,t.isAndroid=s.indexOf("Android")>=0,t.isChromeOS=s.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(s)&&!window.MSStream,t.isIOS&&(t.isMac=!0),t.isMobile=t.isIOS||t.isAndroid}),define("ace/lib/dom",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./useragent"),i="http://www.w3.org/1999/xhtml";t.buildDom=function o(e,t,n){if(typeof e=="string"&&e){var r=document.createTextNode(e);return t&&t.appendChild(r),r}if(!Array.isArray(e))return e;if(typeof e[0]!="string"||!e[0]){var i=[];for(var s=0;s=1.5:!0;if(typeof document!="undefined"){var s=document.createElement("div");t.HI_DPI&&s.style.transform!==undefined&&(t.HAS_CSS_TRANSFORMS=!0),!r.isEdge&&typeof s.style.animationName!="undefined"&&(t.HAS_CSS_ANIMATION=!0),s=null}t.HAS_CSS_TRANSFORMS?t.translate=function(e,t,n){e.style.transform="translate("+Math.round(t)+"px, "+Math.round(n)+"px)"}:t.translate=function(e,t,n){e.style.top=Math.round(n)+"px",e.style.left=Math.round(t)+"px"}}),define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./oop"),i=function(){var e={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta",91:"MetaLeft",92:"MetaRight",93:"ContextMenu"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*"}},t,n;for(n in e.FUNCTION_KEYS)t=e.FUNCTION_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);for(n in e.PRINTABLE_KEYS)t=e.PRINTABLE_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e["return"],e.escape=e.esc,e.del=e["delete"],e[173]="-",function(){var t=["cmd","ctrl","alt","shift"];for(var n=Math.pow(2,t.length);n--;)e.KEY_MODS[n]=t.filter(function(t){return n&e.KEY_MODS[t]}).join("-")+"-"}(),e.KEY_MODS[0]="",e.KEY_MODS[-1]="input-",e}();r.mixin(t,i),t.keyCodeToString=function(e){var t=i[e];return typeof t!="string"&&(t=String.fromCharCode(e)),t.toLowerCase()}}),define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(){u=!1;try{document.createComment("").addEventListener("test",function(){},{get passive(){u={passive:!1}}})}catch(e){}}function f(){return u==undefined&&a(),u}function c(e,t,n){var u=l(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(u|=8);if(s.altGr){if((3&u)==3)return;s.altGr=0}if(n===18||n===17){var a="location"in t?t.location:t.keyLocation;if(n===17&&a===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&u===3&&a===2){var f=t.timeStamp-o;f<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1);if(!u&&n===13){var a="location"in t?t.location:t.keyLocation;if(a===3){e(t,u,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&u&8){e(t,u,n);if(t.defaultPrevented)return;u&=-9}return!!u||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,u,n):!1}function h(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0,u;t.addListener=function(e,t,n){return e.addEventListener(t,n,f())},t.removeListener=function(e,t,n){return e.removeEventListener(t,n,f())},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation&&e.stopPropagation()},t.preventDefault=function(e){e.preventDefault&&e.preventDefault()},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.button},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c)})};var l=function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[l(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return c(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=c(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(h(),r(window,"focus",h))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var p=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+p++,i=function(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())};t.addListener(n,"message",i),n.postMessage(r,"*")}}t.$idleBlocked=!1,t.onIdle=function(e,n){return setTimeout(function r(){t.$idleBlocked?setTimeout(r,100):e()},n)},t.$idleBlockId=null,t.blockIdle=function(e){t.$idleBlockId&&clearTimeout(t.$idleBlockId),t.$idleBlocked=!0,t.$idleBlockId=setTimeout(function(){t.$idleBlocked=!1},e||100)},t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;nDate.now()-50?!0:r=!1},cancel:function(){r=Date.now()}}}),define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/dom"),o=e("../lib/lang"),u=e("../clipboard"),a=i.isChrome<18,f=i.isIE,l=i.isChrome>63,c=400,h=e("../lib/keys"),p=h.KEY_MODS,d=i.isIOS,v=d?/\s/:/\n/,m=function(e,t){function W(){S=!0,n.blur(),n.focus(),S=!1}function V(e){e.keyCode==27&&n.value.lengthN&&x[s]=="\n")o=h.end;else if(rN&&x.slice(0,s).split("\n").length>2)o=h.down;else if(s>N&&x[s-1]==" ")o=h.right,u=p.option;else if(s>N||s==N&&N!=T&&r==s)o=h.right;r!==s&&(u|=p.shift);if(o){var a=t.onCommandKey({},u,o);if(!a&&t.commands){o=h.keyCodeToString(o);var f=t.commands.findKeyCommand(u,o);f&&t.execCommand(f)}T=r,N=s,A("")}};document.addEventListener("selectionchange",s),t.on("destroy",function(){document.removeEventListener("selectionchange",s)})}var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var m=!1,g=!1,y=!1,b=!1,w="";i.isMobile||(n.style.fontSize="1px");var E=!1,S=!1,x="",T=0,N=0,C=0;try{var k=document.activeElement===n}catch(L){}r.addListener(n,"blur",function(e){if(S)return;t.onBlur(e),k=!1}),r.addListener(n,"focus",function(e){if(S)return;k=!0;if(i.isEdge)try{if(!document.hasFocus())return}catch(e){}t.onFocus(e),i.isEdge?setTimeout(A):A()}),this.$focusScroll=!1,this.focus=function(){if(w||l||this.$focusScroll=="browser")return n.focus({preventScroll:!0});var e=n.style.top;n.style.position="fixed",n.style.top="0px";try{var t=n.getBoundingClientRect().top!=0}catch(r){return}var i=[];if(t){var s=n.parentElement;while(s&&s.nodeType==1)i.push(s),s.setAttribute("ace_nocontext",!0),!s.parentElement&&s.getRootNode?s=s.getRootNode().host:s=s.parentElement}n.focus({preventScroll:!0}),t&&i.forEach(function(e){e.removeAttribute("ace_nocontext")}),setTimeout(function(){n.style.position="",n.style.top=="0px"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return k},t.on("beforeEndOperation",function(){if(t.curOp&&t.curOp.command.name=="insertstring")return;y&&(x=n.value="",z()),A()});var A=d?function(e){if(!k||m&&!e||b)return;e||(e="");var r="\n ab"+e+"cde fg\n";r!=n.value&&(n.value=x=r);var i=4,s=4+(e.length||(t.selection.isEmpty()?0:1));(T!=i||N!=s)&&n.setSelectionRange(i,s),T=i,N=s}:function(){if(y||b)return;if(!k&&!D)return;y=!0;var e=t.selection,r=e.getRange(),i=e.cursor.row,s=r.start.column,o=r.end.column,u=t.session.getLine(i);if(r.start.row!=i){var a=t.session.getLine(i-1);s=r.start.rowi+1?f.length:o,o+=u.length+1,u=u+"\n"+f}u.length>c&&(s=x.length&&e.value===x&&x&&e.selectionEnd!==N},M=function(e){if(y)return;m?m=!1:O(n)&&(t.selectAll(),A())},_=null;this.setInputHandler=function(e){_=e},this.getInputHandler=function(){return _};var D=!1,P=function(e,r){D&&(D=!1);if(g)return A(),e&&t.onPaste(e),g=!1,"";var i=n.selectionStart,s=n.selectionEnd,o=T,u=x.length-N,a=e,f=e.length-i,l=e.length-s,c=0;while(o>0&&x[c]==e[c])c++,o--;a=a.slice(c),c=1;while(u>0&&x.length-c>T-1&&x[x.length-c]==e[e.length-c])c++,u--;f-=c-1,l-=c-1;var h=a.length-c+1;return h<0&&(o=-h,h=0),a=a.slice(0,h),!r&&!a&&!f&&!o&&!u&&!l?"":(b=!0,a&&!o&&!u&&!f&&!l||E?t.onTextInput(a):t.onTextInput(a,{extendLeft:o,extendRight:u,restoreStart:f,restoreEnd:l}),b=!1,x=e,T=i,N=s,C=l,a)},H=function(e){if(y)return U();if(e&&e.inputType){if(e.inputType=="historyUndo")return t.execCommand("undo");if(e.inputType=="historyRedo")return t.execCommand("redo")}var r=n.value,i=P(r,!0);(r.length>c+100||v.test(i))&&A()},B=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||a)return;var i=f||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return B(e,t,!0)}},j=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);B(e,s)?(d&&(A(s),m=s,setTimeout(function(){m=!1},10)),i?t.onCut():t.onCopy(),r.preventDefault(e)):(m=!0,n.value=s,n.select(),setTimeout(function(){m=!1,A(),i?t.onCut():t.onCopy()}))},F=function(e){j(e,!0)},I=function(e){j(e,!1)},q=function(e){var s=B(e);if(u.pasteCancelled())return;typeof s=="string"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(A),r.preventDefault(e)):(n.value="",g=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",M),r.addListener(n,"input",H),r.addListener(n,"cut",F),r.addListener(n,"copy",I),r.addListener(n,"paste",q),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:I(e);break;case 86:q(e);break;case 88:F(e)}});var R=function(e){if(y||!t.onCompositionStart||t.$readOnly)return;y={};if(E)return;setTimeout(U,0),t.on("mousedown",W);var r=t.getSelectionRange();r.end.row=r.start.row,r.end.column=r.start.column,y.markerRange=r,y.selectionStart=T,t.onCompositionStart(y),y.useTextareaForIME?(n.value="",x="",T=0,N=0):(n.msGetInputContext&&(y.context=n.msGetInputContext()),n.getInputContext&&(y.context=n.getInputContext()))},U=function(){if(!y||!t.onCompositionUpdate||t.$readOnly)return;if(E)return W();if(y.useTextareaForIME)t.onCompositionUpdate(n.value);else{var e=n.value;P(e),y.markerRange&&(y.context&&(y.markerRange.start.column=y.selectionStart=y.context.compositionStartOffset),y.markerRange.end.column=y.markerRange.start.column+N-y.selectionStart+C)}},z=function(e){if(!t.onCompositionEnd||t.$readOnly)return;y=!1,t.onCompositionEnd(),t.off("mousedown",W),e&&H()},X=o.delayedCall(U,50).schedule.bind(null,null);r.addListener(n,"compositionstart",R),r.addListener(n,"compositionupdate",U),r.addListener(n,"keyup",V),r.addListener(n,"keydown",X),r.addListener(n,"compositionend",z),this.getElement=function(){return n},this.setCommandMode=function(e){E=e,n.readOnly=!1},this.setReadOnly=function(e){E||(n.readOnly=e)},this.setCopyWithEmptySelection=function(e){},this.onContextMenu=function(e){D=!0,A(),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){w||(w=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+(i.isIE?"opacity:0.1;":"")+"text-indent: -"+(T+N)*t.renderer.characterWidth*.5+"px;";var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){s.translate(n,e.clientX-l-2,Math.min(e.clientY-f-2,c))};h(e);if(e.type!="mousedown")return;t.renderer.$isMousePressed=!0,clearTimeout($),i.isWin&&r.capture(t.container,h,J)},this.onContextMenuClose=J;var $,K=function(e){t.textInput.onContextMenu(e),J()};r.addListener(n,"mouseup",K),r.addListener(n,"mousedown",function(e){e.preventDefault(),J()}),r.addListener(t.renderer.scroller,"contextmenu",K),r.addListener(n,"contextmenu",K),d&&Q(e,t,n)};t.TextInput=m}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/useragent"),i=0,s=550;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var i=this.editor,s=e.getButton();if(s!==0){var o=i.getSelectionRange(),u=o.isEmpty();(u||s==1)&&i.selection.moveToPosition(n),s==2&&(i.textInput.onContextMenu(e.domEvent),r.isMozilla||e.preventDefault());return}this.mousedownEvent.time=Date.now();if(t&&!i.isFocused()){i.focus();if(this.$focusTimeout&&!this.$clickSelection&&!i.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;if(!this.mousedownEvent)return;this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>i||t-this.mousedownEvent.time>this.$focusTimeout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,r=e.domEvent.timeStamp,i=r-n.t,o=i?e.wheelX/i:n.vx,u=i?e.wheelY/i:n.vy;i=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(f=!0),a<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(f=!0);if(f)n.allowed=r;else if(r-n.allowedt.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.moveCursorToPosition(e),S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.selection.fromOrientedRange(m),t.isFocused()&&!w&&t.$resetCursorStyle(),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.$resetCursorStyle()}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.$resetCursorStyle(),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./mouse_event").MouseEvent,i=e("../lib/event"),s=e("../lib/dom");t.addTouchListeners=function(e,t){function b(){var e=window.navigator&&window.navigator.clipboard,r=!1,i=function(){var n=t.getCopyText(),i=t.session.getUndoManager().hasUndo();y.replaceChild(s.buildDom(r?["span",!n&&["span",{"class":"ace_mobile-button",action:"selectall"},"Select All"],n&&["span",{"class":"ace_mobile-button",action:"copy"},"Copy"],n&&["span",{"class":"ace_mobile-button",action:"cut"},"Cut"],e&&["span",{"class":"ace_mobile-button",action:"paste"},"Paste"],i&&["span",{"class":"ace_mobile-button",action:"undo"},"Undo"],["span",{"class":"ace_mobile-button",action:"find"},"Find"],["span",{"class":"ace_mobile-button",action:"openCommandPallete"},"Pallete"]]:["span"]),y.firstChild)},o=function(n){var s=n.target.getAttribute("action");if(s=="more"||!r)return r=!r,i();if(s=="paste")e.readText().then(function(e){t.execCommand(s,e)});else if(s){if(s=="cut"||s=="copy")e?e.writeText(t.getCopyText()):document.execCommand("copy");t.execCommand(s)}y.firstChild.style.display="none",r=!1,s!="openCommandPallete"&&t.focus()};y=s.buildDom(["div",{"class":"ace_mobile-menu",ontouchstart:function(e){n="menu",e.stopPropagation(),e.preventDefault(),t.textInput.focus()},ontouchend:function(e){e.stopPropagation(),e.preventDefault(),o(e)},onclick:o},["span"],["span",{"class":"ace_mobile-button",action:"more"},"..."]],t.container)}function w(){y||b();var e=t.selection.cursor,n=t.renderer.textToScreenCoordinates(e.row,e.column),r=t.container.getBoundingClientRect();y.style.top=n.pageY-r.top-3+"px",y.style.right="10px",y.style.display="",y.firstChild.style.display="none",t.on("input",E)}function E(e){y&&(y.style.display="none"),t.off("input",E)}function S(){l=null,clearTimeout(l);var e=t.selection.getRange(),r=e.contains(p.row,p.column);if(e.isEmpty()||!r)t.selection.moveToPosition(p),t.selection.selectWord();n="wait",w()}function x(){l=null,clearTimeout(l),t.selection.moveToPosition(p);var e=d>=2?t.selection.getLineRange(p.row):t.session.getBracketRange(p);e&&!e.isEmpty()?t.selection.setRange(e):t.selection.selectWord(),n="wait"}function T(){h+=60,c=setInterval(function(){h--<=0&&(clearInterval(c),c=null),Math.abs(v)<.01&&(v=0),Math.abs(m)<.01&&(m=0),h<20&&(v=.9*v),h<20&&(m=.9*m);var e=t.session.getScrollTop();t.renderer.scrollBy(10*v,10*m),e==t.session.getScrollTop()&&(h=0)},10)}var n="scroll",o,u,a,f,l,c,h=0,p,d=0,v=0,m=0,g,y;i.addListener(e,"contextmenu",function(e){if(!g)return;var n=t.textInput.getElement();n.focus()}),i.addListener(e,"touchstart",function(e){var i=e.touches;if(l||i.length>1){clearTimeout(l),l=null,a=-1,n="zoom";return}g=t.$mouseHandler.isMousePressed=!0;var s=t.renderer.layerConfig.lineHeight,c=t.renderer.layerConfig.lineHeight,y=e.timeStamp;f=y;var b=i[0],w=b.clientX,E=b.clientY;Math.abs(o-w)+Math.abs(u-E)>s&&(a=-1),o=e.clientX=w,u=e.clientY=E,v=m=0;var T=new r(e,t);p=T.getDocumentPosition();if(y-a<500&&i.length==1&&!h)d++,e.preventDefault(),e.button=0,x();else{d=0;var N=t.selection.cursor,C=t.selection.isEmpty()?N:t.selection.anchor,k=t.renderer.$cursorLayer.getPixelPosition(N,!0),L=t.renderer.$cursorLayer.getPixelPosition(C,!0),A=t.renderer.scroller.getBoundingClientRect(),O=function(e,t){return e/=c,t=t/s-.75,e*e+t*t};if(e.clientX_?"cursor":"anchor"),_<3.5?n="anchor":M<3.5?n="cursor":n="scroll",l=setTimeout(S,450)}a=y}),i.addListener(e,"touchend",function(e){g=t.$mouseHandler.isMousePressed=!1,c&&clearInterval(c),n=="zoom"?(n="",h=0):l?(t.selection.moveToPosition(p),h=0,w()):n=="scroll"?(T(),e.preventDefault(),E()):w(),clearTimeout(l),l=null}),i.addListener(e,"touchmove",function(e){l&&(clearTimeout(l),l=null);var i=e.touches;if(i.length>1||n=="zoom")return;var s=i[0],a=o-s.clientX,c=u-s.clientY;if(n=="wait"){if(!(a*a+c*c>4))return e.preventDefault();n="cursor"}o=s.clientX,u=s.clientY,e.clientX=s.clientX,e.clientY=s.clientY;var h=e.timeStamp,p=h-f;f=h;if(n=="scroll"){var d=new r(e,t);d.speed=1,d.wheelX=a,d.wheelY=c,10*Math.abs(a)1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a),f()};var f=function(){!a.basePath&&!a.workerPath&&!a.modePath&&!a.themePath&&!Object.keys(a.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),f=function(){})};t.init=l,t.version="1.4.8"}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("./touch_handler").addTouchListeners,l=e("../config"),c=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),f(e.container,e);var l=e.renderer.$gutter;r.addListener(l,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(l,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(l,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(l,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(l,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor,s=this.editor.renderer;s.$isMousePressed=!0;var o=this,a=function(e){if(!e)return;if(i.isWebKit&&!e.which&&o.releaseMouse)return o.releaseMouse();o.x=e.clientX,o.y=e.clientY,t&&t(e),o.mouseEvent=new u(e,o.editor),o.$mouseMoved=!0},f=function(e){n.off("beforeEndOperation",c),clearInterval(h),l(),o[o.state+"End"]&&o[o.state+"End"](e),o.state="",o.isMousePressed=s.$isMousePressed=!1,s.$keepTextAreaAtCursor&&s.$moveTextAreaToCursor(),o.$onCaptureMouseMove=o.releaseMouse=null,e&&o.onMouseEvent("mouseup",e),n.endOperation()},l=function(){o[o.state]&&o[o.state](),o.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){f(e)});var c=function(e){if(!o.releaseMouse)return;n.curOp.command.name&&n.curOp.selectionChanged&&(o[o.state+"End"]&&o[o.state+"End"](),o.state="",o.releaseMouse())};n.on("beforeEndOperation",c),n.startOperation({command:{name:"mouse"}}),o.$onCaptureMouseMove=a,o.releaseMouse=r.capture(this.editor.container,a,f);var h=setInterval(l,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(c.prototype),l.defineOptions(c.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimeout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=c}),define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";function i(e){e.on("click",function(t){var n=t.getDocumentPosition(),i=e.session,s=i.getFoldAt(n.row,n.column,1);s&&(t.getAccelKey()?i.removeFold(s):i.expandFold(s),t.stop());var o=t.domEvent&&t.domEvent.target;o&&r.hasCssClass(o,"ace_inline_button")&&r.hasCssClass(o,"ace_toggle_wrap")&&(i.setOption("wrap",!i.getUseWrapMode()),e.renderer.scrollCursorIntoView())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}var r=e("../lib/dom");t.FoldHandler=i}),define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);return this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){return this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),define("ace/lib/bidiutil",["require","exports","module"],function(e,t,n){"use strict";function F(e,t,n,r){var i=s?d:p,c=null,h=null,v=null,m=0,g=null,y=null,b=-1,w=null,E=null,T=[];if(!r)for(w=0,r=[];w0)if(g==16){for(w=b;w-1){for(w=b;w=0;C--){if(r[C]!=N)break;t[C]=s}}}function I(e,t,n){if(o=e){u=i+1;while(u=e)u++;for(a=i,l=u-1;a=t.length||(o=n[r-1])!=b&&o!=w||(c=t[r+1])!=b&&c!=w)return E;return u&&(c=w),c==o?c:E;case k:o=r>0?n[r-1]:S;if(o==b&&r+10&&n[r-1]==b)return b;if(u)return E;p=r+1,h=t.length;while(p=1425&&d<=2303||d==64286;o=t[p];if(v&&(o==y||o==T))return y}if(r<1||(o=t[r-1])==S)return E;return n[r-1];case S:return u=!1,f=!0,s;case x:return l=!0,E;case O:case M:case D:case P:case _:u=!1;case H:return E}}function R(e){var t=e.charCodeAt(0),n=t>>8;return n==0?t>191?g:B[t]:n==5?/[\u0591-\u05f4]/.test(e)?y:g:n==6?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?w:t==1642?L:/[\u06f0-\u06f9]/.test(e)?b:T:n==32&&t<=8287?j[t&255]:n==254?t>=65136?T:E:E}function U(e){return e>="\u064b"&&e<="\u0655"}var r=["\u0621","\u0641"],i=["\u063a","\u064a"],s=0,o=0,u=!1,a=!1,f=!1,l=!1,c=!1,h=!1,p=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],d=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],v=0,m=1,g=0,y=1,b=2,w=3,E=4,S=5,x=6,T=7,N=8,C=9,k=10,L=11,A=12,O=13,M=14,_=15,D=16,P=17,H=18,B=[H,H,H,H,H,H,H,H,H,x,S,x,N,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,S,S,S,x,N,E,E,L,L,L,E,E,E,E,E,k,C,k,C,C,b,b,b,b,b,b,b,b,b,b,C,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,H,H,H,H,H,H,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,C,E,L,L,L,L,E,E,E,E,g,E,E,H,E,E,L,L,b,b,E,g,E,E,E,b,g,E,E,E,E,E],j=[N,N,N,N,N,N,N,N,N,N,N,H,H,H,g,y,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N,S,O,M,_,D,P,C,L,L,L,L,L,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,C,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N];t.L=g,t.R=y,t.EN=b,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.RLE=7,t.DOT="\u00b7",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var i=e.split(""),o=new Array(i.length),u=new Array(i.length),a=[];s=r?m:v,F(i,a,i.length,n);for(var f=0;fT&&n[f]0&&i[f-1]==="\u0644"&&/\u0622|\u0623|\u0625|\u0627/.test(i[f])&&(a[f-1]=a[f]=t.R_H,f++);i[i.length-1]===t.DOT&&(a[i.length-1]=t.B),i[0]==="\u202b"&&(a[0]=t.RLE);for(var f=0;f=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,r=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){n=this.session.$getRowCacheIndex(t,this.currentRow-e-1);if(n!==r)break;r=n,e++}}else e=this.currentRow;return e},this.updateRowLine=function(e,t){e===undefined&&(e=this.getDocumentRow());var n=e===this.session.getLength()-1,s=n?this.EOF:this.EOL;this.wrapIndent=0,this.line=this.session.getLine(e),this.isRtlDir=this.$isRtl||this.line.charAt(0)===this.RLE;if(this.session.$useWrapMode){var o=this.session.$wrapData[e];o&&(t===undefined&&(t=this.getSplitIndex()),t>0&&o.length?(this.wrapIndent=o.indent,this.wrapOffset=this.wrapIndent*this.charWidths[r.L],this.line=tt?this.session.getOverwrite()?e:e-1:t,i=r.getVisualFromLogicalIdx(n,this.bidiMap),s=this.bidiMap.bidiLevels,o=0;!this.session.getOverwrite()&&e<=t&&s[i]%2!==0&&i++;for(var u=0;ut&&s[i]%2===0&&(o+=this.charWidths[s[i]]),this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset),this.isRtlDir&&(o+=this.rtlLineOffset),o},this.getSelections=function(e,t){var n=this.bidiMap,r=n.bidiLevels,i,s=[],o=0,u=Math.min(e,t)-this.wrapIndent,a=Math.max(e,t)-this.wrapIndent,f=!1,l=!1,c=0;this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset);for(var h,p=0;p=u&&hn+s/2){n+=s;if(r===i.length-1){s=0;break}s=this.charWidths[i[++r]]}return r>0&&i[r-1]%2!==0&&i[r]%2===0?(e0&&i[r-1]%2===0&&i[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===i.length-1&&s===0&&i[r-1]%2===0||!this.isRtlDir&&r===0&&i[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&i[r-1]%2!==0&&s!==0&&r--,t=this.bidiMap.logicalFromVisual[r]),t===0&&this.isRtlDir&&t++,t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o}),define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.cursor=this.lead=this.doc.createAnchor(0,0),this.anchor=this.doc.createAnchor(0,0),this.$silent=!1;var t=this;this.cursor.on("change",function(e){t.$cursorChanged=!0,t.$silent||t._emit("changeCursor"),!t.$isEmpty&&!t.$silent&&t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.anchor.on("change",function(){t.$anchorChanged=!0,!t.$isEmpty&&!t.$silent&&t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return!this.$isEmpty&&this.anchor.row!=this.cursor.row},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.$isEmpty=!1,this.anchor.setPosition(e,t)},this.getAnchor=this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.$isEmpty?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){this.$setSelection(0,0,Number.MAX_VALUE,Number.MAX_VALUE)},this.setRange=this.setSelectionRange=function(e,t){var n=t?e.end:e.start,r=t?e.start:e.end;this.$setSelection(n.row,n.column,r.row,r.column)},this.$setSelection=function(e,t,n,r){if(this.$silent)return;var i=this.$isEmpty,s=this.inMultiSelectMode;this.$silent=!0,this.$cursorChanged=this.$anchorChanged=!1,this.anchor.setPosition(e,t),this.cursor.setPosition(n,r),this.$isEmpty=!o.comparePoints(this.anchor,this.cursor),this.$silent=!1,this.$cursorChanged&&this._emit("changeCursor"),(this.$cursorChanged||this.$anchorChanged||i!=this.$isEmpty||s)&&this._emit("changeSelection")},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var r=e.column,i=e.column+t;return n<0&&(r=e.column-t,i=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(r,i).split(" ").length-1==t},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(e,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var i=this.session.getFoldAt(e,t,1);if(i){this.moveCursorTo(i.end.row,i.end.column);return}this.session.nonTokenRe.exec(r)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t));if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}this.session.tokenRe.exec(s)&&(t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t=0,n,r=/\s/,i=this.session.tokenRe;i.lastIndex=0;if(this.session.tokenRe.exec(e))t=this.session.tokenRe.lastIndex;else{while((n=e[t])&&r.test(n))t++;if(t<1){i.lastIndex=0;while((n=e[t])&&!i.test(n)){i.lastIndex=0,t++;if(r.test(n)){if(t>2){t--;break}while((n=e[t])&&r.test(n))t++;if(t>2)break}}}}return i.lastIndex=0,t},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column),r;t===0&&(e!==0&&(this.session.$bidiHandler.isBidiRow(n.row,this.lead.row)?(r=this.session.$bidiHandler.getPosLeft(n.column),n.column=Math.round(r/this.session.$bidiHandler.charWidths[0])):r=n.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);if(e!=0&&this.session.lineWidgets&&this.session.lineWidgets[this.lead.row]){var i=this.session.lineWidgets[this.lead.row];e<0?e-=i.rowsAbove||0:e>0&&(e+=i.rowCount-(i.rowsAbove||0))}var s=this.session.screenToDocumentPosition(n.row+e,n.column,r);e!==0&&t===0&&s.row===this.lead.row&&s.column===this.lead.column,this.moveCursorTo(s.row,s.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0;var i=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(i.charAt(t))&&i.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList&&e.length>1){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new r(this.$row,t,this.$row,t+e.value.length)}}).call(i.prototype),t.TokenIterator=i}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","rparen","paren","punctuation.operator"],a=["text","paren.rparen","rparen","paren","punctuation.operator","comment"],f,l={},c={'"':'"',"'":"'"},h=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},p=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},d=function(e){this.add("braces","insertion",function(t,n,r,i,s){var u=r.getCursorPosition(),a=i.doc.getLine(u.row);if(s=="{"){h(r);var l=r.getSelectionRange(),c=i.doc.getTextRange(l);if(c!==""&&c!=="{"&&r.getWrapBehavioursEnabled())return p(l,c,"{","}");if(d.isSaneInsertion(r,i))return/[\]\}\)]/.test(a[u.column])||r.inMultiSelectMode||e&&e.braces?(d.recordAutoInsert(r,i,"}"),{text:"{}",selection:[1,1]}):(d.recordMaybeInsert(r,i,"{"),{text:"{",selection:[1,1]})}else if(s=="}"){h(r);var v=a.substring(u.column,u.column+1);if(v=="}"){var m=i.$findOpeningBracket("}",{column:u.column+1,row:u.row});if(m!==null&&d.isAutoInsertedClosing(u,a,s))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(s=="\n"||s=="\r\n"){h(r);var g="";d.isMaybeInsertedClosing(u,a)&&(g=o.stringRepeat("}",f.maybeInsertedBrackets),d.clearMaybeInsertedClosing());var v=a.substring(u.column,u.column+1);if(v==="}"){var y=i.findMatchingBracket({row:u.row,column:u.column+1},"}");if(!y)return null;var b=this.$getIndent(i.getLine(y.row))}else{if(!g){d.clearMaybeInsertedClosing();return}var b=this.$getIndent(a)}var w=b+i.getTabString();return{text:"\n"+w+"\n"+b+g,selection:[1,w.length,1,w.length]}}d.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"(",")");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"[","]");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){var s=r.$mode.$quotes||c;if(i.length==1&&s[i]){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;h(n);var o=i,u=n.getSelectionRange(),a=r.doc.getTextRange(u);if(a!==""&&(a.length!=1||!s[a])&&n.getWrapBehavioursEnabled())return p(u,a,o,o);if(!a){var f=n.getCursorPosition(),l=r.doc.getLine(f.row),d=l.substring(f.column-1,f.column),v=l.substring(f.column,f.column+1),m=r.getTokenAt(f.row,f.column),g=r.getTokenAt(f.row,f.column+1);if(d=="\\"&&m&&/escape/.test(m.type))return null;var y=m&&/string|escape/.test(m.type),b=!g||/string|escape/.test(g.type),w;if(v==o)w=y!==b,w&&/string\.end/.test(g.type)&&(w=!1);else{if(y&&!b)return null;if(y&&b)return null;var E=r.$mode.tokenRe;E.lastIndex=0;var S=E.test(d);E.lastIndex=0;var x=E.test(d);if(S||x)return null;if(v&&!/[\s;,.})\]\\]/.test(v))return null;var T=l[f.column-2];if(!(d!=o||T!=o&&!E.test(T)))return null;w=!0}return{text:w?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.$mode.$quotes||c,o=r.doc.getTextRange(i);if(!i.isMultiLine()&&s.hasOwnProperty(o)){h(n);var u=r.doc.getLine(i.start.row),a=u.substring(i.start.column+1,i.start.column+2);if(a==o)return i.end.column++,i}})};d.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){if(/[)}\]]/.test(e.session.getLine(n.row)[n.column]))return!0;var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},d.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},d.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},d.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},d.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},d.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},d.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},d.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(d,i),t.CstyleBehaviour=d}),define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";var r=[48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2],i=0,s=[];for(var o=0;o2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),u==Infinity&&(u=E,s=!1,o=!1),l&&u%f!=0&&(u=Math.floor(u/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new f(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,a=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new l(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new f(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new l(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);a.start.row==c&&(a.start.column+=h),a.end.row==c&&(a.end.column+=h),t.selection.fromOrientedRange(a)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)if(e[t]){var n=e[t],i=n.prototype.$id,s=r.$modes[i];s||(r.$modes[i]=s=new n),r.$modes[t]||(r.$modes[t]=s),this.$embeds.push(t),this.$modes[t]=s}var o=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4?this.$splitAndapplyLargeDelta(e,2e4):(i(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length-t+1,i=e.start.row,s=e.start.column;for(var o=0,u=0;o20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,r==-1&&(r=t),s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row=r)break}if(e.action=="insert"){var f=i-r,l=-t.column+n.column;for(;or)break;a.start.row==r&&a.start.column>=t.column&&(a.start.column==t.column&&this.$bias<=0||(a.start.column+=l,a.start.row+=f));if(a.end.row==r&&a.end.column>=t.column){if(a.end.column==t.column&&this.$bias<0)continue;a.end.column==t.column&&l>0&&oa.start.column&&a.end.column==s[o+1].start.column&&(a.end.column-=l),a.end.column+=l,a.end.row+=f}}}else{var f=r-i,l=t.column-n.column;for(;oi)break;if(a.end.rowt.column)a.end.column=t.column,a.end.row=t.row}else a.end.column+=l,a.end.row+=f;else a.end.row>i&&(a.end.row+=f);if(a.start.rowt.column)a.start.column=t.column,a.start.row=t.row}else a.start.column+=l,a.start.row+=f;else a.start.row>i&&(a.start.row+=f)}}if(f!=0&&o=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column,c=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(c&&h==c)return c.addSubFold(o);c&&!c.range.isStart(u,a)&&this.removeFold(c),h&&!h.range.isEnd(f,l)&&this.removeFold(h);var p=this.getFoldsInRange(o.range);p.length>0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(tl)break}while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return f.end.row=i.getCurrentTokenRow(),f.end.column=i.getCurrentTokenColumn()+s.value.length-2,f}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;if(!r)return;t=t||this.getLength(),e=e||0;for(var i=e;i=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.getMatchingBracketRanges=function(e){var t=this.getLine(e.row),n=t.charAt(e.column-1),r=n&&n.match(/([\(\[\{])|([\)\]\}])/);r||(n=t.charAt(e.column),e={row:e.row,column:e.column+1},r=n&&n.match(/([\(\[\{])|([\)\]\}])/));if(!r)return null;var s=new i(e.row,e.column-1,e.row,e.column),o=r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e);if(!o)return[s];var u=new i(o.row,o.column,o.row,o.column+1);return[s,u]},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{","<":">",">":"<"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,u),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;e.addSession(this),this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.mergeUndoDeltas=!1},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}else this.$syncInformUndoManager=function(){}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},hasUndo:function(){},hasRedo:function(){},reset:function(){},add:function(){},addSelection:function(){},startNewGroup:function(){},addSession:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=e.length-1;n!=-1;n--){var r=e[n];r.action=="insert"||r.action=="remove"?this.doc.revertDelta(r):r.folds&&this.addFolds(r.folds)}!t&&this.$undoSelect&&(e.selectionBefore?this.selection.fromJSON(e.selectionBefore):this.selection.setRange(this.$getUndoSelection(e,!0))),this.$fromUndo=!1},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=0;ne.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,f=s.start,o=f.row-a.row,u=f.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new l(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new l(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),o=this.$wrapData,u=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,o){var u;if(e!=null){u=this.$getDisplayTokens(e,a.length),u[0]=n;for(var f=1;fr-b){var w=f+r-b;if(e[w-1]>=c&&e[w]>=c){y(w);continue}if(e[w]==n||e[w]==s){for(w;w!=f-1;w--)if(e[w]==n)break;if(w>f){y(w);continue}w=f+r;for(w;w>2)),f-1);while(w>E&&e[w]E&&e[w]E&&e[w]==a)w--}else while(w>E&&e[w]E){y(++w);continue}w=f+r,e[w]==t&&w--,y(w-b)}return o},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(a):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){var t=1;return this.lineWidgets&&(t+=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0),!this.$useWrapMode||!this.$wrapData[e]?t:this.$wrapData[e].length+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var u=f[l],i=this.$docRowCache[l],h=e>f[c-1];else var h=!c;var p=this.getLength()-1,d=this.getNextFoldLine(i),v=d?d.start.row:Infinity;while(u<=e){a=this.getRowLength(i);if(u+a>e||i>=p)break;u+=a,i++,i>v&&(i=d.end.row+1,d=this.getNextFoldLine(i,d),v=d?d.start.row:Infinity),h&&(this.$docRowCache.push(i),this.$screenRowCache.push(u))}if(d&&d.start.row<=i)r=this.getFoldDisplayLine(d),i=d.start.row;else{if(u+a<=e||i>p)return{row:p,column:this.getLine(p).length};r=this.getLine(i),d=null}var m=0,g=Math.floor(e-u);if(this.$useWrapMode){var y=this.$wrapData[i];y&&(o=y[g],g>0&&y.length&&(m=y.indent,s=y[g-1]||y[y.length-1],r=r.substring(s)))}return n!==undefined&&this.$bidiHandler.isBidiRow(u+g,i,g)&&(t=this.$bidiHandler.offsetToCol(n)),s+=this.$getStringScreenWidth(r,t-m)[1],this.$useWrapMode&&s>=o&&(s=o-1),d?d.idxToPosition(s):{row:i,column:s}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return this.lineWidgets&&this.lineWidgets[u]&&this.lineWidgets[u].rowsAbove&&(r+=this.lineWidgets[u].rowsAbove),{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()},this.isFullWidth=m}.call(d.prototype),e("./edit_session/folding").Folding.call(d.prototype),e("./edit_session/bracket_match").BracketMatch.call(d.prototype),o.defineOptions(d.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0)))},initialValue:"auto"},indentedSoftWrap:{set:function(){this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0))},initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){e=parseInt(e),e>0&&this.$tabSize!==e&&(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},foldStyle:{set:function(e){this.setFoldStyle(e)},handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId},handlesSet:!0}}),t.EditSession=d}),define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i,o){return r=new s(e,n,i,o),n==o&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start)?(r=null,!1):!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=u;n--)if(c(n,Number.MAX_VALUE,e))return;if(t.wrap==0)return;for(n=a,u=o.row;n>=u;n--)if(c(n,Number.MAX_VALUE,e))return};else var f=function(e){var n=o.row;if(c(n,o.column,e))return;for(n+=1;n<=a;n++)if(c(n,0,e))return;if(t.wrap==0)return;for(n=u,a=o.row;n<=a;n++)if(c(n,0,e))return};if(t.$isMultiLine)var l=n.length,c=function(t,i,s){var o=r?t-l+1:t;if(o<0)return;var u=e.getLine(o),a=u.search(n[0]);if(!r&&ai)return;if(s(o,a,o+l-1,c))return!0};else if(r)var c=function(t,r,i){var s=e.getLine(t),o=[],u,a=0;n.lastIndex=0;while(u=n.exec(s)){var f=u[0].length;a=u.index;if(!f){if(a>=s.length)break;n.lastIndex=a+=1}if(u.index+f>r)break;o.push(u.index,f)}for(var l=o.length-1;l>=0;l-=2){var c=o[l-1],f=o[l];if(i(t,c,t,c+f))return!0}};else var c=function(t,r,i){var s=e.getLine(t),o,u;n.lastIndex=r;while(u=n.exec(s)){var a=u[0].length;o=u.index;if(i(t,o,t,o+a))return!0;if(!a){n.lastIndex=o+=1;if(o>=s.length)return!1}}};return{forEach:f}}}).call(o.prototype),t.Search=o}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(this.$checkCommandState!=0&&e.isAvailable&&!e.isAvailable(t))return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",description:"Select all",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",description:"Center selection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",description:"Go to line...",bindKey:o("Ctrl-L","Command-L"),exec:function(e,t){typeof t=="number"&&!isNaN(t)&&e.gotoLine(t),e.prompt({$type:"gotoLine"})},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",description:"Fold all",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",description:"Fold other",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",description:"Unfold all",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",description:"Find next",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",description:"Find previous",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",description:"Select or find next",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",description:"Select or find previous",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",description:"Find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",description:"Overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",description:"Select to start",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",description:"Go to start",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",description:"Select up",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",description:"Go line up",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",description:"Select to end",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",description:"Go to end",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",description:"Select down",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",description:"Go line down",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",description:"Select word left",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",description:"Go to word left",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",description:"Select to line start",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",description:"Go to line start",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",description:"Select left",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",description:"Go to left",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",description:"Select word right",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",description:"Go to word right",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",description:"Select to line end",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",description:"Go to line end",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",description:"Select right",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",description:"Go to right",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",description:"Select page down",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",description:"Page down",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",description:"Go to page down",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",description:"Select page up",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",description:"Page up",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",description:"Go to page up",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",description:"Scroll up",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",description:"Scroll down",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",description:"Select line start",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",description:"Select line end",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",description:"Toggle recording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",description:"Replay macro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",description:"Jump to matching",bindKey:o("Ctrl-\\|Ctrl-P","Command-\\"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",description:"Select to matching",bindKey:o("Ctrl-Shift-\\|Ctrl-Shift-P","Command-Shift-\\"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",description:"Expand to matching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",description:"Pass keys to browser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",description:"Copy",exec:function(e){},readOnly:!0},{name:"cut",description:"Cut",exec:function(e){var t=e.$copyWithEmptySelection&&e.selection.isEmpty(),n=t?e.selection.getLineRange():e.selection.getRange();e._emit("cut",n),n.isEmpty()||e.session.remove(n),e.clearSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",description:"Paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",description:"Remove line",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",description:"Duplicate selection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",description:"Sort lines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",description:"Toggle comment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",description:"Toggle block comment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",description:"Modify number up",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",description:"Modify number down",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",description:"Replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",description:"Undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",description:"Redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",description:"Copy lines up",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",description:"Move lines up",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",description:"Copy lines down",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",description:"Move lines down",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",description:"Delete",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",description:"Backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",description:"Cut or delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",description:"Remove to line start",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",description:"Remove to line end",bindKey:o("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",description:"Remove to line start hard",bindKey:o("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",description:"Remove to line end hard",bindKey:o("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",description:"Remove word left",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",description:"Remove word right",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",description:"Outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",description:"Indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",description:"Block outdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",description:"Block indent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",description:"Insert string",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",description:"Insert text",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",description:"Split line",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",description:"Transpose letters",bindKey:o("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",description:"To uppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",description:"To lowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",description:"Expand to line",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",description:"Join lines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",description:"Invert selection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}var s=this.selection.toJSON();this.curOp.selectionAfter=s,this.$lastSel=this.selection.toJSON(),this.session.getUndoManager().addSelection(s),this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"&&e!="ace"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container).fontSize},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;t.$bracketHighlight&&(t.$bracketHighlight.markerIds.forEach(function(e){t.removeMarker(e)}),t.$bracketHighlight=null);var n=t.getMatchingBracketRanges(e.getCursorPosition());!n&&t.$mode.getMatching&&(n=t.$mode.getMatching(e.session));if(!n)return;var r="ace_bracket";Array.isArray(n)?n.length==1&&(r="ace_error_bracket"):n=[n],n.length==2&&(p.comparePoints(n[0].end,n[1].start)==0?n=[p.fromPoints(n[0].start,n[1].end)]:p.comparePoints(n[0].start,n[1].end)==0&&(n=[p.fromPoints(n[1].start,n[0].end)])),t.$bracketHighlight={ranges:n,markerIds:n.map(function(e){return t.addMarker(e,r,"text")})}},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column,r=t.end.column,i=e.getLine(t.start.row),s=i.substring(n,r);if(s.length>5e3||!/[\w\d]/.test(s))return;var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:s}),u=i.substring(n-1,r+1);if(!o.test(u))return;return o},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText(),t=this.session.doc.getNewLineCharacter(),n=!1;if(!e&&this.$copyWithEmptySelection){n=!0;var r=this.selection.getAllRanges();for(var i=0;iu.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e);n.insert(i,e),s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var h=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},h)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e,t){if(!t)return this.keyBinding.onTextInput(e);this.startOperation({command:{name:"insertstring"}});var n=this.applyComposition.bind(this,e,t);this.selection.rangeCount?this.forEachSelection(n):n(),this.endOperation()},this.applyComposition=function(e,t){if(t.extendLeft||t.extendRight){var n=this.selection.getRange();n.start.column-=t.extendLeft,n.end.column+=t.extendRight,this.selection.setRange(n),!e&&!n.isEmpty()&&this.remove()}(e||!this.selection.isEmpty())&&this.insert(e,!0);if(t.restoreStart||t.restoreEnd){var n=this.selection.getRange();n.start.column-=t.restoreStart,n.end.column-=t.restoreEnd,this.selection.setRange(n)}},this.onCommandKey=function(e,t,n){return this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.selection.isEmpty()&&this.selection.selectLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var i=new p(0,0,0,0);for(var r=e.first;r<=e.last;r++){var s=t.getLine(r);i.start.row=r,i.end.row=r,i.end.column=s.length,t.replace(i,n[r-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n=u&&o<=a&&(n=t,f.selection.clearSelection(),f.moveCursorTo(e,u+r),f.selection.selectTo(e,a+r)),u=a});var l=this.$toggleWordPairs,c;for(var h=0;hp+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(e)},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection());var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.selection.selectAll()},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.session.unfold(e),this.selection.setSelectionRange(e);var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.session.getUndoManager().undo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.session.getUndoManager().redo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy(),this._$emitInputEvent&&this._$emitInputEvent.cancel(),this.session=null},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))},this.prompt=function(e,t,n){var r=this;g.loadModule("./ext/prompt",function(i){i.prompt(r,e,t,n)})}}.call(w.prototype),g.defineOptions(w.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.$resetCursorStyle()},initialValue:!1},copyWithEmptySelection:{set:function(e){this.textInput.setCopyWithEmptySelection(e)},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.$keybindingId},handlesSet:!0},value:{set:function(e){this.session.setValue(e)},get:function(){return this.getValue()},handlesSet:!0,hidden:!0},session:{set:function(e){this.setSession(e)},get:function(){return this.session},handlesSet:!0,hidden:!0},showLineNumbers:{set:function(e){this.renderer.$gutterLayer.setShowLineNumbers(e),this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER),e&&this.$relativeLineNumbers?E.attach(this):E.detach(this)},initialValue:!0},relativeLineNumbers:{set:function(e){this.$showLineNumbers&&e?E.attach(this):E.detach(this)}},placeholder:{set:function(e){this.$updatePlaceholder||(this.$updatePlaceholder=function(){var e=this.renderer.$composition||this.getValue();if(e&&this.renderer.placeholderNode)this.renderer.off("afterRender",this.$updatePlaceholder),i.removeCssClass(this.container,"ace_hasPlaceholder"),this.renderer.placeholderNode.remove(),this.renderer.placeholderNode=null;else if(!e&&!this.renderer.placeholderNode){this.renderer.on("afterRender",this.$updatePlaceholder),i.addCssClass(this.container,"ace_hasPlaceholder");var t=i.createElement("div");t.className="ace_placeholder",t.textContent=this.$placeholder||"",this.renderer.placeholderNode=t,this.renderer.content.appendChild(this.renderer.placeholderNode)}}.bind(this),this.on("input",this.$updatePlaceholder)),this.$updatePlaceholder()}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",displayIndentGuides:"renderer",showGutter:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",hasCssTransforms:"renderer",maxPixelHeight:"renderer",useTextareaForIME:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimeout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",navigateWithinSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"});var E={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?"\u00b7":""))+""},getWidth:function(e,t,n){return Math.max(t.toString().length,(n.lastRow+1).toString().length,2)*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on("changeSelection",this.update),this.update(null,e)},detach:function(e){e.renderer.$gutterLayer.$renderer==this&&(e.renderer.$gutterLayer.$renderer=null),e.off("changeSelection",this.update),this.update(null,e)}};t.Editor=w}),define("ace/undomanager",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){for(var n=t;n--;){var r=e[n];if(r&&!r[0].ignore){while(n0){a.row+=i,a.column+=a.row==r.row?s:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}}function f(e){return{row:e.row,column:e.column}}function l(e){return{start:f(e.start),end:f(e.end),action:e.action,lines:e.lines.slice()}}function c(e){e=e||this;if(Array.isArray(e))return e.map(c).join("\n");var t="";e.action?(t=e.action=="insert"?"+":"-",t+="["+e.lines+"]"):e.value&&(Array.isArray(e.value)?t=e.value.map(h).join("\n"):t=h(e.value)),e.start&&(t+=h(e));if(e.id||e.rev)t+=" ("+(e.id||e.rev)+")";return t}function h(e){return e.start.row+":"+e.start.column+"=>"+e.end.row+":"+e.end.column}function p(e,t){var n=e.action=="insert",r=t.action=="insert";if(n&&r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}else if(!n&&r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(!n&&!r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}return[t,e]}function d(e,t){for(var n=e.length;n--;)for(var r=0;r=0?m(e,t,-1):o(e.start,t.start)<=0?m(t,e,1):(m(e,s.fromPoints(t.start,e.start),-1),m(t,e,1));else if(!n&&r)o(t.start,e.end)>=0?m(t,e,-1):o(t.start,e.start)<=0?m(e,t,1):(m(t,s.fromPoints(e.start,t.start),-1),m(e,t,1));else if(!n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0)){var i,u;return o(e.start,t.start)<0&&(i=e,e=y(e,t.start)),o(e.end,t.end)>0&&(u=y(e,t.end)),g(t.end,e.start,e.end,-1),u&&!i&&(e.lines=u.lines,e.start=u.start,e.end=u.end,u=e),[t,i,u].filter(Boolean)}m(e,t,-1)}return[t,e]}function m(e,t,n){g(e.start,t.start,t.end,n),g(e.end,t.start,t.end,n)}function g(e,t,n,r){e.row==(r==1?t:n).row&&(e.column+=r*(n.column-t.column)),e.row+=r*(n.row-t.row)}function y(e,t){var n=e.lines,r=e.end;e.end=f(t);var i=e.end.row-e.start.row,s=n.splice(i,n.length),o=i?t.column:t.column-e.start.column;n.push(s[0].substring(0,o)),s[0]=s[0].substr(o);var u={start:f(t),end:r,lines:s,action:e.action};return u}function b(e,t){t=l(t);for(var n=e.length;n--;){var r=e[n];for(var i=0;i0},this.canRedo=function(){return this.$redoStack.length>0},this.bookmark=function(e){e==undefined&&(e=this.$rev),this.mark=e},this.isAtBookmark=function(){return this.$rev===this.mark},this.toJSON=function(){},this.fromJSON=function(){},this.hasUndo=this.canUndo,this.hasRedo=this.canRedo,this.isClean=this.isAtBookmark,this.markClean=this.bookmark,this.$prettyPrint=function(e){return e?c(e):c(this.$undoStack)+"\n---\n"+c(this.$redoStack)}}).call(r.prototype);var s=e("./range").Range,o=s.comparePoints,u=s.comparePoints;t.UndoManager=r}),define("ace/layer/lines",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e,t){this.element=e,this.canvasHeight=t||5e5,this.element.style.height=this.canvasHeight*2+"px",this.cells=[],this.cellCache=[],this.$offsetCoefficient=0};(function(){this.moveContainer=function(e){r.translate(this.element,0,-(e.firstRowScreen*e.lineHeight%this.canvasHeight)-e.offset*this.$offsetCoefficient)},this.pageChanged=function(e,t){return Math.floor(e.firstRowScreen*e.lineHeight/this.canvasHeight)!==Math.floor(t.firstRowScreen*t.lineHeight/this.canvasHeight)},this.computeLineTop=function(e,t,n){var r=t.firstRowScreen*t.lineHeight,i=Math.floor(r/this.canvasHeight),s=n.documentToScreenRow(e,0)*t.lineHeight;return s-i*this.canvasHeight},this.computeLineHeight=function(e,t,n){return t.lineHeight*n.getRowLineCount(e)},this.getLength=function(){return this.cells.length},this.get=function(e){return this.cells[e]},this.shift=function(){this.$cacheCell(this.cells.shift())},this.pop=function(){this.$cacheCell(this.cells.pop())},this.push=function(e){if(Array.isArray(e)){this.cells.push.apply(this.cells,e);var t=r.createFragment(this.element);for(var n=0;ns&&(a=i.end.row+1,i=t.getNextFoldLine(a,i),s=i?i.start.row:Infinity);if(a>r){while(this.$lines.getLength()>u+1)this.$lines.pop();break}o=this.$lines.get(++u),o?o.row=a:(o=this.$lines.createCell(a,e,this.session,f),this.$lines.push(o)),this.$renderCell(o,e,i,a),a++}this._signal("afterRender"),this.$updateGutterWidth(e)},this.$updateGutterWidth=function(e){var t=this.session,n=t.gutterRenderer||this.$renderer,r=t.$firstLineNumber,i=this.$lines.last()?this.$lines.last().text:"";if(this.$fixedWidth||t.$useWrapMode)i=t.getLength()+r-1;var s=n?n.getWidth(t,i,e):i.toString().length*e.characterWidth,o=this.$padding||this.$computePadding();s+=o.left+o.right,s!==this.gutterWidth&&!isNaN(s)&&(this.gutterWidth=s,this.element.parentNode.style.width=this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._signal("changeGutterWidth",s))},this.$updateCursorRow=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.getCursor();if(this.$cursorRow===e.row)return;this.$cursorRow=e.row},this.updateLineHighlight=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.cursor.row;this.$cursorRow=e;if(this.$cursorCell&&this.$cursorCell.row==e)return;this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ",""));var t=this.$lines.cells;this.$cursorCell=null;for(var n=0;n=this.$cursorRow){if(r.row>this.$cursorRow){var i=this.session.getFoldLine(this.$cursorRow);if(!(n>0&&i&&i.start.row==t[n-1].row))break;r=t[n-1]}r.element.className="ace_gutter-active-line "+r.element.className,this.$cursorCell=r;break}}},this.scrollLines=function(e){var t=this.config;this.config=e,this.$updateCursorRow();if(this.$lines.pageChanged(t,e))return this.update(e);this.$lines.moveContainer(e);var n=Math.min(e.lastRow+e.gutterOffset,this.session.getLength()-1),r=this.oldLastRow;this.oldLastRow=n;if(!t||r0;i--)this.$lines.shift();if(r>n)for(var i=this.session.getFoldedRowCount(n+1,r);i>0;i--)this.$lines.pop();e.firstRowr&&this.$lines.push(this.$renderLines(e,r+1,n)),this.updateLineHighlight(),this._signal("afterRender"),this.$updateGutterWidth(e)},this.$renderLines=function(e,t,n){var r=[],i=t,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>n)break;var u=this.$lines.createCell(i,e,this.session,f);this.$renderCell(u,e,s,i),r.push(u),i++}return r},this.$renderCell=function(e,t,n,i){var s=e.element,o=this.session,u=s.childNodes[0],a=s.childNodes[1],f=o.$firstLineNumber,l=o.$breakpoints,c=o.$decorations,h=o.gutterRenderer||this.$renderer,p=this.$showFoldWidgets&&o.foldWidgets,d=n?n.start.row:Number.MAX_VALUE,v="ace_gutter-cell ";this.$highlightGutterLine&&(i==this.$cursorRow||n&&i=d&&this.$cursorRow<=n.end.row)&&(v+="ace_gutter-active-line ",this.$cursorCell!=e&&(this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ","")),this.$cursorCell=e)),l[i]&&(v+=l[i]),c[i]&&(v+=c[i]),this.$annotations[i]&&(v+=this.$annotations[i].className),s.className!=v&&(s.className=v);if(p){var m=p[i];m==null&&(m=p[i]=o.getFoldWidget(i))}if(m){var v="ace_fold-widget ace_"+m;m=="start"&&i==d&&in.right-t.right)return"foldWidgets"}}).call(a.prototype),t.Gutter=a}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.elt=function(e,t){var n=this.i!=-1&&this.element.childNodes[this.i];n?this.i++:(n=document.createElement("div"),this.element.appendChild(n),this.i=-1),n.style.cssText=t,n.className=e},this.update=function(e){if(!e)return;this.config=e,this.i=0;var t;for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}if(this.i!=-1)while(this.ip,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"";if(this.session.$bidiHandler.isBidiRow(t.start.row)){var f=t.clone();f.end.row=f.start.row,f.end.column=this.session.getLine(f.start.row).length,this.drawBidiSingleLineMarker(e,f,n+" ace_br1 ace_start",r,null,i)}else this.elt(n+" ace_br1 ace_start","height:"+o+"px;"+"right:0;"+"top:"+u+"px;left:"+a+"px;"+(i||""));if(this.session.$bidiHandler.isBidiRow(t.end.row)){var f=t.clone();f.start.row=f.end.row,f.start.column=0,this.drawBidiSingleLineMarker(e,f,n+" ace_br12",r,null,i)}else{u=this.$getTop(t.end.row,r);var l=t.end.column*r.characterWidth;this.elt(n+" ace_br12","height:"+o+"px;"+"width:"+l+"px;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))}o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var c=(t.start.column?1:0)|(t.end.column?0:8);this.elt(n+(c?" ace_br"+c:""),"height:"+o+"px;"+"right:0;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))},this.drawSingleLineMarker=function(e,t,n,r,i,s){if(this.session.$bidiHandler.isBidiRow(t.start.row))return this.drawBidiSingleLineMarker(e,t,n,r,i,s);var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;this.elt(n,"height:"+o+"px;"+"width:"+u+"px;"+"top:"+a+"px;"+"left:"+f+"px;"+(s||""))},this.drawBidiSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=this.$getTop(t.start.row,r),a=this.$padding,f=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);f.forEach(function(e){this.elt(n,"height:"+o+"px;"+"width:"+e.width+(i||0)+"px;"+"top:"+u+"px;"+"left:"+(a+e.left)+"px;"+(s||""))},this)},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))}}).call(s.prototype),t.Marker=s}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("./lines").Lines,u=e("../lib/event_emitter").EventEmitter,a=function(e){this.dom=i,this.element=this.dom.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this),this.$lines=new o(this.element)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.MAX_LINE_LENGTH=1e4,this.$updateEolChar=function(){var e=this.session.doc,t=e.getNewLineCharacter()=="\n"&&e.getNewLineMode()!="windows",n=t?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=n)return this.EOL_CHAR=n,!0},this.setPadding=function(e){this.$padding=e,this.element.style.margin="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;nl&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),l=a?a.start.row:Infinity);if(u>i)break;var c=s[o++];if(c){this.dom.removeChildren(c),this.$renderLine(c,u,u==l?a:!1),f&&(c.style.top=this.$lines.computeLineTop(u,e,this.session)+"px");var h=e.lineHeight*this.session.getRowLength(u)+"px";c.style.height!=h&&(f=!0,c.style.height=h)}u++}if(f)while(o0;i--)this.$lines.shift();if(t.lastRow>e.lastRow)for(var i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)this.$lines.pop();e.firstRowt.lastRow&&this.$lines.push(this.$renderLinesFragment(e,t.lastRow+1,e.lastRow))},this.$renderLinesFragment=function(e,t,n){var r=[],s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=this.$lines.createCell(s,e,this.session),f=a.element;this.dom.removeChildren(f),i.setStyle(f.style,"height",this.$lines.computeLineHeight(s,e,this.session)+"px"),i.setStyle(f.style,"top",this.$lines.computeLineTop(s,e,this.session)+"px"),this.$renderLine(f,s,s==u?o:!1),this.$useLineGroups()?f.className="ace_line_group":f.className="ace_line",r.push(a),s++}return r},this.update=function(e){this.$lines.moveContainer(e),this.config=e;var t=e.firstRow,n=e.lastRow,r=this.$lines;while(r.getLength())r.pop();r.push(this.$renderLinesFragment(e,t,n))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g,u=this.dom.createFragment(this.element),a,f=0;while(a=o.exec(r)){var l=a[1],c=a[2],h=a[3],p=a[4],d=a[5];if(!i.showInvisibles&&c)continue;var v=f!=a.index?r.slice(f,a.index):"";f=a.index+a[0].length,v&&u.appendChild(this.dom.createTextNode(v,this.element));if(l){var m=i.session.getScreenTabSize(t+a.index);u.appendChild(i.$tabStrings[m].cloneNode(!0)),t+=m-1}else if(c)if(i.showInvisibles){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space",g.textContent=s.stringRepeat(i.SPACE_CHAR,c.length),u.appendChild(g)}else u.appendChild(this.com.createTextNode(c,this.element));else if(h){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space ace_invalid",g.textContent=s.stringRepeat(i.SPACE_CHAR,h.length),u.appendChild(g)}else if(p){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",g.textContent=i.showInvisibles?i.SPACE_CHAR:p,u.appendChild(g)}else if(d){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className="ace_cjk",g.textContent=d,u.appendChild(g)}}u.appendChild(this.dom.createTextNode(f?r.slice(f):r,this.element));if(!this.$textToken[n.type]){var y="ace_"+n.type.replace(/\./g," ace_"),g=this.dom.createElement("span");n.type=="fold"&&(g.style.width=n.value.length*this.config.characterWidth+"px"),g.className=y,g.appendChild(u),e.appendChild(g)}else e.appendChild(u);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);if(r<=0||r>=n)return t;if(t[0]==" "){r-=r%this.tabSize;var i=r/this.tabSize;for(var s=0;s=o)u=this.$renderToken(a,u,l,c.substring(0,o-r)),c=c.substring(o-r),r=o,a=this.$createLineElement(),e.appendChild(a),a.appendChild(this.dom.createTextNode(s.stringRepeat("\u00a0",n.indent),this.element)),i++,u=0,o=n[i]||Number.MAX_VALUE;c.length!=0&&(r+=c.length,u=this.$renderToken(a,u,l,c))}}n[n.length-1]>this.MAX_LINE_LENGTH&&this.$renderOverflowMessage(a,u,null,"",!0)},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;sthis.MAX_LINE_LENGTH)return this.$renderOverflowMessage(e,n,r,i);n=this.$renderToken(e,n,r,i)}},this.$renderOverflowMessage=function(e,t,n,r,i){n&&this.$renderToken(e,t,n,r.slice(0,this.MAX_LINE_LENGTH-t));var s=this.dom.createElement("span");s.className="ace_inline_button ace_keyword ace_toggle_wrap",s.textContent=i?"":"",e.appendChild(s)},this.$renderLine=function(e,t,n){!n&&n!=0&&(n=this.session.getFoldLine(t));if(n)var r=this.$getFoldLineTokens(t,n);else var r=this.session.getTokens(t);var i=e;if(r.length){var s=this.session.getRowSplitData(t);if(s&&s.length){this.$renderWrappedLine(e,r,s);var i=e.lastChild}else{var i=e;this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i)),this.$renderSimpleLine(i,r)}}else this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i));if(this.showInvisibles&&i){n&&(t=n.end.row);var o=this.dom.createElement("span");o.className="ace_invisible ace_invisible_eol",o.textContent=t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,i.appendChild(o)}},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){}}).call(a.prototype),t.Text=a}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=this.$updateOpacity.bind(this)};(function(){this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)r.setStyle(t[n].style,"opacity",e?"":"0")},this.$startCssAnimation=function(){var e=this.cursors;for(var t=e.length;t--;)e[t].style.animationDuration=this.blinkInterval+"ms";setTimeout(function(){r.addCssClass(this.element,"ace_animate-blinking")}.bind(this))},this.$stopCssAnimation=function(){r.removeCssClass(this.element,"ace_animate-blinking")},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.$stopCssAnimation(),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){this.$stopCssAnimation();return}this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));if(r.HAS_CSS_ANIMATION)this.$startCssAnimation();else{var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.isCursorInView=function(e,t){return e.top>=0&&e.tope.height+e.offset||o.top<0)&&n>1)continue;var u=this.cursors[i++]||this.addCursor(),a=u.style;this.drawCursor?this.drawCursor(u,o,e,t[n],this.session):this.isCursorInView(o,e)?(r.setStyle(a,"display","block"),r.translate(u,o.left,o.top),r.setStyle(a,"width",Math.round(e.characterWidth)+"px"),r.setStyle(a,"height",e.lineHeight+"px")):r.setStyle(a,"display","none")}while(this.cursors.length>i)this.removeCursor();var f=this.session.getOverwrite();this.$setOverwrite(f),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.inner.textContent="\u00a0",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.$recursionLimit=2,this.window=t||window;var n=this;this._flush=function(e){n.pending=!1;var t=n.changes;t&&(r.blockIdle(100),n.changes=0,n.onRender(t));if(n.changes){if(n.$recursionLimit--<0)return;n.schedule()}else n.$recursionLimit=2}};(function(){this.schedule=function(e){this.changes=this.changes|e,this.changes&&!this.pending&&(r.nextFrame(this._flush),this.pending=!0)},this.clear=function(e){var t=this.changes;return this.changes=0,t}}).call(i.prototype),t.RenderLoop=i}),define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/event"),u=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,f=256,l=typeof ResizeObserver=="function",c=200,h=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),this.$measureNode.innerHTML=s.stringRepeat("X",f),this.$characterSize={width:0,height:0},l?this.$addObserver():this.checkForSizeChanges()};(function(){r.implement(this,a),this.$characterSize={width:0,height:0},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",u.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(e){e===undefined&&(e=this.$measureSizes());if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$addObserver=function(){var e=this;this.$observer=new window.ResizeObserver(function(t){var n=t[0].contentRect;e.checkForSizeChanges({height:n.height,width:n.width/f})}),this.$observer.observe(this.$measureNode)},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer||this.$observer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=o.onIdle(function t(){e.checkForSizeChanges(),o.onIdle(t,500)},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(e){var t={height:(e||this.$measureNode).clientHeight,width:(e||this.$measureNode).clientWidth/f};return t.width===0||t.height===0?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,f);var t=this.$main.getBoundingClientRect();return t.width/f},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$observer&&this.$observer.disconnect(),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)},this.$getZoom=function e(t){return t?(window.getComputedStyle(t).zoom||1)*e(t.parentElement):1},this.$initTransformMeasureNodes=function(){var e=function(e,t){return["div",{style:"position: absolute;top:"+e+"px;left:"+t+"px;"}]};this.els=i.buildDom([e(0,0),e(c,0),e(0,c),e(c,c)],this.el)},this.transformCoordinates=function(e,t){function r(e,t,n){var r=e[1]*t[0]-e[0]*t[1];return[(-t[1]*n[0]+t[0]*n[1])/r,(+e[1]*n[0]-e[0]*n[1])/r]}function i(e,t){return[e[0]-t[0],e[1]-t[1]]}function s(e,t){return[e[0]+t[0],e[1]+t[1]]}function o(e,t){return[e*t[0],e*t[1]]}function u(e){var t=e.getBoundingClientRect();return[t.left,t.top]}if(e){var n=this.$getZoom(this.el);e=o(1/n,e)}this.els||this.$initTransformMeasureNodes();var a=u(this.els[0]),f=u(this.els[1]),l=u(this.els[2]),h=u(this.els[3]),p=r(i(h,f),i(h,l),i(s(f,l),s(h,a))),d=o(1+p[0],i(f,a)),v=o(1+p[1],i(l,a));if(t){var m=t,g=p[0]*m[0]/c+p[1]*m[1]/c+1,y=s(o(m[0],d),o(m[1],v));return s(o(1/g/c,y),a)}var b=i(e,a),w=r(i(d,o(p[0],b)),i(v,o(p[1],b)),b);return o(c,w)}}).call(h.prototype)}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./layer/gutter").Gutter,u=e("./layer/marker").Marker,a=e("./layer/text").Text,f=e("./layer/cursor").Cursor,l=e("./scrollbar").HScrollBar,c=e("./scrollbar").VScrollBar,h=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,d=e("./lib/event_emitter").EventEmitter,v='.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;box-sizing: border-box;min-width: 100%;contain: style size layout;font-variant-ligatures: no-common-ligatures;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;contain: style size layout;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {position: absolute;top: 0;left: 0;right: 0;padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {contain: strict;position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;contain: strict;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: transparent;color: inherit;z-index: 1000;opacity: 1;}.ace_composition_placeholder { color: transparent }.ace_composition_marker { border-bottom: 1px solid;position: absolute;border-radius: 0;margin-top: 1px;}[ace_nocontext=true] {transform: none!important;filter: none!important;clip-path: none!important;mask : none!important;contain: none!important;perspective: none!important;mix-blend-mode: initial!important;z-index: auto;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;height: 1000000px;contain: style size layout;}.ace_text-layer {font: inherit !important;position: absolute;height: 1000000px;width: 1000000px;contain: style size layout;}.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {contain: style size layout;position: absolute;top: 0;left: 0;right: 0;}.ace_hidpi .ace_text-layer,.ace_hidpi .ace_gutter-layer,.ace_hidpi .ace_content,.ace_hidpi .ace_gutter {contain: strict;will-change: transform;}.ace_hidpi .ace_text-layer > .ace_line, .ace_hidpi .ace_text-layer > .ace_line_group {contain: strict;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {opacity: 0;}.ace_smooth-blinking .ace_cursor {transition: opacity 0.18s;}.ace_animate-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: step-end;animation-name: blink-ace-animate;animation-iteration-count: infinite;}.ace_animate-blinking.ace_smooth-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: ease-in-out;animation-name: blink-ace-animate-smooth;}@keyframes blink-ace-animate {from, to { opacity: 1; }60% { opacity: 0; }}@keyframes blink-ace-animate-smooth {from, to { opacity: 1; }45% { opacity: 1; }60% { opacity: 0; }85% { opacity: 0; }}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_error_bracket {position: absolute;border-bottom: 1px solid #DE5555;border-radius: 0;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;box-sizing: border-box;}.ace_line .ace_fold {box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_inline_button {border: 1px solid lightgray;display: inline-block;margin: -1px 8px;padding: 0 5px;pointer-events: auto;cursor: pointer;}.ace_inline_button:hover {border-color: gray;background: rgba(200,200,200,0.2);display: inline-block;pointer-events: auto;}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_mobile-menu {position: absolute;line-height: 1.5;border-radius: 4px;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;background: white;box-shadow: 1px 3px 2px grey;border: 1px solid #dcdcdc;color: black;}.ace_dark > .ace_mobile-menu {background: #333;color: #ccc;box-shadow: 1px 3px 2px grey;border: 1px solid #444;}.ace_mobile-button {padding: 2px;cursor: pointer;overflow: hidden;}.ace_mobile-button:hover {background-color: #eee;opacity:1;}.ace_mobile-button:active {background-color: #ddd;}.ace_placeholder {font-family: arial;transform: scale(0.9);transform-origin: left;white-space: pre;opacity: 0.7;margin: 0 10px;}',m=e("./lib/useragent"),g=m.isIE;i.importCssString(v,"ace_editor.css");var y=function(e,t){var n=this;this.container=e||i.createElement("div"),i.addCssClass(this.container,"ace_editor"),i.HI_DPI&&i.addCssClass(this.container,"ace_hidpi"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new u(this.content);var r=this.$textLayer=new a(this.content);this.canvas=r.element,this.$markerFront=new u(this.content),this.$cursorLayer=new f(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new c(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.margin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$keepTextAreaAtCursor=!m.isIOS,this.$loop=new h(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._signal("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,d),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin(),i.setStyle(this.scroller.style,"line-height",this.lineHeight+"px")},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var s=0,o=this.$size,u={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};r&&(e||o.height!=r)&&(o.height=r,s|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",s|=this.CHANGE_SCROLL);if(n&&(e||o.width!=n)){s|=this.CHANGE_SIZE,o.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,i.setStyle(this.scrollBarH.element.style,"left",t+"px"),i.setStyle(this.scroller.style,"left",t+this.margin.left+"px"),o.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()-this.margin.h),i.setStyle(this.$gutter.style,"left",this.margin.left+"px");var a=this.scrollBarV.getWidth()+"px";i.setStyle(this.scrollBarH.element.style,"right",a),i.setStyle(this.scroller.style,"right",a),i.setStyle(this.scroller.style,"bottom",this.scrollBarH.getHeight());if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}return o.$dirty=!n||!r,s&&this._signal("resize",u),s},this.onGutterResize=function(e){var t=this.$showGutter?e:0;t!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,t,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):this.$computeLayerConfig()},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=Math.round(this.characterWidth*this.$printMarginColumn+this.$padding)+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$isMousePressed)return;var e=this.textarea.style,t=this.$composition;if(!this.$keepTextAreaAtCursor&&!t){i.translate(this.textarea,-100,0);return}var n=this.$cursorLayer.$pixelPos;if(!n)return;t&&t.markerRange&&(n=this.$cursorLayer.getPixelPosition(t.markerRange.start,!0));var r=this.layerConfig,s=n.top,o=n.left;s-=r.offset;var u=t&&t.useTextareaForIME?this.lineHeight:g?0:1;if(s<0||s>r.height-u){i.translate(this.textarea,0,0);return}var a=1,f=this.$size.height-u;if(!t)s+=this.lineHeight;else if(t.useTextareaForIME){var l=this.textarea.value;a=this.characterWidth*this.session.$getStringScreenWidth(l)[0]}else s+=this.lineHeight+2;o-=this.scrollLeft,o>this.$size.scrollerWidth-a&&(o=this.$size.scrollerWidth-a),o+=this.gutterWidth+this.margin.left,i.setStyle(e,"height",u+"px"),i.setStyle(e,"width",a+"px"),i.translate(this.textarea,Math.min(o,this.$size.scrollerWidth-a),Math.min(s,f))},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.setMargin=function(e,t,n,r){var i=this.margin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,this.$updateCachedSize(!0,this.gutterWidth,this.$size.width,this.$size.height),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender",e),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig()|this.$loop.clear();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig()|this.$loop.clear())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),i.translate(this.content,-this.scrollLeft,-n.offset);var s=n.width+2*this.$padding+"px",o=n.minHeight+"px";i.setStyle(this.content.style,"width",s),i.setStyle(this.content.style,"height",o)}e&this.CHANGE_H_SCROLL&&(i.translate(this.content,-this.scrollLeft,-n.offset),this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender",e);return}if(e&this.CHANGE_SCROLL){this.$changedLines=null,e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&(e&this.CHANGE_GUTTER||e&this.CHANGE_LINES?this.$gutterLayer.update(n):this.$gutterLayer.scrollLines(n)),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender",e);return}e&this.CHANGE_TEXT?(this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER?this.$showGutter&&this.$gutterLayer.update(n):e&this.CHANGE_CURSOR&&this.$highlightGutterLine&&this.$gutterLayer.updateLineHighlight(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender",e)},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=n<=2*this.lineHeight,i=!r&&e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var s=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,s,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=t.scrollerHeight+this.lineHeight,l=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=l;var c=this.scrollMargin;this.session.setScrollTop(Math.max(-c.top,Math.min(this.scrollTop,i-t.scrollerHeight+c.bottom))),this.session.setScrollLeft(Math.max(-c.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+c.right)));var h=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+l<0||this.scrollTop>c.top),p=a!==h;p&&(this.$vScroll=h,this.scrollBarV.setVisible(h));var d=this.scrollTop%this.lineHeight,v=Math.ceil(f/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-d)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),f=t.scrollerHeight+e.getRowLength(g)*w+b,d=this.scrollTop-y*w;var S=0;if(this.layerConfig.width!=s||u)S=this.CHANGE_H_SCROLL;if(u||p)S|=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:f,maxHeight:i,offset:d,gutterOffset:w?Math.max(0,Math.ceil((d+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},this.session.$bidiHandler&&this.session.$bidiHandler.setContentWidth(s-this.$padding),S},this.$updateLines=function(){if(!this.$changedLines)return;var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(tthis.$textLayer.MAX_LINE_LENGTH&&(e=this.$textLayer.MAX_LINE_LENGTH+30),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t,n){if(this.$size.scrollerHeight===0)return;var r=this.$cursorLayer.getPixelPosition(e),i=r.left,s=r.top,o=n&&n.top||0,u=n&&n.bottom||0,a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop;a+o>s?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),u=this.$blockCursor?Math.floor(s):Math.round(s);return{row:o,column:u,side:s-u>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=this.$blockCursor?Math.floor(s):Math.round(s),u=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(u,Math.max(o,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+(this.session.$bidiHandler.isBidiRow(r.row,e)?this.session.$bidiHandler.getPosLeft(r.column):Math.round(r.column*this.characterWidth)),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition=e,e.cssText||(e.cssText=this.textarea.style.cssText),e.useTextareaForIME=this.$useTextareaForIME,this.$useTextareaForIME?(i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor(),this.$cursorLayer.element.style.display="none"):e.markerId=this.session.addMarker(e.markerRange,"ace_composition_marker","text")},this.setCompositionText=function(e){var t=this.session.selection.cursor;this.addToken(e,"composition_placeholder",t.row,t.column),this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;this.$composition.markerId&&this.session.removeMarker(this.$composition.markerId),i.removeCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText=this.$composition.cssText,this.$composition=null,this.$cursorLayer.element.style.display=""},this.addToken=function(e,t,n,r){var i=this.session;i.bgTokenizer.lines[n]=null;var s={type:t,value:e},o=i.getTokens(n);if(r==null)o.push(s);else{var u=0;for(var a=0;a50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})}}).call(f.prototype);var l=function(e,t,n){var r=null,i=!1,u=Object.create(s),a=[],l=new f({messageBuffer:a,terminate:function(){},postMessage:function(e){a.push(e);if(!r)return;i?setTimeout(c):c()}});l.setEmitSync=function(e){i=e};var c=function(){var e=a.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};return u.postMessage=function(e){l.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.length)c()}),l};t.UIWorkerClient=l,t.WorkerClient=f,t.createWorker=a}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1?e.multiSelect.joinSelections():e.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Alt-L",mac:"Ctrl-Alt-L"},readOnly:!0},{name:"splitSelectionIntoLines",description:"Split into lines",exec:function(e){e.multiSelect.splitIntoLines()},readOnly:!0},{name:"alignCursors",description:"Align cursors",exec:function(e){e.alignCursors()},bindKey:{win:"Ctrl-Alt-A",mac:"Ctrl-Alt-A"},scrollIntoView:"cursor"},{name:"findAll",description:"Find all",exec:function(e){e.findAll()},bindKey:{win:"Ctrl-Alt-K",mac:"Ctrl-Alt-G"},scrollIntoView:"cursor",readOnly:!0}],t.multiSelectCommands=[{name:"singleSelection",description:"Single selection",bindKey:"esc",exec:function(e){e.exitMultiSelectMode()},scrollIntoView:"cursor",readOnly:!0,isAvailable:function(e){return e&&e.inMultiSelectMode}}];var r=e("../keyboard/hash_handler").HashHandler;t.keyboardHandler=new r(t.multiSelectCommands)}),define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"],function(e,t,n){function h(e,t,n){return c.$options.wrap=!0,c.$options.needle=t,c.$options.backwards=n==-1,c.find(e)}function v(e,t){return e.row==t.row&&e.column==t.column}function m(e){if(e.$multiselectOnSessionChange)return;e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),e.$multiselectOnSessionChange=t.onSessionChange.bind(e),e.$checkMultiselectChange=e.$checkMultiselectChange.bind(e),e.$multiselectOnSessionChange(e),e.on("changeSession",e.$multiselectOnSessionChange),e.on("mousedown",o),e.commands.addCommands(f.defaultCommands),g(e)}function g(e){function r(t){n&&(e.renderer.setMouseCursor(""),n=!1)}if(!e.textInput)return;var t=e.textInput.getElement(),n=!1;u.addListener(t,"keydown",function(t){var i=t.keyCode==18&&!(t.ctrlKey||t.shiftKey||t.metaKey);e.$blockSelectEnabled&&i?n||(e.renderer.setMouseCursor("crosshair"),n=!0):n&&r()}),u.addListener(t,"keyup",r),u.addListener(t,"blur",r)}var r=e("./range_list").RangeList,i=e("./range").Range,s=e("./selection").Selection,o=e("./mouse/multi_select_handler").onMouseDown,u=e("./lib/event"),a=e("./lib/lang"),f=e("./commands/multi_select_commands");t.commands=f.defaultCommands.concat(f.multiSelectCommands);var l=e("./search").Search,c=new l,p=e("./edit_session").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(p.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(e,t){if(!e)return;if(!this.inMultiSelectMode&&this.rangeCount===0){var n=this.toOrientedRange();this.rangeList.add(n),this.rangeList.add(e);if(this.rangeList.ranges.length!=2)return this.rangeList.removeAll(),t||this.fromOrientedRange(e);this.rangeList.removeAll(),this.rangeList.add(n),this.$onAddRange(n)}e.cursor||(e.cursor=e.end);var r=this.rangeList.add(e);return this.$onAddRange(e),r.length&&this.$onRemoveRange(r),this.rangeCount>1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length&&this.$onRemoveRange(e)},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){var e=this.ranges.length?this.ranges:[this.getRange()],t=[];for(var n=0;n1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.cursor),s=this.session.documentToScreenPosition(this.anchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)g--;if(g>0){var y=0;while(r[y].isEmpty())y++}for(var b=g;b>=y;b--)r[b].isEmpty()&&r.splice(b,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges(),u.ranges[0]&&u.fromOrientedRange(u.ranges[0]);var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var p=e.getLine(l).length;return new r(f,u,l,p)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}',t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),define("ace/line_widgets",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";function i(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/dom");(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;ut[n].column&&n++,s.unshift(n,0),t.splice.apply(t,s),this.$updateRows()}},this.$updateRows=function(){var e=this.session.lineWidgets;if(!e)return;var t=!0;e.forEach(function(e,n){if(e){t=!1,e.row=n;while(e.$oldWidget)e.$oldWidget.row=n,e=e.$oldWidget}}),t&&(this.session.lineWidgets=null)},this.$registerLineWidget=function(e){this.session.lineWidgets||(this.session.lineWidgets=new Array(this.session.getLength()));var t=this.session.lineWidgets[e.row];return t&&(e.$oldWidget=t,t.el&&t.el.parentNode&&(t.el.parentNode.removeChild(t.el),t._inDocument=!1)),this.session.lineWidgets[e.row]=e,e},this.addLineWidget=function(e){this.$registerLineWidget(e),e.session=this.session;if(!this.editor)return e;var t=this.editor.renderer;e.html&&!e.el&&(e.el=r.createElement("div"),e.el.innerHTML=e.html),e.el&&(r.addCssClass(e.el,"ace_lineWidgetContainer"),e.el.style.position="absolute",e.el.style.zIndex=5,t.container.appendChild(e.el),e._inDocument=!0,e.coverGutter||(e.el.style.zIndex=3),e.pixelHeight==null&&(e.pixelHeight=e.el.offsetHeight)),e.rowCount==null&&(e.rowCount=e.pixelHeight/t.layerConfig.lineHeight);var n=this.session.getFoldAt(e.row,0);e.$fold=n;if(n){var i=this.session.lineWidgets;e.row==n.end.row&&!i[n.start.row]?i[n.start.row]=e:e.hidden=!0}return this.session._emit("changeFold",{data:{start:{row:e.row}}}),this.$updateRows(),this.renderWidgets(null,t),this.onWidgetChanged(e),e},this.removeLineWidget=function(e){e._inDocument=!1,e.session=null,e.el&&e.el.parentNode&&e.el.parentNode.removeChild(e.el);if(e.editor&&e.editor.destroy)try{e.editor.destroy()}catch(t){}if(this.session.lineWidgets){var n=this.session.lineWidgets[e.row];if(n==e)this.session.lineWidgets[e.row]=e.$oldWidget,e.$oldWidget&&this.onWidgetChanged(e.$oldWidget);else while(n){if(n.$oldWidget==e){n.$oldWidget=e.$oldWidget;break}n=n.$oldWidget}}this.session._emit("changeFold",{data:{start:{row:e.row}}}),this.$updateRows()},this.getWidgetsAtRow=function(e){var t=this.session.lineWidgets,n=t&&t[e],r=[];while(n)r.push(n),n=n.$oldWidget;return r},this.onWidgetChanged=function(e){this.session._changedWidgets.push(e),this.editor&&this.editor.renderer.updateFull()},this.measureWidgets=function(e,t){var n=this.session._changedWidgets,r=t.layerConfig;if(!n||!n.length)return;var i=Infinity;for(var s=0;s0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(i.prototype),t.LineWidgets=i}),define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./range").Range,o=e("./editor").Editor,u=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,f=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e,n){if(typeof e=="string"){var s=e;e=document.getElementById(s);if(!e)throw new Error("ace.edit can't find div #"+s)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var u="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;u=a.value,e=r.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(u=e.textContent,e.innerHTML="");var l=t.createEditSession(u),c=new o(new f(e),l,n),h={document:l,editor:c,onResize:c.resize.bind(c,null)};return a&&(h.textarea=a),i.addListener(window,"resize",h.onResize),c.on("destroy",function(){i.removeListener(window,"resize",h.onResize),h.editor.container.env=null}),c.container.env=c.env=h,c},t.createEditSession=function(e,t){var n=new u(e,t);return n.setUndoManager(new a),n},t.Range=s,t.Editor=o,t.EditSession=u,t.UndoManager=a,t.VirtualRenderer=f,t.version=t.config.version}); (function() { + window.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = window.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + window.ace["default"] = window.ace; + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = window.ace; + } + }); + })(); +define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"from(?=\\s*('|\"))"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"storage.type",regex:/=>/,next:"start"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.$quotes={'"':'"',"'":"'","`":"`"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|max-zoom|min-height|min-width|min-zoom|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|user-select|user-zoom|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero|zoom",f=t.supportConstantColor="aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{include:["strings","url","comments"]},{token:"paren.lparen",regex:"\\{",next:"ruleset"},{token:"paren.rparen",regex:"\\}"},{token:"string",regex:"@(?!viewport)",next:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"keyword",regex:"%"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant.numeric",regex:c},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{include:["strings","url","comments"]},{token:"paren.lparen",regex:"\\{",next:"start"},{token:"paren.rparen",regex:"\\}",next:"start"},{token:"string",regex:";",next:"start"},{token:"keyword",regex:"(?:media|supports|document|charset|import|namespace|media|supports|document|page|font|keyframes|viewport|counter-style|font-feature-values|swash|ornaments|annotation|stylistic|styleset|character-variant)"}],comments:[{token:"comment",regex:"\\/\\*",push:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}]}],ruleset:[{regex:"-(webkit|ms|moz|o)-",token:"text"},{token:"punctuation.operator",regex:"[:;]"},{token:"paren.rparen",regex:"\\}",next:"start"},{include:["strings","url","comments"]},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{include:"url"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}],url:[{token:"support.function",regex:"(?:url(:?-prefix)?|domain|regexp)\\(",push:[{token:"support.function",regex:"\\)",next:"pop"},{defaultToken:"string"}]}],strings:[{token:"string.start",regex:"'",push:[{token:"string.end",regex:"'|$",next:"pop"},{include:"escapes"},{token:"constant.language.escape",regex:/\\$/,consumeLineEnd:!0},{defaultToken:"string"}]},{token:"string.start",regex:'"',push:[{token:"string.end",regex:'"|$',next:"pop"},{include:"escapes"},{token:"constant.language.escape",regex:/\\$/,consumeLineEnd:!0},{defaultToken:"string"}]}],escapes:[{token:"constant.language.escape",regex:/\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();if(e==="ruleset"||t.$mode.$id=="ace/mode/scss"){var i=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(i)?(/([\w\-]+):[^:]*$/.test(i),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0;",meta:"property",score:1e6}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:1e6}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"&&n.selection.isEmpty()){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(/^(\s+[^;]|\s*$)/.test(f.substring(s.column)))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"&&n.selection.isEmpty()){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}}),this.add("!important","insertion",function(e,t,n,r,i){if(i==="!"&&n.selection.isEmpty()){var s=n.getCursorPosition(),o=r.doc.getLine(s.row);if(/^\s*(;|}|$)/.test(o.substring(s.column)))return{text:"!important",selection:[10,10]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.start.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.end.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:t},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e&&e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=a.getCurrentTokenColumn()+f.value.length;if(o.column/.test(r.getLine(o.row).slice(o.column)))return;while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var h=a.getCurrentTokenRow(),p=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var d=f.value;h==o.row&&(d=d.substring(0,o.column-p));if(this.voidElements.hasOwnProperty(d.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":this.getCommentFoldWidget(e,n)},this.getCommentFoldWidget=function(e,t){return/comment/.test(e.getState(t))&&/";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return this.getCommentFoldWidget(e,n)&&e.getCommentFoldRange(n,e.getLine(n).length);var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},abbr:{},address:{},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},article:{pubdate:1},aside:{},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},b:{},base:{href:1,target:1},bdi:{},bdo:{},blockquote:{cite:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},br:{},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},canvas:{width:1,height:1},caption:{},cite:{},code:{},col:{span:1},colgroup:{span:1},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},data:{},datalist:{},dd:{},del:{cite:1,datetime:1},details:{open:1},dfn:{},dialog:{open:1},div:{},dl:{},dt:{},em:{},embed:{src:1,height:1,width:1,type:1},fieldset:{disabled:1,form:1,name:1},figcaption:{},figure:{},footer:{},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},head:{},header:{},hr:{},html:{manifest:1},i:{},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},ins:{cite:1,datetime:1},kbd:{},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},label:{form:1,"for":1},legend:{},li:{value:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},main:{},map:{name:1},mark:{},math:{},menu:{type:1,label:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},nav:{},noscript:{href:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},ol:{start:1,reversed:1},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},output:{"for":1,form:1,name:1},p:{},param:{name:1,value:1},pre:{},progress:{value:1,max:1},q:{cite:1},rp:{},rt:{},ruby:{},s:{},samp:{},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},small:{},source:{src:1,type:1,media:1},span:{},strong:{},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},sub:{},sup:{},svg:{},table:{summary:1},tbody:{},td:{headers:1,rowspan:1,colspan:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},tfoot:{},th:{headers:1,rowspan:1,colspan:1,scope:1},thead:{},time:{datetime:1},title:{},tr:{},track:{kind:1,src:1,srclang:1,label:1,"default":1},section:{},summary:{},u:{},ul:{},"var":{},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},wbr:{}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[a-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:1e6}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:1e6}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:1e6}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:1e6}})}}).call(h.prototype),t.HtmlCompletions=h}),define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}); (function() { + window.require(["ace/mode/html"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); +define("ace/theme/monokai",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-monokai",t.cssText=".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() { + window.require(["ace/theme/monokai"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/examples/SmartSwitch/data_src/app.css b/examples/SmartSwitch/data_src/app.css new file mode 100644 index 0000000..ea5eebb --- /dev/null +++ b/examples/SmartSwitch/data_src/app.css @@ -0,0 +1 @@ +.fpicker{background:#f2f2f2;padding:10px;width:100%;max-width:150px;white-space:nowrap;font-size:32px;font-weight:700;text-align:center}.tpop .fpicker{margin:20px auto 0 auto}.fpicker-h,.fpicker-m{display:inline-block;width:50%}.fpicker input[type=text]{box-sizing:border-box;width:70%;padding:2px;margin:5px 0;border:0;background:#fff;color:#888;text-align:center;font-size:24px}.fpicker-down,.fpicker-up{text-align:center;color:#468c00;cursor:pointer}.fpicker-btn{margin-top:10px}.fpicker-btn input[type=button]{width:50%;padding:10px 0;border:0;background:#468c00;color:#fff;font-size:20px;cursor:pointer}.ncf-container{font-size:14px;box-sizing:border-box;position:fixed;z-index:999999}.ncf-container.nfc-top-left{top:12px;left:12px}.ncf-container.nfc-top-right{top:12px;right:12px}.ncf-container.nfc-bottom-right{bottom:12px;right:12px}.ncf-container.nfc-bottom-left{bottom:12px;left:12px}@media (max-width:350px){.ncf-container{left:0;right:0}}.ncf-container .ncf{background:#fff;transition:.3s ease;position:relative;pointer-events:auto;overflow:hidden;margin:0 0 6px;padding:30px;width:100px;border-radius:3px 3px 3px 3px;box-shadow:0 0 12px #999;color:#000;opacity:.9;background-position:15px!important;background-repeat:no-repeat!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ncf-container .ncf:hover{box-shadow:0 0 12px #000;opacity:1;cursor:pointer}.ncf-container .ncf .ncf-title{font-weight:700;font-size:16px;text-align:left;margin-top:0;margin-bottom:6px;word-wrap:break-word}.ncf-container .ncf .nfc-message{margin:0;text-align:left;word-wrap:break-word}.ncf-container .success{background:#51a351;color:#fff;padding:15px 15px 15px 50px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)}.ncf-container .info{background:#2f96b4;color:#fff;padding:15px 15px 15px 50px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)}.ncf-container .warning{background:#f87400;color:#fff;padding:15px 15px 15px 50px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)}.ncf-container .error{background:#bd362f;color:#fff;padding:15px 15px 15px 50px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}.ncf-container button{position:relative;right:-.3em;top:-.3em;float:right;font-weight:700;color:#fff;text-shadow:0 1px 0 #fff;opacity:.8;line-height:1;font-size:16px;padding:0;cursor:pointer;background:0 0;border:0}.ncf-container button:hover{opacity:1}.tpop{position:fixed;top:0;left:0;width:100%;height:100vh;background:rgba(0,0,0,.7);transition:all .5s;visibility:hidden;opacity:0}.tpop.show{visibility:visible;opacity:1}.tpicker{background:#f2f2f2;padding:10px;width:100%;max-width:150px;white-space:nowrap;font-size:32px;font-weight:700;text-align:center}.tpop .tpicker{margin:20px auto 0 auto}.tpicker-h,.tpicker-m{display:inline-block;width:50%}.tpicker input[type=text]{box-sizing:border-box;width:70%;padding:10px;margin:5px 0;border:0;background:#fff;color:#888;text-align:center;font-size:24px}.tpicker-down,.tpicker-up{text-align:center;color:#ff853f;cursor:pointer}.tpicker-btn{margin-top:10px}.tpicker-btn input[type=button]{width:50%;padding:10px 0;border:0;background:#a83a0b;color:#fff;font-size:20px;cursor:pointer} \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/app.min.js b/examples/SmartSwitch/data_src/app.min.js new file mode 100644 index 0000000..f493e7f --- /dev/null +++ b/examples/SmartSwitch/data_src/app.min.js @@ -0,0 +1,533 @@ +var tpick={attach:function(target){var dig=document.getElementById(target).value.split(":");var t1=dig[0]||"23";var t2=dig[1]||"59";var uniqueID=0;while(document.getElementById("tpick-"+uniqueID)!=null){uniqueID=Math.floor(Math.random()*(100-2))+1;} +var tw=document.createElement("div");tw.id="tpick-"+uniqueID;tw.classList.add("tpop");tw.dataset.target=target;tw.addEventListener("click",function(evt){if(evt.target.classList.contains("tpop")){this.classList.remove("show");}});var tp=document.createElement("div");tp.classList.add("tpicker");tp.appendChild(this.draw("h",t1));tp.appendChild(this.draw("m",t2));var bottom=document.createElement("div"),ok=document.createElement("input");ok.setAttribute("type","button");ok.value="OK";ok.addEventListener("click",function(){tpick.set(this);});bottom.classList.add("tpicker-btn");bottom.appendChild(ok);tp.appendChild(bottom);tw.appendChild(tp);document.body.appendChild(tw);var target=document.getElementById(target);target.dataset.dp=uniqueID;target.onfocus=function(){document.getElementById("tpick-"+this.dataset.dp).classList.add("show");};},draw:function(type,tv){var docket=document.createElement("div"),up=document.createElement("div"),down=document.createElement("div"),text=document.createElement("input");docket.classList.add("tpicker-"+type);up.classList.add("tpicker-up");down.classList.add("tpicker-down");up.innerHTML="︿";down.innerHTML="﹀";text.readOnly=true;text.setAttribute("type","text");if(type=="h"){text.value=tv;up.addEventListener("click",function(){tpick.spin("h",1,this);});down.addEventListener("click",function(){tpick.spin("h",0,this);});}else if(type=="m"){text.value=tv;up.addEventListener("click",function(){tpick.spin("m",1,this);});down.addEventListener("click",function(){tpick.spin("m",0,this);});} +docket.appendChild(up);docket.appendChild(text);docket.appendChild(down);return docket;},spin:function(type,direction,el){var parent=el.parentElement,field=parent.getElementsByTagName("input")[0],value=field.value;if(type=="h"){value=parseInt(value);if(direction){value++;}else{value--;} +if(value==-1){value=23;}else if(value>23){value=0;}}else if(type=="m"){value=parseInt(value);if(direction){value+=5;}else{value-=5;} +if(value<0){value=55;}else if(value>59){value=0;} +if(value<10){value="0"+value;}} +field.value=('00'+value).substr(-2);},set:function(el){var parent=el.parentElement;while(parent.classList.contains("tpop")==false){parent=parent.parentElement;} +var input=parent.querySelectorAll("input[type=text]");var time=input[0].value+":"+input[1].value;document.getElementById(parent.dataset.target).value=time;parent.classList.remove("show");}};var fpick={attach:function(target){var dig=document.getElementById(target).value.split(".");var t1=dig[0]||"1";var t2=dig[1]||"2";var uniqueID=0;while(document.getElementById("fpick-"+uniqueID)!=null){uniqueID=Math.floor(Math.random()*(100-2))+1;} +var tw=document.createElement("div");tw.id="fpick-"+uniqueID;tw.classList.add("tpop");tw.dataset.target=target;tw.addEventListener("click",function(evt){if(evt.target.classList.contains("tpop")){this.classList.remove("show");}});var tp=document.createElement("div");tp.classList.add("fpicker");tp.appendChild(this.draw("h",t1));tp.appendChild(this.draw("m",t2));var bottom=document.createElement("div"),ok=document.createElement("input");ok.setAttribute("type","button");ok.value="OK";ok.addEventListener("click",function(){fpick.set(this);});bottom.classList.add("fpicker-btn");bottom.appendChild(ok);tp.appendChild(bottom);tw.appendChild(tp);document.body.appendChild(tw);var target=document.getElementById(target);target.dataset.dp=uniqueID;target.onfocus=function(){document.getElementById("fpick-"+this.dataset.dp).classList.add("show");};},draw:function(type,tv){var docket=document.createElement("div"),up=document.createElement("div"),down=document.createElement("div"),text=document.createElement("input");docket.classList.add("fpicker-"+type);up.classList.add("fpicker-up");down.classList.add("fpicker-down");up.innerHTML="︿";down.innerHTML="﹀";text.readOnly=true;text.setAttribute("type","text");if(type=="h"){text.value=tv;up.addEventListener("click",function(){fpick.spin("h",1,this);});down.addEventListener("click",function(){fpick.spin("h",0,this);});}else if(type=="m"){text.value=tv;up.addEventListener("click",function(){fpick.spin("m",1,this);});down.addEventListener("click",function(){fpick.spin("m",0,this);});} +docket.appendChild(up);docket.appendChild(text);docket.appendChild(down);return docket;},spin:function(type,direction,el){var parent=el.parentElement,field=parent.getElementsByTagName("input")[0],value=field.value;if(type=="h"){value=parseInt(value);if(direction){value++;}else{value--;} +if(value==-41){value=99;}else if(value>99){value=-40;}}else if(type=="m"){value=parseInt(value);if(direction){value++;}else{value--;} +if(value<0){value=9;}else if(value>9){value=0;}} +field.value=value;},set:function(el){var parent=el.parentElement;while(parent.classList.contains("tpop")==false){parent=parent.parentElement;} +var input=parent.querySelectorAll("input[type=text]");var temperature=input[0].value+"."+input[1].value;document.getElementById(parent.dataset.target).value=temperature;parent.classList.remove("show");}};!function(t){function n(i){if(e[i]) +return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports} +var e={};n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:i})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=0)} +([function(t,n,e){e(1),t.exports=e(4)},function(t,n,e){"use strict";var i=Object.assign||function(t){for(var n=1;n-1} +(t.positionClass)||(console.warn("An invalid notification position class has been specified."),t.positionClass=c.positionClass),t.onclick&&"function"!=typeof t.onclick&&(console.warn("Notification on click must be a function."),t.onclick=c.onclick),"number"!=typeof t.showDuration&&(t.showDuration=c.showDuration),(0,o.isString)(t.theme)&&0!==t.theme.length||(console.warn("Notification theme must be a string with length"),t.theme=c.theme),t} +function e(t){return t=n(t),function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=n.title,i=n.message,c=r(t.positionClass);if(!e&&!i) +return console.warn("Notification must contain a title or a message!");var a=(0,o.createElement)("div","ncf",t.theme);if(!0===t.closeOnClick&&a.addEventListener("click",function(){return c.removeChild(a)}),t.onclick&&a.addEventListener("click",function(n){return t.onclick(n)}),t.displayCloseButton){var s=(0,o.createElement)("button");s.innerText="X",!1===t.closeOnClick&&s.addEventListener("click",function(){return c.removeChild(a)}),(0,o.append)(a,s)} +if((0,o.isString)(e)&&e.length&&(0,o.append)(a,(0,o.createParagraph)("ncf-title")(e)),(0,o.isString)(i)&&i.length&&(0,o.append)(a,(0,o.createParagraph)("nfc-message")(i)),(0,o.append)(c,a),t.showDuration&&t.showDuration>0){var l=setTimeout(function(){c.removeChild(a),0===c.querySelectorAll(".ncf").length&&document.body.removeChild(c)},t.showDuration);(t.closeOnClick||t.displayCloseButton)&&a.addEventListener("click",function(){return clearTimeout(l)})}}} +function r(t){var n=document.querySelector("."+t);return n||(n=(0,o.createElement)("div","ncf-container",t),(0,o.append)(document.body,n)),n} +var c={closeOnClick:!0,displayCloseButton:!1,positionClass:"nfc-top-right",onclick:!1,showDuration:3500,theme:"success"};t.createNotification?console.warn("Window already contains a create notification function. Have you included the script twice?"):t.createNotification=e} +(window)},function(t,n,e){"use strict";!function(){function t(t){this.el=t;for(var n=t.className.replace(/^\s+|\s+$/g,"").split(/\s+/),i=0;i1?n-1:0),i=1;i1?n-1:0),i=1;i1?n-1:0),i=1;i1?n-1:0),c=1;cp;p++)"zIndex"in i[p]&&(l.push(i[p].zIndex),i[p].zIndex<0&&(m[i[p].zIndex]=i[p]));for(l.sort(h);l[k]<0;) +if(e=m[l[k++]],n.push(e.apply(d,g)),b) +return b=f,n;for(p=0;q>p;p++) +if(e=i[p],"zIndex"in e) +if(e.zIndex==l[k]){if(n.push(e.apply(d,g)),b) +break;do +if(k++,e=m[l[k]],e&&n.push(e.apply(d,g)),b) +break;while(e)}else +m[e.zIndex]=e;else if(n.push(e.apply(d,g)),b) +break;return b=f,a=o,n.length?n:null};return j._events=i,j.listeners=function(a){var b,c,d,g,h,j,k,l,m=a.split(e),n=i,o=[n],p=[];for(g=0,h=m.length;h>g;g++){for(l=[],j=0,k=o.length;k>j;j++) +for(n=o[j].n,c=[n[m[g]],n[f]],d=2;d--;) +b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l} +return p},j.on=function(a,b){if(a=String(a),"function"!=typeof b) +return function(){};for(var c=a.split(e),d=i,f=0,h=c.length;h>f;f++) +d=d.n,d=d.hasOwnProperty(c[f])&&d[c[f]]||(d[c[f]]={n:{}});for(d.f=d.f||[],f=0,h=d.f.length;h>f;f++) +if(d.f[f]==b) +return g;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},j.f=function(a){var b=[].slice.call(arguments,1);return function(){j.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},j.stop=function(){b=1},j.nt=function(b){return b?new RegExp("(?:\\.|\\/|^)"+b+"(?:\\.|\\/|$)").test(a):a},j.nts=function(){return a.split(e)},j.off=j.unbind=function(a,b){if(!a) +return void(j._events=i={n:{}});var c,g,h,k,l,m,n,o=a.split(e),p=[i];for(k=0,l=o.length;l>k;k++) +for(m=0;mk;k++) +for(c=p[k];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++) +if(c.f[m]==b){c.f.splice(m,1);break} +!c.f.length&&delete c.f} +for(g in c.n) +if(c.n[d](g)&&c.n[g].f){var q=c.n[g].f;for(m=0,n=q.length;n>m;m++) +if(q[m]==b){q.splice(m,1);break} +!q.length&&delete c.n[g].f}}else{delete c.f;for(g in c.n) +c.n[d](g)&&c.n[g].f&&delete c.n[g].f} +c=c.n}},j.once=function(a,b){var c=function(){return j.unbind(a,c),b.apply(this,arguments)};return j.on(a,c)},j.version=c,j.toString=function(){return"You are running Eve "+c},j}),function(a,b){"function"==typeof define&&define.amd?define("raphael.core",["eve"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("eve")):a.Raphael=b(a.eve)} +(this,function(a){function b(c){if(b.is(c,"function")) +return t?c():a.on("raphael.DOMload",c);if(b.is(c,U)) +return b._engine.create[C](b,c.splice(0,3+b.is(c[0],S))).add(c);var d=Array.prototype.slice.call(arguments,0);if(b.is(d[d.length-1],"function")){var e=d.pop();return t?e.call(b._engine.create[C](b,d)):a.on("raphael.DOMload",function(){e.call(b._engine.create[C](b,d))})} +return b._engine.create[C](b,arguments)} +function c(a){if("function"==typeof a||Object(a)!==a) +return a;var b=new a.constructor;for(var d in a) +a[y](d)&&(b[d]=c(a[d]));return b} +function d(a,b){for(var c=0,d=a.length;d>c;c++) +if(a[c]===b) +return a.push(a.splice(c,1)[0])} +function e(a,b,c){function e(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=e.cache=e.cache||{},i=e.count=e.count||[];return h[y](g)?(d(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[C](b,f),c?c(h[g]):h[g])} +return e} +function f(){return this.hex} +function g(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])} +return c} +function h(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c} +function i(a,b,c,d,e,f,g,i,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=h(q,a,c,e,g),s=h(q,b,d,f,i),t=r*r+s*s;o+=n[p]*M.sqrt(t)} +return k*o} +function j(a,b,c,d,e,f,g,h,j){if(!(0>j||i(a,b,c,d,e,f,g,h)o;) +m/=2,n+=(j>k?1:-1)*m,k=i(a,b,c,d,e,f,g,h,n);return n}} +function k(a,b,c,d,e,f,g,h){if(!(N(a,c)N(e,g)||N(b,d)N(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+O(a,c).toFixed(2)||n>+N(a,c).toFixed(2)||n<+O(e,g).toFixed(2)||n>+N(e,g).toFixed(2)||o<+O(b,d).toFixed(2)||o>+N(b,d).toFixed(2)||o<+O(f,h).toFixed(2)||o>+N(f,h).toFixed(2))) +return{x:l,y:m}}}} +function l(a,c,d){var e=b.bezierBBox(a),f=b.bezierBBox(c);if(!b.isBBoxIntersect(e,f)) +return d?0:[];for(var g=i.apply(0,a),h=i.apply(0,c),j=N(~~(g/5),1),l=N(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;j+1>q;q++){var r=b.findDotsAtSegment.apply(b,a.concat(q/j));m.push({x:r.x,y:r.y,t:q/j})} +for(q=0;l+1>q;q++) +r=b.findDotsAtSegment.apply(b,c.concat(q/l)),n.push({x:r.x,y:r.y,t:q/l});for(q=0;j>q;q++) +for(var s=0;l>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=P(u.x-t.x)<.001?"y":"x",y=P(w.x-v.x)<.001?"y":"x",z=k(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4)) +continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+P((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+P((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:O(A,1),t2:O(B,1)}))}} +return p} +function m(a,c,d){a=b._path2curve(a),c=b._path2curve(c);for(var e,f,g,h,i,j,k,m,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0]) +e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=c.length;u>t;t++){var v=c[t];if("M"==v[0]) +g=k=v[1],h=m=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,m,k,m],g=k,h=m);var w=l(n,o,d);if(d) +p+=w;else{for(var x=0,y=w.length;y>x;x++) +w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}} +return p} +function n(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)} +function o(){return this.x+G+this.y+G+this.width+" × "+this.height} +function p(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a} +function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c} +function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,P(f)e) +return c;if(e>d) +return d;for(;d>c;){if(f=g(e),P(f-a)f?c=e:d=e,e=(d-c)/2+c} +return e} +var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))} +function q(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a) +a[y](e)&&(d[$(e)]=a[e],c.push($(e)));c.sort(ka)} +this.anim=d,this.top=c[c.length-1],this.percents=c} +function r(c,d,e,f,g,h){e=$(e);var i,j,k,l,m,o,q=c.ms,r={},s={},t={};if(f) +for(w=0,x=fb.length;x>w;w++){var u=fb[w];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(fb.splice(w,1),k=1):j=u,d.attr(u.totalOrigin);break}} +else +f=+s;for(var w=0,x=c.percents.length;x>w;w++){if(c.percents[w]==e||c.percents[w]>f*c.top){e=c.percents[w],m=c.percents[w-1]||0,q=q/c.top*(e-m),l=c.percents[w+1],i=c.anim[e];break} +f&&d.attr(c.anim[c.percents[w]])} +if(i){if(j) +j.initstatus=f,j.start=new Date-j.ms*f;else{for(var z in i) +if(i[y](z)&&(ca[y](z)||d.paper.customAttributes[y](z))) +switch(r[z]=d.attr(z),null==r[z]&&(r[z]=ba[z]),s[z]=i[z],ca[z]){case S:t[z]=(s[z]-r[z])/q;break;case"colour":r[z]=b.getRGB(r[z]);var A=b.getRGB(s[z]);t[z]={r:(A.r-r[z].r)/q,g:(A.g-r[z].g)/q,b:(A.b-r[z].b)/q};break;case"path":var B=Ia(r[z],s[z]),C=B[1];for(r[z]=B[0],t[z]=[],w=0,x=r[z].length;x>w;w++){t[z][w]=[0];for(var E=1,F=r[z][w].length;F>E;E++) +t[z][w][E]=(C[w][E]-r[z][w][E])/q} +break;case"transform":var G=d._,J=Na(G[z],s[z]);if(J) +for(r[z]=J.from,s[z]=J.to,t[z]=[],t[z].real=!0,w=0,x=r[z].length;x>w;w++) +for(t[z][w]=[r[z][w][0]],E=1,F=r[z][w].length;F>E;E++) +t[z][w][E]=(s[z][w][E]-r[z][w][E])/q;else{var K=d.matrix||new n,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[z]=[K.a,K.b,K.c,K.d,K.e,K.f],La(L,s[z]),s[z]=L._.transform,t[z]=[(L.matrix.a-K.a)/q,(L.matrix.b-K.b)/q,(L.matrix.c-K.c)/q,(L.matrix.d-K.d)/q,(L.matrix.e-K.e)/q,(L.matrix.f-K.f)/q]} +break;case"csv":var M=H(i[z])[I](v),N=H(r[z])[I](v);if("clip-rect"==z) +for(r[z]=N,t[z]=[],w=N.length;w--;) +t[z][w]=(M[w]-r[z][w])/q;s[z]=M;break;default:for(M=[][D](i[z]),N=[][D](r[z]),t[z]=[],w=d.paper.customAttributes[z].length;w--;) +t[z][w]=((M[w]||0)-(N[w]||0))/q} +var O=i.easing,P=b.easing_formulas[O];if(!P) +if(P=H(O).match(Y),P&&5==P.length){var Q=P;P=function(a){return p(a,+Q[1],+Q[2],+Q[3],+Q[4],q)}}else +P=la;if(o=i.start||c.start||+new Date,u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:f||0,stop:!1,ms:q,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||c.times,origin:d.attr(),totalOrigin:g},fb.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-q*f,1==fb.length)) +return hb();k&&(u.start=new Date-u.ms*f),1==fb.length&&gb(hb)} +a("raphael.anim.start."+d.id,d,c)}} +function s(a){for(var b=0;be;e++) +for(i=a[e],f=1,h=i.length;h>f;f+=2) +c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(b._g=z,b.type=z.win.SVGAngle||z.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==b.type){var qa,ra=z.doc.createElement("div");if(ra.innerHTML='',qa=ra.firstChild,qa.style.behavior="url(#default#VML)",!qa||"object"!=typeof qa.adj) +return b.type=F;ra=null} +b.svg=!(b.vml="VML"==b.type),b._Paper=B,b.fn=u=B.prototype=b.prototype,b._id=0,b._oid=0,b.is=function(a,b){return b=L.call(b),"finite"==b?!X[y](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||V.call(a).slice(8,-1).toLowerCase()==b},b.angle=function(a,c,d,e,f,g){if(null==f){var h=a-d,i=c-e;return h||i?(180+180*M.atan2(-i,-h)/R+360)%360:0} +return b.angle(a,c,f,g)-b.angle(d,e,f,g)},b.rad=function(a){return a%360*R/180},b.deg=function(a){return Math.round(180*a/R%360*1e3)/1e3},b.snapTo=function(a,c,d){if(d=b.is(d,"finite")?d:10,b.is(a,U)){for(var e=a.length;e--;) +if(P(a[e]-c)<=d) +return a[e]}else{a=+a;var f=c%a;if(d>f) +return c-f;if(f>a-d) +return c-f+a} +return c};b.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}} +(/[xy]/g,function(a){var b=16*M.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});b.setWindow=function(c){a("raphael.setWindow",b,z.win,c),z.win=c,z.doc=z.win.document,b._engine.initWin&&b._engine.initWin(z.win)};var sa=function(a){if(b.vml){var c,d=/^\s+|\s+$/g;try{var f=new ActiveXObject("htmlfile");f.write(""),f.close(),c=f.body}catch(g){c=createPopup().document.body} +var h=c.createTextRange();sa=e(function(a){try{c.style.color=H(a).replace(d,F);var b=h.queryCommandValue("ForeColor");return b=(255&b)<<16|65280&b|(16711680&b)>>>16,"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=z.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",z.doc.body.appendChild(i),sa=e(function(a){return i.style.color=a,z.doc.defaultView.getComputedStyle(i,F).getPropertyValue("color")})} +return sa(a)},ta=function(){return"hsb("+[this.h,this.s,this.b]+")"},ua=function(){return"hsl("+[this.h,this.s,this.l]+")"},va=function(){return this.hex},wa=function(a,c,d){if(null==c&&b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,c=a.g,a=a.r),null==c&&b.is(a,T)){var e=b.getRGB(a);a=e.r,c=e.g,d=e.b} +return(a>1||c>1||d>1)&&(a/=255,c/=255,d/=255),[a,c,d]},xa=function(a,c,d,e){a*=255,c*=255,d*=255;var f={r:a,g:c,b:d,hex:b.rgb(a,c,d),toString:va};return b.is(e,"finite")&&(f.opacity=e),f};b.color=function(a){var c;return b.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(c=b.hsb2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):b.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(c=b.hsl2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):(b.is(a,"string")&&(a=b.getRGB(a)),b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(c=b.rgb2hsl(a),a.h=c.h,a.s=c.s,a.l=c.l,c=b.rgb2hsb(a),a.v=c.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=va,a},b.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-P(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-P(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.rgb2hsb=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=N(a,b,c),g=f-O(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:ta}},b.rgb2hsl=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=N(a,b,c),h=O(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:ua}},b._path2string=function(){return this.join(",").replace(fa,"$1")};b._preload=function(a,b){var c=z.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,z.doc.body.removeChild(this)},c.onerror=function(){z.doc.body.removeChild(this)},z.doc.body.appendChild(c),c.src=a};b.getRGB=e(function(a){if(!a||(a=H(a)).indexOf("-")+1) +return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f};if("none"==a) +return{r:-1,g:-1,b:-1,hex:"none",toString:f};!(ea[y](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=sa(a));var c,d,e,g,h,i,j=a.match(W);return j?(j[2]&&(e=_(j[2].substring(5),16),d=_(j[2].substring(3,5),16),c=_(j[2].substring(1,3),16)),j[3]&&(e=_((h=j[3].charAt(3))+h,16),d=_((h=j[3].charAt(2))+h,16),c=_((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsb2rgb(c,d,e,g)):j[6]?(i=j[6][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsl2rgb(c,d,e,g)):(j={r:c,g:d,b:e,toString:f},j.hex="#"+(16777216|e|d<<8|c<<16).toString(16).slice(1),b.is(g,"finite")&&(j.opacity=g),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f}},b),b.hsb=e(function(a,c,d){return b.hsb2rgb(a,c,d).hex}),b.hsl=e(function(a,c,d){return b.hsl2rgb(a,c,d).hex}),b.rgb=e(function(a,b,c){function d(a){return a+.5|0} +return"#"+(16777216|d(c)|d(b)<<8|d(a)<<16).toString(16).slice(1)}),b.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},b.getColor.reset=function(){delete this.start},b.parsePathString=function(a){if(!a) +return null;var c=ya(a);if(c.arr) +return Aa(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return b.is(a,U)&&b.is(a[0],U)&&(e=Aa(a)),e.length||H(a).replace(ga,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(ia,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][D](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g) +e.push([b][D](f));else +for(;f.length>=d[g]&&(e.push([b][D](f.splice(0,d[g]))),d[g]););}),e.toString=b._path2string,c.arr=Aa(e),e},b.parseTransformString=e(function(a){if(!a) +return null;var c=[];return b.is(a,U)&&b.is(a[0],U)&&(c=Aa(a)),c.length||H(a).replace(ha,function(a,b,d){{var e=[];L.call(b)} +d.replace(ia,function(a,b){b&&e.push(+b)}),c.push([b][D](e))}),c.toString=b._path2string,c});var ya=function(a){var b=ya.ps=ya.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b) +b[y](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};b.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=Q(j,3),l=Q(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*M.atan2(q-s,r-t)/R;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},b.bezierBBox=function(a,c,d,e,f,g,h,i){b.is(a,"array")||(a=[a,c,d,e,f,g,h,i]);var j=Ha.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},b.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},b.isBBoxIntersect=function(a,c){var d=b.isPointInsideBBox;return d(c,a.x,a.y)||d(c,a.x2,a.y)||d(c,a.x,a.y2)||d(c,a.x2,a.y2)||d(a,c.x,c.y)||d(a,c.x2,c.y)||d(a,c.x,c.y2)||d(a,c.x2,c.y2)||(a.xc.x||c.xa.x)&&(a.yc.y||c.ya.y)},b.pathIntersection=function(a,b){return m(a,b)},b.pathIntersectionNumber=function(a,b){return m(a,b,1)},b.isPointInsidePath=function(a,c,d){var e=b.pathBBox(a);return b.isPointInsideBBox(e,c,d)&&m(a,[["M",c,d],["H",e.x2+10]],1)%2==1},b._removedFactory=function(b){return function(){a("raphael.log",null,"Raphaël: you are calling to method “"+b+"” of removed object",b)}};var za=b.pathBBox=function(a){var b=ya(a);if(b.bbox) +return c(b.bbox);if(!a) +return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Ia(a);for(var d,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++) +if(d=a[i],"M"==d[0]) +e=d[1],f=d[2],g.push(e),h.push(f);else{var k=Ha(e,f,d[1],d[2],d[3],d[4],d[5],d[6]);g=g[D](k.min.x,k.max.x),h=h[D](k.min.y,k.max.y),e=d[5],f=d[6]} +var l=O[C](0,g),m=O[C](0,h),n=N[C](0,g),o=N[C](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=c(r),r},Aa=function(a){var d=c(a);return d.toString=b._path2string,d},Ba=b._pathToRelative=function(a){var c=ya(a);if(c.rel) +return Aa(c.rel);b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=L.call(m[0])) +switch(l[0]=L.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++) +l[n]=+(m[n]-(n%2?e:f)).toFixed(3)} +else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++) +d[j][p]=m[p]} +var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}} +return d.toString=b._path2string,c.rel=Aa(d),d},Ca=b._pathToAbsolute=function(a){var c=ya(a);if(c.abs) +return Aa(c.abs);if(b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a)),!a||!a.length) +return[["M",0,0]];var d=[],e=0,f=0,h=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],h=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=aa.call(l[0])) +switch(k[0]=aa.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][D](l.slice(1)),q=2,r=p.length;r>q;q++) +p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[D](g(p,m));break;case"M":h=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++) +k[q]=+l[q]+(q%2?e:f)} +else if("R"==l[0]) +p=[e,f][D](l.slice(1)),d.pop(),d=d[D](g(p,m)),k=["R"][D](l.slice(-2));else +for(var s=0,t=l.length;t>s;s++) +k[s]=l[s];switch(k[0]){case"Z":e=h,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":h=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}} +return d.toString=b._path2string,c.abs=Aa(d),d},Da=function(a,b,c,d){return[a,b,c,d,c,d]},Ea=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Fa=function(a,b,c,d,f,g,h,i,j,k){var l,m=120*R/180,n=R/180*(+f||0),o=[],p=e(function(a,b,c){var d=a*M.cos(c)-b*M.sin(c),e=a*M.sin(c)+b*M.cos(c);return{x:d,y:e}});if(k) +y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(M.cos(R/180*f),M.sin(R/180*f),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=M.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*M.sqrt(P((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v* -d*q/c+(b+j)/2,y=M.asin(((b-x)/d).toFixed(9)),z=M.asin(((j-x)/d).toFixed(9));y=w>a?R-y:y,z=w>i?R-z:z,0>y&&(y=2*R+y),0>z&&(z=2*R+z),h&&y>z&&(y-=2*R),!h&&z>y&&(z-=2*R)} +var A=z-y;if(P(A)>m){var B=z,C=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+c*M.cos(z),j=x+d*M.sin(z),o=Fa(i,j,c,d,f,0,h,C,E,[z,B,w,x])} +A=z-y;var F=M.cos(y),G=M.sin(y),H=M.cos(z),J=M.sin(z),K=M.tan(A/4),L=4/3*c*K,N=4/3*d*K,O=[a,b],Q=[a+L*G,b-N*F],S=[i+L*J,j-N*H],T=[i,j];if(Q[0]=2*O[0]-Q[0],Q[1]=2*O[1]-Q[1],k) +return[Q,S,T][D](o);o=[Q,S,T][D](o).join()[I](",");for(var U=[],V=0,W=o.length;W>V;V++) +U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ga=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:Q(j,3)*a+3*Q(j,2)*i*c+3*j*i*i*e+Q(i,3)*g,y:Q(j,3)*b+3*Q(j,2)*i*d+3*j*i*i*f+Q(i,3)*h}},Ha=e(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:O[C](0,p),y:O[C](0,o)},max:{x:N[C](0,p),y:N[C](0,o)}}}),Ia=b._path2curve=e(function(a,b){var c=!b&&ya(a);if(!b&&c.curve) +return Aa(c.curve);for(var d=Ca(a),e=b&&Ca(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a) +return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][D](Fa[C](0,[b.x,b.y][D](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][D](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][D](Ea(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][D](Ea(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][D](Da(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][D](Da(b.x,b.y,a[1],b.y));break;case"V":a=["C"][D](Da(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][D](Da(b.x,b.y,b.X,b.Y))} +return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;) +k[b]="A",e&&(l[b]="A"),a.splice(b++,0,["C"][D](c.splice(0,6)));a.splice(b,1),p=N(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],p=N(d.length,e&&e.length||0))},k=[],l=[],m="",n="",o=0,p=N(d.length,e&&e.length||0);p>o;o++){d[o]&&(m=d[o][0]),"C"!=m&&(k[o]=m,o&&(n=k[o-1])),d[o]=h(d[o],f,n),"A"!=k[o]&&"C"==m&&(k[o]="C"),i(d,o),e&&(e[o]&&(m=e[o][0]),"C"!=m&&(l[o]=m,o&&(n=l[o-1])),e[o]=h(e[o],g,n),"A"!=l[o]&&"C"==m&&(l[o]="C"),i(e,o)),j(d,e,f,g,o),j(e,d,g,f,o);var q=d[o],r=e&&e[o],s=q.length,t=e&&r.length;f.x=q[s-2],f.y=q[s-1],f.bx=$(q[s-4])||f.x,f.by=$(q[s-3])||f.y,g.bx=e&&($(r[t-4])||g.x),g.by=e&&($(r[t-3])||g.y),g.x=e&&r[t-2],g.y=e&&r[t-1]} +return e||(c.curve=Aa(d)),e?[d,e]:d},null,Aa),Ja=(b._parseDots=e(function(a){for(var c=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=b.getRGB(g[1]),f.color.error) +return null;f.opacity=f.color.opacity,f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)} +for(d=1,e=c.length-1;e>d;d++) +if(!c[d].offset){for(var h=$(c[d-1].offset||0),i=0,j=d+1;e>j;j++) +if(c[j].offset){i=c[j].offset;break} +i||(i=100,j=e),i=$(i);for(var k=(i-h)/(j-d+1);j>d;d++) +h+=k,c[d].offset=h+"%"} +return c}),b._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Ka=(b._tofront=function(a,b){b.top!==a&&(Ja(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},b._toback=function(a,b){b.bottom!==a&&(Ja(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},b._insertafter=function(a,b,c){Ja(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},b._insertbefore=function(a,b,c){Ja(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},b.toMatrix=function(a,b){var c=za(a),d={_:{transform:F},getBBox:function(){return c}};return La(d,b),d.matrix}),La=(b.transformPath=function(a,b){return pa(a,Ka(a,b))},b._extractTransform=function(a,c){if(null==c) +return a._.transform;c=H(c).replace(/\.{3}|\u2026/g,a._.transform||F);var d=b.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=a._,k=new n;if(j.transform=d||[],d) +for(var l=0,m=d.length;m>l;l++){var o,p,q,r,s,t=d[l],u=t.length,v=H(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(o=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-o,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k} +a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ma=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Na=b._equaliseTransform=function(a,c){c=H(c).replace(/\.{3}|\u2026/g,a),a=b.parseTransformString(a)||[],c=b.parseTransformString(c)||[];for(var d,e,f,g,h=N(a.length,c.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ma(c[k]),g=c[k]||Ma(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4])) +return;for(i[k]=[],j[k]=[],d=0,e=N(f.length,g.length);e>d;d++) +d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])} +return{from:i,to:j}};b._getContainer=function(a,c,d,e){var f;return f=null!=e||b.is(a,"object")?a:z.doc.getElementById(a),null!=f?f.tagName?null==c?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}:{container:1,x:a,y:c,width:d,height:e}:void 0},b.pathToRelative=Ba,b._engine={},b.path2curve=Ia,b.matrix=function(a,b,c,d,e,f){return new n(a,b,c,d,e,f)},function(a){function c(a){return a[0]*a[0]+a[1]*a[1]} +function d(a){var b=M.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)} +a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof n&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++) +for(h=0;3>h;h++){for(j=0,i=0;3>i;i++) +j+=l[g][i]*m[i][h];k[g][h]=j} +this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new n(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new n(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,c,d){a=b.rad(a),c=c||0,d=d||0;var e=+M.cos(a).toFixed(9),f=+M.sin(a).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[H.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return b.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=M.sqrt(c(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=M.sqrt(c(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=b.deg(M.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=b.deg(M.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[I]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:F)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:F)+(b.rotate?"r"+[b.rotate,0,0]:F)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}} +(n.prototype);for(var Oa=function(){this.returnValue=!1},Pa=function(){return this.originalEvent.preventDefault()},Qa=function(){this.cancelBubble=!0},Ra=function(){return this.originalEvent.stopPropagation()},Sa=function(a){var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,c=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Ta=function(){return z.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Sa(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),E&&K[b]){var f=function(b){for(var e=Sa(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++) +if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Pa,b.stopPropagation=Ra;break} +return c.call(d,b,e.x,e.y)};a.addEventListener(K[b],f,!1)} +return function(){return a.removeEventListener(b,e,!1),E&&K[b]&&a.removeEventListener(K[b],f,!1),!0}}:z.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||z.win.event;var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,e=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Oa,a.stopPropagation=a.stopPropagation||Qa,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0} +(),Ua=[],Va=function(b){for(var c,d=b.clientX,e=b.clientY,f=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,g=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,h=Ua.length;h--;){if(c=Ua[h],E&&b.touches){for(var i,j=b.touches.length;j--;) +if(i=b.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(b.originalEvent?b.originalEvent:b).preventDefault();break}}else +b.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;z.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,z.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&a("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,a("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,b)}},Wa=function(c){b.unmousemove(Va).unmouseup(Wa);for(var d,e=Ua.length;e--;) +d=Ua[e],d.el._drag={},a("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c);Ua=[]},Xa=b.el={},Ya=J.length;Ya--;) +!function(a){b[a]=Xa[a]=function(c,d){return b.is(c,"function")&&(this.events=this.events||[],this.events.push({name:a,f:c,unbind:Ta(this.shape||this.node||z.doc,a,c,d||this)})),this},b["un"+a]=Xa["un"+a]=function(c){for(var d=this.events||[],e=d.length;e--;) +d[e].name!=a||!b.is(c,"undefined")&&d[e].f!=c||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}} +(J[Ya]);Xa.data=function(c,d){var e=ja[this.id]=ja[this.id]||{};if(0==arguments.length) +return e;if(1==arguments.length){if(b.is(c,"object")){for(var f in c) +c[y](f)&&this.data(f,c[f]);return this} +return a("raphael.data.get."+this.id,this,e[c],c),e[c]} +return e[c]=d,a("raphael.data.set."+this.id,this,d,c),this},Xa.removeData=function(a){return null==a?ja[this.id]={}:ja[this.id]&&delete ja[this.id][a],this},Xa.getData=function(){return c(ja[this.id]||{})},Xa.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},Xa.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var Za=[];Xa.drag=function(c,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,m=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;if(this._drag.id=i.identifier,E&&i.touches) +for(var n,o=i.touches.length;o--;) +if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break} +this._drag.x=j+m,this._drag.y=k+l,!Ua.length&&b.mousemove(Va).mouseup(Wa),Ua.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&a.on("raphael.drag.start."+this.id,d),c&&a.on("raphael.drag.move."+this.id,c),e&&a.on("raphael.drag.end."+this.id,e),a("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)} +return this._drag={},Za.push({el:this,start:i}),this.mousedown(i),this},Xa.onDragOver=function(b){b?a.on("raphael.drag.over."+this.id,b):a.unbind("raphael.drag.over."+this.id)},Xa.undrag=function(){for(var c=Za.length;c--;) +Za[c].el==this&&(this.unmousedown(Za[c].start),Za.splice(c,1),a.unbind("raphael.drag.*."+this.id));!Za.length&&b.unmousemove(Va).unmouseup(Wa),Ua=[]},u.circle=function(a,c,d){var e=b._engine.circle(this,a||0,c||0,d||0);return this.__set__&&this.__set__.push(e),e},u.rect=function(a,c,d,e,f){var g=b._engine.rect(this,a||0,c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.ellipse=function(a,c,d,e){var f=b._engine.ellipse(this,a||0,c||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},u.path=function(a){a&&!b.is(a,T)&&!b.is(a[0],U)&&(a+=F);var c=b._engine.path(b.format[C](b,arguments),this);return this.__set__&&this.__set__.push(c),c},u.image=function(a,c,d,e,f){var g=b._engine.image(this,a||"about:blank",c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.text=function(a,c,d){var e=b._engine.text(this,a||0,c||0,H(d));return this.__set__&&this.__set__.push(e),e},u.set=function(a){!b.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var c=new jb(a);return this.__set__&&this.__set__.push(c),c.paper=this,c.type="set",c},u.setStart=function(a){this.__set__=a||this.set()},u.setFinish=function(a){var b=this.__set__;return delete this.__set__,b},u.getSize=function(){var a=this.canvas.parentNode;return{width:a.offsetWidth,height:a.offsetHeight}},u.setSize=function(a,c){return b._engine.setSize.call(this,a,c)},u.setViewBox=function(a,c,d,e,f){return b._engine.setViewBox.call(this,a,c,d,e,f)},u.top=u.bottom=null,u.raphael=b;var $a=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(z.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(z.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};u.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=z.doc.elementFromPoint(a,b);if(z.win.opera&&"svg"==e.tagName){var f=$a(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])} +if(!e) +return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;) +e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},u.getElementsByBBox=function(a){var c=this.set();return this.forEach(function(d){b.isBBoxIntersect(d.getBBox(),a)&&c.push(d)}),c},u.getById=function(a){for(var b=this.bottom;b;){if(b.id==a) +return b;b=b.next} +return null},u.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1) +return this;c=c.next} +return this},u.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},Xa.isPointInside=function(a,c){var d=this.realPath=oa[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=b.transformPath(d,this.attr("transform"))),b.isPointInsidePath(d,a,c)},Xa.getBBox=function(a){if(this.removed) +return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=oa[this.type](this),b.bboxwt=za(this.realPath),b.bboxwt.toString=o,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=oa[this.type](this)),b.bbox=za(pa(this.realPath,this.matrix)),b.bbox.toString=o,b.dirty=b.dirtyT=0),b.bbox)},Xa.clone=function(){if(this.removed) +return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},Xa.glow=function(a){if("text"==this.type) +return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:null==a.opacity?.5:a.opacity,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||oa[this.type](this);f=this.matrix?pa(f,this.matrix):f;for(var g=1;c+1>g;g++) +e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var _a=function(a,c,d,e,f,g,h,k,l){return null==l?i(a,c,d,e,f,g,h,k):b.findDotsAtSegment(a,c,d,e,f,g,h,k,j(a,c,d,e,f,g,h,k,l))},ab=function(a,c){return function(d,e,f){d=Ia(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0]) +g=+i[1],h=+i[2];else{if(j=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(c&&!m.start){if(k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f) +return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue} +if(!a&&!c) +return k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}} +n+=j,g=+i[5],h=+i[6]} +l+=i.shift()+i} +return m.end=l,k=a?n:c?m:b.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},bb=ab(1),cb=ab(),db=ab(0,1);b.getTotalLength=bb,b.getPointAtLength=cb,b.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6) +return db(a,b).end;var d=db(a,c,1);return b?db(d,b).end:d},Xa.getTotalLength=function(){var a=this.getPath();if(a) +return this.node.getTotalLength?this.node.getTotalLength():bb(a)},Xa.getPointAtLength=function(a){var b=this.getPath();if(b) +return cb(b,a)},Xa.getPath=function(){var a,c=b._getPath[this.type];if("text"!=this.type&&"set"!=this.type) +return c&&(a=c(this)),a},Xa.getSubpath=function(a,c){var d=this.getPath();if(d) +return b.getSubpath(d,a,c)};var eb=b.easing_formulas={linear:function(a){return a},"<":function(a){return Q(a,1.7)},">":function(a){return Q(a,.48)},"<>":function(a){var b=.48-a/1.04,c=M.sqrt(.1734+b*b),d=c-b,e=Q(P(d),1/3)*(0>d?-1:1),f=-c-b,g=Q(P(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:Q(2,-10*a)*M.sin(2*(a-.075)*R/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};eb.easeIn=eb["ease-in"]=eb["<"],eb.easeOut=eb["ease-out"]=eb[">"],eb.easeInOut=eb["ease-in-out"]=eb["<>"],eb["back-in"]=eb.backIn,eb["back-out"]=eb.backOut;var fb=[],gb=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},hb=function(){for(var c=+new Date,d=0;dh)) +if(i>h){var q=j(h/i);for(var s in k) +if(k[y](s)){switch(ca[s]){case S:f=+k[s]+q*i*l[s];break;case"colour":f="rgb("+[ib(Z(k[s].r+q*i*l[s].r)),ib(Z(k[s].g+q*i*l[s].g)),ib(Z(k[s].b+q*i*l[s].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[s].length;u>t;t++){f[t]=[k[s][t][0]];for(var v=1,w=k[s][t].length;w>v;v++) +f[t][v]=+k[s][t][v]+q*i*l[s][t][v];f[t]=f[t].join(G)} +f=f.join(G);break;case"transform":if(l[s].real) +for(f=[],t=0,u=k[s].length;u>t;t++) +for(f[t]=[k[s][t][0]],v=1,w=k[s][t].length;w>v;v++) +f[t][v]=k[s][t][v]+q*i*l[s][t][v];else{var x=function(a){return+k[s][a]+q*i*l[s][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]} +break;case"csv":if("clip-rect"==s) +for(f=[],t=4;t--;) +f[t]=+k[s][t]+q*i*l[s][t];break;default:var z=[][D](k[s]);for(f=[],t=n.paper.customAttributes[s].length;t--;) +f[t]=+z[t]+q*i*l[s][t]} +o[s]=f} +n.attr(o),function(b,c,d){setTimeout(function(){a("raphael.anim.frame."+b,c,d)})} +(n.id,n,e.anim)}else{if(function(c,d,e){setTimeout(function(){a("raphael.anim.frame."+d.id,d,e),a("raphael.anim.finish."+d.id,d,e),b.is(c,"function")&&c.call(d)})} +(e.callback,n,e.anim),n.attr(m),fb.splice(d--,1),e.repeat>1&&!e.next){for(g in m) +m[y](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),r(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)} +e.next&&!e.stop&&r(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}} +fb.length&&gb(hb)},ib=function(a){return a>255?255:0>a?0:a};Xa.animateWith=function(a,c,d,e,f,g){var h=this;if(h.removed) +return g&&g.call(h),h;var i=d instanceof q?d:b.animation(d,e,f,g);r(i,h,i.percents[0],null,h.attr());for(var j=0,k=fb.length;k>j;j++) +if(fb[j].anim==c&&fb[j].el==a){fb[k-1].start=fb[j].start;break} +return h},Xa.onAnimation=function(b){return b?a.on("raphael.anim.frame."+this.id,b):a.unbind("raphael.anim.frame."+this.id),this},q.prototype.delay=function(a){var b=new q(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},q.prototype.repeat=function(a){var b=new q(this.anim,this.ms);return b.del=this.del,b.times=M.floor(N(a,0))||1,b},b.animation=function(a,c,d,e){if(a instanceof q) +return a;(b.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),c=+c||0;var f,g,h={};for(g in a) +a[y](g)&&$(g)!=g&&$(g)+"%"!=g&&(f=!0,h[g]=a[g]);if(f) +return d&&(h.easing=d),e&&(h.callback=e),new q({100:h},c);if(e){var i=0;for(var j in a){var k=_(j);a[y](j)&&k>i&&(i=k)} +i+="%",!a[i].callback&&(a[i].callback=e)} +return new q(a,c)},Xa.animate=function(a,c,d,e){var f=this;if(f.removed) +return e&&e.call(f),f;var g=a instanceof q?a:b.animation(a,c,d,e);return r(g,f,g.percents[0],null,f.attr()),f},Xa.setTime=function(a,b){return a&&null!=b&&this.status(a,O(b,a.ms)/a.ms),this},Xa.status=function(a,b){var c,d,e=[],f=0;if(null!=b) +return r(a,this,-1,O(b,1)),this;for(c=fb.length;c>f;f++) +if(d=fb[f],d.el.id==this.id&&(!a||d.anim==a)){if(a) +return d.status;e.push({anim:d.anim,status:d.status})} +return a?0:e},Xa.pause=function(b){for(var c=0;cb;b++) +!a[b]||a[b].constructor!=Xa.constructor&&a[b].constructor!=jb||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},kb=jb.prototype;kb.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++) +a=arguments[c],!a||a.constructor!=Xa.constructor&&a.constructor!=jb||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},kb.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},kb.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++) +if(a.call(b,this.items[c],c)===!1) +return this;return this};for(var lb in Xa) +Xa[y](lb)&&(kb[lb]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][C](c,b)})}} +(lb));return kb.attr=function(a,c){if(a&&b.is(a,U)&&b.is(a[0],"object")) +for(var d=0,e=a.length;e>d;d++) +this.items[d].attr(a[d]);else +for(var f=0,g=this.items.length;g>f;f++) +this.items[f].attr(a,c);return this},kb.clear=function(){for(;this.length;) +this.pop()},kb.splice=function(a,b,c){a=0>a?N(this.length+a,0):a,b=N(0,O(this.length-a,b));var d,e=[],f=[],g=[];for(d=2;dd;d++) +f.push(this[a+d]);for(;dd?g[d]:e[d-h];for(d=this.items.length=this.length-=b-h;this[d];) +delete this[d++];return new jb(f)},kb.exclude=function(a){for(var b=0,c=this.length;c>b;b++) +if(this[b]==a) +return this.splice(b,1),!0},kb.animate=function(a,c,d,e){(b.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h) +return this;e&&(g=function(){!--h&&e.call(j)}),d=b.is(d,T)?d:g;var k=b.animation(a,c,d,g);for(f=this.items[--i].animate(k);i--;) +this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},kb.insertAfter=function(a){for(var b=this.items.length;b--;) +this.items[b].insertAfter(a);return this},kb.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;) +if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)} +return a=O[C](0,a),b=O[C](0,b),c=N[C](0,c),d=N[C](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},kb.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++) +a.push(this.items[b].clone());return a},kb.toString=function(){return"Raphaël‘s set"},kb.glow=function(a){var b=this.paper.set();return this.forEach(function(c,d){var e=c.glow(a);null!=e&&e.forEach(function(a,c){b.push(a)})}),b},kb.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},b.registerFont=function(a){if(!a.face) +return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face) +a.face[y](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=_(a.face["units-per-em"],10);for(var e in a.glyphs) +if(a.glyphs[y](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"} +[a]||"M"})+"z"},f.k) +for(var g in f.k) +f[y](g)&&(b.glyphs[e].k[g]=f.k[g])}} +return a},u.getFont=function(a,c,d,e){if(e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800} +[c]||400,b.fonts){var f=b.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,F)+"(\\s|$)","i");for(var h in b.fonts) +if(b.fonts[y](h)&&g.test(h)){f=b.fonts[h];break}} +var i;if(f) +for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=c||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},u.print=function(a,c,d,e,f,g,h,i){g=g||"middle",h=N(O(h||0,1),-1),i=N(O(i||1,3),1);var j,k=H(d)[I](F),l=0,m=0,n=F;if(b.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[I](v),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t]) +l=0,x=0,m=0,r+=q*i;else{var w=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(w.w||e.w)+(w.k&&w.k[k[t]]||0)+e.w*h:0,m=1} +x&&x.d&&(n+=b.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(c-s)/j]))}} +return this.path(n).attr({fill:"#000",stroke:"none"})},u.add=function(a){if(b.is(a,"array")) +for(var c,d=this.set(),e=0,f=a.length;f>e;e++) +c=a[e]||{},w[y](c.type)&&d.push(this[c.type]().attr(c));return d},b.format=function(a,c){var d=b.is(c,U)?[0][D](c):arguments;return a&&b.is(a,T)&&d.length-1&&(a=a.replace(x,function(a,b){return null==d[++b]?F:d[b]})),a||F},b.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}} +(),b.ninja=function(){return A.was?z.win.Raphael=A.is:delete Raphael,b},b.st=kb,a.on("raphael.DOMload",function(){t=!0}),function(a,c,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):b.eve("raphael.DOMload")} +null==a.readyState&&a.addEventListener&&(a.addEventListener(c,d=function(){a.removeEventListener(c,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()} +(document,"DOMContentLoaded"),b}),function(a,b){"function"==typeof define&&define.amd?define("raphael.svg",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)} +(this,function(a){if(!a||a.svg){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e) +e[b](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else +d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){if(e=c(e).replace(a._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)} +return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t)) +return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)} +var w=a._parseDots(e);if(!w) +return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient),!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++) +s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff","stop-opacity":isFinite(w[x].opacity)?w[x].opacity:1}))}} +return q(o,{fill:"url('"+document.location.origin+document.location.pathname+"#"+k+"')",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=c(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;) +switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2} +if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y+"-obj"+d.id;a._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=a._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-E*u):(g=E*u,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=a.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else +f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-g):(g=0,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:a.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p) +if(p[b](k)&&!p[k]){var F=a._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){if(b=u[c(b).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0} +[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;h--;) +g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}else +q(a.node,{"stroke-dasharray":"none"})},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f) +if(f[b](o)){if(!a._availableAttrs[b](o)) +continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0])) +u.firstChild.nodeValue=p;else{u=q("title");var w=a._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)} +break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=c(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=a.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C} +if(!p){var D=i.getAttribute("clip-path");if(D){var E=a._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}} +break;case"path":"path"==d.type&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx) +break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type) +break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy) +break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type) +break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=c(p).match(a._ISURL);if(F){B=q("pattern");var G=q("image");B.id=a.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(b){a._preload(F[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(G,{width:a,height:c})})} +(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break} +var H=a.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}} +k.gradient=p,k.fill="none";break}}else +delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[b]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=a.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[b]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break} +default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}} +y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){for(g.text=f.text;h.firstChild;) +h.removeChild(h.firstChild);for(var j,k=c(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++) +j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(a._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else +for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++) +n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a){return a.parentNode&&"a"===a.parentNode.tagName.toLowerCase()?a.parentNode:a},A=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},B=a.el;A.prototype=B,B.constructor=A,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new A(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},B.rotate=function(a,b,e){if(this.removed) +return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2} +return this.transform(this._.transform.concat([["r",a,b,e]])),this},B.scale=function(a,b,e,f){if(this.removed) +return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f) +var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this},B.translate=function(a,b){return this.removed?this:(a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]])),this)},B.transform=function(c){var d=this._;if(null==c) +return d.transform;if(a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})} +return this},B.hide=function(){return this.removed||(this.node.style.display="none"),this},B.show=function(){return this.removed||(this.node.style.display=""),this},B.remove=function(){var b=z(this.node);if(!this.removed&&b.parentNode){var c=this.paper;c.__set__&&c.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&c.defs.removeChild(this.gradient),a._tear(this,c),b.parentNode.removeChild(b),this.removeData();for(var d in this) +this[d]="function"==typeof this[d]?a._removedFactory(d):null;this.removed=!0}},B._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0} +var b,c=!1;this.paper.canvas.parentElement?b=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(b=this.paper.canvas.parentNode.style),b&&"none"==b.display&&(c=!0,b.display="");var d={};try{d=this.node.getBBox()}catch(e){d={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}} +finally{d=d||{},c&&(b.display="none")} +return a&&this.hide(),d},B.attr=function(c,d){if(this.removed) +return this;if(null==c){var e={};for(var f in this.attrs) +this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e} +if(null==d&&a.is(c,"string")){if("fill"==c&&"none"==this.attrs.fill&&this.attrs.gradient) +return this.attrs.gradient;if("transform"==c) +return this._.transform;for(var g=c.split(j),h={},i=0,l=g.length;l>i;i++) +c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]} +if(null==d&&a.is(c,"array")){for(h={},i=0,l=c.length;l>i;i++) +h[c[i]]=this.attr(c[i]);return h} +if(null!=d){var m={};m[c]=d}else +null!=c&&a.is(c,"object")&&(m=c);for(var n in m) +k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes) +if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o) +o[b](p)&&(m[p]=o[p])} +return w(this,m),this},B.toFront=function(){if(this.removed) +return this;var b=z(this.node);b.parentNode.appendChild(b);var c=this.paper;return c.top!=this&&a._tofront(this,c),this},B.toBack=function(){if(this.removed) +return this;var b=z(this.node),c=b.parentNode;c.insertBefore(b,c.firstChild),a._toback(this,this.paper);this.paper;return this},B.insertAfter=function(b){if(this.removed||!b) +return this;var c=z(this.node),d=z(b.node||b[b.length-1].node);return d.nextSibling?d.parentNode.insertBefore(c,d.nextSibling):d.parentNode.appendChild(c),a._insertafter(this,b,this.paper),this},B.insertBefore=function(b){if(this.removed||!b) +return this;var c=z(this.node),d=z(b.node||b[0].node);return d.parentNode.insertBefore(c,d),a._insertbefore(this,b,this.paper),this},B.blur=function(b){var c=this;if(0!==+b){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else +c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter");return c},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new A(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:b,y:c,width:d,height:e,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new A(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new A(f,b);return g.attrs={x:c,y:d,"text-anchor":"middle",text:e,"font-family":a._availableAttrs["font-family"],"font-size":a._availableAttrs["font-size"],stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},a._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c) +throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==c?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i)),c=new a._Paper,c.width=f,c.height=g,c.canvas=i,c.clear(),c._left=c._top=0,h&&(c.renderfix=function(){}),c.renderfix(),c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=this.getSize(),j=g(c/i.width,d/i.height),l=this.top,n=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(j=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=j,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:n});j&&l;) +h="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":h}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[a,b,c,d,!!e],this},a.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()} +var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},a.prototype.clear=function(){a.eve("raphael.clear",this);for(var b=this.canvas;b.firstChild;) +b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this) +this[b]="function"==typeof this[b]?a._removedFactory(b):null};var C=a.st;for(var D in B) +B[b](D)&&!C[b](D)&&(C[D]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}} +(D))}}),function(a,b){"function"==typeof define&&define.amd?define("raphael.vml",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)} +(this,function(a){if(!a||a.vml){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/gi,e=a._pathToAbsolute;if(c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g,e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g} +var h,i,j=e(b);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++) +i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)} +return g.join(n)},y=function(b,c,d){var e=a.matrix();return e.rotate(-b,.5,.5),{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy} +if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d* -q+n+e* -r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)} +m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){for(var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;) +switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]} +var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i) +i[b](t)&&(m[t]=i[t]);if(q&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e._.dirty=1,"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1} +if("clip-rect"in i){var G=c(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||a._g.doc.createElement("div"),I=H.style;I.clip=a.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)} +i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")} +if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])} +if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=c(i.fill).match(a._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],a._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else +K.color=a.getRGB(i.fill).hex,K.src=o,K.type="solid",a.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=c(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)} +if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")} +l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=a.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[b](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o} +Q&&l.appendChild(P)} +if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=c(s.textpath.string).replace(/"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++) +if(Y[Z]in i){s._.dirty=1;break} +switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0} +s.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=(b.attrs,Math.pow),i="linear",j=".5 .5";if(b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k)) +return null} +var l=a._parseDots(f);if(!l) +return null;if(b=b.shape||b.node,l.length){b.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++) +l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),b.appendChild(g)} +return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(null==b) +return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,f+b);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type) +if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q* -u+n+r* -u,z(this,1,1,q,r,0)}else +j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else +j.style.filter=o,i.matrix=c(h),i.offset=h.offset();return null!==d&&(this._.transform=d,a._extractTransform(this,d)),this},E.rotate=function(a,b,e){if(this.removed) +return this;if(null!=a){if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2} +return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]])),this}},E.translate=function(a,b){return this.removed?this:(a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]])),this)},E.scale=function(a,b,e,f){if(this.removed) +return this;if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f) +var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E.auxGetBBox=a.el.getBBox,E.getBBox=function(){var a=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var b={},c=1/this.paper._viewBoxShift.scale;return b.x=a.x-this.paper._viewBoxShift.dx,b.x*=c,b.y=a.y-this.paper._viewBoxShift.dy,b.y*=c,b.width=a.width*c,b.height=a.height*c,b.x2=b.x+b.width,b.y2=b.y+b.height,b} +return a},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this) +this[b]="function"==typeof this[b]?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed) +return this;if(null==c){var e={};for(var f in this.attrs) +this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e} +if(null==d&&a.is(c,"string")){if(c==j&&"none"==this.attrs.fill&&this.attrs.gradient) +return this.attrs.gradient;for(var g=c.split(k),h={},i=0,m=g.length;m>i;i++) +c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]} +if(this.attrs&&null==d&&a.is(c,"array")){for(h={},i=0,m=c.length;m>i;i++) +h[c[i]]=this.attr(c[i]);return h} +var n;null!=d&&(n={},n[c]=d),null==d&&a.is(c,"object")&&(n=c);for(var o in n) +l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes) +if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p) +p[b](q)&&(n[q]=p[q])} +n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)} +return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper)),this)},E.insertAfter=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper),this)},E.insertBefore=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper),this)},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;return d=d.replace(r,o),0!==+b?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur),this},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;return i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},a._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs} +return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},a._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs} +return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},a._engine.setSize=function(b,c){var d=this.canvas.style;return this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox),this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var g,h,i=this.getSize(),j=i.width,k=i.height;return f&&(g=k/e,h=j/d,j>d*g&&(b-=(j-d*g)/2/g),k>e*h&&(c-=(k-e*h)/2/h)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:i},this.forEach(function(a){a.transform("...")}),this};var F;a._engine.initWin=function(a){var b=a.document;b.styleSheets.length<31?b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):b.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e=b.width,f=b.x,g=b.y;if(!c) +throw new Error("VML container not found.");var h=new a._Paper,i=h.canvas=a._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=a._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==c?(a._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i),h.renderfix=function(){},h},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this) +this[b]="function"==typeof this[b]?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E) +E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}} +(H))}});JustGage=function(config){var obj=this;if(config===null||config===undefined){console.log('* justgage: Make sure to pass options to the constructor!');return false;} +var node;if(config.id!==null&&config.id!==undefined){node=document.getElementById(config.id);if(!node){console.log('* justgage: No element with id : %s found',config.id);return false;}}else if(config.parentNode!==null&&config.parentNode!==undefined){node=config.parentNode;}else{console.log('* justgage: Make sure to pass the existing element id or parentNode to the constructor.');return false;} +var dataset=node.dataset?node.dataset:{};var defaults=(config.defaults!==null&&config.defaults!==undefined)?config.defaults:false;if(defaults!==false){config=extend({},config,defaults);delete config.defaults;} +obj.config={id:config.id,value:kvLookup('value',config,dataset,0,'float'),defaults:kvLookup('defaults',config,dataset,0,false),parentNode:kvLookup('parentNode',config,dataset,null),width:kvLookup('width',config,dataset,null),height:kvLookup('height',config,dataset,null),title:kvLookup('title',config,dataset,""),titleFontColor:kvLookup('titleFontColor',config,dataset,"#999999"),titleFontFamily:kvLookup('titleFontFamily',config,dataset,"sans-serif"),titlePosition:kvLookup('titlePosition',config,dataset,"above"),valueFontColor:kvLookup('valueFontColor',config,dataset,"#010101"),valueFontFamily:kvLookup('valueFontFamily',config,dataset,"Arial"),symbol:kvLookup('symbol',config,dataset,''),min:kvLookup('min',config,dataset,0,'float'),max:kvLookup('max',config,dataset,100,'float'),reverse:kvLookup('reverse',config,dataset,false),humanFriendlyDecimal:kvLookup('humanFriendlyDecimal',config,dataset,0),textRenderer:kvLookup('textRenderer',config,dataset,null),gaugeWidthScale:kvLookup('gaugeWidthScale',config,dataset,1.0),gaugeColor:kvLookup('gaugeColor',config,dataset,"#edebeb"),label:kvLookup('label',config,dataset,''),labelFontColor:kvLookup('labelFontColor',config,dataset,"#b3b3b3"),shadowOpacity:kvLookup('shadowOpacity',config,dataset,0.2),shadowSize:kvLookup('shadowSize',config,dataset,5),shadowVerticalOffset:kvLookup('shadowVerticalOffset',config,dataset,3),levelColors:kvLookup('levelColors',config,dataset,["#a9d70b","#f9c802","#ff0000"],'array',','),startAnimationTime:kvLookup('startAnimationTime',config,dataset,700),startAnimationType:kvLookup('startAnimationType',config,dataset,'>'),refreshAnimationTime:kvLookup('refreshAnimationTime',config,dataset,700),refreshAnimationType:kvLookup('refreshAnimationType',config,dataset,'>'),donutStartAngle:kvLookup('donutStartAngle',config,dataset,90),valueMinFontSize:kvLookup('valueMinFontSize',config,dataset,16),titleMinFontSize:kvLookup('titleMinFontSize',config,dataset,10),labelMinFontSize:kvLookup('labelMinFontSize',config,dataset,10),minLabelMinFontSize:kvLookup('minLabelMinFontSize',config,dataset,10),maxLabelMinFontSize:kvLookup('maxLabelMinFontSize',config,dataset,10),hideValue:kvLookup('hideValue',config,dataset,false),hideMinMax:kvLookup('hideMinMax',config,dataset,false),hideInnerShadow:kvLookup('hideInnerShadow',config,dataset,false),humanFriendly:kvLookup('humanFriendly',config,dataset,false),noGradient:kvLookup('noGradient',config,dataset,false),donut:kvLookup('donut',config,dataset,false),relativeGaugeSize:kvLookup('relativeGaugeSize',config,dataset,false),counter:kvLookup('counter',config,dataset,false),decimals:kvLookup('decimals',config,dataset,0),customSectors:kvLookup('customSectors',config,dataset,[]),formatNumber:kvLookup('formatNumber',config,dataset,false),pointer:kvLookup('pointer',config,dataset,false),pointerOptions:kvLookup('pointerOptions',config,dataset,[])};var +canvasW,canvasH,widgetW,widgetH,aspect,dx,dy,titleFontSize,titleX,titleY,valueFontSize,valueX,valueY,labelFontSize,labelX,labelY,minFontSize,minX,minY,maxFontSize,maxX,maxY;if(obj.config.value>obj.config.max) +obj.config.value=obj.config.max;if(obj.config.valuecanvasH){widgetH=canvasH;widgetW=widgetH;}else if(canvasWcanvasH){aspect=widgetH/canvasH;widgetH=widgetH/aspect;widgetW=widgetH/aspect;}}else{widgetW=canvasW;widgetH=widgetW;} +dx=(canvasW-widgetW)/2;dy=(canvasH-widgetH)/2;titleFontSize=((widgetH/8)>10)?(widgetH/10):10;titleX=dx+widgetW/2;titleY=dy+widgetH/11;valueFontSize=((widgetH/6.4)>16)?(widgetH/5.4):18;valueX=dx+widgetW/2;if(obj.config.label!==''){valueY=dy+widgetH/1.85;}else{valueY=dy+widgetH/1.7;} +labelFontSize=((widgetH/16)>10)?(widgetH/16):10;labelX=dx+widgetW/2;labelY=valueY+labelFontSize;minFontSize=((widgetH/16)>10)?(widgetH/16):10;minX=dx+(widgetW/10)+(widgetW/6.666666666666667*obj.config.gaugeWidthScale)/2;minY=labelY;maxFontSize=((widgetH/16)>10)?(widgetH/16):10;maxX=dx+widgetW-(widgetW/10)-(widgetW/6.666666666666667*obj.config.gaugeWidthScale)/2;maxY=labelY;}else{if(canvasW>canvasH){widgetH=canvasH;widgetW=widgetH*1.25;if(widgetW>canvasW){aspect=widgetW/canvasW;widgetW=widgetW/aspect;widgetH=widgetH/aspect;}}else if(canvasWcanvasH){aspect=widgetH/canvasH;widgetH=widgetH/aspect;widgetW=widgetH/aspect;}}else{widgetW=canvasW;widgetH=widgetW*0.75;} +dx=(canvasW-widgetW)/2;dy=(canvasH-widgetH)/2;if(obj.config.titlePosition==='below'){dy-=(widgetH/6.4);} +titleFontSize=((widgetH/8)>obj.config.titleMinFontSize)?(widgetH/10):obj.config.titleMinFontSize;titleX=dx+widgetW/2;titleY=dy+(obj.config.titlePosition==='below'?(widgetH*1.07):(widgetH/6.4));valueFontSize=((widgetH/6.5)>obj.config.valueMinFontSize)?(widgetH/6.5):obj.config.valueMinFontSize;valueX=dx+widgetW/2;valueY=dy+widgetH/1.275;labelFontSize=((widgetH/16)>obj.config.labelMinFontSize)?(widgetH/16):obj.config.labelMinFontSize;labelX=dx+widgetW/2;labelY=valueY+valueFontSize/2+5;minFontSize=((widgetH/16)>obj.config.minLabelMinFontSize)?(widgetH/16):obj.config.minLabelMinFontSize;minX=dx+(widgetW/10)+(widgetW/6.666666666666667*obj.config.gaugeWidthScale)/2;minY=labelY;maxFontSize=((widgetH/16)>obj.config.maxLabelMinFontSize)?(widgetH/16):obj.config.maxLabelMinFontSize;maxX=dx+widgetW-(widgetW/10)-(widgetW/6.666666666666667*obj.config.gaugeWidthScale)/2;maxY=labelY;} +obj.params={canvasW:canvasW,canvasH:canvasH,widgetW:widgetW,widgetH:widgetH,dx:dx,dy:dy,titleFontSize:titleFontSize,titleX:titleX,titleY:titleY,valueFontSize:valueFontSize,valueX:valueX,valueY:valueY,labelFontSize:labelFontSize,labelX:labelX,labelY:labelY,minFontSize:minFontSize,minX:minX,minY:minY,maxFontSize:maxFontSize,maxX:maxX,maxY:maxY};canvasW,canvasH,widgetW,widgetH,aspect,dx,dy,titleFontSize,titleX,titleY,valueFontSize,valueX,valueY,labelFontSize,labelX,labelY,minFontSize,minX,minY,maxFontSize,maxX,maxY=null;obj.canvas.customAttributes.pki=function(value,min,max,w,h,dx,dy,gws,donut,reverse){var alpha,Ro,Ri,Cx,Cy,Xo,Yo,Xi,Yi,path;if(donut){alpha=(1-2*(value-min)/(max-min))*Math.PI;Ro=w/2-w/7;Ri=Ro-w/6.666666666666667*gws;Cx=w/2+dx;Cy=h/1.95+dy;Xo=w/2+dx+Ro*Math.cos(alpha);Yo=h-(h-Cy)-Ro*Math.sin(alpha);Xi=w/2+dx+Ri*Math.cos(alpha);Yi=h-(h-Cy)-Ri*Math.sin(alpha);path="M"+(Cx-Ri)+","+Cy+" ";path+="L"+(Cx-Ro)+","+Cy+" ";if(value>((max-min)/2)){path+="A"+Ro+","+Ro+" 0 0 1 "+(Cx+Ro)+","+Cy+" ";} +path+="A"+Ro+","+Ro+" 0 0 1 "+Xo+","+Yo+" ";path+="L"+Xi+","+Yi+" ";if(value>((max-min)/2)){path+="A"+Ri+","+Ri+" 0 0 0 "+(Cx+Ri)+","+Cy+" ";} +path+="A"+Ri+","+Ri+" 0 0 0 "+(Cx-Ri)+","+Cy+" ";path+="Z ";return{path:path};}else{alpha=(1-(value-min)/(max-min))*Math.PI;Ro=w/2-w/10;Ri=Ro-w/6.666666666666667*gws;Cx=w/2+dx;Cy=h/1.25+dy;Xo=w/2+dx+Ro*Math.cos(alpha);Yo=h-(h-Cy)-Ro*Math.sin(alpha);Xi=w/2+dx+Ri*Math.cos(alpha);Yi=h-(h-Cy)-Ri*Math.sin(alpha);path="M"+(Cx-Ri)+","+Cy+" ";path+="L"+(Cx-Ro)+","+Cy+" ";path+="A"+Ro+","+Ro+" 0 0 1 "+Xo+","+Yo+" ";path+="L"+Xi+","+Yi+" ";path+="A"+Ri+","+Ri+" 0 0 0 "+(Cx-Ri)+","+Cy+" ";path+="Z ";return{path:path};} +alpha,Ro,Ri,Cx,Cy,Xo,Yo,Xi,Yi,path=null;};obj.canvas.customAttributes.ndl=function(value,min,max,w,h,dx,dy,gws,donut){var dlt=w*3.5/100;var dlb=w/15;var dw=w/100;if(obj.config.pointerOptions.toplength!=null&&obj.config.pointerOptions.toplength!=undefined) +dlt=obj.config.pointerOptions.toplength;if(obj.config.pointerOptions.bottomlength!=null&&obj.config.pointerOptions.bottomlength!=undefined) +dlb=obj.config.pointerOptions.bottomlength;if(obj.config.pointerOptions.bottomwidth!=null&&obj.config.pointerOptions.bottomwidth!=undefined) +dw=obj.config.pointerOptions.bottomwidth;var alpha,Ro,Ri,Cx,Cy,Xo,Yo,Xi,Yi,Xc,Yc,Xz,Yz,Xa,Ya,Xb,Yb,path;if(donut){alpha=(1-2*(value-min)/(max-min))*Math.PI;Ro=w/2-w/7;Ri=Ro-w/6.666666666666667*gws;Cx=w/2+dx;Cy=h/1.95+dy;Xo=w/2+dx+Ro*Math.cos(alpha);Yo=h-(h-Cy)-Ro*Math.sin(alpha);Xi=w/2+dx+Ri*Math.cos(alpha);Yi=h-(h-Cy)-Ri*Math.sin(alpha);Xc=Xo+dlt*Math.cos(alpha);Yc=Yo-dlt*Math.sin(alpha);Xz=Xi-dlb*Math.cos(alpha);Yz=Yi+dlb*Math.sin(alpha);Xa=Xz+dw*Math.sin(alpha);Ya=Yz+dw*Math.cos(alpha);Xb=Xz-dw*Math.sin(alpha);Yb=Yz-dw*Math.cos(alpha);path='M'+Xa+','+Ya+' ';path+='L'+Xb+','+Yb+' ';path+='L'+Xc+','+Yc+' ';path+='Z ';return{path:path};}else{alpha=(1-(value-min)/(max-min))*Math.PI;Ro=w/2-w/10;Ri=Ro-w/6.666666666666667*gws;Cx=w/2+dx;Cy=h/1.25+dy;Xo=w/2+dx+Ro*Math.cos(alpha);Yo=h-(h-Cy)-Ro*Math.sin(alpha);Xi=w/2+dx+Ri*Math.cos(alpha);Yi=h-(h-Cy)-Ri*Math.sin(alpha);Xc=Xo+dlt*Math.cos(alpha);Yc=Yo-dlt*Math.sin(alpha);Xz=Xi-dlb*Math.cos(alpha);Yz=Yi+dlb*Math.sin(alpha);Xa=Xz+dw*Math.sin(alpha);Ya=Yz+dw*Math.cos(alpha);Xb=Xz-dw*Math.sin(alpha);Yb=Yz-dw*Math.cos(alpha);path='M'+Xa+','+Ya+' ';path+='L'+Xb+','+Yb+' ';path+='L'+Xc+','+Yc+' ';path+='Z ';return{path:path};} +alpha,Ro,Ri,Cx,Cy,Xo,Yo,Xi,Yi,Xc,Yc,Xz,Yz,Xa,Ya,Xb,Yb,path=null;};obj.gauge=obj.canvas.path().attr({"stroke":"none","fill":obj.config.gaugeColor,pki:[obj.config.max,obj.config.min,obj.config.max,obj.params.widgetW,obj.params.widgetH,obj.params.dx,obj.params.dy,obj.config.gaugeWidthScale,obj.config.donut,obj.config.reverse]});obj.level=obj.canvas.path().attr({"stroke":"none","fill":getColor(obj.config.value,(obj.config.value-obj.config.min)/(obj.config.max-obj.config.min),obj.config.levelColors,obj.config.noGradient,obj.config.customSectors),pki:[obj.config.min,obj.config.min,obj.config.max,obj.params.widgetW,obj.params.widgetH,obj.params.dx,obj.params.dy,obj.config.gaugeWidthScale,obj.config.donut,obj.config.reverse]});if(obj.config.donut){obj.level.transform("r"+obj.config.donutStartAngle+", "+(obj.params.widgetW/2+obj.params.dx)+", "+(obj.params.widgetH/1.95+obj.params.dy));} +if(obj.config.pointer){obj.needle=obj.canvas.path().attr({"stroke":(obj.config.pointerOptions.stroke!==null&&obj.config.pointerOptions.stroke!==undefined)?obj.config.pointerOptions.stroke:"none","stroke-width":(obj.config.pointerOptions.stroke_width!==null&&obj.config.pointerOptions.stroke_width!==undefined)?obj.config.pointerOptions.stroke_width:0,"stroke-linecap":(obj.config.pointerOptions.stroke_linecap!==null&&obj.config.pointerOptions.stroke_linecap!==undefined)?obj.config.pointerOptions.stroke_linecap:"square","fill":(obj.config.pointerOptions.color!==null&&obj.config.pointerOptions.color!==undefined)?obj.config.pointerOptions.color:"#000000",ndl:[obj.config.min,obj.config.min,obj.config.max,obj.params.widgetW,obj.params.widgetH,obj.params.dx,obj.params.dy,obj.config.gaugeWidthScale,obj.config.donut]});if(obj.config.donut){obj.needle.transform("r"+obj.config.donutStartAngle+", "+(obj.params.widgetW/2+obj.params.dx)+", "+(obj.params.widgetH/1.95+obj.params.dy));}} +obj.txtTitle=obj.canvas.text(obj.params.titleX,obj.params.titleY,obj.config.title);obj.txtTitle.attr({"font-size":obj.params.titleFontSize,"font-weight":"bold","font-family":obj.config.titleFontFamily,"fill":obj.config.titleFontColor,"fill-opacity":"1"});setDy(obj.txtTitle,obj.params.titleFontSize,obj.params.titleY);obj.txtValue=obj.canvas.text(obj.params.valueX,obj.params.valueY,0);obj.txtValue.attr({"font-size":obj.params.valueFontSize,"font-weight":"bold","font-family":obj.config.valueFontFamily,"fill":obj.config.valueFontColor,"fill-opacity":"0"});setDy(obj.txtValue,obj.params.valueFontSize,obj.params.valueY);obj.txtLabel=obj.canvas.text(obj.params.labelX,obj.params.labelY,obj.config.label);obj.txtLabel.attr({"font-size":obj.params.labelFontSize,"font-weight":"normal","font-family":"Arial","fill":obj.config.labelFontColor,"fill-opacity":"0"});setDy(obj.txtLabel,obj.params.labelFontSize,obj.params.labelY);var min=obj.config.min;if(obj.config.reverse){min=obj.config.max;} +obj.txtMinimum=min;if(obj.config.humanFriendly){obj.txtMinimum=humanFriendlyNumber(min,obj.config.humanFriendlyDecimal);}else if(obj.config.formatNumber){obj.txtMinimum=formatNumber(min);} +obj.txtMin=obj.canvas.text(obj.params.minX,obj.params.minY,obj.txtMinimum);obj.txtMin.attr({"font-size":obj.params.minFontSize,"font-weight":"normal","font-family":"Arial","fill":obj.config.labelFontColor,"fill-opacity":(obj.config.hideMinMax||obj.config.donut)?"0":"1"});setDy(obj.txtMin,obj.params.minFontSize,obj.params.minY);var max=obj.config.max;if(obj.config.reverse){max=obj.config.min;} +obj.txtMaximum=max;if(obj.config.humanFriendly){obj.txtMaximum=humanFriendlyNumber(max,obj.config.humanFriendlyDecimal);}else if(obj.config.formatNumber){obj.txtMaximum=formatNumber(max);} +obj.txtMax=obj.canvas.text(obj.params.maxX,obj.params.maxY,obj.txtMaximum);obj.txtMax.attr({"font-size":obj.params.maxFontSize,"font-weight":"normal","font-family":"Arial","fill":obj.config.labelFontColor,"fill-opacity":(obj.config.hideMinMax||obj.config.donut)?"0":"1"});setDy(obj.txtMax,obj.params.maxFontSize,obj.params.maxY);var defs=obj.canvas.canvas.childNodes[1];var svg="http://www.w3.org/2000/svg";if(ie!=='undefined'&&ie<9){} +else if(ie!=='undefined'){onCreateElementNsReady(function(){obj.generateShadow(svg,defs);});}else{obj.generateShadow(svg,defs);} +defs,svg=null;if(obj.config.textRenderer){obj.originalValue=obj.config.textRenderer(obj.originalValue);}else if(obj.config.humanFriendly){obj.originalValue=humanFriendlyNumber(obj.originalValue,obj.config.humanFriendlyDecimal)+obj.config.symbol;}else if(obj.config.formatNumber){obj.originalValue=formatNumber(obj.originalValue)+obj.config.symbol;}else{obj.originalValue=(obj.originalValue*1).toFixed(obj.config.decimals)+obj.config.symbol;} +if(obj.config.counter===true){eve.on("raphael.anim.frame."+(obj.level.id),function(){var currentValue=obj.level.attr("pki")[0];if(obj.config.reverse){currentValue=(obj.config.max*1)+(obj.config.min*1)-(obj.level.attr("pki")[0]*1);} +if(obj.config.textRenderer){obj.txtValue.attr("text",obj.config.textRenderer(Math.floor(currentValue)));}else if(obj.config.humanFriendly){obj.txtValue.attr("text",humanFriendlyNumber(Math.floor(currentValue),obj.config.humanFriendlyDecimal)+obj.config.symbol);}else if(obj.config.formatNumber){obj.txtValue.attr("text",formatNumber(Math.floor(currentValue))+obj.config.symbol);}else{obj.txtValue.attr("text",(currentValue*1).toFixed(obj.config.decimals)+obj.config.symbol);} +setDy(obj.txtValue,obj.params.valueFontSize,obj.params.valueY);currentValue=null;});eve.on("raphael.anim.finish."+(obj.level.id),function(){obj.txtValue.attr({"text":obj.originalValue});setDy(obj.txtValue,obj.params.valueFontSize,obj.params.valueY);});}else{eve.on("raphael.anim.start."+(obj.level.id),function(){obj.txtValue.attr({"text":obj.originalValue});setDy(obj.txtValue,obj.params.valueFontSize,obj.params.valueY);});} +var rvl=obj.config.value;if(obj.config.reverse){rvl=(obj.config.max*1)+(obj.config.min*1)-(obj.config.value*1);} +obj.level.animate({pki:[rvl,obj.config.min,obj.config.max,obj.params.widgetW,obj.params.widgetH,obj.params.dx,obj.params.dy,obj.config.gaugeWidthScale,obj.config.donut,obj.config.reverse]},obj.config.startAnimationTime,obj.config.startAnimationType);if(obj.config.pointer){obj.needle.animate({ndl:[rvl,obj.config.min,obj.config.max,obj.params.widgetW,obj.params.widgetH,obj.params.dx,obj.params.dy,obj.config.gaugeWidthScale,obj.config.donut]},obj.config.startAnimationTime,obj.config.startAnimationType);} +obj.txtValue.animate({"fill-opacity":(obj.config.hideValue)?"0":"1"},obj.config.startAnimationTime,obj.config.startAnimationType);obj.txtLabel.animate({"fill-opacity":"1"},obj.config.startAnimationTime,obj.config.startAnimationType);};JustGage.prototype.refresh=function(val,max){var obj=this;var displayVal,color,max=max||null;if(max!==null){obj.config.max=max;obj.txtMaximum=obj.config.max;if(obj.config.humanFriendly){obj.txtMaximum=humanFriendlyNumber(obj.config.max,obj.config.humanFriendlyDecimal);}else if(obj.config.formatNumber){obj.txtMaximum=formatNumber(obj.config.max);} +if(!obj.config.reverse){obj.txtMax.attr({"text":obj.txtMaximum});setDy(obj.txtMax,obj.params.maxFontSize,obj.params.maxY);}else{obj.txtMin.attr({"text":obj.txtMaximum});setDy(obj.txtMin,obj.params.minFontSize,obj.params.minY);}} +displayVal=val;if((val*1)>(obj.config.max*1)){val=(obj.config.max*1);} +if((val*1)<(obj.config.min*1)){val=(obj.config.min*1);} +color=getColor(val,(val-obj.config.min)/(obj.config.max-obj.config.min),obj.config.levelColors,obj.config.noGradient,obj.config.customSectors);if(obj.config.textRenderer){displayVal=obj.config.textRenderer(displayVal);}else if(obj.config.humanFriendly){displayVal=humanFriendlyNumber(displayVal,obj.config.humanFriendlyDecimal)+obj.config.symbol;}else if(obj.config.formatNumber){displayVal=formatNumber((displayVal*1).toFixed(obj.config.decimals))+obj.config.symbol;}else{displayVal=(displayVal*1).toFixed(obj.config.decimals)+obj.config.symbol;} +obj.originalValue=displayVal;obj.config.value=val*1;if(!obj.config.counter){obj.txtValue.attr({"text":displayVal});setDy(obj.txtValue,obj.params.valueFontSize,obj.params.valueY);} +var rvl=obj.config.value;if(obj.config.reverse){rvl=(obj.config.max*1)+(obj.config.min*1)-(obj.config.value*1);} +obj.level.animate({pki:[rvl,obj.config.min,obj.config.max,obj.params.widgetW,obj.params.widgetH,obj.params.dx,obj.params.dy,obj.config.gaugeWidthScale,obj.config.donut,obj.config.reverse],"fill":color},obj.config.refreshAnimationTime,obj.config.refreshAnimationType);if(obj.config.pointer){obj.needle.animate({ndl:[rvl,obj.config.min,obj.config.max,obj.params.widgetW,obj.params.widgetH,obj.params.dx,obj.params.dy,obj.config.gaugeWidthScale,obj.config.donut]},obj.config.refreshAnimationTime,obj.config.refreshAnimationType);} +obj,displayVal,color,max=null;};JustGage.prototype.generateShadow=function(svg,defs){var obj=this;var sid="inner-shadow-"+obj.config.id;var gaussFilter,feOffset,feGaussianBlur,feComposite1,feFlood,feComposite2,feComposite3;gaussFilter=document.createElementNS(svg,"filter");gaussFilter.setAttribute("id",sid);defs.appendChild(gaussFilter);feOffset=document.createElementNS(svg,"feOffset");feOffset.setAttribute("dx",0);feOffset.setAttribute("dy",obj.config.shadowVerticalOffset);gaussFilter.appendChild(feOffset);feGaussianBlur=document.createElementNS(svg,"feGaussianBlur");feGaussianBlur.setAttribute("result","offset-blur");feGaussianBlur.setAttribute("stdDeviation",obj.config.shadowSize);gaussFilter.appendChild(feGaussianBlur);feComposite1=document.createElementNS(svg,"feComposite");feComposite1.setAttribute("operator","out");feComposite1.setAttribute("in","SourceGraphic");feComposite1.setAttribute("in2","offset-blur");feComposite1.setAttribute("result","inverse");gaussFilter.appendChild(feComposite1);feFlood=document.createElementNS(svg,"feFlood");feFlood.setAttribute("flood-color","black");feFlood.setAttribute("flood-opacity",obj.config.shadowOpacity);feFlood.setAttribute("result","color");gaussFilter.appendChild(feFlood);feComposite2=document.createElementNS(svg,"feComposite");feComposite2.setAttribute("operator","in");feComposite2.setAttribute("in","color");feComposite2.setAttribute("in2","inverse");feComposite2.setAttribute("result","shadow");gaussFilter.appendChild(feComposite2);feComposite3=document.createElementNS(svg,"feComposite");feComposite3.setAttribute("operator","over");feComposite3.setAttribute("in","shadow");feComposite3.setAttribute("in2","SourceGraphic");gaussFilter.appendChild(feComposite3);if(!obj.config.hideInnerShadow){obj.canvas.canvas.childNodes[2].setAttribute("filter","url(#"+sid+")");obj.canvas.canvas.childNodes[3].setAttribute("filter","url(#"+sid+")");} +gaussFilter,feOffset,feGaussianBlur,feComposite1,feFlood,feComposite2,feComposite3=null;};function kvLookup(key,tablea,tableb,defval,datatype,delimiter){var val=defval;var canConvert=false;if(!(key===null||key===undefined)){if(tableb!==null&&tableb!==undefined&&typeof tableb==="object"&&key in tableb){val=tableb[key];canConvert=true;}else if(tablea!==null&&tablea!==undefined&&typeof tablea==="object"&&key in tablea){val=tablea[key];canConvert=true;}else{val=defval;} +if(canConvert===true){if(datatype!==null&&datatype!==undefined){switch(datatype){case'int':val=parseInt(val,10);break;case'float':val=parseFloat(val);break;default:break;}}}} +return val;};function getColor(val,pct,col,noGradient,custSec){var no,inc,colors,percentage,rval,gval,bval,lower,upper,range,rangePct,pctLower,pctUpper,color;var noGradient=noGradient||custSec.length>0;if(custSec.length>0){for(var i=0;icustSec[i].lo&&val<=custSec[i].hi){return custSec[i].color;}}} +no=col.length;if(no===1) +return col[0];inc=(noGradient)?(1/no):(1/(no-1));colors=[];for(i=0;i9)&&elem.node.firstChild.attributes.dy){elem.node.firstChild.attributes.dy.value=0;}} +function getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min;} +function cutHex(str){return(str.charAt(0)=="#")?str.substring(1,7):str;} +function humanFriendlyNumber(n,d){var p,d2,i,s;p=Math.pow;d2=p(10,d);i=7;while(i){s=p(10,i-- *3);if(s<=n){n=Math.round(n*d2/s)/d2+"KMGTPE"[i];}} +return n;} +function formatNumber(x){var parts=x.toString().split(".");parts[0]=parts[0].replace(/\B(?=(\d{3})+(?!\d))/g,",");return parts.join(".");} +function getStyle(oElm,strCssRule){var strValue="";if(document.defaultView&&document.defaultView.getComputedStyle){strValue=document.defaultView.getComputedStyle(oElm,"").getPropertyValue(strCssRule);}else if(oElm.currentStyle){strCssRule=strCssRule.replace(/\-(\w)/g,function(strMatch,p1){return p1.toUpperCase();});strValue=oElm.currentStyle[strCssRule];} +return strValue;} +function onCreateElementNsReady(func){if(document.createElementNS!==undefined){func();}else{setTimeout(function(){onCreateElementNsReady(func);},100);}} +var ie=(function(){var undef,v=3,div=document.createElement('div'),all=div.getElementsByTagName('i');while(div.innerHTML='',all[0]);return v>4?v:undef;} +());function extend(out){out=out||{};for(var i=1;il#$}4M(9jq&>BeA4QV~fmX|+Udl~OUG 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 literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data_src/index.htm b/examples/SmartSwitch/data_src/index.htm new file mode 100644 index 0000000..6f2c731 --- /dev/null +++ b/examples/SmartSwitch/data_src/index.htm @@ -0,0 +1,599 @@ + + + + + + Smart Switch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + +
+ + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+ +

+
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/.exclude.files b/examples/SmartSwitch/data_src/js_css_src/.exclude.files new file mode 100644 index 0000000..955397f --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/.exclude.files @@ -0,0 +1,2 @@ +/*.js.gz +/.exclude.files diff --git a/examples/SmartSwitch/data_src/js_css_src/ace-drafts/ace.js b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/ace.js new file mode 100644 index 0000000..f54ebb2 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/ace.js @@ -0,0 +1,14 @@ +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE="",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0}),define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n=53&&O()},I=o.delayedCall(j,50);r.addListener(n,"compositionstart",B),i.isGecko?r.addListener(n,"text",function(){I.schedule()}):(r.addListener(n,"keyup",function(){I.schedule()}),r.addListener(n,"keydown",function(){I.schedule()})),r.addListener(n,"compositionend",F),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){L=!0,b(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){if(!o&&i.isOldIE)return;p||(p=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+"height:"+n.style.height+";"+(i.isIE?"opacity:0.1;":"");var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){n.style.left=e.clientX-l-2+"px",n.style.top=Math.min(e.clientY-f-2,c)+"px"};h(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(q),i.isWin&&!i.isOldIE&&r.capture(t.container,h,R)},this.onContextMenuClose=R;var q,U=function(e){t.textInput.onContextMenu(e),R()};r.addListener(n,"mouseup",U),r.addListener(n,"mousedown",function(e){e.preventDefault(),R()}),r.addListener(t.renderer.scroller,"contextmenu",U),r.addListener(n,"contextmenu",U)};t.TextInput=f}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function u(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function a(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function f(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=0;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,i=e.getButton();if(i!==0){var s=r.getSelectionRange(),o=s.isEmpty();r.$blockScrolling++,(o||i==1)&&r.selection.moveToPosition(n),r.$blockScrolling--,i==2&&r.textInput.onContextMenu(e.domEvent);return}this.mousedownEvent.time=Date.now();if(t&&!r.isFocused()){r.focus();if(this.$focusTimout&&!this.$clickSelection&&!r.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g,y&&/string\.end/.test(v.type)&&(y=!1);else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";function r(e){var n=/\w{4}/g;for(var r in e)t.packages[r]=e[r].replace(n,"\\u$&")}t.packages={},r({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour/cstyle").CstyleBehaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i};(function(){this.$defaultBehaviour=new s,this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules(this.$highlightRuleConfig),this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push("
"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("
"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("
")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("
")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("
")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("
")}}).call(s.prototype),t.Marker=s}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push("
"),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push("
"),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("","
"),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:w?Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r||!r.cssClass)throw new Error("couldn't load module "+e+" or it didn't call define");i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var s=this.$normalizePath;i=i||s(e.toUrl("ace/worker/worker.js",null,"_"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})},this.$workerBlob=function(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.6"}); + (function() { + window.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = window.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + }); + })(); + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/ace-drafts/ext-searchbox.js b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/ext-searchbox.js new file mode 100644 index 0000000..b38b622 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/ext-searchbox.js @@ -0,0 +1,5 @@ +define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/lang"),s=e("../lib/event"),o=".ace_search {background-color: #ddd;border: 1px solid #cbcbcb;border-top: 0 none;max-width: 325px;overflow: hidden;margin: 0;padding: 4px;padding-right: 6px;padding-bottom: 0;position: absolute;top: 0px;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {border-radius: 3px;border: 1px solid #cbcbcb;float: left;margin-bottom: 4px;overflow: hidden;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {background-color: white;color: black;border-right: 1px solid #cbcbcb;border: 0 none;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;float: left;height: 22px;outline: 0;padding: 0 7px;width: 214px;margin: 0;}.ace_searchbtn,.ace_replacebtn {background: #fff;border: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;float: left;height: 22px;margin: 0;position: relative;}.ace_searchbtn:last-child,.ace_replacebtn:last-child {border-top-right-radius: 3px;border-bottom-right-radius: 3px;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn {background-position: 50% 50%;background-repeat: no-repeat;width: 27px;}.ace_searchbtn.prev {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); }.ace_searchbtn.next {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); }.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;float: right;font: 16px/16px Arial;height: 14px;margin: 5px 1px 9px 5px;padding: 0;text-align: center;width: 14px;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_replacebtn.prev {width: 54px}.ace_replacebtn.next {width: 27px}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;-moz-box-sizing: border-box;box-sizing: border-box;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;}",u=e("../keyboard/hash_handler").HashHandler,a=e("../lib/keys");r.importCssString(o,"ace_searchbox");var f=''.replace(/>\s+/g,">"),l=function(e,t,n){var i=r.createElement("div");i.innerHTML=f,this.element=i.firstChild,this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.container.appendChild(this.element),this.editor=e},this.$initElements=function(e){this.searchBox=e.querySelector(".ace_search_form"),this.replaceBox=e.querySelector(".ace_replace_form"),this.searchOptions=e.querySelector(".ace_search_options"),this.regExpOption=e.querySelector("[action=toggleRegexpMode]"),this.caseSensitiveOption=e.querySelector("[action=toggleCaseSensitive]"),this.wholeWordOption=e.querySelector("[action=toggleWholeWords]"),this.searchInput=this.searchBox.querySelector(".ace_search_field"),this.replaceInput=this.replaceBox.querySelector(".ace_search_field")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;s.addListener(e,"mousedown",function(e){setTimeout(function(){t.activeInput.focus()},0),s.stopPropagation(e)}),s.addListener(e,"click",function(e){var n=e.target||e.srcElement,r=n.getAttribute("action");r&&t[r]?t[r]():t.$searchBarKb.commands[r]&&t.$searchBarKb.commands[r].exec(t),s.stopPropagation(e)}),s.addCommandKeyListener(e,function(e,n,r){var i=a.keyCodeToString(r),o=t.$searchBarKb.findKeyCommand(n,i);o&&o.exec&&(o.exec(t),s.stopEvent(e))}),this.$onChange=i.delayedCall(function(){t.find(!1,!1)}),s.addListener(this.searchInput,"input",function(){t.$onChange.schedule(20)}),s.addListener(this.searchInput,"focus",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),s.addListener(this.replaceInput,"focus",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new u([{bindKey:"Esc",name:"closeSearchBar",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new u,this.$searchBarKb.bindKeys({"Ctrl-f|Command-f":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?"":"none",e.searchInput.focus()},"Ctrl-H|Command-Option-F":function(e){e.replaceBox.style.display="",e.replaceInput.focus()},"Ctrl-G|Command-G":function(e){e.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},"Shift-Return":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},"Alt-Return":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}}]),this.$syncOptions=function(){r.setCssClass(this.regExpOption,"checked",this.regExpOption.checked),r.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked),r.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked),this.find(!1,!1)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,n){var i=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:n}),s=!i&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",s),this.editor._emit("findSearchBox",{match:!s}),this.highlight()},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",t),this.editor._emit("findSearchBox",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.element.style.display="none",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.element.style.display="",this.replaceBox.style.display=t?"":"none",this.isReplace=t,e&&(this.searchInput.value=e),this.find(!1,!1,!0),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(l.prototype),t.SearchBox=l,t.Search=function(e,t){var n=e.searchBox||new l(e);n.show(e.session.getTextRange(),t)}}); + (function() { + window.require(["ace/ext/searchbox"], function() {}); + })(); + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-css.js b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-css.js new file mode 100644 index 0000000..b41ecdc --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-css.js @@ -0,0 +1 @@ +define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}) \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-html.js b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-html.js new file mode 100644 index 0000000..faee447 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-html.js @@ -0,0 +1 @@ +define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[a-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}) \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-javascript.js b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-javascript.js new file mode 100644 index 0000000..6bad9f6 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/mode-javascript.js @@ -0,0 +1 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/ace-drafts/worker-html.js b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/worker-html.js new file mode 100644 index 0000000..58a39b1 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/ace-drafts/worker-html.js @@ -0,0 +1 @@ +"no use strict";(function(e){function t(e,t){var n=e,r="";while(n){var i=t[n];if(typeof i=="string")return i+r;if(i)return i.location.replace(/\/*$/,"/")+(r||i.main||i.name);if(i===!1)return"";var s=n.lastIndexOf("/");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!="undefined"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:"error",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf("!")!==-1){var r=n.split("!");return e.normalizeModule(t,r[0])+"!"+e.normalizeModule(t,r[1])}if(n.charAt(0)=="."){var i=t.split("/").slice(0,-1).join("/");n=(i?i+"/":"")+n;while(n.indexOf(".")!==-1&&s!=n){var s=n;n=n.replace(/^\.\//,"").replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error("worker.js require() accepts only (parentId, id) as arguments");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log("unable to load "+i);var o=t(i,e.require.tlns);return o.slice(-3)!=".js"&&(o+=".js"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!="string"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!="function"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=["require","exports","module"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case"require":return i;case"exports":return e.exports;case"module":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require("ace/lib/event_emitter").EventEmitter,r=e.require("ace/lib/oop"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:"call",id:t,data:e})},this.emit=function(e,t){postMessage({type:"event",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error("Unknown command:"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require("ace/lib/es5-shim"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;othis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i=0;n--){var r=this.elements[n];if(r.localName===e)return!0;if(t(r))return!1}},l.prototype.push=function(e){this.elements.push(e)},l.prototype.pushHtmlElement=function(e){this.rootNode=e.node,this.push(e)},l.prototype.pushHeadElement=function(e){this.headElement=e.node,this.push(e)},l.prototype.pushBodyElement=function(e){this.bodyElement=e.node,this.push(e)},l.prototype.pop=function(){return this.elements.pop()},l.prototype.remove=function(e){this.elements.splice(this.elements.indexOf(e),1)},l.prototype.popUntilPopped=function(e){var t;do t=this.pop();while(t.localName!=e)},l.prototype.popUntilTableScopeMarker=function(){while(!s(this.top))this.pop()},l.prototype.popUntilTableBodyScopeMarker=function(){while(!o(this.top))this.pop()},l.prototype.popUntilTableRowScopeMarker=function(){while(!u(this.top))this.pop()},l.prototype.item=function(e){return this.elements[e]},l.prototype.contains=function(e){return this.elements.indexOf(e)!==-1},l.prototype.inScope=function(e){return this._inScope(e,r)},l.prototype.inListItemScope=function(e){return this._inScope(e,i)},l.prototype.inTableScope=function(e){return this._inScope(e,s)},l.prototype.inButtonScope=function(e){return this._inScope(e,a)},l.prototype.inSelectScope=function(e){return this._inScope(e,f)},l.prototype.hasNumberedHeaderElementInScope=function(){for(var e=this.elements.length-1;e>=0;e--){var t=this.elements[e];if(t.isNumberedHeader())return!0;if(r(t))return!1}},l.prototype.furthestBlockForFormattingElement=function(e){var t=null;for(var n=this.elements.length-1;n>=0;n--){var r=this.elements[n];if(r.node===e)break;r.isSpecial()&&(t=r)}return t},l.prototype.findIndex=function(e){for(var t=this.elements.length-1;t>=0;t--)if(this.elements[t].localName==e)return t;return-1},l.prototype.remove_openElements_until=function(e){var t=!1,n;while(!t)n=this.elements.pop(),t=e(n);return n},Object.defineProperty(l.prototype,"top",{get:function(){return this.elements[this.elements.length-1]}}),Object.defineProperty(l.prototype,"length",{get:function(){return this.elements.length}}),n.ElementStack=l},{}],2:[function(e,t,n){function o(e){return e>="0"&&e<="9"||e>="a"&&e<="z"||e>="A"&&e<="Z"}function u(e){return e>="0"&&e<="9"||e>="a"&&e<="f"||e>="A"&&e<="F"}function a(e){return e>="0"&&e<="9"}var r=e("html5-entities"),i=e("./InputStream").InputStream,s={};Object.keys(r).forEach(function(e){for(var t=0;t65535&&d<=1114111){d-=65536;var m=((1047552&d)>>10)+55296,g=(1023&d)+56320;f=String.fromCharCode(m,g)}else f=String.fromCharCode(d);return c!==";"&&(t._parseError("numeric-entity-without-semicolon"),e.unget(c)),f}return e.unget(l),t._parseError("expected-numeric-entity"),!1}if(c>="a"&&c<="z"||c>="A"&&c<="Z"){var y="";while(s[l]){r[l]&&(y=l);if(c==";")break;c=e.char();if(c===i.EOF)break;l+=c}return y?(f=r[y],c===";"||!n||!o(c)&&c!=="="?(l.length>y.length&&e.unget(l.substring(y.length)),c!==";"&&t._parseError("named-entity-without-semicolon"),f):(e.unget(l),!1)):(t._parseError("expected-named-entity"),e.unget(l),!1)}},f.replaceEntityNumbers=function(e){switch(e){case 0:return 65533;case 19:return 16;case 128:return 8364;case 129:return 129;case 130:return 8218;case 131:return 402;case 132:return 8222;case 133:return 8230;case 134:return 8224;case 135:return 8225;case 136:return 710;case 137:return 8240;case 138:return 352;case 139:return 8249;case 140:return 338;case 141:return 141;case 142:return 381;case 143:return 143;case 144:return 144;case 145:return 8216;case 146:return 8217;case 147:return 8220;case 148:return 8221;case 149:return 8226;case 150:return 8211;case 151:return 8212;case 152:return 732;case 153:return 8482;case 154:return 353;case 155:return 8250;case 156:return 339;case 157:return 157;case 158:return 382;case 159:return 376;default:if(e>=55296&&e<=57343||e>1114111)return 65533;if(e>=1&&e<=8||e>=14&&e<=31||e>=127&&e<=159||e>=64976&&e<=65007||e==11||e==65534||e==131070||e==3145726||e==196607||e==262142||e==262143||e==327678||e==327679||e==393214||e==393215||e==458750||e==458751||e==524286||e==524287||e==589822||e==589823||e==655358||e==655359||e==720894||e==720895||e==786430||e==786431||e==851966||e==851967||e==917502||e==917503||e==983038||e==983039||e==1048574||e==1048575||e==1114110||e==1114111)return e}},n.EntityParser=f},{"./InputStream":3,"html5-entities":12}],3:[function(e,t,n){function r(){this.data="",this.start=0,this.committed=0,this.eof=!1,this.lastLocation={line:0,column:0}}r.EOF=-1,r.DRAIN=-2,r.prototype={slice:function(){if(this.start>=this.data.length){if(!this.eof)throw r.DRAIN;return r.EOF}return this.data.slice(this.start,this.data.length)},"char":function(){if(!this.eof&&this.start>=this.data.length-1)throw r.DRAIN;if(this.start>=this.data.length)return r.EOF;var e=this.data[this.start++];return e==="\r"&&(e="\n"),e},advance:function(e){this.start+=e;if(this.start>=this.data.length){if(!this.eof)throw r.DRAIN;return r.EOF}this.committed>this.data.length/2&&(this.lastLocation=this.location(),this.data=this.data.slice(this.committed),this.start=this.start-this.committed,this.committed=0)},matchWhile:function(e){if(this.eof&&this.start>=this.data.length)return"";var t=new RegExp("^"+e+"+"),n=t.exec(this.slice());if(n){if(!this.eof&&n[0].length==this.data.length-this.start)throw r.DRAIN;return this.advance(n[0].length),n[0]}return""},matchUntil:function(e){var t,n;n=this.slice();if(n===r.EOF)return"";if(t=(new RegExp(e+(this.eof?"|$":""))).exec(n)){var i=this.data.slice(this.start,this.start+t.index);return this.advance(t.index),i.replace(/\r/g,"\n").replace(/\n{2,}/g,"\n")}throw r.DRAIN},append:function(e){this.data+=e},shift:function(e){if(!this.eof&&this.start+e>=this.data.length)throw r.DRAIN;if(this.eof&&this.start>=this.data.length)return r.EOF;var t=this.data.slice(this.start,this.start+e).toString();return this.advance(Math.min(e,this.data.length-this.start)),t},peek:function(e){if(!this.eof&&this.start+e>=this.data.length)throw r.DRAIN;return this.eof&&this.start>=this.data.length?r.EOF:this.data.slice(this.start,Math.min(this.start+e,this.data.length)).toString()},length:function(){return this.data.length-this.start-1},unget:function(e){if(e===r.EOF)return;this.start-=e.length},undo:function(){this.start=this.committed},commit:function(){this.committed=this.start},location:function(){var e=this.lastLocation.line,t=this.lastLocation.column,n=this.data.slice(0,this.committed),r=n.match(/\n/g),i=r?e+r.length:e,s=r?n.length-n.lastIndexOf("\n")-1:t+n.length;return{line:i,column:s}}},n.InputStream=r},{}],4:[function(e,t,n){function i(e,t,n,r){this.localName=t,this.namespaceURI=e,this.attributes=n,this.node=r}function s(e,t){for(var n=0;n-1},i.prototype.isFosterParenting=function(){return this.namespaceURI==="http://www.w3.org/1999/xhtml"?this.localName==="table"||this.localName==="tbody"||this.localName==="tfoot"||this.localName==="thead"||this.localName==="tr":!1},i.prototype.isNumberedHeader=function(){return this.namespaceURI==="http://www.w3.org/1999/xhtml"?this.localName==="h1"||this.localName==="h2"||this.localName==="h3"||this.localName==="h4"||this.localName==="h5"||this.localName==="h6":!1},i.prototype.isForeign=function(){return this.namespaceURI!="http://www.w3.org/1999/xhtml"},i.prototype.isHtmlIntegrationPoint=function(){if(this.namespaceURI==="http://www.w3.org/1998/Math/MathML"){if(this.localName!=="annotation-xml")return!1;var e=s(this,"encoding");return e?(e=e.toLowerCase(),e==="text/html"||e==="application/xhtml+xml"):!1}return this.namespaceURI==="http://www.w3.org/2000/svg"?this.localName==="foreignObject"||this.localName==="desc"||this.localName==="title":!1},i.prototype.isMathMLTextIntegrationPoint=function(){return this.namespaceURI==="http://www.w3.org/1998/Math/MathML"?this.localName==="mi"||this.localName==="mo"||this.localName==="mn"||this.localName==="ms"||this.localName==="mtext":!1},n.StackItem=i},{}],5:[function(e,t,n){function s(e){return e===" "||e==="\n"||e===" "||e==="\r"||e==="\f"}function o(e){return e>="A"&&e<="Z"||e>="a"&&e<="z"}function u(e){this._tokenHandler=e,this._state=u.DATA,this._inputStream=new r,this._currentToken=null,this._temporaryBuffer="",this._additionalAllowedCharacter=""}var r=e("./InputStream").InputStream,i=e("./EntityParser").EntityParser;u.prototype._parseError=function(e,t){this._tokenHandler.parseError(e,t)},u.prototype._emitToken=function(e){if(e.type==="StartTag")for(var t=1;t"&&r?(t._currentToken={type:"EndTag",name:this._temporaryBuffer,data:[],selfClosing:!1},t._emitCurrentToken(),t.setState(n)):o(i)?(this._temporaryBuffer+=i,e.commit()):(t._emitToken({type:"Characters",data:""&&r?(t._currentToken={type:"EndTag",name:this._temporaryBuffer,data:[],selfClosing:!1},t._emitCurrentToken(),t.setState(n)):o(i)?(this._temporaryBuffer+=i,e.commit()):(t._emitToken({type:"Characters",data:""&&n?(t._currentToken={type:"EndTag",name:"script",data:[],selfClosing:!1},t._emitCurrentToken()):o(r)?(this._temporaryBuffer+=r,e.commit()):(t._emitToken({type:"Characters",data:""?(t._emitToken({type:"Characters",data:">"}),t.setState(p)):i==="\0"?(t._parseError("invalid-codepoint"),t._emitToken({type:"Characters",data:"\ufffd"}),t.setState(N)):(t._emitToken({type:"Characters",data:i}),t.setState(N)),!0}function L(e){var n=e.char();return n==="/"?(this._temporaryBuffer="",t.setState(A)):o(n)?(t._emitToken({type:"Characters",data:"<"+n}),this._temporaryBuffer=n,t.setState(M)):(t._emitToken({type:"Characters",data:"<"}),e.unget(n),t.setState(N)),!0}function A(e){var n=e.char();return o(n)?(this._temporaryBuffer=n,t.setState(O)):(t._emitToken({type:"Characters",data:""&&r?(t._currentToken={type:"EndTag",name:"script",data:[],selfClosing:!1},t.setState(n),t._emitCurrentToken()):o(i)?(this._temporaryBuffer+=i,e.commit()):(t._emitToken({type:"Characters",data:""?(t._emitToken({type:"Characters",data:n}),this._temporaryBuffer.toLowerCase()==="script"?t.setState(_):t.setState(N)):o(n)?(t._emitToken({type:"Characters",data:n}),this._temporaryBuffer+=n,e.commit()):(e.unget(n),t.setState(N)),!0}function _(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-script"),e.unget(i),t.setState(n)):i==="-"?(t._emitToken({type:"Characters",data:"-"}),t.setState(D)):i==="<"?(t._emitToken({type:"Characters",data:"<"}),t.setState(H)):i==="\0"?(t._parseError("invalid-codepoint"),t._emitToken({type:"Characters",data:"\ufffd"}),e.commit()):(t._emitToken({type:"Characters",data:i}),e.commit()),!0}function D(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-script"),e.unget(i),t.setState(n)):i==="-"?(t._emitToken({type:"Characters",data:"-"}),t.setState(P)):i==="<"?(t._emitToken({type:"Characters",data:"<"}),t.setState(H)):i==="\0"?(t._parseError("invalid-codepoint"),t._emitToken({type:"Characters",data:"\ufffd"}),t.setState(_)):(t._emitToken({type:"Characters",data:i}),t.setState(_)),!0}function P(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-script"),e.unget(i),t.setState(n)):i==="-"?(t._emitToken({type:"Characters",data:"-"}),e.commit()):i==="<"?(t._emitToken({type:"Characters",data:"<"}),t.setState(H)):i===">"?(t._emitToken({type:"Characters",data:">"}),t.setState(p)):i==="\0"?(t._parseError("invalid-codepoint"),t._emitToken({type:"Characters",data:"\ufffd"}),t.setState(_)):(t._emitToken({type:"Characters",data:i}),t.setState(_)),!0}function H(e){var n=e.char();return n==="/"?(t._emitToken({type:"Characters",data:"/"}),this._temporaryBuffer="",t.setState(B)):(e.unget(n),t.setState(_)),!0}function B(e){var n=e.char();return s(n)||n==="/"||n===">"?(t._emitToken({type:"Characters",data:n}),this._temporaryBuffer.toLowerCase()==="script"?t.setState(N):t.setState(_)):o(n)?(t._emitToken({type:"Characters",data:n}),this._temporaryBuffer+=n,e.commit()):(e.unget(n),t.setState(_)),!0}function j(e){var i=e.char();return i===r.EOF?(t._parseError("bare-less-than-sign-at-eof"),t._emitToken({type:"Characters",data:"<"}),e.unget(i),t.setState(n)):o(i)?(t._currentToken={type:"StartTag",name:i.toLowerCase(),data:[]},t.setState(I)):i==="!"?t.setState(G):i==="/"?t.setState(F):i===">"?(t._parseError("expected-tag-name-but-got-right-bracket"),t._emitToken({type:"Characters",data:"<>"}),t.setState(n)):i==="?"?(t._parseError("expected-tag-name-but-got-question-mark"),e.unget(i),t.setState(Q)):(t._parseError("expected-tag-name"),t._emitToken({type:"Characters",data:"<"}),e.unget(i),t.setState(n)),!0}function F(e){var i=e.char();return i===r.EOF?(t._parseError("expected-closing-tag-but-got-eof"),t._emitToken({type:"Characters",data:""?(t._parseError("expected-closing-tag-but-got-right-bracket"),t.setState(n)):(t._parseError("expected-closing-tag-but-got-char",{data:i}),e.unget(i),t.setState(Q)),!0}function I(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-tag-name"),e.unget(i),t.setState(n)):s(i)?t.setState(q):o(i)?t._currentToken.name+=i.toLowerCase():i===">"?t._emitCurrentToken():i==="/"?t.setState(K):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.name+="\ufffd"):t._currentToken.name+=i,e.commit(),!0}function q(e){var i=e.char();if(i===r.EOF)t._parseError("expected-attribute-name-but-got-eof"),e.unget(i),t.setState(n);else{if(s(i))return!0;o(i)?(t._currentToken.data.push({nodeName:i.toLowerCase(),nodeValue:""}),t.setState(R)):i===">"?t._emitCurrentToken():i==="/"?t.setState(K):i==="'"||i==='"'||i==="="||i==="<"?(t._parseError("invalid-character-in-attribute-name"),t._currentToken.data.push({nodeName:i,nodeValue:""}),t.setState(R)):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.data.push({nodeName:"\ufffd",nodeValue:""})):(t._currentToken.data.push({nodeName:i,nodeValue:""}),t.setState(R))}return!0}function R(e){var i=e.char(),u=!0,a=!1;i===r.EOF?(t._parseError("eof-in-attribute-name"),e.unget(i),t.setState(n),a=!0):i==="="?t.setState(z):o(i)?(t._currentAttribute().nodeName+=i.toLowerCase(),u=!1):i===">"?a=!0:s(i)?t.setState(U):i==="/"?t.setState(K):i==="'"||i==='"'?(t._parseError("invalid-character-in-attribute-name"),t._currentAttribute().nodeName+=i,u=!1):i==="\0"?(t._parseError("invalid-codepoint"),t._currentAttribute().nodeName+="\ufffd"):(t._currentAttribute().nodeName+=i,u=!1);if(u){var f=t._currentToken.data,l=f[f.length-1];for(var c=f.length-2;c>=0;c--)if(l.nodeName===f[c].nodeName){t._parseError("duplicate-attribute",{name:l.nodeName}),l.nodeName=null;break}a&&t._emitCurrentToken()}else e.commit();return!0}function U(e){var i=e.char();if(i===r.EOF)t._parseError("expected-end-of-tag-but-got-eof"),e.unget(i),t.setState(n);else{if(s(i))return!0;i==="="?t.setState(z):i===">"?t._emitCurrentToken():o(i)?(t._currentToken.data.push({nodeName:i,nodeValue:""}),t.setState(R)):i==="/"?t.setState(K):i==="'"||i==='"'||i==="<"?(t._parseError("invalid-character-after-attribute-name"),t._currentToken.data.push({nodeName:i,nodeValue:""}),t.setState(R)):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.data.push({nodeName:"\ufffd",nodeValue:""})):(t._currentToken.data.push({nodeName:i,nodeValue:""}),t.setState(R))}return!0}function z(e){var i=e.char();if(i===r.EOF)t._parseError("expected-attribute-value-but-got-eof"),e.unget(i),t.setState(n);else{if(s(i))return!0;i==='"'?t.setState(W):i==="&"?(t.setState(V),e.unget(i)):i==="'"?t.setState(X):i===">"?(t._parseError("expected-attribute-value-but-got-right-bracket"),t._emitCurrentToken()):i==="="||i==="<"||i==="`"?(t._parseError("unexpected-character-in-unquoted-attribute-value"),t._currentAttribute().nodeValue+=i,t.setState(V)):i==="\0"?(t._parseError("invalid-codepoint"),t._currentAttribute().nodeValue+="\ufffd"):(t._currentAttribute().nodeValue+=i,t.setState(V))}return!0}function W(e){var i=e.char();if(i===r.EOF)t._parseError("eof-in-attribute-value-double-quote"),e.unget(i),t.setState(n);else if(i==='"')t.setState(J);else if(i==="&")this._additionalAllowedCharacter='"',t.setState($);else if(i==="\0")t._parseError("invalid-codepoint"),t._currentAttribute().nodeValue+="\ufffd";else{var s=e.matchUntil('[\0"&]');i+=s,t._currentAttribute().nodeValue+=i}return!0}function X(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-attribute-value-single-quote"),e.unget(i),t.setState(n)):i==="'"?t.setState(J):i==="&"?(this._additionalAllowedCharacter="'",t.setState($)):i==="\0"?(t._parseError("invalid-codepoint"),t._currentAttribute().nodeValue+="\ufffd"):t._currentAttribute().nodeValue+=i+e.matchUntil("\0|['&]"),!0}function V(e){var i=e.char();if(i===r.EOF)t._parseError("eof-after-attribute-value"),e.unget(i),t.setState(n);else if(s(i))t.setState(q);else if(i==="&")this._additionalAllowedCharacter=">",t.setState($);else if(i===">")t._emitCurrentToken();else if(i==='"'||i==="'"||i==="="||i==="`"||i==="<")t._parseError("unexpected-character-in-unquoted-attribute-value"),t._currentAttribute().nodeValue+=i,e.commit();else if(i==="\0")t._parseError("invalid-codepoint"),t._currentAttribute().nodeValue+="\ufffd";else{var o=e.matchUntil("\0|[ \n \f \r&<>\"'=`]");o===r.EOF&&(t._parseError("eof-in-attribute-value-no-quotes"),t._emitCurrentToken()),e.commit(),t._currentAttribute().nodeValue+=i+o}return!0}function $(e){var n=i.consumeEntity(e,t,this._additionalAllowedCharacter);return this._currentAttribute().nodeValue+=n||"&",this._additionalAllowedCharacter==='"'?t.setState(W):this._additionalAllowedCharacter==="'"?t.setState(X):this._additionalAllowedCharacter===">"&&t.setState(V),!0}function J(e){var i=e.char();return i===r.EOF?(t._parseError("eof-after-attribute-value"),e.unget(i),t.setState(n)):s(i)?t.setState(q):i===">"?(t.setState(n),t._emitCurrentToken()):i==="/"?t.setState(K):(t._parseError("unexpected-character-after-attribute-value"),e.unget(i),t.setState(q)),!0}function K(e){var i=e.char();return i===r.EOF?(t._parseError("unexpected-eof-after-solidus-in-tag"),e.unget(i),t.setState(n)):i===">"?(t._currentToken.selfClosing=!0,t.setState(n),t._emitCurrentToken()):(t._parseError("unexpected-character-after-solidus-in-tag"),e.unget(i),t.setState(q)),!0}function Q(e){var r=e.matchUntil(">");return r=r.replace(/\u0000/g,"\ufffd"),e.char(),t._emitToken({type:"Comment",data:r}),t.setState(n),!0}function G(e){var n=e.shift(2);if(n==="--")t._currentToken={type:"Comment",data:""},t.setState(Z);else{var i=e.shift(5);if(i===r.EOF||n===r.EOF)return t._parseError("expected-dashes-or-doctype"),t.setState(Q),e.unget(n),!0;n+=i,n.toUpperCase()==="DOCTYPE"?(t._currentToken={type:"Doctype",name:"",publicId:null,systemId:null,forceQuirks:!1},t.setState(st)):t._tokenHandler.isCdataSectionAllowed()&&n==="[CDATA["?t.setState(Y):(t._parseError("expected-dashes-or-doctype"),e.unget(n),t.setState(Q))}return!0}function Y(e){var r=e.matchUntil("]]>");return e.shift(3),r&&t._emitToken({type:"Characters",data:r}),t.setState(n),!0}function Z(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-comment"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i==="-"?t.setState(et):i===">"?(t._parseError("incorrect-comment"),t._emitToken(t._currentToken),t.setState(n)):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.data+="\ufffd"):(t._currentToken.data+=i,t.setState(tt)),!0}function et(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-comment"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i==="-"?t.setState(rt):i===">"?(t._parseError("incorrect-comment"),t._emitToken(t._currentToken),t.setState(n)):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.data+="\ufffd"):(t._currentToken.data+="-"+i,t.setState(tt)),!0}function tt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-comment"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i==="-"?t.setState(nt):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.data+="\ufffd"):(t._currentToken.data+=i,e.commit()),!0}function nt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-comment-end-dash"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i==="-"?t.setState(rt):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.data+="-\ufffd",t.setState(tt)):(t._currentToken.data+="-"+i+e.matchUntil("\0|-"),e.char()),!0}function rt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-comment-double-dash"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===">"?(t._emitToken(t._currentToken),t.setState(n)):i==="!"?(t._parseError("unexpected-bang-after-double-dash-in-comment"),t.setState(it)):i==="-"?(t._parseError("unexpected-dash-after-double-dash-in-comment"),t._currentToken.data+=i):i==="\0"?(t._parseError("invalid-codepoint"),t._currentToken.data+="--\ufffd",t.setState(tt)):(t._parseError("unexpected-char-in-comment"),t._currentToken.data+="--"+i,t.setState(tt)),!0}function it(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-comment-end-bang-state"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===">"?(t._emitToken(t._currentToken),t.setState(n)):i==="-"?(t._currentToken.data+="--!",t.setState(nt)):(t._currentToken.data+="--!"+i,t.setState(tt)),!0}function st(e){var i=e.char();return i===r.EOF?(t._parseError("expected-doctype-name-but-got-eof"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)?t.setState(ot):(t._parseError("need-space-after-doctype"),e.unget(i),t.setState(ot)),!0}function ot(e){var i=e.char();return i===r.EOF?(t._parseError("expected-doctype-name-but-got-eof"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)||(i===">"?(t._parseError("expected-doctype-name-but-got-right-bracket"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):(o(i)&&(i=i.toLowerCase()),t._currentToken.name=i,t.setState(ut))),!0}function ut(e){var i=e.char();return i===r.EOF?(t._currentToken.forceQuirks=!0,e.unget(i),t._parseError("eof-in-doctype-name"),t.setState(n),t._emitCurrentToken()):s(i)?t.setState(at):i===">"?(t.setState(n),t._emitCurrentToken()):(o(i)&&(i=i.toLowerCase()),t._currentToken.name+=i,e.commit()),!0}function at(e){var i=e.char();if(i===r.EOF)t._currentToken.forceQuirks=!0,e.unget(i),t._parseError("eof-in-doctype"),t.setState(n),t._emitCurrentToken();else if(!s(i))if(i===">")t.setState(n),t._emitCurrentToken();else{if(["p","P"].indexOf(i)>-1){var o=[["u","U"],["b","B"],["l","L"],["i","I"],["c","C"]],u=o.every(function(t){return i=e.char(),t.indexOf(i)>-1});if(u)return t.setState(ft),!0}else if(["s","S"].indexOf(i)>-1){var o=[["y","Y"],["s","S"],["t","T"],["e","E"],["m","M"]],u=o.every(function(t){return i=e.char(),t.indexOf(i)>-1});if(u)return t.setState(vt),!0}e.unget(i),t._currentToken.forceQuirks=!0,i===r.EOF?(t._parseError("eof-in-doctype"),e.unget(i),t.setState(n),t._emitCurrentToken()):(t._parseError("expected-space-or-right-bracket-in-doctype",{data:i}),t.setState(wt))}return!0}function ft(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)?t.setState(lt):i==="'"||i==='"'?(t._parseError("unexpected-char-in-doctype"),e.unget(i),t.setState(lt)):(e.unget(i),t.setState(lt)),!0}function lt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)||(i==='"'?(t._currentToken.publicId="",t.setState(ct)):i==="'"?(t._currentToken.publicId="",t.setState(ht)):i===">"?(t._parseError("unexpected-end-of-doctype"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):(t._parseError("unexpected-char-in-doctype"),t._currentToken.forceQuirks=!0,t.setState(wt))),!0}function ct(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):i==='"'?t.setState(pt):i===">"?(t._parseError("unexpected-end-of-doctype"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):t._currentToken.publicId+=i,!0}function ht(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):i==="'"?t.setState(pt):i===">"?(t._parseError("unexpected-end-of-doctype"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):t._currentToken.publicId+=i,!0}function pt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)?t.setState(dt):i===">"?(t.setState(n),t._emitCurrentToken()):i==='"'?(t._parseError("unexpected-char-in-doctype"),t._currentToken.systemId="",t.setState(gt)):i==="'"?(t._parseError("unexpected-char-in-doctype"),t._currentToken.systemId="",t.setState(yt)):(t._parseError("unexpected-char-in-doctype"),t._currentToken.forceQuirks=!0,t.setState(wt)),!0}function dt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)||(i===">"?(t._emitCurrentToken(),t.setState(n)):i==='"'?(t._currentToken.systemId="",t.setState(gt)):i==="'"?(t._currentToken.systemId="",t.setState(yt)):(t._parseError("unexpected-char-in-doctype"),t._currentToken.forceQuirks=!0,t.setState(wt))),!0}function vt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)?t.setState(mt):i==="'"||i==='"'?(t._parseError("unexpected-char-in-doctype"),e.unget(i),t.setState(mt)):(e.unget(i),t.setState(mt)),!0}function mt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)||(i==='"'?(t._currentToken.systemId="",t.setState(gt)):i==="'"?(t._currentToken.systemId="",t.setState(yt)):i===">"?(t._parseError("unexpected-end-of-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),t.setState(n)):(t._parseError("unexpected-char-in-doctype"),t._currentToken.forceQuirks=!0,t.setState(wt))),!0}function gt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):i==='"'?t.setState(bt):i===">"?(t._parseError("unexpected-end-of-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),t.setState(n)):t._currentToken.systemId+=i,!0}function yt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):i==="'"?t.setState(bt):i===">"?(t._parseError("unexpected-end-of-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),t.setState(n)):t._currentToken.systemId+=i,!0}function bt(e){var i=e.char();return i===r.EOF?(t._parseError("eof-in-doctype"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)||(i===">"?(t._emitCurrentToken(),t.setState(n)):(t._parseError("unexpected-char-in-doctype"),t.setState(wt))),!0}function wt(e){var i=e.char();return i===r.EOF?(e.unget(i),t._emitCurrentToken(),t.setState(n)):i===">"&&(t._emitCurrentToken(),t.setState(n)),!0}u.DATA=n,u.RCDATA=f,u.RAWTEXT=c,u.SCRIPT_DATA=p,u.PLAINTEXT=h,this._state=u.DATA,this._inputStream.append(e),this._tokenHandler.startTokenization(this),this._inputStream.eof=!0;var t=this;while(this._state.call(this,this._inputStream));},Object.defineProperty(u.prototype,"lineNumber",{get:function(){return this._inputStream.location().line}}),Object.defineProperty(u.prototype,"columnNumber",{get:function(){return this._inputStream.location().column}}),n.Tokenizer=u},{"./EntityParser":2,"./InputStream":3}],6:[function(e,t,n){function c(e){return e===" "||e==="\n"||e===" "||e==="\r"||e==="\f"}function h(e){return c(e)||e==="\ufffd"}function p(e){for(var t=0;t2?e.parseError("expected-closing-tag-but-got-eof"):e.openElements.length==2&&e.openElements.item(1).localName!="body"?e.parseError("expected-closing-tag-but-got-eof"):e.context&&e.openElements.length>1},processComment:function(t){e.insertComment(t,e.currentStackItem().node)},processDoctype:function(t,n,r,i){e.parseError("unexpected-doctype")},processStartTag:function(e,t,n){if(this[this.start_tag_handlers[e]])this[this.start_tag_handlers[e]](e,t,n);else{if(!this[this.start_tag_handlers["-default"]])throw new Error("No handler found for "+e);this[this.start_tag_handlers["-default"]](e,t,n)}},processEndTag:function(e){if(this[this.end_tag_handlers[e]])this[this.end_tag_handlers[e]](e);else{if(!this[this.end_tag_handlers["-default"]])throw new Error("No handler found for "+e);this[this.end_tag_handlers["-default"]](e)}},startTagHtml:function(e,n){t.inBody.startTagHtml(e,n)}},t.initial=Object.create(t.base),t.initial.processEOF=function(){e.parseError("expected-doctype-but-got-eof"),this.anythingElse(),e.insertionMode.processEOF()},t.initial.processComment=function(t){e.insertComment(t,e.document)},t.initial.processDoctype=function(t,n,r,i){function s(e){return n.toLowerCase().indexOf(e)===0}e.insertDoctype(t||"",n||"",r||""),i||t!="html"||n!=null&&(["+//silmaril//dtd html pro v0r11 19970101//","-//advasoft ltd//dtd html 3.0 aswedit + extensions//","-//as//dtd html 3.0 aswedit + extensions//","-//ietf//dtd html 2.0 level 1//","-//ietf//dtd html 2.0 level 2//","-//ietf//dtd html 2.0 strict level 1//","-//ietf//dtd html 2.0 strict level 2//","-//ietf//dtd html 2.0 strict//","-//ietf//dtd html 2.0//","-//ietf//dtd html 2.1e//","-//ietf//dtd html 3.0//","-//ietf//dtd html 3.0//","-//ietf//dtd html 3.2 final//","-//ietf//dtd html 3.2//","-//ietf//dtd html 3//","-//ietf//dtd html level 0//","-//ietf//dtd html level 0//","-//ietf//dtd html level 1//","-//ietf//dtd html level 1//","-//ietf//dtd html level 2//","-//ietf//dtd html level 2//","-//ietf//dtd html level 3//","-//ietf//dtd html level 3//","-//ietf//dtd html strict level 0//","-//ietf//dtd html strict level 0//","-//ietf//dtd html strict level 1//","-//ietf//dtd html strict level 1//","-//ietf//dtd html strict level 2//","-//ietf//dtd html strict level 2//","-//ietf//dtd html strict level 3//","-//ietf//dtd html strict level 3//","-//ietf//dtd html strict//","-//ietf//dtd html strict//","-//ietf//dtd html strict//","-//ietf//dtd html//","-//ietf//dtd html//","-//ietf//dtd html//","-//metrius//dtd metrius presentational//","-//microsoft//dtd internet explorer 2.0 html strict//","-//microsoft//dtd internet explorer 2.0 html//","-//microsoft//dtd internet explorer 2.0 tables//","-//microsoft//dtd internet explorer 3.0 html strict//","-//microsoft//dtd internet explorer 3.0 html//","-//microsoft//dtd internet explorer 3.0 tables//","-//netscape comm. corp.//dtd html//","-//netscape comm. corp.//dtd strict html//","-//o'reilly and associates//dtd html 2.0//","-//o'reilly and associates//dtd html extended 1.0//","-//spyglass//dtd html 2.0 extended//","-//sq//dtd html 2.0 hotmetal + extensions//","-//sun microsystems corp.//dtd hotjava html//","-//sun microsystems corp.//dtd hotjava strict html//","-//w3c//dtd html 3 1995-03-24//","-//w3c//dtd html 3.2 draft//","-//w3c//dtd html 3.2 final//","-//w3c//dtd html 3.2//","-//w3c//dtd html 3.2s draft//","-//w3c//dtd html 4.0 frameset//","-//w3c//dtd html 4.0 transitional//","-//w3c//dtd html experimental 19960712//","-//w3c//dtd html experimental 970421//","-//w3c//dtd w3 html//","-//w3o//dtd w3 html 3.0//","-//webtechs//dtd mozilla html 2.0//","-//webtechs//dtd mozilla html//","html"].some(s)||["-//w3o//dtd w3 html strict 3.0//en//","-/w3c/dtd html 4.0 transitional/en","html"].indexOf(n.toLowerCase())>-1||r==null&&["-//w3c//dtd html 4.01 transitional//","-//w3c//dtd html 4.01 frameset//"].some(s))||r!=null&&r.toLowerCase()=="http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"?(e.compatMode="quirks",e.parseError("quirky-doctype")):n!=null&&(["-//w3c//dtd xhtml 1.0 transitional//","-//w3c//dtd xhtml 1.0 frameset//"].some(s)||r!=null&&["-//w3c//dtd html 4.01 transitional//","-//w3c//dtd html 4.01 frameset//"].indexOf(n.toLowerCase())>-1)?(e.compatMode="limited quirks",e.parseError("almost-standards-doctype")):n=="-//W3C//DTD HTML 4.0//EN"&&(r==null||r=="http://www.w3.org/TR/REC-html40/strict.dtd")||n=="-//W3C//DTD HTML 4.01//EN"&&(r==null||r=="http://www.w3.org/TR/html4/strict.dtd")||n=="-//W3C//DTD XHTML 1.0 Strict//EN"&&r=="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"||n=="-//W3C//DTD XHTML 1.1//EN"&&r=="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"||(r!=null&&r!="about:legacy-compat"||n!=null)&&e.parseError("unknown-doctype"),e.setInsertionMode("beforeHTML")},t.initial.processCharacters=function(t){t.skipLeadingWhitespace();if(!t.length)return;e.parseError("expected-doctype-but-got-chars"),this.anythingElse(),e.insertionMode.processCharacters(t)},t.initial.processStartTag=function(t,n,r){e.parseError("expected-doctype-but-got-start-tag",{name:t}),this.anythingElse(),e.insertionMode.processStartTag(t,n,r)},t.initial.processEndTag=function(t){e.parseError("expected-doctype-but-got-end-tag",{name:t}),this.anythingElse(),e.insertionMode.processEndTag(t)},t.initial.anythingElse=function(){e.compatMode="quirks",e.setInsertionMode("beforeHTML")},t.beforeHTML=Object.create(t.base),t.beforeHTML.start_tag_handlers={html:"startTagHtml","-default":"startTagOther"},t.beforeHTML.processEOF=function(){this.anythingElse(),e.insertionMode.processEOF()},t.beforeHTML.processComment=function(t){e.insertComment(t,e.document)},t.beforeHTML.processCharacters=function(t){t.skipLeadingWhitespace();if(!t.length)return;this.anythingElse(),e.insertionMode.processCharacters(t)},t.beforeHTML.startTagHtml=function(t,n,r){e.insertHtmlElement(n),e.setInsertionMode("beforeHead")},t.beforeHTML.startTagOther=function(t,n,r){this.anythingElse(),e.insertionMode.processStartTag(t,n,r)},t.beforeHTML.processEndTag=function(t){this.anythingElse(),e.insertionMode.processEndTag(t)},t.beforeHTML.anythingElse=function(){e.insertHtmlElement(),e.setInsertionMode("beforeHead")},t.afterAfterBody=Object.create(t.base),t.afterAfterBody.start_tag_handlers={html:"startTagHtml","-default":"startTagOther"},t.afterAfterBody.processComment=function(t){e.insertComment(t,e.document)},t.afterAfterBody.processDoctype=function(e){t.inBody.processDoctype(e)},t.afterAfterBody.startTagHtml=function(e,n){t.inBody.startTagHtml(e,n)},t.afterAfterBody.startTagOther=function(t,n,r){e.parseError("unexpected-start-tag",{name:t}),e.setInsertionMode("inBody"),e.insertionMode.processStartTag(t,n,r)},t.afterAfterBody.endTagOther=function(t){e.parseError("unexpected-end-tag",{name:t}),e.setInsertionMode("inBody"),e.insertionMode.processEndTag(t)},t.afterAfterBody.processCharacters=function(n){if(!p(n.characters))return e.parseError("unexpected-char-after-body"),e.setInsertionMode("inBody"),e.insertionMode.processCharacters(n);t.inBody.processCharacters(n)},t.afterBody=Object.create(t.base),t.afterBody.end_tag_handlers={html:"endTagHtml","-default":"endTagOther"},t.afterBody.processComment=function(t){e.insertComment(t,e.openElements.rootNode)},t.afterBody.processCharacters=function(n){if(!p(n.characters))return e.parseError("unexpected-char-after-body"),e.setInsertionMode("inBody"),e.insertionMode.processCharacters(n);t.inBody.processCharacters(n)},t.afterBody.processStartTag=function(t,n,r){e.parseError("unexpected-start-tag-after-body",{name:t}),e.setInsertionMode("inBody"),e.insertionMode.processStartTag(t,n,r)},t.afterBody.endTagHtml=function(t){e.context?e.parseError("end-html-in-innerhtml"):e.setInsertionMode("afterAfterBody")},t.afterBody.endTagOther=function(t){e.parseError("unexpected-end-tag-after-body",{name:t}),e.setInsertionMode("inBody"),e.insertionMode.processEndTag(t)},t.afterFrameset=Object.create(t.base),t.afterFrameset.start_tag_handlers={html:"startTagHtml",noframes:"startTagNoframes","-default":"startTagOther"},t.afterFrameset.end_tag_handlers={html:"endTagHtml","-default":"endTagOther"},t.afterFrameset.processCharacters=function(t){var n=t.takeRemaining(),r="";for(var i=0;i1)e.openElements.pop();e.insertElement(t,n),e.setInsertionMode("inFrameset")}},t.inBody.startTagCloseP=function(t,n){e.openElements.inButtonScope("p")&&this.endTagP("p"),e.insertElement(t,n)},t.inBody.startTagPreListing=function(t,n){e.openElements.inButtonScope("p")&&this.endTagP("p"),e.insertElement(t,n),e.framesetOk=!1,e.shouldSkipLeadingNewline=!0},t.inBody.startTagForm=function(t,n){e.form?e.parseError("unexpected-start-tag",{name:t}):(e.openElements.inButtonScope("p")&&this.endTagP("p"),e.insertElement(t,n),e.form=e.currentStackItem())},t.inBody.startTagRpRt=function(t,n){e.openElements.inScope("ruby")&&(e.generateImpliedEndTags(),e.currentStackItem().localName!="ruby"&&e.parseError("unexpected-start-tag",{name:t})),e.insertElement(t,n)},t.inBody.startTagListItem=function(t,n){var r={li:["li"],dd:["dd","dt"],dt:["dd","dt"]},i=r[t],s=e.openElements;for(var o=s.length-1;o>=0;o--){var u=s.item(o);if(i.indexOf(u.localName)!=-1){e.insertionMode.processEndTag(u.localName);break}if(u.isSpecial()&&u.localName!=="p"&&u.localName!=="address"&&u.localName!=="div")break}e.openElements.inButtonScope("p")&&this.endTagP("p"),e.insertElement(t,n),e.framesetOk=!1},t.inBody.startTagPlaintext=function(t,n){e.openElements.inButtonScope("p")&&this.endTagP("p"),e.insertElement(t,n),e.tokenizer.setState(u.PLAINTEXT)},t.inBody.startTagHeading=function(t,n){e.openElements.inButtonScope("p")&&this.endTagP("p"),e.currentStackItem().isNumberedHeader()&&(e.parseError("unexpected-start-tag",{name:t}),e.popElement()),e.insertElement(t,n)},t.inBody.startTagA=function(t,n){var r=e.elementInActiveFormattingElements("a");r&&(e.parseError("unexpected-start-tag-implies-end-tag",{startName:"a",endName:"a"}),e.adoptionAgencyEndTag("a"),e.openElements.contains(r)&&e.openElements.remove(r),e.removeElementFromActiveFormattingElements(r)),e.reconstructActiveFormattingElements(),e.insertFormattingElement(t,n)},t.inBody.startTagFormatting=function(t,n){e.reconstructActiveFormattingElements(),e.insertFormattingElement(t,n)},t.inBody.startTagNobr=function(t,n){e.reconstructActiveFormattingElements(),e.openElements.inScope("nobr")&&(e.parseError("unexpected-start-tag-implies-end-tag",{startName:"nobr",endName:"nobr"}),this.processEndTag("nobr"),e.reconstructActiveFormattingElements()),e.insertFormattingElement(t,n)},t.inBody.startTagButton=function(t,n){e.openElements.inScope("button")?(e.parseError("unexpected-start-tag-implies-end-tag",{startName:"button",endName:"button"}),this.processEndTag("button"),e.insertionMode.processStartTag(t,n)):(e.framesetOk=!1,e.reconstructActiveFormattingElements(),e.insertElement(t,n))},t.inBody.startTagAppletMarqueeObject=function(t,n){e.reconstructActiveFormattingElements(),e.insertElement(t,n),e.activeFormattingElements.push(l),e.framesetOk=!1},t.inBody.endTagAppletMarqueeObject=function(t){e.openElements.inScope(t)?(e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError("end-tag-too-early",{name:t}),e.openElements.popUntilPopped(t),e.clearActiveFormattingElements()):e.parseError("unexpected-end-tag",{name:t})},t.inBody.startTagXmp=function(t,n){e.openElements.inButtonScope("p")&&this.processEndTag("p"),e.reconstructActiveFormattingElements(),e.processGenericRawTextStartTag(t,n),e.framesetOk=!1},t.inBody.startTagTable=function(t,n){e.compatMode!=="quirks"&&e.openElements.inButtonScope("p")&&this.processEndTag("p"),e.insertElement(t,n),e.setInsertionMode("inTable"),e.framesetOk=!1},t.inBody.startTagVoidFormatting=function(t,n){e.reconstructActiveFormattingElements(),e.insertSelfClosingElement(t,n),e.framesetOk=!1},t.inBody.startTagParamSourceTrack=function(t,n){e.insertSelfClosingElement(t,n)},t.inBody.startTagHr=function(t,n){e.openElements.inButtonScope("p")&&this.endTagP("p"),e.insertSelfClosingElement(t,n),e.framesetOk=!1},t.inBody.startTagImage=function(t,n){e.parseError("unexpected-start-tag-treated-as",{originalName:"image",newName:"img"}),this.processStartTag("img",n)},t.inBody.startTagInput=function(t,n){var r=e.framesetOk;this.startTagVoidFormatting(t,n);for(var i in n)if(n[i].nodeName=="type"){n[i].nodeValue.toLowerCase()=="hidden"&&(e.framesetOk=r);break}},t.inBody.startTagIsindex=function(t,n){e.parseError("deprecated-tag",{name:"isindex"}),e.selfClosingFlagAcknowledged=!0;if(e.form)return;var r=[],i=[],s="This is a searchable index. Enter search keywords: ";for(var o in n)switch(n[o].nodeName){case"action":r.push({nodeName:"action",nodeValue:n[o].nodeValue});break;case"prompt":s=n[o].nodeValue;break;case"name":break;default:i.push({nodeName:n[o].nodeName,nodeValue:n[o].nodeValue})}i.push({nodeName:"name",nodeValue:"isindex"}),this.processStartTag("form",r),this.processStartTag("hr"),this.processStartTag("label"),this.processCharacters(new m(s)),this.processStartTag("input",i),this.processEndTag("label"),this.processStartTag("hr"),this.processEndTag("form")},t.inBody.startTagTextarea=function(t,n){e.insertElement(t,n),e.tokenizer.setState(u.RCDATA),e.originalInsertionMode=e.insertionModeName,e.shouldSkipLeadingNewline=!0,e.framesetOk=!1,e.setInsertionMode("text")},t.inBody.startTagIFrame=function(t,n){e.framesetOk=!1,this.startTagRawText(t,n)},t.inBody.startTagRawText=function(t,n){e.processGenericRawTextStartTag(t,n)},t.inBody.startTagSelect=function(t,n){e.reconstructActiveFormattingElements(),e.insertElement(t,n),e.framesetOk=!1;var r=e.insertionModeName;r=="inTable"||r=="inCaption"||r=="inColumnGroup"||r=="inTableBody"||r=="inRow"||r=="inCell"?e.setInsertionMode("inSelectInTable"):e.setInsertionMode("inSelect")},t.inBody.startTagMisplaced=function(t,n){e.parseError("unexpected-start-tag-ignored",{name:t})},t.inBody.endTagMisplaced=function(t){e.parseError("unexpected-end-tag",{name:t})},t.inBody.endTagBr=function(t){e.parseError("unexpected-end-tag-treated-as",{originalName:"br",newName:"br element"}),e.reconstructActiveFormattingElements(),e.insertElement(t,[]),e.popElement()},t.inBody.startTagOptionOptgroup=function(t,n){e.currentStackItem().localName=="option"&&e.popElement(),e.reconstructActiveFormattingElements(),e.insertElement(t,n)},t.inBody.startTagOther=function(t,n){e.reconstructActiveFormattingElements(),e.insertElement(t,n)},t.inBody.endTagOther=function(t){var n;for(var r=e.openElements.length-1;r>0;r--){n=e.openElements.item(r);if(n.localName==t){e.generateImpliedEndTags(t),e.currentStackItem().localName!=t&&e.parseError("unexpected-end-tag",{name:t}),e.openElements.remove_openElements_until(function(e){return e===n});break}if(n.isSpecial()){e.parseError("unexpected-end-tag",{name:t});break}}},t.inBody.startTagMath=function(t,n,r){e.reconstructActiveFormattingElements(),n=e.adjustMathMLAttributes(n),n=e.adjustForeignAttributes(n),e.insertForeignElement(t,n,"http://www.w3.org/1998/Math/MathML",r)},t.inBody.startTagSVG=function(t,n,r){e.reconstructActiveFormattingElements(),n=e.adjustSVGAttributes(n),n=e.adjustForeignAttributes(n),e.insertForeignElement(t,n,"http://www.w3.org/2000/svg",r)},t.inBody.endTagP=function(t){e.openElements.inButtonScope("p")?(e.generateImpliedEndTags("p"),e.currentStackItem().localName!="p"&&e.parseError("unexpected-implied-end-tag",{name:"p"}),e.openElements.popUntilPopped(t)):(e.parseError("unexpected-end-tag",{name:"p"}),this.startTagCloseP("p",[]),this.endTagP("p"))},t.inBody.endTagBody=function(t){if(!e.openElements.inScope("body")){e.parseError("unexpected-end-tag",{name:t});return}e.currentStackItem().localName!="body"&&e.parseError("expected-one-end-tag-but-got-another",{expectedName:e.currentStackItem().localName,gotName:t}),e.setInsertionMode("afterBody")},t.inBody.endTagHtml=function(t){if(!e.openElements.inScope("body")){e.parseError("unexpected-end-tag",{name:t});return}e.currentStackItem().localName!="body"&&e.parseError("expected-one-end-tag-but-got-another",{expectedName:e.currentStackItem().localName,gotName:t}),e.setInsertionMode("afterBody"),e.insertionMode.processEndTag(t)},t.inBody.endTagBlock=function(t){e.openElements.inScope(t)?(e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError("end-tag-too-early",{name:t}),e.openElements.popUntilPopped(t)):e.parseError("unexpected-end-tag",{name:t})},t.inBody.endTagForm=function(t){var n=e.form;e.form=null,!n||!e.openElements.inScope(t)?e.parseError("unexpected-end-tag",{name:t}):(e.generateImpliedEndTags(),e.currentStackItem()!=n&&e.parseError("end-tag-too-early-ignored",{name:"form"}),e.openElements.remove(n))},t.inBody.endTagListItem=function(t){e.openElements.inListItemScope(t)?(e.generateImpliedEndTags(t),e.currentStackItem().localName!=t&&e.parseError("end-tag-too-early",{name:t}),e.openElements.popUntilPopped(t)):e.parseError("unexpected-end-tag",{name:t})},t.inBody.endTagHeading=function(t){if(!e.openElements.hasNumberedHeaderElementInScope()){e.parseError("unexpected-end-tag",{name:t});return}e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError("end-tag-too-early",{name:t}),e.openElements.remove_openElements_until(function(e){return e.isNumberedHeader()})},t.inBody.endTagFormatting=function(t,n){e.adoptionAgencyEndTag(t)||this.endTagOther(t,n)},t.inCaption=Object.create(t.base),t.inCaption.start_tag_handlers={html:"startTagHtml",caption:"startTagTableElement",col:"startTagTableElement",colgroup:"startTagTableElement",tbody:"startTagTableElement",td:"startTagTableElement",tfoot:"startTagTableElement",thead:"startTagTableElement",tr:"startTagTableElement","-default":"startTagOther"},t.inCaption.end_tag_handlers={caption:"endTagCaption",table:"endTagTable",body:"endTagIgnore",col:"endTagIgnore",colgroup:"endTagIgnore",html:"endTagIgnore",tbody:"endTagIgnore",td:"endTagIgnore",tfood:"endTagIgnore",thead:"endTagIgnore",tr:"endTagIgnore","-default":"endTagOther"},t.inCaption.processCharacters=function(e){t.inBody.processCharacters(e)},t.inCaption.startTagTableElement=function(t,n){e.parseError("unexpected-end-tag",{name:t});var r=!e.openElements.inTableScope("caption");e.insertionMode.processEndTag("caption"),r||e.insertionMode.processStartTag(t,n)},t.inCaption.startTagOther=function(e,n,r){t.inBody.processStartTag(e,n,r)},t.inCaption.endTagCaption=function(t){e.openElements.inTableScope("caption")?(e.generateImpliedEndTags(),e.currentStackItem().localName!="caption"&&e.parseError("expected-one-end-tag-but-got-another",{gotName:"caption",expectedName:e.currentStackItem().localName}),e.openElements.popUntilPopped("caption"),e.clearActiveFormattingElements(),e.setInsertionMode("inTable")):(r.ok(e.context),e.parseError("unexpected-end-tag",{name:t}))},t.inCaption.endTagTable=function(t){e.parseError("unexpected-end-table-in-caption");var n=!e.openElements.inTableScope("caption");e.insertionMode.processEndTag("caption"),n||e.insertionMode.processEndTag(t)},t.inCaption.endTagIgnore=function(t){e.parseError("unexpected-end-tag",{name:t})},t.inCaption.endTagOther=function(e){t.inBody.processEndTag(e)},t.inCell=Object.create(t.base),t.inCell.start_tag_handlers={html:"startTagHtml",caption:"startTagTableOther",col:"startTagTableOther",colgroup:"startTagTableOther",tbody:"startTagTableOther",td:"startTagTableOther",tfoot:"startTagTableOther",th:"startTagTableOther",thead:"startTagTableOther",tr:"startTagTableOther","-default":"startTagOther"},t.inCell.end_tag_handlers={td:"endTagTableCell",th:"endTagTableCell",body:"endTagIgnore",caption:"endTagIgnore",col:"endTagIgnore",colgroup:"endTagIgnore",html:"endTagIgnore",table:"endTagImply",tbody:"endTagImply",tfoot:"endTagImply",thead:"endTagImply",tr:"endTagImply","-default":"endTagOther"},t.inCell.processCharacters=function(e){t.inBody.processCharacters(e)},t.inCell.startTagTableOther=function(t,n,r){e.openElements.inTableScope("td")||e.openElements.inTableScope("th")?(this.closeCell(),e.insertionMode.processStartTag(t,n,r)):e.parseError("unexpected-start-tag",{name:t})},t.inCell.startTagOther=function(e,n,r){t.inBody.processStartTag(e,n,r)},t.inCell.endTagTableCell=function(t){e.openElements.inTableScope(t)?(e.generateImpliedEndTags(t),e.currentStackItem().localName!=t.toLowerCase()?(e.parseError("unexpected-cell-end-tag",{name:t}),e.openElements.popUntilPopped(t)):e.popElement(),e.clearActiveFormattingElements(),e.setInsertionMode("inRow")):e.parseError("unexpected-end-tag",{name:t})},t.inCell.endTagIgnore=function(t){e.parseError("unexpected-end-tag",{name:t})},t.inCell.endTagImply=function(t){e.openElements.inTableScope(t)?(this.closeCell(),e.insertionMode.processEndTag(t)):e.parseError("unexpected-end-tag",{name:t})},t.inCell.endTagOther=function(e){t.inBody.processEndTag(e)},t.inCell.closeCell=function(){e.openElements.inTableScope("td")?this.endTagTableCell("td"):e.openElements.inTableScope("th")&&this.endTagTableCell("th")},t.inColumnGroup=Object.create(t.base),t.inColumnGroup.start_tag_handlers={html:"startTagHtml",col:"startTagCol","-default":"startTagOther"},t.inColumnGroup.end_tag_handlers={colgroup:"endTagColgroup",col:"endTagCol","-default":"endTagOther"},t.inColumnGroup.ignoreEndTagColgroup=function(){return e.currentStackItem().localName=="html"},t.inColumnGroup.processCharacters=function(t){var n=t.takeLeadingWhitespace();n&&e.insertText(n);if(!t.length)return;var r=this.ignoreEndTagColgroup();this.endTagColgroup("colgroup"),r||e.insertionMode.processCharacters(t)},t.inColumnGroup.startTagCol=function(t,n){e.insertSelfClosingElement(t,n)},t.inColumnGroup.startTagOther=function(t,n,r){var i=this.ignoreEndTagColgroup();this.endTagColgroup("colgroup"),i||e.insertionMode.processStartTag(t,n,r)},t.inColumnGroup.endTagColgroup=function(t){this.ignoreEndTagColgroup()?(r.ok(e.context),e.parseError("unexpected-end-tag",{name:t})):(e.popElement(),e.setInsertionMode("inTable"))},t.inColumnGroup.endTagCol=function(t){e.parseError("no-end-tag",{name:"col"})},t.inColumnGroup.endTagOther=function(t){var n=this.ignoreEndTagColgroup();this.endTagColgroup("colgroup"),n||e.insertionMode.processEndTag(t)},t.inForeignContent=Object.create(t.base),t.inForeignContent.processStartTag=function(t,n,r){if(["b","big","blockquote","body","br","center","code","dd","div","dl","dt","em","embed","h1","h2","h3","h4","h5","h6","head","hr","i","img","li","listing","menu","meta","nobr","ol","p","pre","ruby","s","small","span","strong","strike","sub","sup","table","tt","u","ul","var"].indexOf(t)!=-1||t=="font"&&n.some(function(e){return["color","face","size"].indexOf(e.nodeName)>=0})){e.parseError("unexpected-html-element-in-foreign-content",{name:t});while(e.currentStackItem().isForeign()&&!e.currentStackItem().isHtmlIntegrationPoint()&&!e.currentStackItem().isMathMLTextIntegrationPoint())e.openElements.pop();e.insertionMode.processStartTag(t,n,r);return}e.currentStackItem().namespaceURI=="http://www.w3.org/1998/Math/MathML"&&(n=e.adjustMathMLAttributes(n)),e.currentStackItem().namespaceURI=="http://www.w3.org/2000/svg"&&(t=e.adjustSVGTagNameCase(t),n=e.adjustSVGAttributes(n)),n=e.adjustForeignAttributes(n),e.insertForeignElement(t,n,e.currentStackItem().namespaceURI,r)},t.inForeignContent.processEndTag=function(t){var n=e.currentStackItem(),r=e.openElements.length-1;n.localName.toLowerCase()!=t&&e.parseError("unexpected-end-tag",{name:t});for(;;){if(r===0)break;if(n.localName.toLowerCase()==t){while(e.openElements.pop()!=n);break}r-=1,n=e.openElements.item(r);if(n.isForeign())continue;e.insertionMode.processEndTag(t);break}},t.inForeignContent.processCharacters=function(t){var n=t.takeRemaining();n=n.replace(/\u0000/g,function(t,n){return e.parseError("invalid-codepoint"),"\ufffd"}),e.framesetOk&&!d(n)&&(e.framesetOk=!1),e.insertText(n)},t.inHeadNoscript=Object.create(t.base),t.inHeadNoscript.start_tag_handlers={html:"startTagHtml",basefont:"startTagBasefontBgsoundLinkMetaNoframesStyle",bgsound:"startTagBasefontBgsoundLinkMetaNoframesStyle",link:"startTagBasefontBgsoundLinkMetaNoframesStyle",meta:"startTagBasefontBgsoundLinkMetaNoframesStyle",noframes:"startTagBasefontBgsoundLinkMetaNoframesStyle",style:"startTagBasefontBgsoundLinkMetaNoframesStyle",head:"startTagHeadNoscript",noscript:"startTagHeadNoscript","-default":"startTagOther"},t.inHeadNoscript.end_tag_handlers={noscript:"endTagNoscript",br:"endTagBr","-default":"endTagOther"},t.inHeadNoscript.processCharacters=function(t){var n=t.takeLeadingWhitespace();n&&e.insertText(n);if(!t.length)return;e.parseError("unexpected-char-in-frameset"),this.anythingElse(),e.insertionMode.processCharacters(t)},t.inHeadNoscript.processComment=function(e){t.inHead.processComment(e)},t.inHeadNoscript.startTagBasefontBgsoundLinkMetaNoframesStyle=function(e,n){t.inHead.processStartTag(e,n)},t.inHeadNoscript.startTagHeadNoscript=function(t,n){e.parseError("unexpected-start-tag-in-frameset",{name:t})},t.inHeadNoscript.startTagOther=function(t,n){e.parseError("unexpected-start-tag-in-frameset",{name:t}),this.anythingElse(),e.insertionMode.processStartTag(t,n)},t.inHeadNoscript.endTagBr=function(t,n){e.parseError("unexpected-end-tag-in-frameset",{name:t}),this.anythingElse(),e.insertionMode.processEndTag(t,n)},t.inHeadNoscript.endTagNoscript=function(t,n){e.popElement(),e.setInsertionMode("inHead")},t.inHeadNoscript.endTagOther=function(t,n){e.parseError("unexpected-end-tag-in-frameset",{name:t})},t.inHeadNoscript.anythingElse=function(){e.popElement(),e.setInsertionMode("inHead")},t.inFrameset=Object.create(t.base),t.inFrameset.start_tag_handlers={html:"startTagHtml",frameset:"startTagFrameset",frame:"startTagFrame",noframes:"startTagNoframes","-default":"startTagOther"},t.inFrameset.end_tag_handlers={frameset:"endTagFrameset",noframes:"endTagNoframes","-default":"endTagOther"},t.inFrameset.processCharacters=function(t){e.parseError("unexpected-char-in-frameset")},t.inFrameset.startTagFrameset=function(t,n){e.insertElement(t,n)},t.inFrameset.startTagFrame=function(t,n){e.insertSelfClosingElement(t,n)},t.inFrameset.startTagNoframes=function(e,n){t.inBody.processStartTag(e,n)},t.inFrameset.startTagOther=function(t,n){e.parseError("unexpected-start-tag-in-frameset",{name:t})},t.inFrameset.endTagFrameset=function(t,n){e.currentStackItem().localName=="html"?e.parseError("unexpected-frameset-in-frameset-innerhtml"):e.popElement(),!e.context&&e.currentStackItem().localName!="frameset"&&e.setInsertionMode("afterFrameset")},t.inFrameset.endTagNoframes=function(e){t.inBody.processEndTag(e)},t.inFrameset.endTagOther=function(t){e.parseError("unexpected-end-tag-in-frameset",{name:t})},t.inTable=Object.create(t.base),t.inTable.start_tag_handlers={html:"startTagHtml",caption:"startTagCaption",colgroup:"startTagColgroup",col:"startTagCol",table:"startTagTable",tbody:"startTagRowGroup",tfoot:"startTagRowGroup",thead:"startTagRowGroup",td:"startTagImplyTbody",th:"startTagImplyTbody",tr:"startTagImplyTbody",style:"startTagStyleScript",script:"startTagStyleScript",input:"startTagInput",form:"startTagForm","-default":"startTagOther"},t.inTable.end_tag_handlers={table:"endTagTable",body:"endTagIgnore",caption:"endTagIgnore",col:"endTagIgnore",colgroup:"endTagIgnore",html:"endTagIgnore",tbody:"endTagIgnore",td:"endTagIgnore",tfoot:"endTagIgnore",th:"endTagIgnore",thead:"endTagIgnore",tr:"endTagIgnore","-default":"endTagOther"},t.inTable.processCharacters=function(n){if(e.currentStackItem().isFosterParenting()){var r=e.insertionModeName;e.setInsertionMode("inTableText"),e.originalInsertionMode=r,e.insertionMode.processCharacters(n)}else e.redirectAttachToFosterParent=!0,t.inBody.processCharacters(n),e.redirectAttachToFosterParent=!1},t.inTable.startTagCaption=function(t,n){e.openElements.popUntilTableScopeMarker(),e.activeFormattingElements.push(l),e.insertElement(t,n),e.setInsertionMode("inCaption")},t.inTable.startTagColgroup=function(t,n){e.openElements.popUntilTableScopeMarker(),e.insertElement(t,n),e.setInsertionMode("inColumnGroup")},t.inTable.startTagCol=function(t,n){this.startTagColgroup("colgroup",[]),e.insertionMode.processStartTag(t,n)},t.inTable.startTagRowGroup=function(t,n){e.openElements.popUntilTableScopeMarker(),e.insertElement(t,n),e.setInsertionMode("inTableBody")},t.inTable.startTagImplyTbody=function(t,n){this.startTagRowGroup("tbody",[]),e.insertionMode.processStartTag(t,n)},t.inTable.startTagTable=function(t,n){e.parseError("unexpected-start-tag-implies-end-tag",{startName:"table",endName:"table"}),e.insertionMode.processEndTag("table"),e.context||e.insertionMode.processStartTag(t,n)},t.inTable.startTagStyleScript=function(e,n){t.inHead.processStartTag(e,n)},t.inTable.startTagInput=function(t,n){for(var r in n)if(n[r].nodeName.toLowerCase()=="type"){if(n[r].nodeValue.toLowerCase()=="hidden"){e.parseError("unexpected-hidden-input-in-table"),e.insertElement(t,n),e.openElements.pop();return}break}this.startTagOther(t,n)},t.inTable.startTagForm=function(t,n){e.parseError("unexpected-form-in-table"),e.form||(e.insertElement(t,n),e.form=e.currentStackItem(),e.openElements.pop())},t.inTable.startTagOther=function(n,r,i){e.parseError("unexpected-start-tag-implies-table-voodoo",{name:n}),e.redirectAttachToFosterParent=!0,t.inBody.processStartTag(n,r,i),e.redirectAttachToFosterParent=!1},t.inTable.endTagTable=function(t){e.openElements.inTableScope(t)?(e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError("end-tag-too-early-named",{gotName:"table",expectedName:e.currentStackItem().localName}),e.openElements.popUntilPopped("table"),e.resetInsertionMode()):(r.ok(e.context),e.parseError("unexpected-end-tag",{name:t}))},t.inTable.endTagIgnore=function(t){e.parseError("unexpected-end-tag",{name:t})},t.inTable.endTagOther=function(n){e.parseError("unexpected-end-tag-implies-table-voodoo",{name:n}),e.redirectAttachToFosterParent=!0,t.inBody.processEndTag(n),e.redirectAttachToFosterParent=!1},t.inTableText=Object.create(t.base),t.inTableText.flushCharacters=function(){var t=e.pendingTableCharacters.join("");p(t)?e.insertText(t):(e.redirectAttachToFosterParent=!0,e.reconstructActiveFormattingElements(),e.insertText(t),e.framesetOk=!1,e.redirectAttachToFosterParent=!1),e.pendingTableCharacters=[]},t.inTableText.processComment=function(t){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processComment(t)},t.inTableText.processEOF=function(t){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processEOF()},t.inTableText.processCharacters=function(t){var n=t.takeRemaining();n=n.replace(/\u0000/g,function(t,n){return e.parseError("invalid-codepoint"),""});if(!n)return;e.pendingTableCharacters.push(n)},t.inTableText.processStartTag=function(t,n,r){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processStartTag(t,n,r)},t.inTableText.processEndTag=function(t,n){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processEndTag(t,n)},t.inTableBody=Object.create(t.base),t.inTableBody.start_tag_handlers={html:"startTagHtml",tr:"startTagTr",td:"startTagTableCell",th:"startTagTableCell",caption:"startTagTableOther",col:"startTagTableOther",colgroup:"startTagTableOther",tbody:"startTagTableOther",tfoot:"startTagTableOther",thead:"startTagTableOther","-default":"startTagOther"},t.inTableBody.end_tag_handlers={table:"endTagTable",tbody:"endTagTableRowGroup",tfoot:"endTagTableRowGroup",thead:"endTagTableRowGroup",body:"endTagIgnore",caption:"endTagIgnore",col:"endTagIgnore",colgroup:"endTagIgnore",html:"endTagIgnore",td:"endTagIgnore",th:"endTagIgnore",tr:"endTagIgnore","-default":"endTagOther"},t.inTableBody.processCharacters=function(e){t.inTable.processCharacters(e)},t.inTableBody.startTagTr=function(t,n){e.openElements.popUntilTableBodyScopeMarker(),e.insertElement(t,n),e.setInsertionMode("inRow")},t.inTableBody.startTagTableCell=function(t,n){e.parseError("unexpected-cell-in-table-body",{name:t}),this.startTagTr("tr",[]),e.insertionMode.processStartTag(t,n)},t.inTableBody.startTagTableOther=function(t,n){e.openElements.inTableScope("tbody")||e.openElements.inTableScope("thead")||e.openElements.inTableScope("tfoot")?(e.openElements.popUntilTableBodyScopeMarker(),this.endTagTableRowGroup(e.currentStackItem().localName),e.insertionMode.processStartTag(t,n)):e.parseError("unexpected-start-tag",{name:t})},t.inTableBody.startTagOther=function(e,n){t.inTable.processStartTag(e,n)},t.inTableBody.endTagTableRowGroup=function(t){e.openElements.inTableScope(t)?(e.openElements.popUntilTableBodyScopeMarker(),e.popElement(),e.setInsertionMode("inTable")):e.parseError("unexpected-end-tag-in-table-body",{name:t})},t.inTableBody.endTagTable=function(t){e.openElements.inTableScope("tbody")||e.openElements.inTableScope("thead")||e.openElements.inTableScope("tfoot")?(e.openElements.popUntilTableBodyScopeMarker(),this.endTagTableRowGroup(e.currentStackItem().localName),e.insertionMode.processEndTag(t)):e.parseError("unexpected-end-tag",{name:t})},t.inTableBody.endTagIgnore=function(t){e.parseError("unexpected-end-tag-in-table-body",{name:t})},t.inTableBody.endTagOther=function(e){t.inTable.processEndTag(e)},t.inSelect=Object.create(t.base),t.inSelect.start_tag_handlers={html:"startTagHtml",option:"startTagOption",optgroup:"startTagOptgroup",select:"startTagSelect",input:"startTagInput",keygen:"startTagInput",textarea:"startTagInput",script:"startTagScript","-default":"startTagOther"},t.inSelect.end_tag_handlers={option:"endTagOption",optgroup:"endTagOptgroup",select:"endTagSelect",caption:"endTagTableElements",table:"endTagTableElements",tbody:"endTagTableElements",tfoot:"endTagTableElements",thead:"endTagTableElements",tr:"endTagTableElements",td:"endTagTableElements",th:"endTagTableElements","-default":"endTagOther"},t.inSelect.processCharacters=function(t){var n=t.takeRemaining();n=n.replace(/\u0000/g,function(t,n){return e.parseError("invalid-codepoint"),""});if(!n)return;e.insertText(n)},t.inSelect.startTagOption=function(t,n){e.currentStackItem().localName=="option"&&e.popElement(),e.insertElement(t,n)},t.inSelect.startTagOptgroup=function(t,n){e.currentStackItem().localName=="option"&&e.popElement(),e.currentStackItem().localName=="optgroup"&&e.popElement(),e.insertElement(t,n)},t.inSelect.endTagOption=function(t){if(e.currentStackItem().localName!=="option"){e.parseError("unexpected-end-tag-in-select",{name:t});return}e.popElement()},t.inSelect.endTagOptgroup=function(t){e.currentStackItem().localName=="option"&&e.openElements.item(e.openElements.length-2).localName=="optgroup"&&e.popElement(),e.currentStackItem().localName=="optgroup"?e.popElement():e.parseError("unexpected-end-tag-in-select",{name:"optgroup"})},t.inSelect.startTagSelect=function(t){e.parseError("unexpected-select-in-select"),this.endTagSelect("select")},t.inSelect.endTagSelect=function(t){e.openElements.inTableScope("select")?(e.openElements.popUntilPopped("select"),e.resetInsertionMode()):e.parseError("unexpected-end-tag",{name:t})},t.inSelect.startTagInput=function(t,n){e.parseError("unexpected-input-in-select"),e.openElements.inSelectScope("select")&&(this.endTagSelect("select"),e.insertionMode.processStartTag(t,n))},t.inSelect.startTagScript=function(e,n){t.inHead.processStartTag(e,n)},t.inSelect.endTagTableElements=function(t){e.parseError("unexpected-end-tag-in-select",{name:t}),e.openElements.inTableScope(t)&&(this.endTagSelect("select"),e.insertionMode.processEndTag(t))},t.inSelect.startTagOther=function(t,n){e.parseError("unexpected-start-tag-in-select",{name:t})},t.inSelect.endTagOther=function(t){e.parseError("unexpected-end-tag-in-select",{name:t})},t.inSelectInTable=Object.create(t.base),t.inSelectInTable.start_tag_handlers={caption:"startTagTable",table:"startTagTable",tbody:"startTagTable",tfoot:"startTagTable",thead:"startTagTable",tr:"startTagTable",td:"startTagTable",th:"startTagTable","-default":"startTagOther"},t.inSelectInTable.end_tag_handlers={caption:"endTagTable",table:"endTagTable",tbody:"endTagTable",tfoot:"endTagTable",thead:"endTagTable",tr:"endTagTable",td:"endTagTable",th:"endTagTable","-default":"endTagOther"},t.inSelectInTable.processCharacters=function(e){t.inSelect.processCharacters(e)},t.inSelectInTable.startTagTable=function(t,n){e.parseError("unexpected-table-element-start-tag-in-select-in-table",{name:t}),this.endTagOther("select"),e.insertionMode.processStartTag(t,n)},t.inSelectInTable.startTagOther=function(e,n,r){t.inSelect.processStartTag(e,n,r)},t.inSelectInTable.endTagTable=function(t){e.parseError("unexpected-table-element-end-tag-in-select-in-table",{name:t}),e.openElements.inTableScope(t)&&(this.endTagOther("select"),e.insertionMode.processEndTag(t))},t.inSelectInTable.endTagOther=function(e){t.inSelect.processEndTag(e)},t.inRow=Object.create(t.base),t.inRow.start_tag_handlers={html:"startTagHtml",td:"startTagTableCell",th:"startTagTableCell",caption:"startTagTableOther",col:"startTagTableOther",colgroup:"startTagTableOther",tbody:"startTagTableOther",tfoot:"startTagTableOther",thead:"startTagTableOther",tr:"startTagTableOther","-default":"startTagOther"},t.inRow.end_tag_handlers={tr:"endTagTr",table:"endTagTable",tbody:"endTagTableRowGroup",tfoot:"endTagTableRowGroup",thead:"endTagTableRowGroup",body:"endTagIgnore",caption:"endTagIgnore",col:"endTagIgnore",colgroup:"endTagIgnore",html:"endTagIgnore",td:"endTagIgnore",th:"endTagIgnore","-default":"endTagOther"},t.inRow.processCharacters=function(e){t.inTable.processCharacters(e)},t.inRow.startTagTableCell=function(t,n){e.openElements.popUntilTableRowScopeMarker(),e.insertElement(t,n),e.setInsertionMode("inCell"),e.activeFormattingElements.push(l)},t.inRow.startTagTableOther=function(t,n){var r=this.ignoreEndTagTr();this.endTagTr("tr"),r||e.insertionMode.processStartTag(t,n)},t.inRow.startTagOther=function(e,n,r){t.inTable.processStartTag(e,n,r)},t.inRow.endTagTr=function(t){this.ignoreEndTagTr()?(r.ok(e.context),e.parseError("unexpected-end-tag",{name:t})):(e.openElements.popUntilTableRowScopeMarker(),e.popElement(),e.setInsertionMode("inTableBody"))},t.inRow.endTagTable=function(t){var n=this.ignoreEndTagTr();this.endTagTr("tr"),n||e.insertionMode.processEndTag(t)},t.inRow.endTagTableRowGroup=function(t){e.openElements.inTableScope(t)?(this.endTagTr("tr"),e.insertionMode.processEndTag(t)):e.parseError("unexpected-end-tag",{name:t})},t.inRow.endTagIgnore=function(t){e.parseError("unexpected-end-tag-in-table-row",{name:t})},t.inRow.endTagOther=function(e){t.inTable.processEndTag(e)},t.inRow.ignoreEndTagTr=function(){return!e.openElements.inTableScope("tr")},t.afterAfterFrameset=Object.create(t.base),t.afterAfterFrameset.start_tag_handlers={html:"startTagHtml",noframes:"startTagNoFrames","-default":"startTagOther"},t.afterAfterFrameset.processEOF=function(){},t.afterAfterFrameset.processComment=function(t){e.insertComment(t,e.document)},t.afterAfterFrameset.processCharacters=function(t){var n=t.takeRemaining(),r="";for(var i=0;i0&&this.currentStackItem().isForeign()},g.prototype.isSelfClosingFlagAcknowledged=function(){return this.selfClosingFlagAcknowledged},g.prototype.createElement=function(e,t,n){throw new Error("Not implemented")},g.prototype.attachNode=function(e,t){throw new Error("Not implemented")},g.prototype.attachNodeToFosterParent=function(e,t,n){throw new Error("Not implemented")},g.prototype.detachFromParent=function(e){throw new Error("Not implemented")},g.prototype.addAttributesToElement=function(e,t){throw new Error("Not implemented")},g.prototype.insertHtmlElement=function(e){var t=this.createElement("http://www.w3.org/1999/xhtml","html",e);return this.attachNode(t,this.document),this.openElements.pushHtmlElement(new f("http://www.w3.org/1999/xhtml","html",e,t)),t},g.prototype.insertHeadElement=function(e){var t=this.createElement("http://www.w3.org/1999/xhtml","head",e);return this.head=new f("http://www.w3.org/1999/xhtml","head",e,t),this.attachNode(t,this.openElements.top.node),this.openElements.pushHeadElement(this.head),t},g.prototype.insertBodyElement=function(e){var t=this.createElement("http://www.w3.org/1999/xhtml","body",e);return this.attachNode(t,this.openElements.top.node),this.openElements.pushBodyElement(new f("http://www.w3.org/1999/xhtml","body",e,t)),t},g.prototype.insertIntoFosterParent=function(e){var t=this.openElements.findIndex("table"),n=this.openElements.item(t).node;if(t===0)return this.attachNode(e,n);this.attachNodeToFosterParent(e,n,this.openElements.item(t-1).node)},g.prototype.insertElement=function(e,t,n,r){n||(n="http://www.w3.org/1999/xhtml");var i=this.createElement(n,e,t);this.shouldFosterParent()?this.insertIntoFosterParent(i):this.attachNode(i,this.openElements.top.node),r||this.openElements.push(new f(n,e,t,i))},g.prototype.insertFormattingElement=function(e,t){this.insertElement(e,t,"http://www.w3.org/1999/xhtml"),this.appendElementToActiveFormattingElements(this.currentStackItem())},g.prototype.insertSelfClosingElement=function(e,t){this.selfClosingFlagAcknowledged=!0,this.insertElement(e,t,"http://www.w3.org/1999/xhtml",!0)},g.prototype.insertForeignElement=function(e,t,n,r){r&&(this.selfClosingFlagAcknowledged=!0),this.insertElement(e,t,n,r)},g.prototype.insertComment=function(e,t){throw new Error("Not implemented")},g.prototype.insertDoctype=function(e,t,n){throw new Error("Not implemented")},g.prototype.insertText=function(e){throw new Error("Not implemented")},g.prototype.currentStackItem=function(){return this.openElements.top},g.prototype.popElement=function(){return this.openElements.pop()},g.prototype.shouldFosterParent=function(){return this.redirectAttachToFosterParent&&this.currentStackItem().isFosterParenting()},g.prototype.generateImpliedEndTags=function(e){var t=this.openElements.top.localName;["dd","dt","li","option","optgroup","p","rp","rt"].indexOf(t)!=-1&&t!=e&&(this.popElement(),this.generateImpliedEndTags(e))},g.prototype.reconstructActiveFormattingElements=function(){if(this.activeFormattingElements.length===0)return;var e=this.activeFormattingElements.length-1,t=this.activeFormattingElements[e];if(t==l||this.openElements.contains(t))return;while(t!=l&&!this.openElements.contains(t)){e-=1,t=this.activeFormattingElements[e];if(!t)break}for(;;){e+=1,t=this.activeFormattingElements[e],this.insertElement(t.localName,t.attributes);var n=this.currentStackItem();this.activeFormattingElements[e]=n;if(n==this.activeFormattingElements[this.activeFormattingElements.length-1])break}},g.prototype.ensureNoahsArkCondition=function(e){var t=3;if(this.activeFormattingElements.length=0;i--){var s=this.activeFormattingElements[i];if(s===l)break;if(e.localName!==s.localName||e.namespaceURI!==s.namespaceURI)continue;if(s.attributes.length!=r)continue;n.push(s)}if(n.length=0&&this.activeFormattingElements.splice(t,1)},g.prototype.elementInActiveFormattingElements=function(e){var t=this.activeFormattingElements;for(var n=t.length-1;n>=0;n--){if(t[n]==l)break;if(t[n].localName==e)return t[n]}return!1},g.prototype.clearActiveFormattingElements=function(){while(this.activeFormattingElements.length!==0&&this.activeFormattingElements.pop()!=l);},g.prototype.reparentChildren=function(e,t){throw new Error("Not implemented")},g.prototype.setFragmentContext=function(e){this.context=e},g.prototype.parseError=function(e,t){if(!this.errorHandler)return;var n=y(i[e],t);this.errorHandler.error(n,this.tokenizer._inputStream.location(),e)},g.prototype.resetInsertionMode=function(){var e=!1,t=null;for(var n=this.openElements.length-1;n>=0;n--){t=this.openElements.item(n),n===0&&(r.ok(this.context),e=!0,t=new f("http://www.w3.org/1999/xhtml",this.context,[],null));if(t.namespaceURI==="http://www.w3.org/1999/xhtml"){if(t.localName==="select")return this.setInsertionMode("inSelect");if(t.localName==="td"||t.localName==="th")return this.setInsertionMode("inCell");if(t.localName==="tr")return this.setInsertionMode("inRow");if(t.localName==="tbody"||t.localName==="thead"||t.localName==="tfoot")return this.setInsertionMode("inTableBody");if(t.localName==="caption")return this.setInsertionMode("inCaption");if(t.localName==="colgroup")return this.setInsertionMode("inColumnGroup");if(t.localName==="table")return this.setInsertionMode("inTable");if(t.localName==="head"&&!e)return this.setInsertionMode("inHead");if(t.localName==="body")return this.setInsertionMode("inBody");if(t.localName==="frameset")return this.setInsertionMode("inFrameset");if(t.localName==="html")return this.openElements.headElement?this.setInsertionMode("afterHead"):this.setInsertionMode("beforeHead")}if(e)return this.setInsertionMode("inBody")}},g.prototype.processGenericRCDATAStartTag=function(e,t){this.insertElement(e,t),this.tokenizer.setState(u.RCDATA),this.originalInsertionMode=this.insertionModeName,this.setInsertionMode("text")},g.prototype.processGenericRawTextStartTag=function(e,t){this.insertElement(e,t),this.tokenizer.setState(u.RAWTEXT),this.originalInsertionMode=this.insertionModeName,this.setInsertionMode("text")},g.prototype.adjustMathMLAttributes=function(e){return e.forEach(function(e){e.namespaceURI="http://www.w3.org/1998/Math/MathML",s.MATHMLAttributeMap[e.nodeName]&&(e.nodeName=s.MATHMLAttributeMap[e.nodeName])}),e},g.prototype.adjustSVGTagNameCase=function(e){return s.SVGTagMap[e]||e},g.prototype.adjustSVGAttributes=function(e){return e.forEach(function(e){e.namespaceURI="http://www.w3.org/2000/svg",s.SVGAttributeMap[e.nodeName]&&(e.nodeName=s.SVGAttributeMap[e.nodeName])}),e},g.prototype.adjustForeignAttributes=function(e){for(var t=0;t' instead.","expected-tag-name-but-got-question-mark":"Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)","expected-tag-name":"Expected tag name. Got something else instead.","expected-closing-tag-but-got-right-bracket":"Expected closing tag. Got '>' instead. Ignoring ''.","expected-closing-tag-but-got-eof":"Expected closing tag. Unexpected end of file.","expected-closing-tag-but-got-char":"Expected closing tag. Unexpected character '{data}' found.","eof-in-tag-name":"Unexpected end of file in the tag name.","expected-attribute-name-but-got-eof":"Unexpected end of file. Expected attribute name instead.","eof-in-attribute-name":"Unexpected end of file in attribute name.","invalid-character-in-attribute-name":"Invalid character in attribute name.","duplicate-attribute":"Dropped duplicate attribute '{name}' on tag.","expected-end-of-tag-but-got-eof":"Unexpected end of file. Expected = or end of tag.","expected-attribute-value-but-got-eof":"Unexpected end of file. Expected attribute value.","expected-attribute-value-but-got-right-bracket":"Expected attribute value. Got '>' instead.","unexpected-character-in-unquoted-attribute-value":"Unexpected character in unquoted attribute","invalid-character-after-attribute-name":"Unexpected character after attribute name.","unexpected-character-after-attribute-value":"Unexpected character after attribute value.","eof-in-attribute-value-double-quote":'Unexpected end of file in attribute value (").',"eof-in-attribute-value-single-quote":"Unexpected end of file in attribute value (').","eof-in-attribute-value-no-quotes":"Unexpected end of file in attribute value.","eof-after-attribute-value":"Unexpected end of file after attribute value.","unexpected-eof-after-solidus-in-tag":"Unexpected end of file in tag. Expected >.","unexpected-character-after-solidus-in-tag":"Unexpected character after / in tag. Expected >.","expected-dashes-or-doctype":"Expected '--' or 'DOCTYPE'. Not found.","unexpected-bang-after-double-dash-in-comment":"Unexpected ! after -- in comment.","incorrect-comment":"Incorrect comment.","eof-in-comment":"Unexpected end of file in comment.","eof-in-comment-end-dash":"Unexpected end of file in comment (-).","unexpected-dash-after-double-dash-in-comment":"Unexpected '-' after '--' found in comment.","eof-in-comment-double-dash":"Unexpected end of file in comment (--).","eof-in-comment-end-bang-state":"Unexpected end of file in comment.","unexpected-char-in-comment":"Unexpected character in comment found.","need-space-after-doctype":"No space after literal string 'DOCTYPE'.","expected-doctype-name-but-got-right-bracket":"Unexpected > character. Expected DOCTYPE name.","expected-doctype-name-but-got-eof":"Unexpected end of file. Expected DOCTYPE name.","eof-in-doctype-name":"Unexpected end of file in DOCTYPE name.","eof-in-doctype":"Unexpected end of file in DOCTYPE.","expected-space-or-right-bracket-in-doctype":"Expected space or '>'. Got '{data}'.","unexpected-end-of-doctype":"Unexpected end of DOCTYPE.","unexpected-char-in-doctype":"Unexpected character in DOCTYPE.","eof-in-bogus-doctype":"Unexpected end of file in bogus doctype.","eof-in-innerhtml":"Unexpected EOF in inner html mode.","unexpected-doctype":"Unexpected DOCTYPE. Ignored.","non-html-root":"html needs to be the first start tag.","expected-doctype-but-got-eof":"Unexpected End of file. Expected DOCTYPE.","unknown-doctype":"Erroneous DOCTYPE. Expected .","quirky-doctype":"Quirky doctype. Expected .","almost-standards-doctype":"Almost standards mode doctype. Expected .","obsolete-doctype":"Obsolete doctype. Expected .","expected-doctype-but-got-chars":"Non-space characters found without seeing a doctype first. Expected e.g. .","expected-doctype-but-got-start-tag":"Start tag seen without seeing a doctype first. Expected e.g. .","expected-doctype-but-got-end-tag":"End tag seen without seeing a doctype first. Expected e.g. .","end-tag-after-implied-root":"Unexpected end tag ({name}) after the (implied) root element.","expected-named-closing-tag-but-got-eof":"Unexpected end of file. Expected end tag ({name}).","two-heads-are-not-better-than-one":"Unexpected start tag head in existing head. Ignored.","unexpected-end-tag":"Unexpected end tag ({name}). Ignored.","unexpected-implied-end-tag":"End tag {name} implied, but there were open elements.","unexpected-start-tag-out-of-my-head":"Unexpected start tag ({name}) that can be in head. Moved.","unexpected-start-tag":"Unexpected start tag ({name}).","missing-end-tag":"Missing end tag ({name}).","missing-end-tags":"Missing end tags ({name}).","unexpected-start-tag-implies-end-tag":"Unexpected start tag ({startName}) implies end tag ({endName}).","unexpected-start-tag-treated-as":"Unexpected start tag ({originalName}). Treated as {newName}.","deprecated-tag":"Unexpected start tag {name}. Don't use it!","unexpected-start-tag-ignored":"Unexpected start tag {name}. Ignored.","expected-one-end-tag-but-got-another":"Unexpected end tag ({gotName}). Missing end tag ({expectedName}).","end-tag-too-early":"End tag ({name}) seen too early. Expected other end tag.","end-tag-too-early-named":"Unexpected end tag ({gotName}). Expected end tag ({expectedName}.","end-tag-too-early-ignored":"End tag ({name}) seen too early. Ignored.","adoption-agency-1.1":"End tag ({name}) violates step 1, paragraph 1 of the adoption agency algorithm.","adoption-agency-1.2":"End tag ({name}) violates step 1, paragraph 2 of the adoption agency algorithm.","adoption-agency-1.3":"End tag ({name}) violates step 1, paragraph 3 of the adoption agency algorithm.","adoption-agency-4.4":"End tag ({name}) violates step 4, paragraph 4 of the adoption agency algorithm.","unexpected-end-tag-treated-as":"Unexpected end tag ({originalName}). Treated as {newName}.","no-end-tag":"This element ({name}) has no end tag.","unexpected-implied-end-tag-in-table":"Unexpected implied end tag ({name}) in the table phase.","unexpected-implied-end-tag-in-table-body":"Unexpected implied end tag ({name}) in the table body phase.","unexpected-char-implies-table-voodoo":"Unexpected non-space characters in table context caused voodoo mode.","unexpected-hidden-input-in-table":"Unexpected input with type hidden in table context.","unexpected-form-in-table":"Unexpected form in table context.","unexpected-start-tag-implies-table-voodoo":"Unexpected start tag ({name}) in table context caused voodoo mode.","unexpected-end-tag-implies-table-voodoo":"Unexpected end tag ({name}) in table context caused voodoo mode.","unexpected-cell-in-table-body":"Unexpected table cell start tag ({name}) in the table body phase.","unexpected-cell-end-tag":"Got table cell end tag ({name}) while required end tags are missing.","unexpected-end-tag-in-table-body":"Unexpected end tag ({name}) in the table body phase. Ignored.","unexpected-implied-end-tag-in-table-row":"Unexpected implied end tag ({name}) in the table row phase.","unexpected-end-tag-in-table-row":"Unexpected end tag ({name}) in the table row phase. Ignored.","unexpected-select-in-select":"Unexpected select start tag in the select phase treated as select end tag.","unexpected-input-in-select":"Unexpected input start tag in the select phase.","unexpected-start-tag-in-select":"Unexpected start tag token ({name}) in the select phase. Ignored.","unexpected-end-tag-in-select":"Unexpected end tag ({name}) in the select phase. Ignored.","unexpected-table-element-start-tag-in-select-in-table":"Unexpected table element start tag ({name}) in the select in table phase.","unexpected-table-element-end-tag-in-select-in-table":"Unexpected table element end tag ({name}) in the select in table phase.","unexpected-char-after-body":"Unexpected non-space characters in the after body phase.","unexpected-start-tag-after-body":"Unexpected start tag token ({name}) in the after body phase.","unexpected-end-tag-after-body":"Unexpected end tag token ({name}) in the after body phase.","unexpected-char-in-frameset":"Unepxected characters in the frameset phase. Characters ignored.","unexpected-start-tag-in-frameset":"Unexpected start tag token ({name}) in the frameset phase. Ignored.","unexpected-frameset-in-frameset-innerhtml":"Unexpected end tag token (frameset in the frameset phase (innerHTML).","unexpected-end-tag-in-frameset":"Unexpected end tag token ({name}) in the frameset phase. Ignored.","unexpected-char-after-frameset":"Unexpected non-space characters in the after frameset phase. Ignored.","unexpected-start-tag-after-frameset":"Unexpected start tag ({name}) in the after frameset phase. Ignored.","unexpected-end-tag-after-frameset":"Unexpected end tag ({name}) in the after frameset phase. Ignored.","expected-eof-but-got-char":"Unexpected non-space characters. Expected end of file.","expected-eof-but-got-start-tag":"Unexpected start tag ({name}). Expected end of file.","expected-eof-but-got-end-tag":"Unexpected end tag ({name}). Expected end of file.","unexpected-end-table-in-caption":"Unexpected end table tag in caption. Generates implied end caption.","end-html-in-innerhtml":"Unexpected html end tag in inner html mode.","eof-in-table":"Unexpected end of file. Expected table content.","eof-in-script":"Unexpected end of file. Expected script content.","non-void-element-with-trailing-solidus":"Trailing solidus not allowed on element {name}.","unexpected-html-element-in-foreign-content":'HTML start tag "{name}" in a foreign namespace context.',"unexpected-start-tag-in-table":"Unexpected {name}. Expected table content."}},{}],9:[function(e,t,n){function o(){this.contentHandler=null,this._errorHandler=null,this._treeBuilder=new r,this._tokenizer=new i(this._treeBuilder),this._scriptingEnabled=!1}var r=e("./SAXTreeBuilder").SAXTreeBuilder,i=e("../Tokenizer").Tokenizer,s=e("./TreeParser").TreeParser;o.prototype.parse=function(e){this._tokenizer.tokenize(e);var t=this._treeBuilder.document;t&&(new s(this.contentHandler)).parse(t)},o.prototype.parseFragment=function(e,t){this._treeBuilder.setFragmentContext(t),this._tokenizer.tokenize(e);var n=this._treeBuilder.getFragment();n&&(new s(this.contentHandler)).parse(n)},Object.defineProperty(o.prototype,"scriptingEnabled",{get:function(){return this._scriptingEnabled},set:function(e){this._scriptingEnabled=e,this._treeBuilder.scriptingEnabled=e}}),Object.defineProperty(o.prototype,"errorHandler",{get:function(){return this._errorHandler},set:function(e){this._errorHandler=e,this._treeBuilder.errorHandler=e}}),n.SAXParser=o},{"../Tokenizer":5,"./SAXTreeBuilder":10,"./TreeParser":11}],10:[function(e,t,n){function s(){i.call(this)}function o(e,t){for(var n=0;n",gt:">","GT;":">",GT:">","Gt;":"\u226b","gtdot;":"\u22d7","gtlPar;":"\u2995","gtquest;":"\u2a7c","gtrapprox;":"\u2a86","gtrarr;":"\u2978","gtrdot;":"\u22d7","gtreqless;":"\u22db","gtreqqless;":"\u2a8c","gtrless;":"\u2277","gtrsim;":"\u2273","gvertneqq;":"\u2269\ufe00","gvnE;":"\u2269\ufe00","Hacek;":"\u02c7","hairsp;":"\u200a","half;":"\u00bd","hamilt;":"\u210b","HARDcy;":"\u042a","hardcy;":"\u044a","harrcir;":"\u2948","harr;":"\u2194","hArr;":"\u21d4","harrw;":"\u21ad","Hat;":"^","hbar;":"\u210f","Hcirc;":"\u0124","hcirc;":"\u0125","hearts;":"\u2665","heartsuit;":"\u2665","hellip;":"\u2026","hercon;":"\u22b9","hfr;":"\ud835\udd25","Hfr;":"\u210c","HilbertSpace;":"\u210b","hksearow;":"\u2925","hkswarow;":"\u2926","hoarr;":"\u21ff","homtht;":"\u223b","hookleftarrow;":"\u21a9","hookrightarrow;":"\u21aa","hopf;":"\ud835\udd59","Hopf;":"\u210d","horbar;":"\u2015","HorizontalLine;":"\u2500","hscr;":"\ud835\udcbd","Hscr;":"\u210b","hslash;":"\u210f","Hstrok;":"\u0126","hstrok;":"\u0127","HumpDownHump;":"\u224e","HumpEqual;":"\u224f","hybull;":"\u2043","hyphen;":"\u2010","Iacute;":"\u00cd",Iacute:"\u00cd","iacute;":"\u00ed",iacute:"\u00ed","ic;":"\u2063","Icirc;":"\u00ce",Icirc:"\u00ce","icirc;":"\u00ee",icirc:"\u00ee","Icy;":"\u0418","icy;":"\u0438","Idot;":"\u0130","IEcy;":"\u0415","iecy;":"\u0435","iexcl;":"\u00a1",iexcl:"\u00a1","iff;":"\u21d4","ifr;":"\ud835\udd26","Ifr;":"\u2111","Igrave;":"\u00cc",Igrave:"\u00cc","igrave;":"\u00ec",igrave:"\u00ec","ii;":"\u2148","iiiint;":"\u2a0c","iiint;":"\u222d","iinfin;":"\u29dc","iiota;":"\u2129","IJlig;":"\u0132","ijlig;":"\u0133","Imacr;":"\u012a","imacr;":"\u012b","image;":"\u2111","ImaginaryI;":"\u2148","imagline;":"\u2110","imagpart;":"\u2111","imath;":"\u0131","Im;":"\u2111","imof;":"\u22b7","imped;":"\u01b5","Implies;":"\u21d2","incare;":"\u2105","in;":"\u2208","infin;":"\u221e","infintie;":"\u29dd","inodot;":"\u0131","intcal;":"\u22ba","int;":"\u222b","Int;":"\u222c","integers;":"\u2124","Integral;":"\u222b","intercal;":"\u22ba","Intersection;":"\u22c2","intlarhk;":"\u2a17","intprod;":"\u2a3c","InvisibleComma;":"\u2063","InvisibleTimes;":"\u2062","IOcy;":"\u0401","iocy;":"\u0451","Iogon;":"\u012e","iogon;":"\u012f","Iopf;":"\ud835\udd40","iopf;":"\ud835\udd5a","Iota;":"\u0399","iota;":"\u03b9","iprod;":"\u2a3c","iquest;":"\u00bf",iquest:"\u00bf","iscr;":"\ud835\udcbe","Iscr;":"\u2110","isin;":"\u2208","isindot;":"\u22f5","isinE;":"\u22f9","isins;":"\u22f4","isinsv;":"\u22f3","isinv;":"\u2208","it;":"\u2062","Itilde;":"\u0128","itilde;":"\u0129","Iukcy;":"\u0406","iukcy;":"\u0456","Iuml;":"\u00cf",Iuml:"\u00cf","iuml;":"\u00ef",iuml:"\u00ef","Jcirc;":"\u0134","jcirc;":"\u0135","Jcy;":"\u0419","jcy;":"\u0439","Jfr;":"\ud835\udd0d","jfr;":"\ud835\udd27","jmath;":"\u0237","Jopf;":"\ud835\udd41","jopf;":"\ud835\udd5b","Jscr;":"\ud835\udca5","jscr;":"\ud835\udcbf","Jsercy;":"\u0408","jsercy;":"\u0458","Jukcy;":"\u0404","jukcy;":"\u0454","Kappa;":"\u039a","kappa;":"\u03ba","kappav;":"\u03f0","Kcedil;":"\u0136","kcedil;":"\u0137","Kcy;":"\u041a","kcy;":"\u043a","Kfr;":"\ud835\udd0e","kfr;":"\ud835\udd28","kgreen;":"\u0138","KHcy;":"\u0425","khcy;":"\u0445","KJcy;":"\u040c","kjcy;":"\u045c","Kopf;":"\ud835\udd42","kopf;":"\ud835\udd5c","Kscr;":"\ud835\udca6","kscr;":"\ud835\udcc0","lAarr;":"\u21da","Lacute;":"\u0139","lacute;":"\u013a","laemptyv;":"\u29b4","lagran;":"\u2112","Lambda;":"\u039b","lambda;":"\u03bb","lang;":"\u27e8","Lang;":"\u27ea","langd;":"\u2991","langle;":"\u27e8","lap;":"\u2a85","Laplacetrf;":"\u2112","laquo;":"\u00ab",laquo:"\u00ab","larrb;":"\u21e4","larrbfs;":"\u291f","larr;":"\u2190","Larr;":"\u219e","lArr;":"\u21d0","larrfs;":"\u291d","larrhk;":"\u21a9","larrlp;":"\u21ab","larrpl;":"\u2939","larrsim;":"\u2973","larrtl;":"\u21a2","latail;":"\u2919","lAtail;":"\u291b","lat;":"\u2aab","late;":"\u2aad","lates;":"\u2aad\ufe00","lbarr;":"\u290c","lBarr;":"\u290e","lbbrk;":"\u2772","lbrace;":"{","lbrack;":"[","lbrke;":"\u298b","lbrksld;":"\u298f","lbrkslu;":"\u298d","Lcaron;":"\u013d","lcaron;":"\u013e","Lcedil;":"\u013b","lcedil;":"\u013c","lceil;":"\u2308","lcub;":"{","Lcy;":"\u041b","lcy;":"\u043b","ldca;":"\u2936","ldquo;":"\u201c","ldquor;":"\u201e","ldrdhar;":"\u2967","ldrushar;":"\u294b","ldsh;":"\u21b2","le;":"\u2264","lE;":"\u2266","LeftAngleBracket;":"\u27e8","LeftArrowBar;":"\u21e4","leftarrow;":"\u2190","LeftArrow;":"\u2190","Leftarrow;":"\u21d0","LeftArrowRightArrow;":"\u21c6","leftarrowtail;":"\u21a2","LeftCeiling;":"\u2308","LeftDoubleBracket;":"\u27e6","LeftDownTeeVector;":"\u2961","LeftDownVectorBar;":"\u2959","LeftDownVector;":"\u21c3","LeftFloor;":"\u230a","leftharpoondown;":"\u21bd","leftharpoonup;":"\u21bc","leftleftarrows;":"\u21c7","leftrightarrow;":"\u2194","LeftRightArrow;":"\u2194","Leftrightarrow;":"\u21d4","leftrightarrows;":"\u21c6","leftrightharpoons;":"\u21cb","leftrightsquigarrow;":"\u21ad","LeftRightVector;":"\u294e","LeftTeeArrow;":"\u21a4","LeftTee;":"\u22a3","LeftTeeVector;":"\u295a","leftthreetimes;":"\u22cb","LeftTriangleBar;":"\u29cf","LeftTriangle;":"\u22b2","LeftTriangleEqual;":"\u22b4","LeftUpDownVector;":"\u2951","LeftUpTeeVector;":"\u2960","LeftUpVectorBar;":"\u2958","LeftUpVector;":"\u21bf","LeftVectorBar;":"\u2952","LeftVector;":"\u21bc","lEg;":"\u2a8b","leg;":"\u22da","leq;":"\u2264","leqq;":"\u2266","leqslant;":"\u2a7d","lescc;":"\u2aa8","les;":"\u2a7d","lesdot;":"\u2a7f","lesdoto;":"\u2a81","lesdotor;":"\u2a83","lesg;":"\u22da\ufe00","lesges;":"\u2a93","lessapprox;":"\u2a85","lessdot;":"\u22d6","lesseqgtr;":"\u22da","lesseqqgtr;":"\u2a8b","LessEqualGreater;":"\u22da","LessFullEqual;":"\u2266","LessGreater;":"\u2276","lessgtr;":"\u2276","LessLess;":"\u2aa1","lesssim;":"\u2272","LessSlantEqual;":"\u2a7d","LessTilde;":"\u2272","lfisht;":"\u297c","lfloor;":"\u230a","Lfr;":"\ud835\udd0f","lfr;":"\ud835\udd29","lg;":"\u2276","lgE;":"\u2a91","lHar;":"\u2962","lhard;":"\u21bd","lharu;":"\u21bc","lharul;":"\u296a","lhblk;":"\u2584","LJcy;":"\u0409","ljcy;":"\u0459","llarr;":"\u21c7","ll;":"\u226a","Ll;":"\u22d8","llcorner;":"\u231e","Lleftarrow;":"\u21da","llhard;":"\u296b","lltri;":"\u25fa","Lmidot;":"\u013f","lmidot;":"\u0140","lmoustache;":"\u23b0","lmoust;":"\u23b0","lnap;":"\u2a89","lnapprox;":"\u2a89","lne;":"\u2a87","lnE;":"\u2268","lneq;":"\u2a87","lneqq;":"\u2268","lnsim;":"\u22e6","loang;":"\u27ec","loarr;":"\u21fd","lobrk;":"\u27e6","longleftarrow;":"\u27f5","LongLeftArrow;":"\u27f5","Longleftarrow;":"\u27f8","longleftrightarrow;":"\u27f7","LongLeftRightArrow;":"\u27f7","Longleftrightarrow;":"\u27fa","longmapsto;":"\u27fc","longrightarrow;":"\u27f6","LongRightArrow;":"\u27f6","Longrightarrow;":"\u27f9","looparrowleft;":"\u21ab","looparrowright;":"\u21ac","lopar;":"\u2985","Lopf;":"\ud835\udd43","lopf;":"\ud835\udd5d","loplus;":"\u2a2d","lotimes;":"\u2a34","lowast;":"\u2217","lowbar;":"_","LowerLeftArrow;":"\u2199","LowerRightArrow;":"\u2198","loz;":"\u25ca","lozenge;":"\u25ca","lozf;":"\u29eb","lpar;":"(","lparlt;":"\u2993","lrarr;":"\u21c6","lrcorner;":"\u231f","lrhar;":"\u21cb","lrhard;":"\u296d","lrm;":"\u200e","lrtri;":"\u22bf","lsaquo;":"\u2039","lscr;":"\ud835\udcc1","Lscr;":"\u2112","lsh;":"\u21b0","Lsh;":"\u21b0","lsim;":"\u2272","lsime;":"\u2a8d","lsimg;":"\u2a8f","lsqb;":"[","lsquo;":"\u2018","lsquor;":"\u201a","Lstrok;":"\u0141","lstrok;":"\u0142","ltcc;":"\u2aa6","ltcir;":"\u2a79","lt;":"<",lt:"<","LT;":"<",LT:"<","Lt;":"\u226a","ltdot;":"\u22d6","lthree;":"\u22cb","ltimes;":"\u22c9","ltlarr;":"\u2976","ltquest;":"\u2a7b","ltri;":"\u25c3","ltrie;":"\u22b4","ltrif;":"\u25c2","ltrPar;":"\u2996","lurdshar;":"\u294a","luruhar;":"\u2966","lvertneqq;":"\u2268\ufe00","lvnE;":"\u2268\ufe00","macr;":"\u00af",macr:"\u00af","male;":"\u2642","malt;":"\u2720","maltese;":"\u2720","Map;":"\u2905","map;":"\u21a6","mapsto;":"\u21a6","mapstodown;":"\u21a7","mapstoleft;":"\u21a4","mapstoup;":"\u21a5","marker;":"\u25ae","mcomma;":"\u2a29","Mcy;":"\u041c","mcy;":"\u043c","mdash;":"\u2014","mDDot;":"\u223a","measuredangle;":"\u2221","MediumSpace;":"\u205f","Mellintrf;":"\u2133","Mfr;":"\ud835\udd10","mfr;":"\ud835\udd2a","mho;":"\u2127","micro;":"\u00b5",micro:"\u00b5","midast;":"*","midcir;":"\u2af0","mid;":"\u2223","middot;":"\u00b7",middot:"\u00b7","minusb;":"\u229f","minus;":"\u2212","minusd;":"\u2238","minusdu;":"\u2a2a","MinusPlus;":"\u2213","mlcp;":"\u2adb","mldr;":"\u2026","mnplus;":"\u2213","models;":"\u22a7","Mopf;":"\ud835\udd44","mopf;":"\ud835\udd5e","mp;":"\u2213","mscr;":"\ud835\udcc2","Mscr;":"\u2133","mstpos;":"\u223e","Mu;":"\u039c","mu;":"\u03bc","multimap;":"\u22b8","mumap;":"\u22b8","nabla;":"\u2207","Nacute;":"\u0143","nacute;":"\u0144","nang;":"\u2220\u20d2","nap;":"\u2249","napE;":"\u2a70\u0338","napid;":"\u224b\u0338","napos;":"\u0149","napprox;":"\u2249","natural;":"\u266e","naturals;":"\u2115","natur;":"\u266e","nbsp;":"\u00a0",nbsp:"\u00a0","nbump;":"\u224e\u0338","nbumpe;":"\u224f\u0338","ncap;":"\u2a43","Ncaron;":"\u0147","ncaron;":"\u0148","Ncedil;":"\u0145","ncedil;":"\u0146","ncong;":"\u2247","ncongdot;":"\u2a6d\u0338","ncup;":"\u2a42","Ncy;":"\u041d","ncy;":"\u043d","ndash;":"\u2013","nearhk;":"\u2924","nearr;":"\u2197","neArr;":"\u21d7","nearrow;":"\u2197","ne;":"\u2260","nedot;":"\u2250\u0338","NegativeMediumSpace;":"\u200b","NegativeThickSpace;":"\u200b","NegativeThinSpace;":"\u200b","NegativeVeryThinSpace;":"\u200b","nequiv;":"\u2262","nesear;":"\u2928","nesim;":"\u2242\u0338","NestedGreaterGreater;":"\u226b","NestedLessLess;":"\u226a","NewLine;":"\n","nexist;":"\u2204","nexists;":"\u2204","Nfr;":"\ud835\udd11","nfr;":"\ud835\udd2b","ngE;":"\u2267\u0338","nge;":"\u2271","ngeq;":"\u2271","ngeqq;":"\u2267\u0338","ngeqslant;":"\u2a7e\u0338","nges;":"\u2a7e\u0338","nGg;":"\u22d9\u0338","ngsim;":"\u2275","nGt;":"\u226b\u20d2","ngt;":"\u226f","ngtr;":"\u226f","nGtv;":"\u226b\u0338","nharr;":"\u21ae","nhArr;":"\u21ce","nhpar;":"\u2af2","ni;":"\u220b","nis;":"\u22fc","nisd;":"\u22fa","niv;":"\u220b","NJcy;":"\u040a","njcy;":"\u045a","nlarr;":"\u219a","nlArr;":"\u21cd","nldr;":"\u2025","nlE;":"\u2266\u0338","nle;":"\u2270","nleftarrow;":"\u219a","nLeftarrow;":"\u21cd","nleftrightarrow;":"\u21ae","nLeftrightarrow;":"\u21ce","nleq;":"\u2270","nleqq;":"\u2266\u0338","nleqslant;":"\u2a7d\u0338","nles;":"\u2a7d\u0338","nless;":"\u226e","nLl;":"\u22d8\u0338","nlsim;":"\u2274","nLt;":"\u226a\u20d2","nlt;":"\u226e","nltri;":"\u22ea","nltrie;":"\u22ec","nLtv;":"\u226a\u0338","nmid;":"\u2224","NoBreak;":"\u2060","NonBreakingSpace;":"\u00a0","nopf;":"\ud835\udd5f","Nopf;":"\u2115","Not;":"\u2aec","not;":"\u00ac",not:"\u00ac","NotCongruent;":"\u2262","NotCupCap;":"\u226d","NotDoubleVerticalBar;":"\u2226","NotElement;":"\u2209","NotEqual;":"\u2260","NotEqualTilde;":"\u2242\u0338","NotExists;":"\u2204","NotGreater;":"\u226f","NotGreaterEqual;":"\u2271","NotGreaterFullEqual;":"\u2267\u0338","NotGreaterGreater;":"\u226b\u0338","NotGreaterLess;":"\u2279","NotGreaterSlantEqual;":"\u2a7e\u0338","NotGreaterTilde;":"\u2275","NotHumpDownHump;":"\u224e\u0338","NotHumpEqual;":"\u224f\u0338","notin;":"\u2209","notindot;":"\u22f5\u0338","notinE;":"\u22f9\u0338","notinva;":"\u2209","notinvb;":"\u22f7","notinvc;":"\u22f6","NotLeftTriangleBar;":"\u29cf\u0338","NotLeftTriangle;":"\u22ea","NotLeftTriangleEqual;":"\u22ec","NotLess;":"\u226e","NotLessEqual;":"\u2270","NotLessGreater;":"\u2278","NotLessLess;":"\u226a\u0338","NotLessSlantEqual;":"\u2a7d\u0338","NotLessTilde;":"\u2274","NotNestedGreaterGreater;":"\u2aa2\u0338","NotNestedLessLess;":"\u2aa1\u0338","notni;":"\u220c","notniva;":"\u220c","notnivb;":"\u22fe","notnivc;":"\u22fd","NotPrecedes;":"\u2280","NotPrecedesEqual;":"\u2aaf\u0338","NotPrecedesSlantEqual;":"\u22e0","NotReverseElement;":"\u220c","NotRightTriangleBar;":"\u29d0\u0338","NotRightTriangle;":"\u22eb","NotRightTriangleEqual;":"\u22ed","NotSquareSubset;":"\u228f\u0338","NotSquareSubsetEqual;":"\u22e2","NotSquareSuperset;":"\u2290\u0338","NotSquareSupersetEqual;":"\u22e3","NotSubset;":"\u2282\u20d2","NotSubsetEqual;":"\u2288","NotSucceeds;":"\u2281","NotSucceedsEqual;":"\u2ab0\u0338","NotSucceedsSlantEqual;":"\u22e1","NotSucceedsTilde;":"\u227f\u0338","NotSuperset;":"\u2283\u20d2","NotSupersetEqual;":"\u2289","NotTilde;":"\u2241","NotTildeEqual;":"\u2244","NotTildeFullEqual;":"\u2247","NotTildeTilde;":"\u2249","NotVerticalBar;":"\u2224","nparallel;":"\u2226","npar;":"\u2226","nparsl;":"\u2afd\u20e5","npart;":"\u2202\u0338","npolint;":"\u2a14","npr;":"\u2280","nprcue;":"\u22e0","nprec;":"\u2280","npreceq;":"\u2aaf\u0338","npre;":"\u2aaf\u0338","nrarrc;":"\u2933\u0338","nrarr;":"\u219b","nrArr;":"\u21cf","nrarrw;":"\u219d\u0338","nrightarrow;":"\u219b","nRightarrow;":"\u21cf","nrtri;":"\u22eb","nrtrie;":"\u22ed","nsc;":"\u2281","nsccue;":"\u22e1","nsce;":"\u2ab0\u0338","Nscr;":"\ud835\udca9","nscr;":"\ud835\udcc3","nshortmid;":"\u2224","nshortparallel;":"\u2226","nsim;":"\u2241","nsime;":"\u2244","nsimeq;":"\u2244","nsmid;":"\u2224","nspar;":"\u2226","nsqsube;":"\u22e2","nsqsupe;":"\u22e3","nsub;":"\u2284","nsubE;":"\u2ac5\u0338","nsube;":"\u2288","nsubset;":"\u2282\u20d2","nsubseteq;":"\u2288","nsubseteqq;":"\u2ac5\u0338","nsucc;":"\u2281","nsucceq;":"\u2ab0\u0338","nsup;":"\u2285","nsupE;":"\u2ac6\u0338","nsupe;":"\u2289","nsupset;":"\u2283\u20d2","nsupseteq;":"\u2289","nsupseteqq;":"\u2ac6\u0338","ntgl;":"\u2279","Ntilde;":"\u00d1",Ntilde:"\u00d1","ntilde;":"\u00f1",ntilde:"\u00f1","ntlg;":"\u2278","ntriangleleft;":"\u22ea","ntrianglelefteq;":"\u22ec","ntriangleright;":"\u22eb","ntrianglerighteq;":"\u22ed","Nu;":"\u039d","nu;":"\u03bd","num;":"#","numero;":"\u2116","numsp;":"\u2007","nvap;":"\u224d\u20d2","nvdash;":"\u22ac","nvDash;":"\u22ad","nVdash;":"\u22ae","nVDash;":"\u22af","nvge;":"\u2265\u20d2","nvgt;":">\u20d2","nvHarr;":"\u2904","nvinfin;":"\u29de","nvlArr;":"\u2902","nvle;":"\u2264\u20d2","nvlt;":"<\u20d2","nvltrie;":"\u22b4\u20d2","nvrArr;":"\u2903","nvrtrie;":"\u22b5\u20d2","nvsim;":"\u223c\u20d2","nwarhk;":"\u2923","nwarr;":"\u2196","nwArr;":"\u21d6","nwarrow;":"\u2196","nwnear;":"\u2927","Oacute;":"\u00d3",Oacute:"\u00d3","oacute;":"\u00f3",oacute:"\u00f3","oast;":"\u229b","Ocirc;":"\u00d4",Ocirc:"\u00d4","ocirc;":"\u00f4",ocirc:"\u00f4","ocir;":"\u229a","Ocy;":"\u041e","ocy;":"\u043e","odash;":"\u229d","Odblac;":"\u0150","odblac;":"\u0151","odiv;":"\u2a38","odot;":"\u2299","odsold;":"\u29bc","OElig;":"\u0152","oelig;":"\u0153","ofcir;":"\u29bf","Ofr;":"\ud835\udd12","ofr;":"\ud835\udd2c","ogon;":"\u02db","Ograve;":"\u00d2",Ograve:"\u00d2","ograve;":"\u00f2",ograve:"\u00f2","ogt;":"\u29c1","ohbar;":"\u29b5","ohm;":"\u03a9","oint;":"\u222e","olarr;":"\u21ba","olcir;":"\u29be","olcross;":"\u29bb","oline;":"\u203e","olt;":"\u29c0","Omacr;":"\u014c","omacr;":"\u014d","Omega;":"\u03a9","omega;":"\u03c9","Omicron;":"\u039f","omicron;":"\u03bf","omid;":"\u29b6","ominus;":"\u2296","Oopf;":"\ud835\udd46","oopf;":"\ud835\udd60","opar;":"\u29b7","OpenCurlyDoubleQuote;":"\u201c","OpenCurlyQuote;":"\u2018","operp;":"\u29b9","oplus;":"\u2295","orarr;":"\u21bb","Or;":"\u2a54","or;":"\u2228","ord;":"\u2a5d","order;":"\u2134","orderof;":"\u2134","ordf;":"\u00aa",ordf:"\u00aa","ordm;":"\u00ba",ordm:"\u00ba","origof;":"\u22b6","oror;":"\u2a56","orslope;":"\u2a57","orv;":"\u2a5b","oS;":"\u24c8","Oscr;":"\ud835\udcaa","oscr;":"\u2134","Oslash;":"\u00d8",Oslash:"\u00d8","oslash;":"\u00f8",oslash:"\u00f8","osol;":"\u2298","Otilde;":"\u00d5",Otilde:"\u00d5","otilde;":"\u00f5",otilde:"\u00f5","otimesas;":"\u2a36","Otimes;":"\u2a37","otimes;":"\u2297","Ouml;":"\u00d6",Ouml:"\u00d6","ouml;":"\u00f6",ouml:"\u00f6","ovbar;":"\u233d","OverBar;":"\u203e","OverBrace;":"\u23de","OverBracket;":"\u23b4","OverParenthesis;":"\u23dc","para;":"\u00b6",para:"\u00b6","parallel;":"\u2225","par;":"\u2225","parsim;":"\u2af3","parsl;":"\u2afd","part;":"\u2202","PartialD;":"\u2202","Pcy;":"\u041f","pcy;":"\u043f","percnt;":"%","period;":".","permil;":"\u2030","perp;":"\u22a5","pertenk;":"\u2031","Pfr;":"\ud835\udd13","pfr;":"\ud835\udd2d","Phi;":"\u03a6","phi;":"\u03c6","phiv;":"\u03d5","phmmat;":"\u2133","phone;":"\u260e","Pi;":"\u03a0","pi;":"\u03c0","pitchfork;":"\u22d4","piv;":"\u03d6","planck;":"\u210f","planckh;":"\u210e","plankv;":"\u210f","plusacir;":"\u2a23","plusb;":"\u229e","pluscir;":"\u2a22","plus;":"+","plusdo;":"\u2214","plusdu;":"\u2a25","pluse;":"\u2a72","PlusMinus;":"\u00b1","plusmn;":"\u00b1",plusmn:"\u00b1","plussim;":"\u2a26","plustwo;":"\u2a27","pm;":"\u00b1","Poincareplane;":"\u210c","pointint;":"\u2a15","popf;":"\ud835\udd61","Popf;":"\u2119","pound;":"\u00a3",pound:"\u00a3","prap;":"\u2ab7","Pr;":"\u2abb","pr;":"\u227a","prcue;":"\u227c","precapprox;":"\u2ab7","prec;":"\u227a","preccurlyeq;":"\u227c","Precedes;":"\u227a","PrecedesEqual;":"\u2aaf","PrecedesSlantEqual;":"\u227c","PrecedesTilde;":"\u227e","preceq;":"\u2aaf","precnapprox;":"\u2ab9","precneqq;":"\u2ab5","precnsim;":"\u22e8","pre;":"\u2aaf","prE;":"\u2ab3","precsim;":"\u227e","prime;":"\u2032","Prime;":"\u2033","primes;":"\u2119","prnap;":"\u2ab9","prnE;":"\u2ab5","prnsim;":"\u22e8","prod;":"\u220f","Product;":"\u220f","profalar;":"\u232e","profline;":"\u2312","profsurf;":"\u2313","prop;":"\u221d","Proportional;":"\u221d","Proportion;":"\u2237","propto;":"\u221d","prsim;":"\u227e","prurel;":"\u22b0","Pscr;":"\ud835\udcab","pscr;":"\ud835\udcc5","Psi;":"\u03a8","psi;":"\u03c8","puncsp;":"\u2008","Qfr;":"\ud835\udd14","qfr;":"\ud835\udd2e","qint;":"\u2a0c","qopf;":"\ud835\udd62","Qopf;":"\u211a","qprime;":"\u2057","Qscr;":"\ud835\udcac","qscr;":"\ud835\udcc6","quaternions;":"\u210d","quatint;":"\u2a16","quest;":"?","questeq;":"\u225f","quot;":'"',quot:'"',"QUOT;":'"',QUOT:'"',"rAarr;":"\u21db","race;":"\u223d\u0331","Racute;":"\u0154","racute;":"\u0155","radic;":"\u221a","raemptyv;":"\u29b3","rang;":"\u27e9","Rang;":"\u27eb","rangd;":"\u2992","range;":"\u29a5","rangle;":"\u27e9","raquo;":"\u00bb",raquo:"\u00bb","rarrap;":"\u2975","rarrb;":"\u21e5","rarrbfs;":"\u2920","rarrc;":"\u2933","rarr;":"\u2192","Rarr;":"\u21a0","rArr;":"\u21d2","rarrfs;":"\u291e","rarrhk;":"\u21aa","rarrlp;":"\u21ac","rarrpl;":"\u2945","rarrsim;":"\u2974","Rarrtl;":"\u2916","rarrtl;":"\u21a3","rarrw;":"\u219d","ratail;":"\u291a","rAtail;":"\u291c","ratio;":"\u2236","rationals;":"\u211a","rbarr;":"\u290d","rBarr;":"\u290f","RBarr;":"\u2910","rbbrk;":"\u2773","rbrace;":"}","rbrack;":"]","rbrke;":"\u298c","rbrksld;":"\u298e","rbrkslu;":"\u2990","Rcaron;":"\u0158","rcaron;":"\u0159","Rcedil;":"\u0156","rcedil;":"\u0157","rceil;":"\u2309","rcub;":"}","Rcy;":"\u0420","rcy;":"\u0440","rdca;":"\u2937","rdldhar;":"\u2969","rdquo;":"\u201d","rdquor;":"\u201d","rdsh;":"\u21b3","real;":"\u211c","realine;":"\u211b","realpart;":"\u211c","reals;":"\u211d","Re;":"\u211c","rect;":"\u25ad","reg;":"\u00ae",reg:"\u00ae","REG;":"\u00ae",REG:"\u00ae","ReverseElement;":"\u220b","ReverseEquilibrium;":"\u21cb","ReverseUpEquilibrium;":"\u296f","rfisht;":"\u297d","rfloor;":"\u230b","rfr;":"\ud835\udd2f","Rfr;":"\u211c","rHar;":"\u2964","rhard;":"\u21c1","rharu;":"\u21c0","rharul;":"\u296c","Rho;":"\u03a1","rho;":"\u03c1","rhov;":"\u03f1","RightAngleBracket;":"\u27e9","RightArrowBar;":"\u21e5","rightarrow;":"\u2192","RightArrow;":"\u2192","Rightarrow;":"\u21d2","RightArrowLeftArrow;":"\u21c4","rightarrowtail;":"\u21a3","RightCeiling;":"\u2309","RightDoubleBracket;":"\u27e7","RightDownTeeVector;":"\u295d","RightDownVectorBar;":"\u2955","RightDownVector;":"\u21c2","RightFloor;":"\u230b","rightharpoondown;":"\u21c1","rightharpoonup;":"\u21c0","rightleftarrows;":"\u21c4","rightleftharpoons;":"\u21cc","rightrightarrows;":"\u21c9","rightsquigarrow;":"\u219d","RightTeeArrow;":"\u21a6","RightTee;":"\u22a2","RightTeeVector;":"\u295b","rightthreetimes;":"\u22cc","RightTriangleBar;":"\u29d0","RightTriangle;":"\u22b3","RightTriangleEqual;":"\u22b5","RightUpDownVector;":"\u294f","RightUpTeeVector;":"\u295c","RightUpVectorBar;":"\u2954","RightUpVector;":"\u21be","RightVectorBar;":"\u2953","RightVector;":"\u21c0","ring;":"\u02da","risingdotseq;":"\u2253","rlarr;":"\u21c4","rlhar;":"\u21cc","rlm;":"\u200f","rmoustache;":"\u23b1","rmoust;":"\u23b1","rnmid;":"\u2aee","roang;":"\u27ed","roarr;":"\u21fe","robrk;":"\u27e7","ropar;":"\u2986","ropf;":"\ud835\udd63","Ropf;":"\u211d","roplus;":"\u2a2e","rotimes;":"\u2a35","RoundImplies;":"\u2970","rpar;":")","rpargt;":"\u2994","rppolint;":"\u2a12","rrarr;":"\u21c9","Rrightarrow;":"\u21db","rsaquo;":"\u203a","rscr;":"\ud835\udcc7","Rscr;":"\u211b","rsh;":"\u21b1","Rsh;":"\u21b1","rsqb;":"]","rsquo;":"\u2019","rsquor;":"\u2019","rthree;":"\u22cc","rtimes;":"\u22ca","rtri;":"\u25b9","rtrie;":"\u22b5","rtrif;":"\u25b8","rtriltri;":"\u29ce","RuleDelayed;":"\u29f4","ruluhar;":"\u2968","rx;":"\u211e","Sacute;":"\u015a","sacute;":"\u015b","sbquo;":"\u201a","scap;":"\u2ab8","Scaron;":"\u0160","scaron;":"\u0161","Sc;":"\u2abc","sc;":"\u227b","sccue;":"\u227d","sce;":"\u2ab0","scE;":"\u2ab4","Scedil;":"\u015e","scedil;":"\u015f","Scirc;":"\u015c","scirc;":"\u015d","scnap;":"\u2aba","scnE;":"\u2ab6","scnsim;":"\u22e9","scpolint;":"\u2a13","scsim;":"\u227f","Scy;":"\u0421","scy;":"\u0441","sdotb;":"\u22a1","sdot;":"\u22c5","sdote;":"\u2a66","searhk;":"\u2925","searr;":"\u2198","seArr;":"\u21d8","searrow;":"\u2198","sect;":"\u00a7",sect:"\u00a7","semi;":";","seswar;":"\u2929","setminus;":"\u2216","setmn;":"\u2216","sext;":"\u2736","Sfr;":"\ud835\udd16","sfr;":"\ud835\udd30","sfrown;":"\u2322","sharp;":"\u266f","SHCHcy;":"\u0429","shchcy;":"\u0449","SHcy;":"\u0428","shcy;":"\u0448","ShortDownArrow;":"\u2193","ShortLeftArrow;":"\u2190","shortmid;":"\u2223","shortparallel;":"\u2225","ShortRightArrow;":"\u2192","ShortUpArrow;":"\u2191","shy;":"\u00ad",shy:"\u00ad","Sigma;":"\u03a3","sigma;":"\u03c3","sigmaf;":"\u03c2","sigmav;":"\u03c2","sim;":"\u223c","simdot;":"\u2a6a","sime;":"\u2243","simeq;":"\u2243","simg;":"\u2a9e","simgE;":"\u2aa0","siml;":"\u2a9d","simlE;":"\u2a9f","simne;":"\u2246","simplus;":"\u2a24","simrarr;":"\u2972","slarr;":"\u2190","SmallCircle;":"\u2218","smallsetminus;":"\u2216","smashp;":"\u2a33","smeparsl;":"\u29e4","smid;":"\u2223","smile;":"\u2323","smt;":"\u2aaa","smte;":"\u2aac","smtes;":"\u2aac\ufe00","SOFTcy;":"\u042c","softcy;":"\u044c","solbar;":"\u233f","solb;":"\u29c4","sol;":"/","Sopf;":"\ud835\udd4a","sopf;":"\ud835\udd64","spades;":"\u2660","spadesuit;":"\u2660","spar;":"\u2225","sqcap;":"\u2293","sqcaps;":"\u2293\ufe00","sqcup;":"\u2294","sqcups;":"\u2294\ufe00","Sqrt;":"\u221a","sqsub;":"\u228f","sqsube;":"\u2291","sqsubset;":"\u228f","sqsubseteq;":"\u2291","sqsup;":"\u2290","sqsupe;":"\u2292","sqsupset;":"\u2290","sqsupseteq;":"\u2292","square;":"\u25a1","Square;":"\u25a1","SquareIntersection;":"\u2293","SquareSubset;":"\u228f","SquareSubsetEqual;":"\u2291","SquareSuperset;":"\u2290","SquareSupersetEqual;":"\u2292","SquareUnion;":"\u2294","squarf;":"\u25aa","squ;":"\u25a1","squf;":"\u25aa","srarr;":"\u2192","Sscr;":"\ud835\udcae","sscr;":"\ud835\udcc8","ssetmn;":"\u2216","ssmile;":"\u2323","sstarf;":"\u22c6","Star;":"\u22c6","star;":"\u2606","starf;":"\u2605","straightepsilon;":"\u03f5","straightphi;":"\u03d5","strns;":"\u00af","sub;":"\u2282","Sub;":"\u22d0","subdot;":"\u2abd","subE;":"\u2ac5","sube;":"\u2286","subedot;":"\u2ac3","submult;":"\u2ac1","subnE;":"\u2acb","subne;":"\u228a","subplus;":"\u2abf","subrarr;":"\u2979","subset;":"\u2282","Subset;":"\u22d0","subseteq;":"\u2286","subseteqq;":"\u2ac5","SubsetEqual;":"\u2286","subsetneq;":"\u228a","subsetneqq;":"\u2acb","subsim;":"\u2ac7","subsub;":"\u2ad5","subsup;":"\u2ad3","succapprox;":"\u2ab8","succ;":"\u227b","succcurlyeq;":"\u227d","Succeeds;":"\u227b","SucceedsEqual;":"\u2ab0","SucceedsSlantEqual;":"\u227d","SucceedsTilde;":"\u227f","succeq;":"\u2ab0","succnapprox;":"\u2aba","succneqq;":"\u2ab6","succnsim;":"\u22e9","succsim;":"\u227f","SuchThat;":"\u220b","sum;":"\u2211","Sum;":"\u2211","sung;":"\u266a","sup1;":"\u00b9",sup1:"\u00b9","sup2;":"\u00b2",sup2:"\u00b2","sup3;":"\u00b3",sup3:"\u00b3","sup;":"\u2283","Sup;":"\u22d1","supdot;":"\u2abe","supdsub;":"\u2ad8","supE;":"\u2ac6","supe;":"\u2287","supedot;":"\u2ac4","Superset;":"\u2283","SupersetEqual;":"\u2287","suphsol;":"\u27c9","suphsub;":"\u2ad7","suplarr;":"\u297b","supmult;":"\u2ac2","supnE;":"\u2acc","supne;":"\u228b","supplus;":"\u2ac0","supset;":"\u2283","Supset;":"\u22d1","supseteq;":"\u2287","supseteqq;":"\u2ac6","supsetneq;":"\u228b","supsetneqq;":"\u2acc","supsim;":"\u2ac8","supsub;":"\u2ad4","supsup;":"\u2ad6","swarhk;":"\u2926","swarr;":"\u2199","swArr;":"\u21d9","swarrow;":"\u2199","swnwar;":"\u292a","szlig;":"\u00df",szlig:"\u00df","Tab;":" ","target;":"\u2316","Tau;":"\u03a4","tau;":"\u03c4","tbrk;":"\u23b4","Tcaron;":"\u0164","tcaron;":"\u0165","Tcedil;":"\u0162","tcedil;":"\u0163","Tcy;":"\u0422","tcy;":"\u0442","tdot;":"\u20db","telrec;":"\u2315","Tfr;":"\ud835\udd17","tfr;":"\ud835\udd31","there4;":"\u2234","therefore;":"\u2234","Therefore;":"\u2234","Theta;":"\u0398","theta;":"\u03b8","thetasym;":"\u03d1","thetav;":"\u03d1","thickapprox;":"\u2248","thicksim;":"\u223c","ThickSpace;":"\u205f\u200a","ThinSpace;":"\u2009","thinsp;":"\u2009","thkap;":"\u2248","thksim;":"\u223c","THORN;":"\u00de",THORN:"\u00de","thorn;":"\u00fe",thorn:"\u00fe","tilde;":"\u02dc","Tilde;":"\u223c","TildeEqual;":"\u2243","TildeFullEqual;":"\u2245","TildeTilde;":"\u2248","timesbar;":"\u2a31","timesb;":"\u22a0","times;":"\u00d7",times:"\u00d7","timesd;":"\u2a30","tint;":"\u222d","toea;":"\u2928","topbot;":"\u2336","topcir;":"\u2af1","top;":"\u22a4","Topf;":"\ud835\udd4b","topf;":"\ud835\udd65","topfork;":"\u2ada","tosa;":"\u2929","tprime;":"\u2034","trade;":"\u2122","TRADE;":"\u2122","triangle;":"\u25b5","triangledown;":"\u25bf","triangleleft;":"\u25c3","trianglelefteq;":"\u22b4","triangleq;":"\u225c","triangleright;":"\u25b9","trianglerighteq;":"\u22b5","tridot;":"\u25ec","trie;":"\u225c","triminus;":"\u2a3a","TripleDot;":"\u20db","triplus;":"\u2a39","trisb;":"\u29cd","tritime;":"\u2a3b","trpezium;":"\u23e2","Tscr;":"\ud835\udcaf","tscr;":"\ud835\udcc9","TScy;":"\u0426","tscy;":"\u0446","TSHcy;":"\u040b","tshcy;":"\u045b","Tstrok;":"\u0166","tstrok;":"\u0167","twixt;":"\u226c","twoheadleftarrow;":"\u219e","twoheadrightarrow;":"\u21a0","Uacute;":"\u00da",Uacute:"\u00da","uacute;":"\u00fa",uacute:"\u00fa","uarr;":"\u2191","Uarr;":"\u219f","uArr;":"\u21d1","Uarrocir;":"\u2949","Ubrcy;":"\u040e","ubrcy;":"\u045e","Ubreve;":"\u016c","ubreve;":"\u016d","Ucirc;":"\u00db",Ucirc:"\u00db","ucirc;":"\u00fb",ucirc:"\u00fb","Ucy;":"\u0423","ucy;":"\u0443","udarr;":"\u21c5","Udblac;":"\u0170","udblac;":"\u0171","udhar;":"\u296e","ufisht;":"\u297e","Ufr;":"\ud835\udd18","ufr;":"\ud835\udd32","Ugrave;":"\u00d9",Ugrave:"\u00d9","ugrave;":"\u00f9",ugrave:"\u00f9","uHar;":"\u2963","uharl;":"\u21bf","uharr;":"\u21be","uhblk;":"\u2580","ulcorn;":"\u231c","ulcorner;":"\u231c","ulcrop;":"\u230f","ultri;":"\u25f8","Umacr;":"\u016a","umacr;":"\u016b","uml;":"\u00a8",uml:"\u00a8","UnderBar;":"_","UnderBrace;":"\u23df","UnderBracket;":"\u23b5","UnderParenthesis;":"\u23dd","Union;":"\u22c3","UnionPlus;":"\u228e","Uogon;":"\u0172","uogon;":"\u0173","Uopf;":"\ud835\udd4c","uopf;":"\ud835\udd66","UpArrowBar;":"\u2912","uparrow;":"\u2191","UpArrow;":"\u2191","Uparrow;":"\u21d1","UpArrowDownArrow;":"\u21c5","updownarrow;":"\u2195","UpDownArrow;":"\u2195","Updownarrow;":"\u21d5","UpEquilibrium;":"\u296e","upharpoonleft;":"\u21bf","upharpoonright;":"\u21be","uplus;":"\u228e","UpperLeftArrow;":"\u2196","UpperRightArrow;":"\u2197","upsi;":"\u03c5","Upsi;":"\u03d2","upsih;":"\u03d2","Upsilon;":"\u03a5","upsilon;":"\u03c5","UpTeeArrow;":"\u21a5","UpTee;":"\u22a5","upuparrows;":"\u21c8","urcorn;":"\u231d","urcorner;":"\u231d","urcrop;":"\u230e","Uring;":"\u016e","uring;":"\u016f","urtri;":"\u25f9","Uscr;":"\ud835\udcb0","uscr;":"\ud835\udcca","utdot;":"\u22f0","Utilde;":"\u0168","utilde;":"\u0169","utri;":"\u25b5","utrif;":"\u25b4","uuarr;":"\u21c8","Uuml;":"\u00dc",Uuml:"\u00dc","uuml;":"\u00fc",uuml:"\u00fc","uwangle;":"\u29a7","vangrt;":"\u299c","varepsilon;":"\u03f5","varkappa;":"\u03f0","varnothing;":"\u2205","varphi;":"\u03d5","varpi;":"\u03d6","varpropto;":"\u221d","varr;":"\u2195","vArr;":"\u21d5","varrho;":"\u03f1","varsigma;":"\u03c2","varsubsetneq;":"\u228a\ufe00","varsubsetneqq;":"\u2acb\ufe00","varsupsetneq;":"\u228b\ufe00","varsupsetneqq;":"\u2acc\ufe00","vartheta;":"\u03d1","vartriangleleft;":"\u22b2","vartriangleright;":"\u22b3","vBar;":"\u2ae8","Vbar;":"\u2aeb","vBarv;":"\u2ae9","Vcy;":"\u0412","vcy;":"\u0432","vdash;":"\u22a2","vDash;":"\u22a8","Vdash;":"\u22a9","VDash;":"\u22ab","Vdashl;":"\u2ae6","veebar;":"\u22bb","vee;":"\u2228","Vee;":"\u22c1","veeeq;":"\u225a","vellip;":"\u22ee","verbar;":"|","Verbar;":"\u2016","vert;":"|","Vert;":"\u2016","VerticalBar;":"\u2223","VerticalLine;":"|","VerticalSeparator;":"\u2758","VerticalTilde;":"\u2240","VeryThinSpace;":"\u200a","Vfr;":"\ud835\udd19","vfr;":"\ud835\udd33","vltri;":"\u22b2","vnsub;":"\u2282\u20d2","vnsup;":"\u2283\u20d2","Vopf;":"\ud835\udd4d","vopf;":"\ud835\udd67","vprop;":"\u221d","vrtri;":"\u22b3","Vscr;":"\ud835\udcb1","vscr;":"\ud835\udccb","vsubnE;":"\u2acb\ufe00","vsubne;":"\u228a\ufe00","vsupnE;":"\u2acc\ufe00","vsupne;":"\u228b\ufe00","Vvdash;":"\u22aa","vzigzag;":"\u299a","Wcirc;":"\u0174","wcirc;":"\u0175","wedbar;":"\u2a5f","wedge;":"\u2227","Wedge;":"\u22c0","wedgeq;":"\u2259","weierp;":"\u2118","Wfr;":"\ud835\udd1a","wfr;":"\ud835\udd34","Wopf;":"\ud835\udd4e","wopf;":"\ud835\udd68","wp;":"\u2118","wr;":"\u2240","wreath;":"\u2240","Wscr;":"\ud835\udcb2","wscr;":"\ud835\udccc","xcap;":"\u22c2","xcirc;":"\u25ef","xcup;":"\u22c3","xdtri;":"\u25bd","Xfr;":"\ud835\udd1b","xfr;":"\ud835\udd35","xharr;":"\u27f7","xhArr;":"\u27fa","Xi;":"\u039e","xi;":"\u03be","xlarr;":"\u27f5","xlArr;":"\u27f8","xmap;":"\u27fc","xnis;":"\u22fb","xodot;":"\u2a00","Xopf;":"\ud835\udd4f","xopf;":"\ud835\udd69","xoplus;":"\u2a01","xotime;":"\u2a02","xrarr;":"\u27f6","xrArr;":"\u27f9","Xscr;":"\ud835\udcb3","xscr;":"\ud835\udccd","xsqcup;":"\u2a06","xuplus;":"\u2a04","xutri;":"\u25b3","xvee;":"\u22c1","xwedge;":"\u22c0","Yacute;":"\u00dd",Yacute:"\u00dd","yacute;":"\u00fd",yacute:"\u00fd","YAcy;":"\u042f","yacy;":"\u044f","Ycirc;":"\u0176","ycirc;":"\u0177","Ycy;":"\u042b","ycy;":"\u044b","yen;":"\u00a5",yen:"\u00a5","Yfr;":"\ud835\udd1c","yfr;":"\ud835\udd36","YIcy;":"\u0407","yicy;":"\u0457","Yopf;":"\ud835\udd50","yopf;":"\ud835\udd6a","Yscr;":"\ud835\udcb4","yscr;":"\ud835\udcce","YUcy;":"\u042e","yucy;":"\u044e","yuml;":"\u00ff",yuml:"\u00ff","Yuml;":"\u0178","Zacute;":"\u0179","zacute;":"\u017a","Zcaron;":"\u017d","zcaron;":"\u017e","Zcy;":"\u0417","zcy;":"\u0437","Zdot;":"\u017b","zdot;":"\u017c","zeetrf;":"\u2128","ZeroWidthSpace;":"\u200b","Zeta;":"\u0396","zeta;":"\u03b6","zfr;":"\ud835\udd37","Zfr;":"\u2128","ZHcy;":"\u0416","zhcy;":"\u0436","zigrarr;":"\u21dd","zopf;":"\ud835\udd6b","Zopf;":"\u2124","Zscr;":"\ud835\udcb5","zscr;":"\ud835\udccf","zwj;":"\u200d","zwnj;":"\u200c"}},{}],13:[function(e,t,n){function u(e,t){return r.isUndefined(t)?""+t:r.isNumber(t)&&(isNaN(t)||!isFinite(t))?t.toString():r.isFunction(t)||r.isRegExp(t)?t.toString():t}function a(e,t){return r.isString(e)?e.length=0;u--)if(n[u]!=s[u])return!1;for(u=n.length-1;u>=0;u--){o=n[u];if(!h(e[o],t[o]))return!1}return!0}function v(e,t){return!e||!t?!1:Object.prototype.toString.call(t)=="[object RegExp]"?t.test(e):e instanceof t?!0:t.call({},e)===!0?!0:!1}function m(e,t,n,i){var s;r.isString(n)&&(i=n,n=null);try{t()}catch(o){s=o}i=(n&&n.name?" ("+n.name+").":".")+(i?" "+i:"."),e&&!s&&l(s,n,"Missing expected exception"+i),!e&&v(s,n)&&l(s,n,"Got unwanted exception"+i);if(e&&s&&n&&!v(s,n)||!e&&s)throw s}var r=e("util/"),i=Array.prototype.slice,s=Object.prototype.hasOwnProperty,o=t.exports=c;o.AssertionError=function(t){this.name="AssertionError",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=f(this),this.generatedMessage=!0);var n=t.stackStartFunction||l;if(Error.captureStackTrace)Error.captureStackTrace(this,n);else{var r=new Error;if(r.stack){var i=r.stack,s=n.name,o=i.indexOf("\n"+s);if(o>=0){var u=i.indexOf("\n",o+1);i=i.substring(u+1)}this.stack=i}}},r.inherits(o.AssertionError,Error),o.fail=l,o.ok=c,o.equal=function(t,n,r){t!=n&&l(t,n,r,"==",o.equal)},o.notEqual=function(t,n,r){t==n&&l(t,n,r,"!=",o.notEqual)},o.deepEqual=function(t,n,r){h(t,n)||l(t,n,r,"deepEqual",o.deepEqual)},o.notDeepEqual=function(t,n,r){h(t,n)&&l(t,n,r,"notDeepEqual",o.notDeepEqual)},o.strictEqual=function(t,n,r){t!==n&&l(t,n,r,"===",o.strictEqual)},o.notStrictEqual=function(t,n,r){t===n&&l(t,n,r,"!==",o.notStrictEqual)},o.throws=function(e,t,n){m.apply(this,[!0].concat(i.call(arguments)))},o.doesNotThrow=function(e,t){m.apply(this,[!1].concat(i.call(arguments)))},o.ifError=function(e){if(e)throw e};var g=Object.keys||function(e){var t=[];for(var n in e)s.call(e,n)&&t.push(n);return t}},{"util/":15}],14:[function(e,t,n){t.exports=function(t){return t&&typeof t=="object"&&typeof t.copy=="function"&&typeof t.fill=="function"&&typeof t.readUInt8=="function"}},{}],15:[function(e,t,n){(function(t,r){function u(e,t){var r={seen:[],stylize:f};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),y(t)?r.showHidden=t:t&&n._extend(r,t),T(r.showHidden)&&(r.showHidden=!1),T(r.depth)&&(r.depth=2),T(r.colors)&&(r.colors=!1),T(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=a),c(r,e,r.depth)}function a(e,t){var n=u.styles[t];return n?"["+u.colors[n][0]+"m"+e+"["+u.colors[n][1]+"m":e}function f(e,t){return e}function l(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function c(e,t,r){if(e.customInspect&&t&&A(t.inspect)&&t.inspect!==n.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(r,e);return S(i)||(i=c(e,i,r)),i}var s=h(e,t);if(s)return s;var o=Object.keys(t),u=l(o);e.showHidden&&(o=Object.getOwnPropertyNames(t));if(L(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return p(t);if(o.length===0){if(A(t)){var a=t.name?": "+t.name:"";return e.stylize("[Function"+a+"]","special")}if(N(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(k(t))return e.stylize(Date.prototype.toString.call(t),"date");if(L(t))return p(t)}var f="",y=!1,b=["{","}"];g(t)&&(y=!0,b=["[","]"]);if(A(t)){var w=t.name?": "+t.name:"";f=" [Function"+w+"]"}N(t)&&(f=" "+RegExp.prototype.toString.call(t)),k(t)&&(f=" "+Date.prototype.toUTCString.call(t)),L(t)&&(f=" "+p(t));if(o.length!==0||!!y&&t.length!=0){if(r<0)return N(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var E;return y?E=d(e,t,r,u,o):E=o.map(function(n){return v(e,t,r,u,n,y)}),e.seen.pop(),m(E,f,b)}return b[0]+f+b[1]}function h(e,t){if(T(t))return e.stylize("undefined","undefined");if(S(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}if(E(t))return e.stylize(""+t,"number");if(y(t))return e.stylize(""+t,"boolean");if(b(t))return e.stylize("null","null")}function p(e){return"["+Error.prototype.toString.call(e)+"]"}function d(e,t,n,r,i){var s=[];for(var o=0,u=t.length;o-1&&(s?u=u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):u="\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special"));if(T(o)){if(s&&i.match(/^\d+$/))return u;o=JSON.stringify(""+i),o.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=e.stylize(o,"string"))}return o+": "+u}function m(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?n[0]+(t===""?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function g(e){return Array.isArray(e)}function y(e){return typeof e=="boolean"}function b(e){return e===null}function w(e){return e==null}function E(e){return typeof e=="number"}function S(e){return typeof e=="string"}function x(e){return typeof e=="symbol"}function T(e){return e===void 0}function N(e){return C(e)&&M(e)==="[object RegExp]"}function C(e){return typeof e=="object"&&e!==null}function k(e){return C(e)&&M(e)==="[object Date]"}function L(e){return C(e)&&(M(e)==="[object Error]"||e instanceof Error)}function A(e){return typeof e=="function"}function O(e){return e===null||typeof e=="boolean"||typeof e=="number"||typeof e=="string"||typeof e=="symbol"||typeof e=="undefined"}function M(e){return Object.prototype.toString.call(e)}function _(e){return e<10?"0"+e.toString(10):e.toString(10)}function P(){var e=new Date,t=[_(e.getHours()),_(e.getMinutes()),_(e.getSeconds())].join(":");return[e.getDate(),D[e.getMonth()],t].join(" ")}function H(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var i=/%[sdj%]/g;n.format=function(e){if(!S(e)){var t=[];for(var n=0;n=s)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(t){return"[Circular]"};default:return e}});for(var a=r[n];n0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),n||(n=!0,t.apply(this,arguments))}if(!i(t))throw TypeError("listener must be a function");var n=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var n,r,s,u;if(!i(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;n=this._events[e],s=n.length,r=-1;if(n===t||i(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(n)){for(u=s;u-->0;)if(n[u]===t||n[u].listener&&n[u].listener===t){r=u;break}if(r<0)return this;n.length===1?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return arguments.length===0?this._events={}:this._events[e]&&delete this._events[e],this;if(arguments.length===0){for(t in this._events){if(t==="removeListener")continue;this.removeAllListeners(t)}return this.removeAllListeners("removeListener"),this._events={},this}n=this._events[e];if(i(n))this.removeListener(e,n);else while(n.length)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return!this._events||!this._events[e]?t=[]:i(this._events[e])?t=[this._events[e]]:t=this._events[e].slice(),t},r.listenerCount=function(e,t){var n;return!e._events||!e._events[t]?n=0:i(e._events[t])?n=1:n=e._events[t].length,n}},{}],17:[function(e,t,n){typeof Object.create=="function"?t.exports=function(t,n){t.super_=n,t.prototype=Object.create(n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,n){t.super_=n;var r=function(){};r.prototype=n.prototype,t.prototype=new r,t.prototype.constructor=t}},{}],18:[function(e,t,n){function i(){}var r=t.exports={};r.nextTick=function(){var e=typeof window!="undefined"&&window.setImmediate,t=typeof window!="undefined"&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){var t=e.source;if((t===window||t===null)&&e.data==="process-tick"){e.stopPropagation();if(n.length>0){var r=n.shift();r()}}},!0),function(t){n.push(t),window.postMessage("process-tick","*")}}return function(t){setTimeout(t,0)}}(),r.title="browser",r.browser=!0,r.env={},r.argv=[],r.on=i,r.once=i,r.off=i,r.emit=i,r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")}},{}],19:[function(e,t,n){t.exports=e(14)},{}],20:[function(e,t,n){t.exports=e(15)},{"./support/isBuffer":19,"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":18,inherits:17}]},{},[9])(9)}),define("ace/mode/html_worker",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/worker/mirror","ace/mode/html/saxparser"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("../worker/mirror").Mirror,o=e("./html/saxparser").SAXParser,u={"expected-doctype-but-got-start-tag":"info","expected-doctype-but-got-chars":"info","non-html-root":"info"},a=t.Worker=function(e){s.call(this,e),this.setTimeout(400),this.context=null};r.inherits(a,s),function(){this.setOptions=function(e){this.context=e.context},this.onUpdate=function(){var e=this.doc.getValue();if(!e)return;var t=new o,n=[],r=function(){};t.contentHandler={startDocument:r,endDocument:r,startElement:r,endElement:r,characters:r},t.errorHandler={error:function(e,t,r){n.push({row:t.line,column:t.column,text:e,type:u[r]||"error"})}},this.context?t.parseFragment(e,this.context):t.parse(e),this.sender.emit("error",n)}}.call(a.prototype)}),define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0}),define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n=53&&O()},I=o.delayedCall(j,50);r.addListener(n,"compositionstart",B),i.isGecko?r.addListener(n,"text",function(){I.schedule()}):(r.addListener(n,"keyup",function(){I.schedule()}),r.addListener(n,"keydown",function(){I.schedule()})),r.addListener(n,"compositionend",F),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){L=!0,b(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){if(!o&&i.isOldIE)return;p||(p=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+"height:"+n.style.height+";"+(i.isIE?"opacity:0.1;":"");var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){n.style.left=e.clientX-l-2+"px",n.style.top=Math.min(e.clientY-f-2,c)+"px"};h(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(q),i.isWin&&!i.isOldIE&&r.capture(t.container,h,R)},this.onContextMenuClose=R;var q,U=function(e){t.textInput.onContextMenu(e),R()};r.addListener(n,"mouseup",U),r.addListener(n,"mousedown",function(e){e.preventDefault(),R()}),r.addListener(t.renderer.scroller,"contextmenu",U),r.addListener(n,"contextmenu",U)};t.TextInput=f}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function u(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function a(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function f(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=0;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,i=e.getButton();if(i!==0){var s=r.getSelectionRange(),o=s.isEmpty();r.$blockScrolling++,(o||i==1)&&r.selection.moveToPosition(n),r.$blockScrolling--,i==2&&r.textInput.onContextMenu(e.domEvent);return}this.mousedownEvent.time=Date.now();if(t&&!r.isFocused()){r.focus();if(this.$focusTimout&&!this.$clickSelection&&!r.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g,y&&/string\.end/.test(v.type)&&(y=!1);else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";function r(e){var n=/\w{4}/g;for(var r in e)t.packages[r]=e[r].replace(n,"\\u$&")}t.packages={},r({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour/cstyle").CstyleBehaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i};(function(){this.$defaultBehaviour=new s,this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules(this.$highlightRuleConfig),this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push("
"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("
"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("
")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("
")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("
")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("
")}}).call(s.prototype),t.Marker=s}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push("
"),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push("
"),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("","
"),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:w?Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r||!r.cssClass)throw new Error("couldn't load module "+e+" or it didn't call define");i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var s=this.$normalizePath;i=i||s(e.toUrl("ace/worker/worker.js",null,"_"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})},this.$workerBlob=function(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.6"}); + (function() { + window.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = window.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + }); + })(); + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/app.js b/examples/SmartSwitch/data_src/js_css_src/app.js new file mode 100644 index 0000000..46305f2 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/app.js @@ -0,0 +1,5787 @@ +var tpick = { + attach: function (target) { + + var dig = document.getElementById(target).value.split(":"); + var t1 = dig[0] || "23"; + var t2 = dig[1] || "59"; + + var uniqueID = 0; + while (document.getElementById("tpick-" + uniqueID) != null) { + uniqueID = Math.floor(Math.random() * (100 - 2)) + 1; + } + var tw = document.createElement("div"); + tw.id = "tpick-" + uniqueID; + tw.classList.add("tpop"); + tw.dataset.target = target; + tw.addEventListener("click", function (evt) { + if (evt.target.classList.contains("tpop")) { + this.classList.remove("show"); + } + }); + var tp = document.createElement("div"); + tp.classList.add("tpicker"); + tp.appendChild(this.draw("h",t1)); + tp.appendChild(this.draw("m",t2)); + var bottom = document.createElement("div"), + ok = document.createElement("input"); + ok.setAttribute("type", "button"); + ok.value = "OK"; + ok.addEventListener("click", function () { + tpick.set(this); + }); + bottom.classList.add("tpicker-btn"); + bottom.appendChild(ok); + tp.appendChild(bottom); + tw.appendChild(tp); + document.body.appendChild(tw); + var target = document.getElementById(target); + target.dataset.dp = uniqueID; + target.onfocus = function () { + document.getElementById("tpick-" + this.dataset.dp).classList.add("show"); + }; + }, + draw: function (type,tv) { + var docket = document.createElement("div"), + up = document.createElement("div"), + down = document.createElement("div"), + text = document.createElement("input"); + docket.classList.add("tpicker-" + type); + up.classList.add("tpicker-up"); + down.classList.add("tpicker-down"); + up.innerHTML = "︿"; + down.innerHTML = "﹀"; + text.readOnly = true; + text.setAttribute("type", "text"); + if (type == "h") { + text.value = tv; + up.addEventListener("click", function () { + tpick.spin("h", 1, this); + }); + down.addEventListener("click", function () { + tpick.spin("h", 0, this); + }); + } else if (type == "m") { + text.value = tv; + up.addEventListener("click", function () { + tpick.spin("m", 1, this); + }); + down.addEventListener("click", function () { + tpick.spin("m", 0, this); + }); + } + docket.appendChild(up); + docket.appendChild(text); + docket.appendChild(down); + return docket; + }, + spin: function (type, direction, el) { + var parent = el.parentElement, + field = parent.getElementsByTagName("input")[0], + value = field.value; + if (type == "h") { + value = parseInt(value); + if (direction) { + value++; + } else { + value--; + } + if (value == -1) { + value = 23; + } else if (value > 23) { + value = 0; + } + } else if (type == "m") { + value = parseInt(value); + if (direction) { + value += 5; + } else { + value -= 5; + } + if (value < 0) { + value = 55; + } else if (value > 59) { + value = 0; + } + if (value < 10) { + value = "0" + value; + } + } + field.value = ('00' + value).substr(-2); + }, + set: function (el) { + var parent = el.parentElement; + while (parent.classList.contains("tpop") == false) { + parent = parent.parentElement; + } + var input = parent.querySelectorAll("input[type=text]"); + var time = input[0].value + ":" + input[1].value; + document.getElementById(parent.dataset.target).value = time; + parent.classList.remove("show"); + } +}; +var fpick = { + attach: function (target) { + + var dig = document.getElementById(target).value.split("."); + var t1 = dig[0] || "1"; + var t2 = dig[1] || "2"; + var uniqueID = 0; + while (document.getElementById("fpick-" + uniqueID) != null) { + uniqueID = Math.floor(Math.random() * (100 - 2)) + 1; + } + var tw = document.createElement("div"); + tw.id = "fpick-" + uniqueID; + tw.classList.add("tpop"); + tw.dataset.target = target; + tw.addEventListener("click", function (evt) { + if (evt.target.classList.contains("tpop")) { + this.classList.remove("show"); + } + }); + var tp = document.createElement("div"); + tp.classList.add("fpicker"); + tp.appendChild(this.draw("h",t1)); + tp.appendChild(this.draw("m",t2)); + var bottom = document.createElement("div"), + ok = document.createElement("input"); + ok.setAttribute("type", "button"); + ok.value = "OK"; + ok.addEventListener("click", function () { + fpick.set(this); + }); + bottom.classList.add("fpicker-btn"); + bottom.appendChild(ok); + tp.appendChild(bottom); + tw.appendChild(tp); + document.body.appendChild(tw); + var target = document.getElementById(target); + target.dataset.dp = uniqueID; + target.onfocus = function () { + document.getElementById("fpick-" + this.dataset.dp).classList.add("show"); + }; + }, + draw: function (type,tv) { + + var docket = document.createElement("div"), + up = document.createElement("div"), + down = document.createElement("div"), + text = document.createElement("input"); + docket.classList.add("fpicker-" + type); + up.classList.add("fpicker-up"); + down.classList.add("fpicker-down"); + up.innerHTML = "︿"; + down.innerHTML = "﹀"; + text.readOnly = true; + text.setAttribute("type", "text"); + if (type == "h") { + text.value = tv; + up.addEventListener("click", function () { + fpick.spin("h", 1, this); + }); + down.addEventListener("click", function () { + fpick.spin("h", 0, this); + }); + } else if (type == "m") { + text.value = tv; + up.addEventListener("click", function () { + fpick.spin("m", 1, this); + }); + down.addEventListener("click", function () { + fpick.spin("m", 0, this); + }); + } + docket.appendChild(up); + docket.appendChild(text); + docket.appendChild(down); + return docket; + }, + spin: function (type, direction, el) { + var parent = el.parentElement, + field = parent.getElementsByTagName("input")[0], + value = field.value; + if (type == "h") { + value = parseInt(value); + if (direction) { + value++; + } else { + value--; + } + if (value == -41) { + value = 99; + } else if (value > 99) { + value = -40; + } + } else if (type == "m") { + value = parseInt(value); + if (direction) { + value++; + } else { + value--; + } + if (value < 0) { + value = 9; + } else if (value > 9) { + value = 0; + } + } + field.value = value; + }, + set: function (el) { + var parent = el.parentElement; + while (parent.classList.contains("tpop") == false) { + parent = parent.parentElement; + } + var input = parent.querySelectorAll("input[type=text]"); + var temperature = input[0].value + "." + input[1].value; + document.getElementById(parent.dataset.target).value = temperature; + parent.classList.remove("show"); + } +}; +!function (t) { + function n(i) { + if (e[i]) + return e[i].exports; + var o = e[i] = { + i: i, + l: !1, + exports: {} + }; + return t[i].call(o.exports, o, o.exports, n), + o.l = !0, + o.exports + } + var e = {}; + n.m = t, + n.c = e, + n.d = function (t, e, i) { + n.o(t, e) || Object.defineProperty(t, e, { + configurable: !1, + enumerable: !0, + get: i + }) + }, + n.n = function (t) { + var e = t && t.__esModule ? function () { + return t.default + } + : function () { + return t + }; + return n.d(e, "a", e), + e + }, + n.o = function (t, n) { + return Object.prototype.hasOwnProperty.call(t, n) + }, + n.p = "", + n(n.s = 0) +} +([function (t, n, e) { + e(1), + t.exports = e(4) + }, function (t, n, e) { + "use strict"; + var i = Object.assign || function (t) { + for (var n = 1; n < arguments.length; n++) { + var e = arguments[n]; + for (var i in e) + Object.prototype.hasOwnProperty.call(e, i) && (t[i] = e[i]) + } + return t + }; + e(2); + var o = e(3); + !function (t) { + function n(t) { + return t = i({}, c, t), + function (t) { + return ["nfc-top-left", "nfc-top-right", "nfc-bottom-left", "nfc-bottom-right"].indexOf(t) > -1 + } + (t.positionClass) || (console.warn("An invalid notification position class has been specified."), t.positionClass = c.positionClass), + t.onclick && "function" != typeof t.onclick && (console.warn("Notification on click must be a function."), t.onclick = c.onclick), + "number" != typeof t.showDuration && (t.showDuration = c.showDuration), + (0, o.isString)(t.theme) && 0 !== t.theme.length || (console.warn("Notification theme must be a string with length"), t.theme = c.theme), + t + } + function e(t) { + return t = n(t), + function () { + var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, + e = n.title, + i = n.message, + c = r(t.positionClass); + if (!e && !i) + return console.warn("Notification must contain a title or a message!"); + var a = (0, o.createElement)("div", "ncf", t.theme); + if (!0 === t.closeOnClick && a.addEventListener("click", function () { + return c.removeChild(a) + }), t.onclick && a.addEventListener("click", function (n) { + return t.onclick(n) + }), t.displayCloseButton) { + var s = (0, o.createElement)("button"); + s.innerText = "X", + !1 === t.closeOnClick && s.addEventListener("click", function () { + return c.removeChild(a) + }), + (0, o.append)(a, s) + } + if ((0, o.isString)(e) && e.length && (0, o.append)(a, (0, o.createParagraph)("ncf-title")(e)), (0, o.isString)(i) && i.length && (0, o.append)(a, (0, o.createParagraph)("nfc-message")(i)), (0, o.append)(c, a), t.showDuration && t.showDuration > 0) { + var l = setTimeout(function () { + c.removeChild(a), + 0 === c.querySelectorAll(".ncf").length && document.body.removeChild(c) + }, t.showDuration); + (t.closeOnClick || t.displayCloseButton) && a.addEventListener("click", function () { + return clearTimeout(l) + }) + } + } + } + function r(t) { + var n = document.querySelector("." + t); + return n || (n = (0, o.createElement)("div", "ncf-container", t), (0, o.append)(document.body, n)), + n + } + var c = { + closeOnClick: !0, + displayCloseButton: !1, + positionClass: "nfc-top-right", + onclick: !1, + showDuration: 3500, + theme: "success" + }; + t.createNotification ? console.warn("Window already contains a create notification function. Have you included the script twice?") : t.createNotification = e + } + (window) + }, function (t, n, e) { + "use strict"; + !function () { + function t(t) { + this.el = t; + for (var n = t.className.replace(/^\s+|\s+$/g, "").split(/\s+/), i = 0; i < n.length; i++) + e.call(this, n[i]) + } + if (!(void 0 === window.Element || "classList" in document.documentElement)) { + var n = Array.prototype, + e = n.push, + i = n.splice, + o = n.join; + t.prototype = { + add: function (t) { + this.contains(t) || (e.call(this, t), this.el.className = this.toString()) + }, + contains: function (t) { + return -1 != this.el.className.indexOf(t) + }, + item: function (t) { + return this[t] || null + }, + remove: function (t) { + if (this.contains(t)) { + for (var n = 0; n < this.length && this[n] != t; n++); + i.call(this, n, 1), + this.el.className = this.toString() + } + }, + toString: function () { + return o.call(this, " ") + }, + toggle: function (t) { + return this.contains(t) ? this.remove(t) : this.add(t), + this.contains(t) + } + }, + window.DOMTokenList = t, + function (t, n, e) { + Object.defineProperty ? Object.defineProperty(t, n, { + get: e + }) : t.__defineGetter__(n, e) + } + (Element.prototype, "classList", function () { + return new t(this) + }) + } + } + () + }, function (t, n, e) { + "use strict"; + Object.defineProperty(n, "__esModule", { + value: !0 + }); + var i = n.partial = function (t) { + for (var n = arguments.length, e = Array(n > 1 ? n - 1 : 0), i = 1; i < n; i++) + e[i - 1] = arguments[i]; + return function () { + for (var n = arguments.length, i = Array(n), o = 0; o < n; o++) + i[o] = arguments[o]; + return t.apply(void 0, e.concat(i)) + } + }, + o = (n.append = function (t) { + for (var n = arguments.length, e = Array(n > 1 ? n - 1 : 0), i = 1; i < n; i++) + e[i - 1] = arguments[i]; + return e.forEach(function (n) { + return t.appendChild(n) + }) + }, n.isString = function (t) { + return "string" == typeof t + }, n.createElement = function (t) { + for (var n = arguments.length, e = Array(n > 1 ? n - 1 : 0), i = 1; i < n; i++) + e[i - 1] = arguments[i]; + var o = document.createElement(t); + return e.length && e.forEach(function (t) { + return o.classList.add(t) + }), + o + }), + r = function (t, n) { + return t.innerText = n, + t + }, + c = function (t) { + for (var n = arguments.length, e = Array(n > 1 ? n - 1 : 0), c = 1; c < n; c++) + e[c - 1] = arguments[c]; + return i(r, o.apply(void 0, [t].concat(e))) + }; + n.createParagraph = function () { + for (var t = arguments.length, n = Array(t), e = 0; e < t; e++) + n[e] = arguments[e]; + return c.apply(void 0, ["p"].concat(n)) + } + }, function (t, n) {} + ]); +!function (a, b) { + "function" == typeof define && define.amd ? define("eve", function () { + return b() + }) : "object" == typeof exports ? module.exports = b() : a.eve = b() +} +(this, function () { + var a, + b, + c = "0.4.2", + d = "hasOwnProperty", + e = /[\.\/]/, + f = "*", + g = function () {}, + h = function (a, b) { + return a - b + }, + i = { + n: {} + }, + j = function (c, d) { + c = String(c); + var e, + f = b, + g = Array.prototype.slice.call(arguments, 2), + i = j.listeners(c), + k = 0, + l = [], + m = {}, + n = [], + o = a; + a = c, + b = 0; + for (var p = 0, q = i.length; q > p; p++) + "zIndex" in i[p] && (l.push(i[p].zIndex), i[p].zIndex < 0 && (m[i[p].zIndex] = i[p])); + for (l.sort(h); l[k] < 0; ) + if (e = m[l[k++]], n.push(e.apply(d, g)), b) + return b = f, n; + for (p = 0; q > p; p++) + if (e = i[p], "zIndex" in e) + if (e.zIndex == l[k]) { + if (n.push(e.apply(d, g)), b) + break; + do + if (k++, e = m[l[k]], e && n.push(e.apply(d, g)), b) + break; + while (e) + } else + m[e.zIndex] = e; + else if (n.push(e.apply(d, g)), b) + break; + return b = f, + a = o, + n.length ? n : null + }; + return j._events = i, + j.listeners = function (a) { + var b, + c, + d, + g, + h, + j, + k, + l, + m = a.split(e), + n = i, + o = [n], + p = []; + for (g = 0, h = m.length; h > g; g++) { + for (l = [], j = 0, k = o.length; k > j; j++) + for (n = o[j].n, c = [n[m[g]], n[f]], d = 2; d--; ) + b = c[d], b && (l.push(b), p = p.concat(b.f || [])); + o = l + } + return p + }, + j.on = function (a, b) { + if (a = String(a), "function" != typeof b) + return function () {}; + for (var c = a.split(e), d = i, f = 0, h = c.length; h > f; f++) + d = d.n, d = d.hasOwnProperty(c[f]) && d[c[f]] || (d[c[f]] = { + n: {} + }); + for (d.f = d.f || [], f = 0, h = d.f.length; h > f; f++) + if (d.f[f] == b) + return g; + return d.f.push(b), + function (a) { + +a == +a && (b.zIndex = +a) + } + }, + j.f = function (a) { + var b = [].slice.call(arguments, 1); + return function () { + j.apply(null, [a, null].concat(b).concat([].slice.call(arguments, 0))) + } + }, + j.stop = function () { + b = 1 + }, + j.nt = function (b) { + return b ? new RegExp("(?:\\.|\\/|^)" + b + "(?:\\.|\\/|$)").test(a) : a + }, + j.nts = function () { + return a.split(e) + }, + j.off = j.unbind = function (a, b) { + if (!a) + return void(j._events = i = { + n: {} + }); + var c, + g, + h, + k, + l, + m, + n, + o = a.split(e), + p = [i]; + for (k = 0, l = o.length; l > k; k++) + for (m = 0; m < p.length; m += h.length - 2) { + if (h = [m, 1], c = p[m].n, o[k] != f) + c[o[k]] && h.push(c[o[k]]); + else + for (g in c) + c[d](g) && h.push(c[g]); + p.splice.apply(p, h) + } + for (k = 0, l = p.length; l > k; k++) + for (c = p[k]; c.n; ) { + if (b) { + if (c.f) { + for (m = 0, n = c.f.length; n > m; m++) + if (c.f[m] == b) { + c.f.splice(m, 1); + break + } + !c.f.length && delete c.f + } + for (g in c.n) + if (c.n[d](g) && c.n[g].f) { + var q = c.n[g].f; + for (m = 0, n = q.length; n > m; m++) + if (q[m] == b) { + q.splice(m, 1); + break + } + !q.length && delete c.n[g].f + } + } else { + delete c.f; + for (g in c.n) + c.n[d](g) && c.n[g].f && delete c.n[g].f + } + c = c.n + } + }, + j.once = function (a, b) { + var c = function () { + return j.unbind(a, c), + b.apply(this, arguments) + }; + return j.on(a, c) + }, + j.version = c, + j.toString = function () { + return "You are running Eve " + c + }, + j +}), function (a, b) { + "function" == typeof define && define.amd ? define("raphael.core", ["eve"], function (a) { + return b(a) + }) : "object" == typeof exports ? module.exports = b(require("eve")) : a.Raphael = b(a.eve) +} +(this, function (a) { + function b(c) { + if (b.is(c, "function")) + return t ? c() : a.on("raphael.DOMload", c); + if (b.is(c, U)) + return b._engine.create[C](b, c.splice(0, 3 + b.is(c[0], S))).add(c); + var d = Array.prototype.slice.call(arguments, 0); + if (b.is(d[d.length - 1], "function")) { + var e = d.pop(); + return t ? e.call(b._engine.create[C](b, d)) : a.on("raphael.DOMload", function () { + e.call(b._engine.create[C](b, d)) + }) + } + return b._engine.create[C](b, arguments) + } + function c(a) { + if ("function" == typeof a || Object(a) !== a) + return a; + var b = new a.constructor; + for (var d in a) + a[y](d) && (b[d] = c(a[d])); + return b + } + function d(a, b) { + for (var c = 0, d = a.length; d > c; c++) + if (a[c] === b) + return a.push(a.splice(c, 1)[0]) + } + function e(a, b, c) { + function e() { + var f = Array.prototype.slice.call(arguments, 0), + g = f.join("␀"), + h = e.cache = e.cache || {}, + i = e.count = e.count || []; + return h[y](g) ? (d(i, g), c ? c(h[g]) : h[g]) : (i.length >= 1e3 && delete h[i.shift()], i.push(g), h[g] = a[C](b, f), c ? c(h[g]) : h[g]) + } + return e + } + function f() { + return this.hex + } + function g(a, b) { + for (var c = [], d = 0, e = a.length; e - 2 * !b > d; d += 2) { + var f = [{ + x: +a[d - 2], + y: +a[d - 1] + }, { + x: +a[d], + y: +a[d + 1] + }, { + x: +a[d + 2], + y: +a[d + 3] + }, { + x: +a[d + 4], + y: +a[d + 5] + } + ]; + b ? d ? e - 4 == d ? f[3] = { + x: +a[0], + y: +a[1] + } + : e - 2 == d && (f[2] = { + x: +a[0], + y: +a[1] + }, f[3] = { + x: +a[2], + y: +a[3] + }) : f[0] = { + x: +a[e - 2], + y: +a[e - 1] + } + : e - 4 == d ? f[3] = f[2] : d || (f[0] = { + x: +a[d], + y: +a[d + 1] + }), + c.push(["C", (-f[0].x + 6 * f[1].x + f[2].x) / 6, (-f[0].y + 6 * f[1].y + f[2].y) / 6, (f[1].x + 6 * f[2].x - f[3].x) / 6, (f[1].y + 6 * f[2].y - f[3].y) / 6, f[2].x, f[2].y]) + } + return c + } + function h(a, b, c, d, e) { + var f = -3 * b + 9 * c - 9 * d + 3 * e, + g = a * f + 6 * b - 12 * c + 6 * d; + return a * g - 3 * b + 3 * c + } + function i(a, b, c, d, e, f, g, i, j) { + null == j && (j = 1), + j = j > 1 ? 1 : 0 > j ? 0 : j; + for (var k = j / 2, l = 12, m = [ - .1252, .1252, - .3678, .3678, - .5873, .5873, - .7699, .7699, - .9041, .9041, - .9816, .9816], n = [.2491, .2491, .2335, .2335, .2032, .2032, .1601, .1601, .1069, .1069, .0472, .0472], o = 0, p = 0; l > p; p++) { + var q = k * m[p] + k, + r = h(q, a, c, e, g), + s = h(q, b, d, f, i), + t = r * r + s * s; + o += n[p] * M.sqrt(t) + } + return k * o + } + function j(a, b, c, d, e, f, g, h, j) { + if (!(0 > j || i(a, b, c, d, e, f, g, h) < j)) { + var k, + l = 1, + m = l / 2, + n = l - m, + o = .01; + for (k = i(a, b, c, d, e, f, g, h, n); P(k - j) > o; ) + m /= 2, n += (j > k ? 1 : -1) * m, k = i(a, b, c, d, e, f, g, h, n); + return n + } + } + function k(a, b, c, d, e, f, g, h) { + if (!(N(a, c) < O(e, g) || O(a, c) > N(e, g) || N(b, d) < O(f, h) || O(b, d) > N(f, h))) { + var i = (a * d - b * c) * (e - g) - (a - c) * (e * h - f * g), + j = (a * d - b * c) * (f - h) - (b - d) * (e * h - f * g), + k = (a - c) * (f - h) - (b - d) * (e - g); + if (k) { + var l = i / k, + m = j / k, + n = +l.toFixed(2), + o = +m.toFixed(2); + if (!(n < +O(a, c).toFixed(2) || n > +N(a, c).toFixed(2) || n < +O(e, g).toFixed(2) || n > +N(e, g).toFixed(2) || o < +O(b, d).toFixed(2) || o > +N(b, d).toFixed(2) || o < +O(f, h).toFixed(2) || o > +N(f, h).toFixed(2))) + return { + x: l, + y: m + } + } + } + } + function l(a, c, d) { + var e = b.bezierBBox(a), + f = b.bezierBBox(c); + if (!b.isBBoxIntersect(e, f)) + return d ? 0 : []; + for (var g = i.apply(0, a), h = i.apply(0, c), j = N(~~(g / 5), 1), l = N(~~(h / 5), 1), m = [], n = [], o = {}, p = d ? 0 : [], q = 0; j + 1 > q; q++) { + var r = b.findDotsAtSegment.apply(b, a.concat(q / j)); + m.push({ + x: r.x, + y: r.y, + t: q / j + }) + } + for (q = 0; l + 1 > q; q++) + r = b.findDotsAtSegment.apply(b, c.concat(q / l)), n.push({ + x: r.x, + y: r.y, + t: q / l + }); + for (q = 0; j > q; q++) + for (var s = 0; l > s; s++) { + var t = m[q], + u = m[q + 1], + v = n[s], + w = n[s + 1], + x = P(u.x - t.x) < .001 ? "y" : "x", + y = P(w.x - v.x) < .001 ? "y" : "x", + z = k(t.x, t.y, u.x, u.y, v.x, v.y, w.x, w.y); + if (z) { + if (o[z.x.toFixed(4)] == z.y.toFixed(4)) + continue; + o[z.x.toFixed(4)] = z.y.toFixed(4); + var A = t.t + P((z[x] - t[x]) / (u[x] - t[x])) * (u.t - t.t), + B = v.t + P((z[y] - v[y]) / (w[y] - v[y])) * (w.t - v.t); + A >= 0 && 1.001 >= A && B >= 0 && 1.001 >= B && (d ? p++ : p.push({ + x: z.x, + y: z.y, + t1: O(A, 1), + t2: O(B, 1) + })) + } + } + return p + } + function m(a, c, d) { + a = b._path2curve(a), + c = b._path2curve(c); + for (var e, f, g, h, i, j, k, m, n, o, p = d ? 0 : [], q = 0, r = a.length; r > q; q++) { + var s = a[q]; + if ("M" == s[0]) + e = i = s[1], f = j = s[2]; + else { + "C" == s[0] ? (n = [e, f].concat(s.slice(1)), e = n[6], f = n[7]) : (n = [e, f, e, f, i, j, i, j], e = i, f = j); + for (var t = 0, u = c.length; u > t; t++) { + var v = c[t]; + if ("M" == v[0]) + g = k = v[1], h = m = v[2]; + else { + "C" == v[0] ? (o = [g, h].concat(v.slice(1)), g = o[6], h = o[7]) : (o = [g, h, g, h, k, m, k, m], g = k, h = m); + var w = l(n, o, d); + if (d) + p += w; + else { + for (var x = 0, y = w.length; y > x; x++) + w[x].segment1 = q, w[x].segment2 = t, w[x].bez1 = n, w[x].bez2 = o; + p = p.concat(w) + } + } + } + } + } + return p + } + function n(a, b, c, d, e, f) { + null != a ? (this.a = +a, this.b = +b, this.c = +c, this.d = +d, this.e = +e, this.f = +f) : (this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0) + } + function o() { + return this.x + G + this.y + G + this.width + " × " + this.height + } + function p(a, b, c, d, e, f) { + function g(a) { + return ((l * a + k) * a + j) * a + } + function h(a, b) { + var c = i(a, b); + return ((o * c + n) * c + m) * c + } + function i(a, b) { + var c, + d, + e, + f, + h, + i; + for (e = a, i = 0; 8 > i; i++) { + if (f = g(e) - a, P(f) < b) + return e; + if (h = (3 * l * e + 2 * k) * e + j, P(h) < 1e-6) + break; + e -= f / h + } + if (c = 0, d = 1, e = a, c > e) + return c; + if (e > d) + return d; + for (; d > c; ) { + if (f = g(e), P(f - a) < b) + return e; + a > f ? c = e : d = e, + e = (d - c) / 2 + c + } + return e + } + var j = 3 * b, + k = 3 * (d - b) - j, + l = 1 - j - k, + m = 3 * c, + n = 3 * (e - c) - m, + o = 1 - m - n; + return h(a, 1 / (200 * f)) + } + function q(a, b) { + var c = [], + d = {}; + if (this.ms = b, this.times = 1, a) { + for (var e in a) + a[y](e) && (d[$(e)] = a[e], c.push($(e))); + c.sort(ka) + } + this.anim = d, + this.top = c[c.length - 1], + this.percents = c + } + function r(c, d, e, f, g, h) { + e = $(e); + var i, + j, + k, + l, + m, + o, + q = c.ms, + r = {}, + s = {}, + t = {}; + if (f) + for (w = 0, x = fb.length; x > w; w++) { + var u = fb[w]; + if (u.el.id == d.id && u.anim == c) { + u.percent != e ? (fb.splice(w, 1), k = 1) : j = u, + d.attr(u.totalOrigin); + break + } + } + else + f = +s; + for (var w = 0, x = c.percents.length; x > w; w++) { + if (c.percents[w] == e || c.percents[w] > f * c.top) { + e = c.percents[w], + m = c.percents[w - 1] || 0, + q = q / c.top * (e - m), + l = c.percents[w + 1], + i = c.anim[e]; + break + } + f && d.attr(c.anim[c.percents[w]]) + } + if (i) { + if (j) + j.initstatus = f, j.start = new Date - j.ms * f; + else { + for (var z in i) + if (i[y](z) && (ca[y](z) || d.paper.customAttributes[y](z))) + switch (r[z] = d.attr(z), null == r[z] && (r[z] = ba[z]), s[z] = i[z], ca[z]) { + case S: + t[z] = (s[z] - r[z]) / q; + break; + case "colour": + r[z] = b.getRGB(r[z]); + var A = b.getRGB(s[z]); + t[z] = { + r: (A.r - r[z].r) / q, + g: (A.g - r[z].g) / q, + b: (A.b - r[z].b) / q + }; + break; + case "path": + var B = Ia(r[z], s[z]), + C = B[1]; + for (r[z] = B[0], t[z] = [], w = 0, x = r[z].length; x > w; w++) { + t[z][w] = [0]; + for (var E = 1, F = r[z][w].length; F > E; E++) + t[z][w][E] = (C[w][E] - r[z][w][E]) / q + } + break; + case "transform": + var G = d._, + J = Na(G[z], s[z]); + if (J) + for (r[z] = J.from, s[z] = J.to, t[z] = [], t[z].real = !0, w = 0, x = r[z].length; x > w; w++) + for (t[z][w] = [r[z][w][0]], E = 1, F = r[z][w].length; F > E; E++) + t[z][w][E] = (s[z][w][E] - r[z][w][E]) / q; + else { + var K = d.matrix || new n, + L = { + _: { + transform: G.transform + }, + getBBox: function () { + return d.getBBox(1) + } + }; + r[z] = [K.a, K.b, K.c, K.d, K.e, K.f], + La(L, s[z]), + s[z] = L._.transform, + t[z] = [(L.matrix.a - K.a) / q, (L.matrix.b - K.b) / q, (L.matrix.c - K.c) / q, (L.matrix.d - K.d) / q, (L.matrix.e - K.e) / q, (L.matrix.f - K.f) / q] + } + break; + case "csv": + var M = H(i[z])[I](v), + N = H(r[z])[I](v); + if ("clip-rect" == z) + for (r[z] = N, t[z] = [], w = N.length; w--; ) + t[z][w] = (M[w] - r[z][w]) / q; + s[z] = M; + break; + default: + for (M = [][D](i[z]), N = [][D](r[z]), t[z] = [], w = d.paper.customAttributes[z].length; w--; ) + t[z][w] = ((M[w] || 0) - (N[w] || 0)) / q + } + var O = i.easing, + P = b.easing_formulas[O]; + if (!P) + if (P = H(O).match(Y), P && 5 == P.length) { + var Q = P; + P = function (a) { + return p(a, +Q[1], +Q[2], +Q[3], +Q[4], q) + } + } else + P = la; + if (o = i.start || c.start || +new Date, u = { + anim: c, + percent: e, + timestamp: o, + start: o + (c.del || 0), + status: 0, + initstatus: f || 0, + stop: !1, + ms: q, + easing: P, + from: r, + diff: t, + to: s, + el: d, + callback: i.callback, + prev: m, + next: l, + repeat: h || c.times, + origin: d.attr(), + totalOrigin: g + }, fb.push(u), f && !j && !k && (u.stop = !0, u.start = new Date - q * f, 1 == fb.length)) + return hb(); + k && (u.start = new Date - u.ms * f), + 1 == fb.length && gb(hb) + } + a("raphael.anim.start." + d.id, d, c) + } + } + function s(a) { + for (var b = 0; b < fb.length; b++) + fb[b].el.paper == a && fb.splice(b--, 1) + } + b.version = "2.1.4", + b.eve = a; + var t, + u, + v = /[, ]+/, + w = { + circle: 1, + rect: 1, + path: 1, + ellipse: 1, + text: 1, + image: 1 + }, + x = /\{(\d+)\}/g, + y = "hasOwnProperty", + z = { + doc: document, + win: window + }, + A = { + was: Object.prototype[y].call(z.win, "Raphael"), + is: z.win.Raphael + }, + B = function () { + this.ca = this.customAttributes = {} + }, + C = "apply", + D = "concat", + E = "ontouchstart" in z.win || z.win.DocumentTouch && z.doc instanceof DocumentTouch, + F = "", + G = " ", + H = String, + I = "split", + J = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[I](G), + K = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + L = H.prototype.toLowerCase, + M = Math, + N = M.max, + O = M.min, + P = M.abs, + Q = M.pow, + R = M.PI, + S = "number", + T = "string", + U = "array", + V = Object.prototype.toString, + W = (b._ISURL = /^url\(['"]?(.+?)['"]?\)$/i, /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i), + X = { + NaN: 1, + Infinity: 1, + "-Infinity": 1 + }, + Y = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + Z = M.round, + $ = parseFloat, + _ = parseInt, + aa = H.prototype.toUpperCase, + ba = b._availableAttrs = { + "arrow-end": "none", + "arrow-start": "none", + blur: 0, + "clip-rect": "0 0 1e9 1e9", + cursor: "default", + cx: 0, + cy: 0, + fill: "#fff", + "fill-opacity": 1, + font: '10px "Arial"', + "font-family": '"Arial"', + "font-size": "10", + "font-style": "normal", + "font-weight": 400, + gradient: 0, + height: 0, + href: "http://raphaeljs.com/", + "letter-spacing": 0, + opacity: 1, + path: "M0,0", + r: 0, + rx: 0, + ry: 0, + src: "", + stroke: "#000", + "stroke-dasharray": "", + "stroke-linecap": "butt", + "stroke-linejoin": "butt", + "stroke-miterlimit": 0, + "stroke-opacity": 1, + "stroke-width": 1, + target: "_blank", + "text-anchor": "middle", + title: "Raphael", + transform: "", + width: 0, + x: 0, + y: 0 + }, + ca = b._availableAnimAttrs = { + blur: S, + "clip-rect": "csv", + cx: S, + cy: S, + fill: "colour", + "fill-opacity": S, + "font-size": S, + height: S, + opacity: S, + path: "path", + r: S, + rx: S, + ry: S, + stroke: "colour", + "stroke-opacity": S, + "stroke-width": S, + transform: "transform", + width: S, + x: S, + y: S + }, + da = /[\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]*,[\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]*/, + ea = { + hs: 1, + rg: 1 + }, + fa = /,?([achlmqrstvxz]),?/gi, + ga = /([achlmrqstvz])[\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,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\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]*,?[\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]*)+)/gi, + ha = /([rstm])[\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,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\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]*,?[\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]*)+)/gi, + ia = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\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]*,?[\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]*/gi, + ja = (b._radial_gradient = /^r(?:\(([^,]+?)[\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]*,[\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]*([^\)]+?)\))?/, {}), + ka = function (a, b) { + return $(a) - $(b) + }, + la = function (a) { + return a + }, + ma = b._rectPath = function (a, b, c, d, e) { + return e ? [["M", a + e, b], ["l", c - 2 * e, 0], ["a", e, e, 0, 0, 1, e, e], ["l", 0, d - 2 * e], ["a", e, e, 0, 0, 1, -e, e], ["l", 2 * e - c, 0], ["a", e, e, 0, 0, 1, -e, -e], ["l", 0, 2 * e - d], ["a", e, e, 0, 0, 1, e, -e], ["z"]] : [["M", a, b], ["l", c, 0], ["l", 0, d], ["l", -c, 0], ["z"]] + }, + na = function (a, b, c, d) { + return null == d && (d = c), + [["M", a, b], ["m", 0, -d], ["a", c, d, 0, 1, 1, 0, 2 * d], ["a", c, d, 0, 1, 1, 0, -2 * d], ["z"]] + }, + oa = b._getPath = { + path: function (a) { + return a.attr("path") + }, + circle: function (a) { + var b = a.attrs; + return na(b.cx, b.cy, b.r) + }, + ellipse: function (a) { + var b = a.attrs; + return na(b.cx, b.cy, b.rx, b.ry) + }, + rect: function (a) { + var b = a.attrs; + return ma(b.x, b.y, b.width, b.height, b.r) + }, + image: function (a) { + var b = a.attrs; + return ma(b.x, b.y, b.width, b.height) + }, + text: function (a) { + var b = a._getBBox(); + return ma(b.x, b.y, b.width, b.height) + }, + set: function (a) { + var b = a._getBBox(); + return ma(b.x, b.y, b.width, b.height) + } + }, + pa = b.mapPath = function (a, b) { + if (!b) + return a; + var c, + d, + e, + f, + g, + h, + i; + for (a = Ia(a), e = 0, g = a.length; g > e; e++) + for (i = a[e], f = 1, h = i.length; h > f; f += 2) + c = b.x(i[f], i[f + 1]), d = b.y(i[f], i[f + 1]), i[f] = c, i[f + 1] = d; + return a + }; + if (b._g = z, b.type = z.win.SVGAngle || z.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML", "VML" == b.type) { + var qa, + ra = z.doc.createElement("div"); + if (ra.innerHTML = '', qa = ra.firstChild, qa.style.behavior = "url(#default#VML)", !qa || "object" != typeof qa.adj) + return b.type = F; + ra = null + } + b.svg = !(b.vml = "VML" == b.type), + b._Paper = B, + b.fn = u = B.prototype = b.prototype, + b._id = 0, + b._oid = 0, + b.is = function (a, b) { + return b = L.call(b), + "finite" == b ? !X[y](+a) : "array" == b ? a instanceof Array : "null" == b && null === a || b == typeof a && null !== a || "object" == b && a === Object(a) || "array" == b && Array.isArray && Array.isArray(a) || V.call(a).slice(8, -1).toLowerCase() == b + }, + b.angle = function (a, c, d, e, f, g) { + if (null == f) { + var h = a - d, + i = c - e; + return h || i ? (180 + 180 * M.atan2(-i, -h) / R + 360) % 360 : 0 + } + return b.angle(a, c, f, g) - b.angle(d, e, f, g) + }, + b.rad = function (a) { + return a % 360 * R / 180 + }, + b.deg = function (a) { + return Math.round(180 * a / R % 360 * 1e3) / 1e3 + }, + b.snapTo = function (a, c, d) { + if (d = b.is(d, "finite") ? d : 10, b.is(a, U)) { + for (var e = a.length; e--; ) + if (P(a[e] - c) <= d) + return a[e] + } else { + a = +a; + var f = c % a; + if (d > f) + return c - f; + if (f > a - d) + return c - f + a + } + return c + }; + b.createUUID = function (a, b) { + return function () { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a, b).toUpperCase() + } + } + (/[xy]/g, function (a) { + var b = 16 * M.random() | 0, + c = "x" == a ? b : 3 & b | 8; + return c.toString(16) + }); + b.setWindow = function (c) { + a("raphael.setWindow", b, z.win, c), + z.win = c, + z.doc = z.win.document, + b._engine.initWin && b._engine.initWin(z.win) + }; + var sa = function (a) { + if (b.vml) { + var c, + d = /^\s+|\s+$/g; + try { + var f = new ActiveXObject("htmlfile"); + f.write(""), + f.close(), + c = f.body + } catch (g) { + c = createPopup().document.body + } + var h = c.createTextRange(); + sa = e(function (a) { + try { + c.style.color = H(a).replace(d, F); + var b = h.queryCommandValue("ForeColor"); + return b = (255 & b) << 16 | 65280 & b | (16711680 & b) >>> 16, + "#" + ("000000" + b.toString(16)).slice(-6) + } catch (e) { + return "none" + } + }) + } else { + var i = z.doc.createElement("i"); + i.title = "Raphaël Colour Picker", + i.style.display = "none", + z.doc.body.appendChild(i), + sa = e(function (a) { + return i.style.color = a, + z.doc.defaultView.getComputedStyle(i, F).getPropertyValue("color") + }) + } + return sa(a) + }, + ta = function () { + return "hsb(" + [this.h, this.s, this.b] + ")" + }, + ua = function () { + return "hsl(" + [this.h, this.s, this.l] + ")" + }, + va = function () { + return this.hex + }, + wa = function (a, c, d) { + if (null == c && b.is(a, "object") && "r" in a && "g" in a && "b" in a && (d = a.b, c = a.g, a = a.r), null == c && b.is(a, T)) { + var e = b.getRGB(a); + a = e.r, + c = e.g, + d = e.b + } + return (a > 1 || c > 1 || d > 1) && (a /= 255, c /= 255, d /= 255), + [a, c, d] + }, + xa = function (a, c, d, e) { + a *= 255, + c *= 255, + d *= 255; + var f = { + r: a, + g: c, + b: d, + hex: b.rgb(a, c, d), + toString: va + }; + return b.is(e, "finite") && (f.opacity = e), + f + }; + b.color = function (a) { + var c; + return b.is(a, "object") && "h" in a && "s" in a && "b" in a ? (c = b.hsb2rgb(a), a.r = c.r, a.g = c.g, a.b = c.b, a.hex = c.hex) : b.is(a, "object") && "h" in a && "s" in a && "l" in a ? (c = b.hsl2rgb(a), a.r = c.r, a.g = c.g, a.b = c.b, a.hex = c.hex) : (b.is(a, "string") && (a = b.getRGB(a)), b.is(a, "object") && "r" in a && "g" in a && "b" in a ? (c = b.rgb2hsl(a), a.h = c.h, a.s = c.s, a.l = c.l, c = b.rgb2hsb(a), a.v = c.b) : (a = { + hex: "none" + }, a.r = a.g = a.b = a.h = a.s = a.v = a.l = -1)), + a.toString = va, + a + }, + b.hsb2rgb = function (a, b, c, d) { + this.is(a, "object") && "h" in a && "s" in a && "b" in a && (c = a.b, b = a.s, d = a.o, a = a.h), + a *= 360; + var e, + f, + g, + h, + i; + return a = a % 360 / 60, + i = c * b, + h = i * (1 - P(a % 2 - 1)), + e = f = g = c - i, + a = ~~a, + e += [i, h, 0, 0, h, i][a], + f += [h, i, i, h, 0, 0][a], + g += [0, 0, h, i, i, h][a], + xa(e, f, g, d) + }, + b.hsl2rgb = function (a, b, c, d) { + this.is(a, "object") && "h" in a && "s" in a && "l" in a && (c = a.l, b = a.s, a = a.h), + (a > 1 || b > 1 || c > 1) && (a /= 360, b /= 100, c /= 100), + a *= 360; + var e, + f, + g, + h, + i; + return a = a % 360 / 60, + i = 2 * b * (.5 > c ? c : 1 - c), + h = i * (1 - P(a % 2 - 1)), + e = f = g = c - i / 2, + a = ~~a, + e += [i, h, 0, 0, h, i][a], + f += [h, i, i, h, 0, 0][a], + g += [0, 0, h, i, i, h][a], + xa(e, f, g, d) + }, + b.rgb2hsb = function (a, b, c) { + c = wa(a, b, c), + a = c[0], + b = c[1], + c = c[2]; + var d, + e, + f, + g; + return f = N(a, b, c), + g = f - O(a, b, c), + d = 0 == g ? null : f == a ? (b - c) / g : f == b ? (c - a) / g + 2 : (a - b) / g + 4, + d = (d + 360) % 6 * 60 / 360, + e = 0 == g ? 0 : g / f, { + h: d, + s: e, + b: f, + toString: ta + } + }, + b.rgb2hsl = function (a, b, c) { + c = wa(a, b, c), + a = c[0], + b = c[1], + c = c[2]; + var d, + e, + f, + g, + h, + i; + return g = N(a, b, c), + h = O(a, b, c), + i = g - h, + d = 0 == i ? null : g == a ? (b - c) / i : g == b ? (c - a) / i + 2 : (a - b) / i + 4, + d = (d + 360) % 6 * 60 / 360, + f = (g + h) / 2, + e = 0 == i ? 0 : .5 > f ? i / (2 * f) : i / (2 - 2 * f), { + h: d, + s: e, + l: f, + toString: ua + } + }, + b._path2string = function () { + return this.join(",").replace(fa, "$1") + }; + b._preload = function (a, b) { + var c = z.doc.createElement("img"); + c.style.cssText = "position:absolute;left:-9999em;top:-9999em", + c.onload = function () { + b.call(this), + this.onload = null, + z.doc.body.removeChild(this) + }, + c.onerror = function () { + z.doc.body.removeChild(this) + }, + z.doc.body.appendChild(c), + c.src = a + }; + b.getRGB = e(function (a) { + if (!a || (a = H(a)).indexOf("-") + 1) + return { + r: -1, + g: -1, + b: -1, + hex: "none", + error: 1, + toString: f + }; + if ("none" == a) + return { + r: -1, + g: -1, + b: -1, + hex: "none", + toString: f + }; + !(ea[y](a.toLowerCase().substring(0, 2)) || "#" == a.charAt()) && (a = sa(a)); + var c, + d, + e, + g, + h, + i, + j = a.match(W); + return j ? (j[2] && (e = _(j[2].substring(5), 16), d = _(j[2].substring(3, 5), 16), c = _(j[2].substring(1, 3), 16)), j[3] && (e = _((h = j[3].charAt(3)) + h, 16), d = _((h = j[3].charAt(2)) + h, 16), c = _((h = j[3].charAt(1)) + h, 16)), j[4] && (i = j[4][I](da), c = $(i[0]), "%" == i[0].slice(-1) && (c *= 2.55), d = $(i[1]), "%" == i[1].slice(-1) && (d *= 2.55), e = $(i[2]), "%" == i[2].slice(-1) && (e *= 2.55), "rgba" == j[1].toLowerCase().slice(0, 4) && (g = $(i[3])), i[3] && "%" == i[3].slice(-1) && (g /= 100)), j[5] ? (i = j[5][I](da), c = $(i[0]), "%" == i[0].slice(-1) && (c *= 2.55), d = $(i[1]), "%" == i[1].slice(-1) && (d *= 2.55), e = $(i[2]), "%" == i[2].slice(-1) && (e *= 2.55), ("deg" == i[0].slice(-3) || "°" == i[0].slice(-1)) && (c /= 360), "hsba" == j[1].toLowerCase().slice(0, 4) && (g = $(i[3])), i[3] && "%" == i[3].slice(-1) && (g /= 100), b.hsb2rgb(c, d, e, g)) : j[6] ? (i = j[6][I](da), c = $(i[0]), "%" == i[0].slice(-1) && (c *= 2.55), d = $(i[1]), "%" == i[1].slice(-1) && (d *= 2.55), e = $(i[2]), "%" == i[2].slice(-1) && (e *= 2.55), ("deg" == i[0].slice(-3) || "°" == i[0].slice(-1)) && (c /= 360), "hsla" == j[1].toLowerCase().slice(0, 4) && (g = $(i[3])), i[3] && "%" == i[3].slice(-1) && (g /= 100), b.hsl2rgb(c, d, e, g)) : (j = { + r: c, + g: d, + b: e, + toString: f + }, j.hex = "#" + (16777216 | e | d << 8 | c << 16).toString(16).slice(1), b.is(g, "finite") && (j.opacity = g), j)) : { + r: -1, + g: -1, + b: -1, + hex: "none", + error: 1, + toString: f + } + }, b), + b.hsb = e(function (a, c, d) { + return b.hsb2rgb(a, c, d).hex + }), + b.hsl = e(function (a, c, d) { + return b.hsl2rgb(a, c, d).hex + }), + b.rgb = e(function (a, b, c) { + function d(a) { + return a + .5 | 0 + } + return "#" + (16777216 | d(c) | d(b) << 8 | d(a) << 16).toString(16).slice(1) + }), + b.getColor = function (a) { + var b = this.getColor.start = this.getColor.start || { + h: 0, + s: 1, + b: a || .75 + }, + c = this.hsb2rgb(b.h, b.s, b.b); + return b.h += .075, + b.h > 1 && (b.h = 0, b.s -= .2, b.s <= 0 && (this.getColor.start = { + h: 0, + s: 1, + b: b.b + })), + c.hex + }, + b.getColor.reset = function () { + delete this.start + }, + b.parsePathString = function (a) { + if (!a) + return null; + var c = ya(a); + if (c.arr) + return Aa(c.arr); + var d = { + a: 7, + c: 6, + h: 1, + l: 2, + m: 2, + r: 4, + q: 4, + s: 4, + t: 2, + v: 1, + z: 0 + }, + e = []; + return b.is(a, U) && b.is(a[0], U) && (e = Aa(a)), + e.length || H(a).replace(ga, function (a, b, c) { + var f = [], + g = b.toLowerCase(); + if (c.replace(ia, function (a, b) { + b && f.push(+b) + }), "m" == g && f.length > 2 && (e.push([b][D](f.splice(0, 2))), g = "l", b = "m" == b ? "l" : "L"), "r" == g) + e.push([b][D](f)); + else + for (; f.length >= d[g] && (e.push([b][D](f.splice(0, d[g]))), d[g]); ); + }), + e.toString = b._path2string, + c.arr = Aa(e), + e + }, + b.parseTransformString = e(function (a) { + if (!a) + return null; + var c = []; + return b.is(a, U) && b.is(a[0], U) && (c = Aa(a)), + c.length || H(a).replace(ha, function (a, b, d) { { + var e = []; + L.call(b) + } + d.replace(ia, function (a, b) { + b && e.push(+b) + }), + c.push([b][D](e)) + }), + c.toString = b._path2string, + c + }); + var ya = function (a) { + var b = ya.ps = ya.ps || {}; + return b[a] ? b[a].sleep = 100 : b[a] = { + sleep: 100 + }, + setTimeout(function () { + for (var c in b) + b[y](c) && c != a && (b[c].sleep--, !b[c].sleep && delete b[c]) + }), + b[a] + }; + b.findDotsAtSegment = function (a, b, c, d, e, f, g, h, i) { + var j = 1 - i, + k = Q(j, 3), + l = Q(j, 2), + m = i * i, + n = m * i, + o = k * a + 3 * l * i * c + 3 * j * i * i * e + n * g, + p = k * b + 3 * l * i * d + 3 * j * i * i * f + n * h, + q = a + 2 * i * (c - a) + m * (e - 2 * c + a), + r = b + 2 * i * (d - b) + m * (f - 2 * d + b), + s = c + 2 * i * (e - c) + m * (g - 2 * e + c), + t = d + 2 * i * (f - d) + m * (h - 2 * f + d), + u = j * a + i * c, + v = j * b + i * d, + w = j * e + i * g, + x = j * f + i * h, + y = 90 - 180 * M.atan2(q - s, r - t) / R; + return (q > s || t > r) && (y += 180), { + x: o, + y: p, + m: { + x: q, + y: r + }, + n: { + x: s, + y: t + }, + start: { + x: u, + y: v + }, + end: { + x: w, + y: x + }, + alpha: y + } + }, + b.bezierBBox = function (a, c, d, e, f, g, h, i) { + b.is(a, "array") || (a = [a, c, d, e, f, g, h, i]); + var j = Ha.apply(null, a); + return { + x: j.min.x, + y: j.min.y, + x2: j.max.x, + y2: j.max.y, + width: j.max.x - j.min.x, + height: j.max.y - j.min.y + } + }, + b.isPointInsideBBox = function (a, b, c) { + return b >= a.x && b <= a.x2 && c >= a.y && c <= a.y2 + }, + b.isBBoxIntersect = function (a, c) { + var d = b.isPointInsideBBox; + return d(c, a.x, a.y) || d(c, a.x2, a.y) || d(c, a.x, a.y2) || d(c, a.x2, a.y2) || d(a, c.x, c.y) || d(a, c.x2, c.y) || d(a, c.x, c.y2) || d(a, c.x2, c.y2) || (a.x < c.x2 && a.x > c.x || c.x < a.x2 && c.x > a.x) && (a.y < c.y2 && a.y > c.y || c.y < a.y2 && c.y > a.y) + }, + b.pathIntersection = function (a, b) { + return m(a, b) + }, + b.pathIntersectionNumber = function (a, b) { + return m(a, b, 1) + }, + b.isPointInsidePath = function (a, c, d) { + var e = b.pathBBox(a); + return b.isPointInsideBBox(e, c, d) && m(a, [["M", c, d], ["H", e.x2 + 10]], 1) % 2 == 1 + }, + b._removedFactory = function (b) { + return function () { + a("raphael.log", null, "Raphaël: you are calling to method “" + b + "” of removed object", b) + } + }; + var za = b.pathBBox = function (a) { + var b = ya(a); + if (b.bbox) + return c(b.bbox); + if (!a) + return { + x: 0, + y: 0, + width: 0, + height: 0, + x2: 0, + y2: 0 + }; + a = Ia(a); + for (var d, e = 0, f = 0, g = [], h = [], i = 0, j = a.length; j > i; i++) + if (d = a[i], "M" == d[0]) + e = d[1], f = d[2], g.push(e), h.push(f); + else { + var k = Ha(e, f, d[1], d[2], d[3], d[4], d[5], d[6]); + g = g[D](k.min.x, k.max.x), + h = h[D](k.min.y, k.max.y), + e = d[5], + f = d[6] + } + var l = O[C](0, g), + m = O[C](0, h), + n = N[C](0, g), + o = N[C](0, h), + p = n - l, + q = o - m, + r = { + x: l, + y: m, + x2: n, + y2: o, + width: p, + height: q, + cx: l + p / 2, + cy: m + q / 2 + }; + return b.bbox = c(r), + r + }, + Aa = function (a) { + var d = c(a); + return d.toString = b._path2string, + d + }, + Ba = b._pathToRelative = function (a) { + var c = ya(a); + if (c.rel) + return Aa(c.rel); + b.is(a, U) && b.is(a && a[0], U) || (a = b.parsePathString(a)); + var d = [], + e = 0, + f = 0, + g = 0, + h = 0, + i = 0; + "M" == a[0][0] && (e = a[0][1], f = a[0][2], g = e, h = f, i++, d.push(["M", e, f])); + for (var j = i, k = a.length; k > j; j++) { + var l = d[j] = [], + m = a[j]; + if (m[0] != L.call(m[0])) + switch (l[0] = L.call(m[0]), l[0]) { + case "a": + l[1] = m[1], + l[2] = m[2], + l[3] = m[3], + l[4] = m[4], + l[5] = m[5], + l[6] = + (m[6] - e).toFixed(3), + l[7] = + (m[7] - f).toFixed(3); + break; + case "v": + l[1] = + (m[1] - f).toFixed(3); + break; + case "m": + g = m[1], + h = m[2]; + default: + for (var n = 1, o = m.length; o > n; n++) + l[n] = + (m[n] - (n % 2 ? e : f)).toFixed(3) + } + else { + l = d[j] = [], + "m" == m[0] && (g = m[1] + e, h = m[2] + f); + for (var p = 0, q = m.length; q > p; p++) + d[j][p] = m[p] + } + var r = d[j].length; + switch (d[j][0]) { + case "z": + e = g, + f = h; + break; + case "h": + e += +d[j][r - 1]; + break; + case "v": + f += +d[j][r - 1]; + break; + default: + e += +d[j][r - 2], + f += +d[j][r - 1] + } + } + return d.toString = b._path2string, + c.rel = Aa(d), + d + }, + Ca = b._pathToAbsolute = function (a) { + var c = ya(a); + if (c.abs) + return Aa(c.abs); + if (b.is(a, U) && b.is(a && a[0], U) || (a = b.parsePathString(a)), !a || !a.length) + return [["M", 0, 0]]; + var d = [], + e = 0, + f = 0, + h = 0, + i = 0, + j = 0; + "M" == a[0][0] && (e = +a[0][1], f = +a[0][2], h = e, i = f, j++, d[0] = ["M", e, f]); + for (var k, l, m = 3 == a.length && "M" == a[0][0] && "R" == a[1][0].toUpperCase() && "Z" == a[2][0].toUpperCase(), n = j, o = a.length; o > n; n++) { + if (d.push(k = []), l = a[n], l[0] != aa.call(l[0])) + switch (k[0] = aa.call(l[0]), k[0]) { + case "A": + k[1] = l[1], + k[2] = l[2], + k[3] = l[3], + k[4] = l[4], + k[5] = l[5], + k[6] = + (l[6] + e), + k[7] = + (l[7] + f); + break; + case "V": + k[1] = +l[1] + f; + break; + case "H": + k[1] = +l[1] + e; + break; + case "R": + for (var p = [e, f][D](l.slice(1)), q = 2, r = p.length; r > q; q++) + p[q] = +p[q] + e, p[++q] = +p[q] + f; + d.pop(), + d = d[D](g(p, m)); + break; + case "M": + h = +l[1] + e, + i = +l[2] + f; + default: + for (q = 1, r = l.length; r > q; q++) + k[q] = +l[q] + (q % 2 ? e : f) + } + else if ("R" == l[0]) + p = [e, f][D](l.slice(1)), d.pop(), d = d[D](g(p, m)), k = ["R"][D](l.slice(-2)); + else + for (var s = 0, t = l.length; t > s; s++) + k[s] = l[s]; + switch (k[0]) { + case "Z": + e = h, + f = i; + break; + case "H": + e = k[1]; + break; + case "V": + f = k[1]; + break; + case "M": + h = k[k.length - 2], + i = k[k.length - 1]; + default: + e = k[k.length - 2], + f = k[k.length - 1] + } + } + return d.toString = b._path2string, + c.abs = Aa(d), + d + }, + Da = function (a, b, c, d) { + return [a, b, c, d, c, d] + }, + Ea = function (a, b, c, d, e, f) { + var g = 1 / 3, + h = 2 / 3; + return [g * a + h * c, g * b + h * d, g * e + h * c, g * f + h * d, e, f] + }, + Fa = function (a, b, c, d, f, g, h, i, j, k) { + var l, + m = 120 * R / 180, + n = R / 180 * (+f || 0), + o = [], + p = e(function (a, b, c) { + var d = a * M.cos(c) - b * M.sin(c), + e = a * M.sin(c) + b * M.cos(c); + return { + x: d, + y: e + } + }); + if (k) + y = k[0], z = k[1], w = k[2], x = k[3]; + else { + l = p(a, b, -n), + a = l.x, + b = l.y, + l = p(i, j, -n), + i = l.x, + j = l.y; + var q = (M.cos(R / 180 * f), M.sin(R / 180 * f), (a - i) / 2), + r = (b - j) / 2, + s = q * q / (c * c) + r * r / (d * d); + s > 1 && (s = M.sqrt(s), c = s * c, d = s * d); + var t = c * c, + u = d * d, + v = (g == h ? -1 : 1) * M.sqrt(P((t * u - t * r * r - u * q * q) / (t * r * r + u * q * q))), + w = v * c * r / d + (a + i) / 2, + x = v * -d * q / c + (b + j) / 2, + y = M.asin(((b - x) / d).toFixed(9)), + z = M.asin(((j - x) / d).toFixed(9)); + y = w > a ? R - y : y, + z = w > i ? R - z : z, + 0 > y && (y = 2 * R + y), + 0 > z && (z = 2 * R + z), + h && y > z && (y -= 2 * R), + !h && z > y && (z -= 2 * R) + } + var A = z - y; + if (P(A) > m) { + var B = z, + C = i, + E = j; + z = y + m * (h && z > y ? 1 : -1), + i = w + c * M.cos(z), + j = x + d * M.sin(z), + o = Fa(i, j, c, d, f, 0, h, C, E, [z, B, w, x]) + } + A = z - y; + var F = M.cos(y), + G = M.sin(y), + H = M.cos(z), + J = M.sin(z), + K = M.tan(A / 4), + L = 4 / 3 * c * K, + N = 4 / 3 * d * K, + O = [a, b], + Q = [a + L * G, b - N * F], + S = [i + L * J, j - N * H], + T = [i, j]; + if (Q[0] = 2 * O[0] - Q[0], Q[1] = 2 * O[1] - Q[1], k) + return [Q, S, T][D](o); + o = [Q, S, T][D](o).join()[I](","); + for (var U = [], V = 0, W = o.length; W > V; V++) + U[V] = V % 2 ? p(o[V - 1], o[V], n).y : p(o[V], o[V + 1], n).x; + return U + }, + Ga = function (a, b, c, d, e, f, g, h, i) { + var j = 1 - i; + return { + x: Q(j, 3) * a + 3 * Q(j, 2) * i * c + 3 * j * i * i * e + Q(i, 3) * g, + y: Q(j, 3) * b + 3 * Q(j, 2) * i * d + 3 * j * i * i * f + Q(i, 3) * h + } + }, + Ha = e(function (a, b, c, d, e, f, g, h) { + var i, + j = e - 2 * c + a - (g - 2 * e + c), + k = 2 * (c - a) - 2 * (e - c), + l = a - c, + m = (-k + M.sqrt(k * k - 4 * j * l)) / 2 / j, + n = (-k - M.sqrt(k * k - 4 * j * l)) / 2 / j, + o = [b, h], + p = [a, g]; + return P(m) > "1e12" && (m = .5), + P(n) > "1e12" && (n = .5), + m > 0 && 1 > m && (i = Ga(a, b, c, d, e, f, g, h, m), p.push(i.x), o.push(i.y)), + n > 0 && 1 > n && (i = Ga(a, b, c, d, e, f, g, h, n), p.push(i.x), o.push(i.y)), + j = f - 2 * d + b - (h - 2 * f + d), + k = 2 * (d - b) - 2 * (f - d), + l = b - d, + m = (-k + M.sqrt(k * k - 4 * j * l)) / 2 / j, + n = (-k - M.sqrt(k * k - 4 * j * l)) / 2 / j, + P(m) > "1e12" && (m = .5), + P(n) > "1e12" && (n = .5), + m > 0 && 1 > m && (i = Ga(a, b, c, d, e, f, g, h, m), p.push(i.x), o.push(i.y)), + n > 0 && 1 > n && (i = Ga(a, b, c, d, e, f, g, h, n), p.push(i.x), o.push(i.y)), { + min: { + x: O[C](0, p), + y: O[C](0, o) + }, + max: { + x: N[C](0, p), + y: N[C](0, o) + } + } + }), + Ia = b._path2curve = e(function (a, b) { + var c = !b && ya(a); + if (!b && c.curve) + return Aa(c.curve); + for (var d = Ca(a), e = b && Ca(b), f = { + x: 0, + y: 0, + bx: 0, + by: 0, + X: 0, + Y: 0, + qx: null, + qy: null + }, g = { + x: 0, + y: 0, + bx: 0, + by: 0, + X: 0, + Y: 0, + qx: null, + qy: null + }, h = (function (a, b, c) { + var d, + e, + f = { + T: 1, + Q: 1 + }; + if (!a) + return ["C", b.x, b.y, b.x, b.y, b.x, b.y]; + switch (!(a[0]in f) && (b.qx = b.qy = null), a[0]) { + case "M": + b.X = a[1], + b.Y = a[2]; + break; + case "A": + a = ["C"][D](Fa[C](0, [b.x, b.y][D](a.slice(1)))); + break; + case "S": + "C" == c || "S" == c ? (d = 2 * b.x - b.bx, e = 2 * b.y - b.by) : (d = b.x, e = b.y), + a = ["C", d, e][D](a.slice(1)); + break; + case "T": + "Q" == c || "T" == c ? (b.qx = 2 * b.x - b.qx, b.qy = 2 * b.y - b.qy) : (b.qx = b.x, b.qy = b.y), + a = ["C"][D](Ea(b.x, b.y, b.qx, b.qy, a[1], a[2])); + break; + case "Q": + b.qx = a[1], + b.qy = a[2], + a = ["C"][D](Ea(b.x, b.y, a[1], a[2], a[3], a[4])); + break; + case "L": + a = ["C"][D](Da(b.x, b.y, a[1], a[2])); + break; + case "H": + a = ["C"][D](Da(b.x, b.y, a[1], b.y)); + break; + case "V": + a = ["C"][D](Da(b.x, b.y, b.x, a[1])); + break; + case "Z": + a = ["C"][D](Da(b.x, b.y, b.X, b.Y)) + } + return a + }), i = function (a, b) { + if (a[b].length > 7) { + a[b].shift(); + for (var c = a[b]; c.length; ) + k[b] = "A", e && (l[b] = "A") , a.splice(b++, 0, ["C"][D](c.splice(0, 6))); + a.splice(b, 1), + p = N(d.length, e && e.length || 0) + } + }, j = function (a, b, c, f, g) { + a && b && "M" == a[g][0] && "M" != b[g][0] && (b.splice(g, 0, ["M", f.x, f.y]), c.bx = 0, c.by = 0, c.x = a[g][1], c.y = a[g][2], p = N(d.length, e && e.length || 0)) + }, k = [], l = [], m = "", n = "", o = 0, p = N(d.length, e && e.length || 0); p > o; o++) { + d[o] && (m = d[o][0]), + "C" != m && (k[o] = m, o && (n = k[o - 1])), + d[o] = h(d[o], f, n), + "A" != k[o] && "C" == m && (k[o] = "C"), + i(d, o), + e && (e[o] && (m = e[o][0]), "C" != m && (l[o] = m, o && (n = l[o - 1])), e[o] = h(e[o], g, n), "A" != l[o] && "C" == m && (l[o] = "C"), i(e, o)), + j(d, e, f, g, o), + j(e, d, g, f, o); + var q = d[o], + r = e && e[o], + s = q.length, + t = e && r.length; + f.x = q[s - 2], + f.y = q[s - 1], + f.bx = $(q[s - 4]) || f.x, + f.by = $(q[s - 3]) || f.y, + g.bx = e && ($(r[t - 4]) || g.x), + g.by = e && ($(r[t - 3]) || g.y), + g.x = e && r[t - 2], + g.y = e && r[t - 1] + } + return e || (c.curve = Aa(d)), + e ? [d, e] : d + }, null, Aa), + Ja = (b._parseDots = e(function (a) { + for (var c = [], d = 0, e = a.length; e > d; d++) { + var f = {}, + g = a[d].match(/^([^:]*):?([\d\.]*)/); + if (f.color = b.getRGB(g[1]), f.color.error) + return null; + f.opacity = f.color.opacity, + f.color = f.color.hex, + g[2] && (f.offset = g[2] + "%"), + c.push(f) + } + for (d = 1, e = c.length - 1; e > d; d++) + if (!c[d].offset) { + for (var h = $(c[d - 1].offset || 0), i = 0, j = d + 1; e > j; j++) + if (c[j].offset) { + i = c[j].offset; + break + } + i || (i = 100, j = e), + i = $(i); + for (var k = (i - h) / (j - d + 1); j > d; d++) + h += k, c[d].offset = h + "%" + } + return c + }), b._tear = function (a, b) { + a == b.top && (b.top = a.prev), + a == b.bottom && (b.bottom = a.next), + a.next && (a.next.prev = a.prev), + a.prev && (a.prev.next = a.next) + }), + Ka = (b._tofront = function (a, b) { + b.top !== a && (Ja(a, b), a.next = null, a.prev = b.top, b.top.next = a, b.top = a) + }, b._toback = function (a, b) { + b.bottom !== a && (Ja(a, b), a.next = b.bottom, a.prev = null, b.bottom.prev = a, b.bottom = a) + }, b._insertafter = function (a, b, c) { + Ja(a, c), + b == c.top && (c.top = a), + b.next && (b.next.prev = a), + a.next = b.next, + a.prev = b, + b.next = a + }, b._insertbefore = function (a, b, c) { + Ja(a, c), + b == c.bottom && (c.bottom = a), + b.prev && (b.prev.next = a), + a.prev = b.prev, + b.prev = a, + a.next = b + }, b.toMatrix = function (a, b) { + var c = za(a), + d = { + _: { + transform: F + }, + getBBox: function () { + return c + } + }; + return La(d, b), + d.matrix + }), + La = (b.transformPath = function (a, b) { + return pa(a, Ka(a, b)) + }, b._extractTransform = function (a, c) { + if (null == c) + return a._.transform; + c = H(c).replace(/\.{3}|\u2026/g, a._.transform || F); + var d = b.parseTransformString(c), + e = 0, + f = 0, + g = 0, + h = 1, + i = 1, + j = a._, + k = new n; + if (j.transform = d || [], d) + for (var l = 0, m = d.length; m > l; l++) { + var o, + p, + q, + r, + s, + t = d[l], + u = t.length, + v = H(t[0]).toLowerCase(), + w = t[0] != v, + x = w ? k.invert() : 0; + "t" == v && 3 == u ? w ? (o = x.x(0, 0), p = x.y(0, 0), q = x.x(t[1], t[2]), r = x.y(t[1], t[2]), k.translate(q - o, r - p)) : k.translate(t[1], t[2]) : "r" == v ? 2 == u ? (s = s || a.getBBox(1), k.rotate(t[1], s.x + s.width / 2, s.y + s.height / 2), e += t[1]) : 4 == u && (w ? (q = x.x(t[2], t[3]), r = x.y(t[2], t[3]), k.rotate(t[1], q, r)) : k.rotate(t[1], t[2], t[3]), e += t[1]) : "s" == v ? 2 == u || 3 == u ? (s = s || a.getBBox(1), k.scale(t[1], t[u - 1], s.x + s.width / 2, s.y + s.height / 2), h *= t[1], i *= t[u - 1]) : 5 == u && (w ? (q = x.x(t[3], t[4]), r = x.y(t[3], t[4]), k.scale(t[1], t[2], q, r)) : k.scale(t[1], t[2], t[3], t[4]), h *= t[1], i *= t[2]) : "m" == v && 7 == u && k.add(t[1], t[2], t[3], t[4], t[5], t[6]), + j.dirtyT = 1, + a.matrix = k + } + a.matrix = k, + j.sx = h, + j.sy = i, + j.deg = e, + j.dx = f = k.e, + j.dy = g = k.f, + 1 == h && 1 == i && !e && j.bbox ? (j.bbox.x += +f, j.bbox.y += +g) : j.dirtyT = 1 + }), + Ma = function (a) { + var b = a[0]; + switch (b.toLowerCase()) { + case "t": + return [b, 0, 0]; + case "m": + return [b, 1, 0, 0, 1, 0, 0]; + case "r": + return 4 == a.length ? [b, 0, a[2], a[3]] : [b, 0]; + case "s": + return 5 == a.length ? [b, 1, 1, a[3], a[4]] : 3 == a.length ? [b, 1, 1] : [b, 1] + } + }, + Na = b._equaliseTransform = function (a, c) { + c = H(c).replace(/\.{3}|\u2026/g, a), + a = b.parseTransformString(a) || [], + c = b.parseTransformString(c) || []; + for (var d, e, f, g, h = N(a.length, c.length), i = [], j = [], k = 0; h > k; k++) { + if (f = a[k] || Ma(c[k]), g = c[k] || Ma(f), f[0] != g[0] || "r" == f[0].toLowerCase() && (f[2] != g[2] || f[3] != g[3]) || "s" == f[0].toLowerCase() && (f[3] != g[3] || f[4] != g[4])) + return; + for (i[k] = [], j[k] = [], d = 0, e = N(f.length, g.length); e > d; d++) + d in f && (i[k][d] = f[d]), d in g && (j[k][d] = g[d]) + } + return { + from: i, + to: j + } + }; + b._getContainer = function (a, c, d, e) { + var f; + return f = null != e || b.is(a, "object") ? a : z.doc.getElementById(a), + null != f ? f.tagName ? null == c ? { + container: f, + width: f.style.pixelWidth || f.offsetWidth, + height: f.style.pixelHeight || f.offsetHeight + } + : { + container: f, + width: c, + height: d + } + : { + container: 1, + x: a, + y: c, + width: d, + height: e + } + : void 0 + }, + b.pathToRelative = Ba, + b._engine = {}, + b.path2curve = Ia, + b.matrix = function (a, b, c, d, e, f) { + return new n(a, b, c, d, e, f) + }, + function (a) { + function c(a) { + return a[0] * a[0] + a[1] * a[1] + } + function d(a) { + var b = M.sqrt(c(a)); + a[0] && (a[0] /= b), + a[1] && (a[1] /= b) + } + a.add = function (a, b, c, d, e, f) { + var g, + h, + i, + j, + k = [[], [], []], + l = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], + m = [[a, c, e], [b, d, f], [0, 0, 1]]; + for (a && a instanceof n && (m = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]), g = 0; 3 > g; g++) + for (h = 0; 3 > h; h++) { + for (j = 0, i = 0; 3 > i; i++) + j += l[g][i] * m[i][h]; + k[g][h] = j + } + this.a = k[0][0], + this.b = k[1][0], + this.c = k[0][1], + this.d = k[1][1], + this.e = k[0][2], + this.f = k[1][2] + }, + a.invert = function () { + var a = this, + b = a.a * a.d - a.b * a.c; + return new n(a.d / b, -a.b / b, -a.c / b, a.a / b, (a.c * a.f - a.d * a.e) / b, (a.b * a.e - a.a * a.f) / b) + }, + a.clone = function () { + return new n(this.a, this.b, this.c, this.d, this.e, this.f) + }, + a.translate = function (a, b) { + this.add(1, 0, 0, 1, a, b) + }, + a.scale = function (a, b, c, d) { + null == b && (b = a), + (c || d) && this.add(1, 0, 0, 1, c, d), + this.add(a, 0, 0, b, 0, 0), + (c || d) && this.add(1, 0, 0, 1, -c, -d) + }, + a.rotate = function (a, c, d) { + a = b.rad(a), + c = c || 0, + d = d || 0; + var e = +M.cos(a).toFixed(9), + f = +M.sin(a).toFixed(9); + this.add(e, f, -f, e, c, d), + this.add(1, 0, 0, 1, -c, -d) + }, + a.x = function (a, b) { + return a * this.a + b * this.c + this.e + }, + a.y = function (a, b) { + return a * this.b + b * this.d + this.f + }, + a.get = function (a) { + return +this[H.fromCharCode(97 + a)].toFixed(4) + }, + a.toString = function () { + return b.svg ? "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" : [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join() + }, + a.toFilter = function () { + return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) + ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) + ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')" + }, + a.offset = function () { + return [this.e.toFixed(4), this.f.toFixed(4)] + }, + a.split = function () { + var a = {}; + a.dx = this.e, + a.dy = this.f; + var e = [[this.a, this.c], [this.b, this.d]]; + a.scalex = M.sqrt(c(e[0])), + d(e[0]), + a.shear = e[0][0] * e[1][0] + e[0][1] * e[1][1], + e[1] = [e[1][0] - e[0][0] * a.shear, e[1][1] - e[0][1] * a.shear], + a.scaley = M.sqrt(c(e[1])), + d(e[1]), + a.shear /= a.scaley; + var f = -e[0][1], + g = e[1][1]; + return 0 > g ? (a.rotate = b.deg(M.acos(g)), 0 > f && (a.rotate = 360 - a.rotate)) : a.rotate = b.deg(M.asin(f)), + a.isSimple = !(+a.shear.toFixed(9) || a.scalex.toFixed(9) != a.scaley.toFixed(9) && a.rotate), + a.isSuperSimple = !+a.shear.toFixed(9) && a.scalex.toFixed(9) == a.scaley.toFixed(9) && !a.rotate, + a.noRotation = !+a.shear.toFixed(9) && !a.rotate, + a + }, + a.toTransformString = function (a) { + var b = a || this[I](); + return b.isSimple ? (b.scalex = +b.scalex.toFixed(4), b.scaley = +b.scaley.toFixed(4), b.rotate = +b.rotate.toFixed(4), (b.dx || b.dy ? "t" + [b.dx, b.dy] : F) + (1 != b.scalex || 1 != b.scaley ? "s" + [b.scalex, b.scaley, 0, 0] : F) + (b.rotate ? "r" + [b.rotate, 0, 0] : F)) : "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)] + } + } + (n.prototype); + for (var Oa = function () { + this.returnValue = !1 + }, Pa = function () { + return this.originalEvent.preventDefault() + }, Qa = function () { + this.cancelBubble = !0 + }, Ra = function () { + return this.originalEvent.stopPropagation() + }, Sa = function (a) { + var b = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, + c = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft; + return { + x: a.clientX + c, + y: a.clientY + b + } + }, Ta = function () { + return z.doc.addEventListener ? function (a, b, c, d) { + var e = function (a) { + var b = Sa(a); + return c.call(d, a, b.x, b.y) + }; + if (a.addEventListener(b, e, !1), E && K[b]) { + var f = function (b) { + for (var e = Sa(b), f = b, g = 0, h = b.targetTouches && b.targetTouches.length; h > g; g++) + if (b.targetTouches[g].target == a) { + b = b.targetTouches[g], + b.originalEvent = f, + b.preventDefault = Pa, + b.stopPropagation = Ra; + break + } + return c.call(d, b, e.x, e.y) + }; + a.addEventListener(K[b], f, !1) + } + return function () { + return a.removeEventListener(b, e, !1), + E && K[b] && a.removeEventListener(K[b], f, !1), + !0 + } + } + : z.doc.attachEvent ? function (a, b, c, d) { + var e = function (a) { + a = a || z.win.event; + var b = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, + e = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft, + f = a.clientX + e, + g = a.clientY + b; + return a.preventDefault = a.preventDefault || Oa, + a.stopPropagation = a.stopPropagation || Qa, + c.call(d, a, f, g) + }; + a.attachEvent("on" + b, e); + var f = function () { + return a.detachEvent("on" + b, e), + !0 + }; + return f + } + : void 0 + } + (), Ua = [], Va = function (b) { + for (var c, d = b.clientX, e = b.clientY, f = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, g = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft, h = Ua.length; h--; ) { + if (c = Ua[h], E && b.touches) { + for (var i, j = b.touches.length; j--; ) + if (i = b.touches[j], i.identifier == c.el._drag.id) { + d = i.clientX, + e = i.clientY, + (b.originalEvent ? b.originalEvent : b).preventDefault(); + break + } + } else + b.preventDefault(); + var k, + l = c.el.node, + m = l.nextSibling, + n = l.parentNode, + o = l.style.display; + z.win.opera && n.removeChild(l), + l.style.display = "none", + k = c.el.paper.getElementByPoint(d, e), + l.style.display = o, + z.win.opera && (m ? n.insertBefore(l, m) : n.appendChild(l)), + k && a("raphael.drag.over." + c.el.id, c.el, k), + d += g, + e += f, + a("raphael.drag.move." + c.el.id, c.move_scope || c.el, d - c.el._drag.x, e - c.el._drag.y, d, e, b) + } + }, Wa = function (c) { + b.unmousemove(Va).unmouseup(Wa); + for (var d, e = Ua.length; e--; ) + d = Ua[e], d.el._drag = {}, + a("raphael.drag.end." + d.el.id, d.end_scope || d.start_scope || d.move_scope || d.el, c); + Ua = [] + }, Xa = b.el = {}, Ya = J.length; Ya--; ) + !function (a) { + b[a] = Xa[a] = function (c, d) { + return b.is(c, "function") && (this.events = this.events || [], this.events.push({ + name: a, + f: c, + unbind: Ta(this.shape || this.node || z.doc, a, c, d || this) + })), + this + }, + b["un" + a] = Xa["un" + a] = function (c) { + for (var d = this.events || [], e = d.length; e--; ) + d[e].name != a || !b.is(c, "undefined") && d[e].f != c || (d[e].unbind(), d.splice(e, 1), !d.length && delete this.events); + return this + } + } + (J[Ya]); + Xa.data = function (c, d) { + var e = ja[this.id] = ja[this.id] || {}; + if (0 == arguments.length) + return e; + if (1 == arguments.length) { + if (b.is(c, "object")) { + for (var f in c) + c[y](f) && this.data(f, c[f]); + return this + } + return a("raphael.data.get." + this.id, this, e[c], c), + e[c] + } + return e[c] = d, + a("raphael.data.set." + this.id, this, d, c), + this + }, + Xa.removeData = function (a) { + return null == a ? ja[this.id] = {} + : ja[this.id] && delete ja[this.id][a], + this + }, + Xa.getData = function () { + return c(ja[this.id] || {}) + }, + Xa.hover = function (a, b, c, d) { + return this.mouseover(a, c).mouseout(b, d || c) + }, + Xa.unhover = function (a, b) { + return this.unmouseover(a).unmouseout(b) + }; + var Za = []; + Xa.drag = function (c, d, e, f, g, h) { + function i(i) { + (i.originalEvent || i).preventDefault(); + var j = i.clientX, + k = i.clientY, + l = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, + m = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft; + if (this._drag.id = i.identifier, E && i.touches) + for (var n, o = i.touches.length; o--; ) + if (n = i.touches[o], this._drag.id = n.identifier, n.identifier == this._drag.id) { + j = n.clientX, + k = n.clientY; + break + } + this._drag.x = j + m, + this._drag.y = k + l, + !Ua.length && b.mousemove(Va).mouseup(Wa), + Ua.push({ + el: this, + move_scope: f, + start_scope: g, + end_scope: h + }), + d && a.on("raphael.drag.start." + this.id, d), + c && a.on("raphael.drag.move." + this.id, c), + e && a.on("raphael.drag.end." + this.id, e), + a("raphael.drag.start." + this.id, g || f || this, i.clientX + m, i.clientY + l, i) + } + return this._drag = {}, + Za.push({ + el: this, + start: i + }), + this.mousedown(i), + this + }, + Xa.onDragOver = function (b) { + b ? a.on("raphael.drag.over." + this.id, b) : a.unbind("raphael.drag.over." + this.id) + }, + Xa.undrag = function () { + for (var c = Za.length; c--; ) + Za[c].el == this && (this.unmousedown(Za[c].start), Za.splice(c, 1), a.unbind("raphael.drag.*." + this.id)); + !Za.length && b.unmousemove(Va).unmouseup(Wa), + Ua = [] + }, + u.circle = function (a, c, d) { + var e = b._engine.circle(this, a || 0, c || 0, d || 0); + return this.__set__ && this.__set__.push(e), + e + }, + u.rect = function (a, c, d, e, f) { + var g = b._engine.rect(this, a || 0, c || 0, d || 0, e || 0, f || 0); + return this.__set__ && this.__set__.push(g), + g + }, + u.ellipse = function (a, c, d, e) { + var f = b._engine.ellipse(this, a || 0, c || 0, d || 0, e || 0); + return this.__set__ && this.__set__.push(f), + f + }, + u.path = function (a) { + a && !b.is(a, T) && !b.is(a[0], U) && (a += F); + var c = b._engine.path(b.format[C](b, arguments), this); + return this.__set__ && this.__set__.push(c), + c + }, + u.image = function (a, c, d, e, f) { + var g = b._engine.image(this, a || "about:blank", c || 0, d || 0, e || 0, f || 0); + return this.__set__ && this.__set__.push(g), + g + }, + u.text = function (a, c, d) { + var e = b._engine.text(this, a || 0, c || 0, H(d)); + return this.__set__ && this.__set__.push(e), + e + }, + u.set = function (a) { + !b.is(a, "array") && (a = Array.prototype.splice.call(arguments, 0, arguments.length)); + var c = new jb(a); + return this.__set__ && this.__set__.push(c), + c.paper = this, + c.type = "set", + c + }, + u.setStart = function (a) { + this.__set__ = a || this.set() + }, + u.setFinish = function (a) { + var b = this.__set__; + return delete this.__set__, + b + }, + u.getSize = function () { + var a = this.canvas.parentNode; + return { + width: a.offsetWidth, + height: a.offsetHeight + } + }, + u.setSize = function (a, c) { + return b._engine.setSize.call(this, a, c) + }, + u.setViewBox = function (a, c, d, e, f) { + return b._engine.setViewBox.call(this, a, c, d, e, f) + }, + u.top = u.bottom = null, + u.raphael = b; + var $a = function (a) { + var b = a.getBoundingClientRect(), + c = a.ownerDocument, + d = c.body, + e = c.documentElement, + f = e.clientTop || d.clientTop || 0, + g = e.clientLeft || d.clientLeft || 0, + h = b.top + (z.win.pageYOffset || e.scrollTop || d.scrollTop) - f, + i = b.left + (z.win.pageXOffset || e.scrollLeft || d.scrollLeft) - g; + return { + y: h, + x: i + } + }; + u.getElementByPoint = function (a, b) { + var c = this, + d = c.canvas, + e = z.doc.elementFromPoint(a, b); + if (z.win.opera && "svg" == e.tagName) { + var f = $a(d), + g = d.createSVGRect(); + g.x = a - f.x, + g.y = b - f.y, + g.width = g.height = 1; + var h = d.getIntersectionList(g, null); + h.length && (e = h[h.length - 1]) + } + if (!e) + return null; + for (; e.parentNode && e != d.parentNode && !e.raphael; ) + e = e.parentNode; + return e == c.canvas.parentNode && (e = d), + e = e && e.raphael ? c.getById(e.raphaelid) : null + }, + u.getElementsByBBox = function (a) { + var c = this.set(); + return this.forEach(function (d) { + b.isBBoxIntersect(d.getBBox(), a) && c.push(d) + }), + c + }, + u.getById = function (a) { + for (var b = this.bottom; b; ) { + if (b.id == a) + return b; + b = b.next + } + return null + }, + u.forEach = function (a, b) { + for (var c = this.bottom; c; ) { + if (a.call(b, c) === !1) + return this; + c = c.next + } + return this + }, + u.getElementsByPoint = function (a, b) { + var c = this.set(); + return this.forEach(function (d) { + d.isPointInside(a, b) && c.push(d) + }), + c + }, + Xa.isPointInside = function (a, c) { + var d = this.realPath = oa[this.type](this); + return this.attr("transform") && this.attr("transform").length && (d = b.transformPath(d, this.attr("transform"))), + b.isPointInsidePath(d, a, c) + }, + Xa.getBBox = function (a) { + if (this.removed) + return {}; + var b = this._; + return a ? ((b.dirty || !b.bboxwt) && (this.realPath = oa[this.type](this), b.bboxwt = za(this.realPath), b.bboxwt.toString = o, b.dirty = 0), b.bboxwt) : ((b.dirty || b.dirtyT || !b.bbox) && ((b.dirty || !this.realPath) && (b.bboxwt = 0, this.realPath = oa[this.type](this)), b.bbox = za(pa(this.realPath, this.matrix)), b.bbox.toString = o, b.dirty = b.dirtyT = 0), b.bbox) + }, + Xa.clone = function () { + if (this.removed) + return null; + var a = this.paper[this.type]().attr(this.attr()); + return this.__set__ && this.__set__.push(a), + a + }, + Xa.glow = function (a) { + if ("text" == this.type) + return null; + a = a || {}; + var b = { + width: (a.width || 10) + (+this.attr("stroke-width") || 1), + fill: a.fill || !1, + opacity: null == a.opacity ? .5 : a.opacity, + offsetx: a.offsetx || 0, + offsety: a.offsety || 0, + color: a.color || "#000" + }, + c = b.width / 2, + d = this.paper, + e = d.set(), + f = this.realPath || oa[this.type](this); + f = this.matrix ? pa(f, this.matrix) : f; + for (var g = 1; c + 1 > g; g++) + e.push(d.path(f).attr({ + stroke: b.color, + fill: b.fill ? b.color : "none", + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-width": + (b.width / c * g).toFixed(3), + opacity: + (b.opacity / c).toFixed(3) + })); + return e.insertBefore(this).translate(b.offsetx, b.offsety) + }; + var _a = function (a, c, d, e, f, g, h, k, l) { + return null == l ? i(a, c, d, e, f, g, h, k) : b.findDotsAtSegment(a, c, d, e, f, g, h, k, j(a, c, d, e, f, g, h, k, l)) + }, + ab = function (a, c) { + return function (d, e, f) { + d = Ia(d); + for (var g, h, i, j, k, l = "", m = {}, n = 0, o = 0, p = d.length; p > o; o++) { + if (i = d[o], "M" == i[0]) + g = +i[1], h = +i[2]; + else { + if (j = _a(g, h, i[1], i[2], i[3], i[4], i[5], i[6]), n + j > e) { + if (c && !m.start) { + if (k = _a(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n), l += ["C" + k.start.x, k.start.y, k.m.x, k.m.y, k.x, k.y], f) + return l; + m.start = l, + l = ["M" + k.x, k.y + "C" + k.n.x, k.n.y, k.end.x, k.end.y, i[5], i[6]].join(), + n += j, + g = +i[5], + h = +i[6]; + continue + } + if (!a && !c) + return k = _a(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n), { + x: k.x, + y: k.y, + alpha: k.alpha + } + } + n += j, + g = +i[5], + h = +i[6] + } + l += i.shift() + i + } + return m.end = l, + k = a ? n : c ? m : b.findDotsAtSegment(g, h, i[0], i[1], i[2], i[3], i[4], i[5], 1), + k.alpha && (k = { + x: k.x, + y: k.y, + alpha: k.alpha + }), + k + } + }, + bb = ab(1), + cb = ab(), + db = ab(0, 1); + b.getTotalLength = bb, + b.getPointAtLength = cb, + b.getSubpath = function (a, b, c) { + if (this.getTotalLength(a) - c < 1e-6) + return db(a, b).end; + var d = db(a, c, 1); + return b ? db(d, b).end : d + }, + Xa.getTotalLength = function () { + var a = this.getPath(); + if (a) + return this.node.getTotalLength ? this.node.getTotalLength() : bb(a) + }, + Xa.getPointAtLength = function (a) { + var b = this.getPath(); + if (b) + return cb(b, a) + }, + Xa.getPath = function () { + var a, + c = b._getPath[this.type]; + if ("text" != this.type && "set" != this.type) + return c && (a = c(this)), a + }, + Xa.getSubpath = function (a, c) { + var d = this.getPath(); + if (d) + return b.getSubpath(d, a, c) + }; + var eb = b.easing_formulas = { + linear: function (a) { + return a + }, + "<": function (a) { + return Q(a, 1.7) + }, + ">": function (a) { + return Q(a, .48) + }, + "<>": function (a) { + var b = .48 - a / 1.04, + c = M.sqrt(.1734 + b * b), + d = c - b, + e = Q(P(d), 1 / 3) * (0 > d ? -1 : 1), + f = -c - b, + g = Q(P(f), 1 / 3) * (0 > f ? -1 : 1), + h = e + g + .5; + return 3 * (1 - h) * h * h + h * h * h + }, + backIn: function (a) { + var b = 1.70158; + return a * a * ((b + 1) * a - b) + }, + backOut: function (a) { + a -= 1; + var b = 1.70158; + return a * a * ((b + 1) * a + b) + 1 + }, + elastic: function (a) { + return a == !!a ? a : Q(2, -10 * a) * M.sin(2 * (a - .075) * R / .3) + 1 + }, + bounce: function (a) { + var b, + c = 7.5625, + d = 2.75; + return 1 / d > a ? b = c * a * a : 2 / d > a ? (a -= 1.5 / d, b = c * a * a + .75) : 2.5 / d > a ? (a -= 2.25 / d, b = c * a * a + .9375) : (a -= 2.625 / d, b = c * a * a + .984375), + b + } + }; + eb.easeIn = eb["ease-in"] = eb["<"], + eb.easeOut = eb["ease-out"] = eb[">"], + eb.easeInOut = eb["ease-in-out"] = eb["<>"], + eb["back-in"] = eb.backIn, + eb["back-out"] = eb.backOut; + var fb = [], + gb = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (a) { + setTimeout(a, 16) + }, + hb = function () { + for (var c = +new Date, d = 0; d < fb.length; d++) { + var e = fb[d]; + if (!e.el.removed && !e.paused) { + var f, + g, + h = c - e.start, + i = e.ms, + j = e.easing, + k = e.from, + l = e.diff, + m = e.to, + n = (e.t, e.el), + o = {}, + p = {}; + if (e.initstatus ? (h = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * i, e.status = e.initstatus, delete e.initstatus, e.stop && fb.splice(d--, 1)) : e.status = (e.prev + (e.percent - e.prev) * (h / i)) / e.anim.top, !(0 > h)) + if (i > h) { + var q = j(h / i); + for (var s in k) + if (k[y](s)) { + switch (ca[s]) { + case S: + f = +k[s] + q * i * l[s]; + break; + case "colour": + f = "rgb(" + [ib(Z(k[s].r + q * i * l[s].r)), ib(Z(k[s].g + q * i * l[s].g)), ib(Z(k[s].b + q * i * l[s].b))].join(",") + ")"; + break; + case "path": + f = []; + for (var t = 0, u = k[s].length; u > t; t++) { + f[t] = [k[s][t][0]]; + for (var v = 1, w = k[s][t].length; w > v; v++) + f[t][v] = +k[s][t][v] + q * i * l[s][t][v]; + f[t] = f[t].join(G) + } + f = f.join(G); + break; + case "transform": + if (l[s].real) + for (f = [], t = 0, u = k[s].length; u > t; t++) + for (f[t] = [k[s][t][0]], v = 1, w = k[s][t].length; w > v; v++) + f[t][v] = k[s][t][v] + q * i * l[s][t][v]; + else { + var x = function (a) { + return +k[s][a] + q * i * l[s][a] + }; + f = [["m", x(0), x(1), x(2), x(3), x(4), x(5)]] + } + break; + case "csv": + if ("clip-rect" == s) + for (f = [], t = 4; t--; ) + f[t] = +k[s][t] + q * i * l[s][t]; + break; + default: + var z = [][D](k[s]); + for (f = [], t = n.paper.customAttributes[s].length; t--; ) + f[t] = +z[t] + q * i * l[s][t] + } + o[s] = f + } + n.attr(o), + function (b, c, d) { + setTimeout(function () { + a("raphael.anim.frame." + b, c, d) + }) + } + (n.id, n, e.anim) + } else { + if (function (c, d, e) { + setTimeout(function () { + a("raphael.anim.frame." + d.id, d, e), + a("raphael.anim.finish." + d.id, d, e), + b.is(c, "function") && c.call(d) + }) + } + (e.callback, n, e.anim), n.attr(m), fb.splice(d--, 1), e.repeat > 1 && !e.next) { + for (g in m) + m[y](g) && (p[g] = e.totalOrigin[g]); + e.el.attr(p), + r(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1) + } + e.next && !e.stop && r(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat) + } + } + } + fb.length && gb(hb) + }, + ib = function (a) { + return a > 255 ? 255 : 0 > a ? 0 : a + }; + Xa.animateWith = function (a, c, d, e, f, g) { + var h = this; + if (h.removed) + return g && g.call(h), h; + var i = d instanceof q ? d : b.animation(d, e, f, g); + r(i, h, i.percents[0], null, h.attr()); + for (var j = 0, k = fb.length; k > j; j++) + if (fb[j].anim == c && fb[j].el == a) { + fb[k - 1].start = fb[j].start; + break + } + return h + }, + Xa.onAnimation = function (b) { + return b ? a.on("raphael.anim.frame." + this.id, b) : a.unbind("raphael.anim.frame." + this.id), + this + }, + q.prototype.delay = function (a) { + var b = new q(this.anim, this.ms); + return b.times = this.times, + b.del = +a || 0, + b + }, + q.prototype.repeat = function (a) { + var b = new q(this.anim, this.ms); + return b.del = this.del, + b.times = M.floor(N(a, 0)) || 1, + b + }, + b.animation = function (a, c, d, e) { + if (a instanceof q) + return a; + (b.is(d, "function") || !d) && (e = e || d || null, d = null), + a = Object(a), + c = +c || 0; + var f, + g, + h = {}; + for (g in a) + a[y](g) && $(g) != g && $(g) + "%" != g && (f = !0, h[g] = a[g]); + if (f) + return d && (h.easing = d), e && (h.callback = e), new q({ + 100: h + }, c); + if (e) { + var i = 0; + for (var j in a) { + var k = _(j); + a[y](j) && k > i && (i = k) + } + i += "%", + !a[i].callback && (a[i].callback = e) + } + return new q(a, c) + }, + Xa.animate = function (a, c, d, e) { + var f = this; + if (f.removed) + return e && e.call(f), f; + var g = a instanceof q ? a : b.animation(a, c, d, e); + return r(g, f, g.percents[0], null, f.attr()), + f + }, + Xa.setTime = function (a, b) { + return a && null != b && this.status(a, O(b, a.ms) / a.ms), + this + }, + Xa.status = function (a, b) { + var c, + d, + e = [], + f = 0; + if (null != b) + return r(a, this, -1, O(b, 1)), this; + for (c = fb.length; c > f; f++) + if (d = fb[f], d.el.id == this.id && (!a || d.anim == a)) { + if (a) + return d.status; + e.push({ + anim: d.anim, + status: d.status + }) + } + return a ? 0 : e + }, + Xa.pause = function (b) { + for (var c = 0; c < fb.length; c++) + fb[c].el.id != this.id || b && fb[c].anim != b || a("raphael.anim.pause." + this.id, this, fb[c].anim) !== !1 && (fb[c].paused = !0); + return this + }, + Xa.resume = function (b) { + for (var c = 0; c < fb.length; c++) + if (fb[c].el.id == this.id && (!b || fb[c].anim == b)) { + var d = fb[c]; + a("raphael.anim.resume." + this.id, this, d.anim) !== !1 && (delete d.paused, this.status(d.anim, d.status)) + } + return this + }, + Xa.stop = function (b) { + for (var c = 0; c < fb.length; c++) + fb[c].el.id != this.id || b && fb[c].anim != b || a("raphael.anim.stop." + this.id, this, fb[c].anim) !== !1 && fb.splice(c--, 1); + return this + }, + a.on("raphael.remove", s), + a.on("raphael.clear", s), + Xa.toString = function () { + return "Raphaël’s object" + }; + var jb = function (a) { + if (this.items = [], this.length = 0, this.type = "set", a) + for (var b = 0, c = a.length; c > b; b++) + !a[b] || a[b].constructor != Xa.constructor && a[b].constructor != jb || (this[this.items.length] = this.items[this.items.length] = a[b], this.length++) + }, + kb = jb.prototype; + kb.push = function () { + for (var a, b, c = 0, d = arguments.length; d > c; c++) + a = arguments[c], !a || a.constructor != Xa.constructor && a.constructor != jb || (b = this.items.length, this[b] = this.items[b] = a, this.length++); + return this + }, + kb.pop = function () { + return this.length && delete this[this.length--], + this.items.pop() + }, + kb.forEach = function (a, b) { + for (var c = 0, d = this.items.length; d > c; c++) + if (a.call(b, this.items[c], c) === !1) + return this; + return this + }; + for (var lb in Xa) + Xa[y](lb) && (kb[lb] = function (a) { + return function () { + var b = arguments; + return this.forEach(function (c) { + c[a][C](c, b) + }) + } + } + (lb)); + return kb.attr = function (a, c) { + if (a && b.is(a, U) && b.is(a[0], "object")) + for (var d = 0, e = a.length; e > d; d++) + this.items[d].attr(a[d]); + else + for (var f = 0, g = this.items.length; g > f; f++) + this.items[f].attr(a, c); + return this + }, + kb.clear = function () { + for (; this.length; ) + this.pop() + }, + kb.splice = function (a, b, c) { + a = 0 > a ? N(this.length + a, 0) : a, + b = N(0, O(this.length - a, b)); + var d, + e = [], + f = [], + g = []; + for (d = 2; d < arguments.length; d++) + g.push(arguments[d]); + for (d = 0; b > d; d++) + f.push(this[a + d]); + for (; d < this.length - a; d++) + e.push(this[a + d]); + var h = g.length; + for (d = 0; d < h + e.length; d++) + this.items[a + d] = this[a + d] = h > d ? g[d] : e[d - h]; + for (d = this.items.length = this.length -= b - h; this[d]; ) + delete this[d++]; + return new jb(f) + }, + kb.exclude = function (a) { + for (var b = 0, c = this.length; c > b; b++) + if (this[b] == a) + return this.splice(b, 1), !0 + }, + kb.animate = function (a, c, d, e) { + (b.is(d, "function") || !d) && (e = d || null); + var f, + g, + h = this.items.length, + i = h, + j = this; + if (!h) + return this; + e && (g = function () { + !--h && e.call(j) + }), + d = b.is(d, T) ? d : g; + var k = b.animation(a, c, d, g); + for (f = this.items[--i].animate(k); i--; ) + this.items[i] && !this.items[i].removed && this.items[i].animateWith(f, k, k), this.items[i] && !this.items[i].removed || h--; + return this + }, + kb.insertAfter = function (a) { + for (var b = this.items.length; b--; ) + this.items[b].insertAfter(a); + return this + }, + kb.getBBox = function () { + for (var a = [], b = [], c = [], d = [], e = this.items.length; e--; ) + if (!this.items[e].removed) { + var f = this.items[e].getBBox(); + a.push(f.x), + b.push(f.y), + c.push(f.x + f.width), + d.push(f.y + f.height) + } + return a = O[C](0, a), + b = O[C](0, b), + c = N[C](0, c), + d = N[C](0, d), { + x: a, + y: b, + x2: c, + y2: d, + width: c - a, + height: d - b + } + }, + kb.clone = function (a) { + a = this.paper.set(); + for (var b = 0, c = this.items.length; c > b; b++) + a.push(this.items[b].clone()); + return a + }, + kb.toString = function () { + return "Raphaël‘s set" + }, + kb.glow = function (a) { + var b = this.paper.set(); + return this.forEach(function (c, d) { + var e = c.glow(a); + null != e && e.forEach(function (a, c) { + b.push(a) + }) + }), + b + }, + kb.isPointInside = function (a, b) { + var c = !1; + return this.forEach(function (d) { + return d.isPointInside(a, b) ? (c = !0, !1) : void 0 + }), + c + }, + b.registerFont = function (a) { + if (!a.face) + return a; + this.fonts = this.fonts || {}; + var b = { + w: a.w, + face: {}, + glyphs: {} + }, + c = a.face["font-family"]; + for (var d in a.face) + a.face[y](d) && (b.face[d] = a.face[d]); + if (this.fonts[c] ? this.fonts[c].push(b) : this.fonts[c] = [b], !a.svg) { + b.face["units-per-em"] = _(a.face["units-per-em"], 10); + for (var e in a.glyphs) + if (a.glyphs[y](e)) { + var f = a.glyphs[e]; + if (b.glyphs[e] = { + w: f.w, + k: {}, + d: f.d && "M" + f.d.replace(/[mlcxtrv]/g, function (a) { + return { + l: "L", + c: "C", + x: "z", + t: "m", + r: "l", + v: "c" + } + [a] || "M" + }) + "z" + }, f.k) + for (var g in f.k) + f[y](g) && (b.glyphs[e].k[g] = f.k[g]) + } + } + return a + }, + u.getFont = function (a, c, d, e) { + if (e = e || "normal", d = d || "normal", c = +c || { + normal: 400, + bold: 700, + lighter: 300, + bolder: 800 + } + [c] || 400, b.fonts) { + var f = b.fonts[a]; + if (!f) { + var g = new RegExp("(^|\\s)" + a.replace(/[^\w\d\s+!~.:_-]/g, F) + "(\\s|$)", "i"); + for (var h in b.fonts) + if (b.fonts[y](h) && g.test(h)) { + f = b.fonts[h]; + break + } + } + var i; + if (f) + for (var j = 0, k = f.length; k > j && (i = f[j], i.face["font-weight"] != c || i.face["font-style"] != d && i.face["font-style"] || i.face["font-stretch"] != e); j++); + return i + } + }, + u.print = function (a, c, d, e, f, g, h, i) { + g = g || "middle", + h = N(O(h || 0, 1), -1), + i = N(O(i || 1, 3), 1); + var j, + k = H(d)[I](F), + l = 0, + m = 0, + n = F; + if (b.is(e, "string") && (e = this.getFont(e)), e) { + j = (f || 16) / e.face["units-per-em"]; + for (var o = e.face.bbox[I](v), p = +o[0], q = o[3] - o[1], r = 0, s = +o[1] + ("baseline" == g ? q + +e.face.descent : q / 2), t = 0, u = k.length; u > t; t++) { + if ("\n" == k[t]) + l = 0, x = 0, m = 0, r += q * i; + else { + var w = m && e.glyphs[k[t - 1]] || {}, + x = e.glyphs[k[t]]; + l += m ? (w.w || e.w) + (w.k && w.k[k[t]] || 0) + e.w * h : 0, + m = 1 + } + x && x.d && (n += b.transformPath(x.d, ["t", l * j, r * j, "s", j, j, p, s, "t", (a - p) / j, (c - s) / j])) + } + } + return this.path(n).attr({ + fill: "#000", + stroke: "none" + }) + }, + u.add = function (a) { + if (b.is(a, "array")) + for (var c, d = this.set(), e = 0, f = a.length; f > e; e++) + c = a[e] || {}, + w[y](c.type) && d.push(this[c.type]().attr(c)); + return d + }, + b.format = function (a, c) { + var d = b.is(c, U) ? [0][D](c) : arguments; + return a && b.is(a, T) && d.length - 1 && (a = a.replace(x, function (a, b) { + return null == d[++b] ? F : d[b] + })), + a || F + }, + b.fullfill = function () { + var a = /\{([^\}]+)\}/g, + b = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, + c = function (a, c, d) { + var e = d; + return c.replace(b, function (a, b, c, d, f) { + b = b || d, + e && (b in e && (e = e[b]), "function" == typeof e && f && (e = e())) + }), + e = (null == e || e == d ? a : e) + "" + }; + return function (b, d) { + return String(b).replace(a, function (a, b) { + return c(a, b, d) + }) + } + } + (), + b.ninja = function () { + return A.was ? z.win.Raphael = A.is : delete Raphael, + b + }, + b.st = kb, + a.on("raphael.DOMload", function () { + t = !0 + }), + function (a, c, d) { + function e() { + /in/.test(a.readyState) ? setTimeout(e, 9) : b.eve("raphael.DOMload") + } + null == a.readyState && a.addEventListener && (a.addEventListener(c, d = function () { + a.removeEventListener(c, d, !1), + a.readyState = "complete" + }, !1), a.readyState = "loading"), + e() + } + (document, "DOMContentLoaded"), + b +}), function (a, b) { + "function" == typeof define && define.amd ? define("raphael.svg", ["raphael.core"], function (a) { + return b(a) + }) : b("object" == typeof exports ? require("./raphael.core") : a.Raphael) +} +(this, function (a) { + if (!a || a.svg) { + var b = "hasOwnProperty", + c = String, + d = parseFloat, + e = parseInt, + f = Math, + g = f.max, + h = f.abs, + i = f.pow, + j = /[, ]+/, + k = a.eve, + l = "", + m = " ", + n = "http://www.w3.org/1999/xlink", + o = { + block: "M5,0 0,2.5 5,5z", + classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z", + diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z", + open: "M6,1 1,3.5 6,6", + oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z" + }, + p = {}; + a.toString = function () { + return "Your browser supports SVG.\nYou are running Raphaël " + this.version + }; + var q = function (d, e) { + if (e) { + "string" == typeof d && (d = q(d)); + for (var f in e) + e[b](f) && ("xlink:" == f.substring(0, 6) ? d.setAttributeNS(n, f.substring(6), c(e[f])) : d.setAttribute(f, c(e[f]))) + } else + d = a._g.doc.createElementNS("http://www.w3.org/2000/svg", d), d.style && (d.style.webkitTapHighlightColor = "rgba(0,0,0,0)"); + return d + }, + r = function (b, e) { + var j = "linear", + k = b.id + e, + m = .5, + n = .5, + o = b.node, + p = b.paper, + r = o.style, + s = a._g.doc.getElementById(k); + if (!s) { + if (e = c(e).replace(a._radial_gradient, function (a, b, c) { + if (j = "radial", b && c) { + m = d(b), + n = d(c); + var e = 2 * (n > .5) - 1; + i(m - .5, 2) + i(n - .5, 2) > .25 && (n = f.sqrt(.25 - i(m - .5, 2)) * e + .5) && .5 != n && (n = n.toFixed(5) - 1e-5 * e) + } + return l + }), e = e.split(/\s*\-\s*/), "linear" == j) { + var t = e.shift(); + if (t = -d(t), isNaN(t)) + return null; + var u = [0, 0, f.cos(a.rad(t)), f.sin(a.rad(t))], + v = 1 / (g(h(u[2]), h(u[3])) || 1); + u[2] *= v, + u[3] *= v, + u[2] < 0 && (u[0] = -u[2], u[2] = 0), + u[3] < 0 && (u[1] = -u[3], u[3] = 0) + } + var w = a._parseDots(e); + if (!w) + return null; + if (k = k.replace(/[\(\)\s,\xb0#]/g, "_"), b.gradient && k != b.gradient.id && (p.defs.removeChild(b.gradient), delete b.gradient), !b.gradient) { + s = q(j + "Gradient", { + id: k + }), + b.gradient = s, + q(s, "radial" == j ? { + fx: m, + fy: n + } + : { + x1: u[0], + y1: u[1], + x2: u[2], + y2: u[3], + gradientTransform: b.matrix.invert() + }), + p.defs.appendChild(s); + for (var x = 0, y = w.length; y > x; x++) + s.appendChild(q("stop", { + offset: w[x].offset ? w[x].offset : x ? "100%" : "0%", + "stop-color": w[x].color || "#fff", + "stop-opacity": isFinite(w[x].opacity) ? w[x].opacity : 1 + })) + } + } + return q(o, { + fill: "url('" + document.location.origin + document.location.pathname + "#" + k + "')", + opacity: 1, + "fill-opacity": 1 + }), + r.fill = l, + r.opacity = 1, + r.fillOpacity = 1, + 1 + }, + s = function (a) { + var b = a.getBBox(1); + q(a.pattern, { + patternTransform: a.matrix.invert() + " translate(" + b.x + "," + b.y + ")" + }) + }, + t = function (d, e, f) { + if ("path" == d.type) { + for (var g, h, i, j, k, m = c(e).toLowerCase().split("-"), n = d.paper, r = f ? "end" : "start", s = d.node, t = d.attrs, u = t["stroke-width"], v = m.length, w = "classic", x = 3, y = 3, z = 5; v--; ) + switch (m[v]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + w = m[v]; + break; + case "wide": + y = 5; + break; + case "narrow": + y = 2; + break; + case "long": + x = 5; + break; + case "short": + x = 2 + } + if ("open" == w ? (x += 2, y += 2, z += 2, i = 1, j = f ? 4 : 1, k = { + fill: "none", + stroke: t.stroke + }) : (j = i = x / 2, k = { + fill: t.stroke, + stroke: "none" + }), d._.arrows ? f ? (d._.arrows.endPath && p[d._.arrows.endPath]--, d._.arrows.endMarker && p[d._.arrows.endMarker]--) : (d._.arrows.startPath && p[d._.arrows.startPath]--, d._.arrows.startMarker && p[d._.arrows.startMarker]--) : d._.arrows = {}, "none" != w) { + var A = "raphael-marker-" + w, + B = "raphael-marker-" + r + w + x + y + "-obj" + d.id; + a._g.doc.getElementById(A) ? p[A]++ : (n.defs.appendChild(q(q("path"), { + "stroke-linecap": "round", + d: o[w], + id: A + })), p[A] = 1); + var C, + D = a._g.doc.getElementById(B); + D ? (p[B]++, C = D.getElementsByTagName("use")[0]) : (D = q(q("marker"), { + id: B, + markerHeight: y, + markerWidth: x, + orient: "auto", + refX: j, + refY: y / 2 + }), C = q(q("use"), { + "xlink:href": "#" + A, + transform: (f ? "rotate(180 " + x / 2 + " " + y / 2 + ") " : l) + "scale(" + x / z + "," + y / z + ")", + "stroke-width": (1 / ((x / z + y / z) / 2)).toFixed(4) + }), D.appendChild(C), n.defs.appendChild(D), p[B] = 1), + q(C, k); + var E = i * ("diamond" != w && "oval" != w); + f ? (g = d._.arrows.startdx * u || 0, h = a.getTotalLength(t.path) - E * u) : (g = E * u, h = a.getTotalLength(t.path) - (d._.arrows.enddx * u || 0)), + k = {}, + k["marker-" + r] = "url(#" + B + ")", + (h || g) && (k.d = a.getSubpath(t.path, g, h)), + q(s, k), + d._.arrows[r + "Path"] = A, + d._.arrows[r + "Marker"] = B, + d._.arrows[r + "dx"] = E, + d._.arrows[r + "Type"] = w, + d._.arrows[r + "String"] = e + } else + f ? (g = d._.arrows.startdx * u || 0, h = a.getTotalLength(t.path) - g) : (g = 0, h = a.getTotalLength(t.path) - (d._.arrows.enddx * u || 0)), d._.arrows[r + "Path"] && q(s, { + d: a.getSubpath(t.path, g, h) + }), delete d._.arrows[r + "Path"], delete d._.arrows[r + "Marker"], delete d._.arrows[r + "dx"], delete d._.arrows[r + "Type"], delete d._.arrows[r + "String"]; + for (k in p) + if (p[b](k) && !p[k]) { + var F = a._g.doc.getElementById(k); + F && F.parentNode.removeChild(F) + } + } + }, + u = { + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + v = function (a, b, d) { + if (b = u[c(b).toLowerCase()]) { + for (var e = a.attrs["stroke-width"] || "1", f = { + round: e, + square: e, + butt: 0 + } + [a.attrs["stroke-linecap"] || d["stroke-linecap"]] || 0, g = [], h = b.length; h--; ) + g[h] = b[h] * e + (h % 2 ? 1 : -1) * f; + q(a.node, { + "stroke-dasharray": g.join(",") + }) + } else + q(a.node, { + "stroke-dasharray": "none" + }) + }, + w = function (d, f) { + var i = d.node, + k = d.attrs, + m = i.style.visibility; + i.style.visibility = "hidden"; + for (var o in f) + if (f[b](o)) { + if (!a._availableAttrs[b](o)) + continue; + var p = f[o]; + switch (k[o] = p, o) { + case "blur": + d.blur(p); + break; + case "title": + var u = i.getElementsByTagName("title"); + if (u.length && (u = u[0])) + u.firstChild.nodeValue = p; + else { + u = q("title"); + var w = a._g.doc.createTextNode(p); + u.appendChild(w), + i.appendChild(u) + } + break; + case "href": + case "target": + var x = i.parentNode; + if ("a" != x.tagName.toLowerCase()) { + var z = q("a"); + x.insertBefore(z, i), + z.appendChild(i), + x = z + } + "target" == o ? x.setAttributeNS(n, "show", "blank" == p ? "new" : p) : x.setAttributeNS(n, o, p); + break; + case "cursor": + i.style.cursor = p; + break; + case "transform": + d.transform(p); + break; + case "arrow-start": + t(d, p); + break; + case "arrow-end": + t(d, p, 1); + break; + case "clip-rect": + var A = c(p).split(j); + if (4 == A.length) { + d.clip && d.clip.parentNode.parentNode.removeChild(d.clip.parentNode); + var B = q("clipPath"), + C = q("rect"); + B.id = a.createUUID(), + q(C, { + x: A[0], + y: A[1], + width: A[2], + height: A[3] + }), + B.appendChild(C), + d.paper.defs.appendChild(B), + q(i, { + "clip-path": "url(#" + B.id + ")" + }), + d.clip = C + } + if (!p) { + var D = i.getAttribute("clip-path"); + if (D) { + var E = a._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g, l)); + E && E.parentNode.removeChild(E), + q(i, { + "clip-path": l + }), + delete d.clip + } + } + break; + case "path": + "path" == d.type && (q(i, { + d: p ? k.path = a._pathToAbsolute(p) : "M0,0" + }), d._.dirty = 1, d._.arrows && ("startString" in d._.arrows && t(d, d._.arrows.startString), "endString" in d._.arrows && t(d, d._.arrows.endString, 1))); + break; + case "width": + if (i.setAttribute(o, p), d._.dirty = 1, !k.fx) + break; + o = "x", + p = k.x; + case "x": + k.fx && (p = -k.x - (k.width || 0)); + case "rx": + if ("rx" == o && "rect" == d.type) + break; + case "cx": + i.setAttribute(o, p), + d.pattern && s(d), + d._.dirty = 1; + break; + case "height": + if (i.setAttribute(o, p), d._.dirty = 1, !k.fy) + break; + o = "y", + p = k.y; + case "y": + k.fy && (p = -k.y - (k.height || 0)); + case "ry": + if ("ry" == o && "rect" == d.type) + break; + case "cy": + i.setAttribute(o, p), + d.pattern && s(d), + d._.dirty = 1; + break; + case "r": + "rect" == d.type ? q(i, { + rx: p, + ry: p + }) : i.setAttribute(o, p), + d._.dirty = 1; + break; + case "src": + "image" == d.type && i.setAttributeNS(n, "href", p); + break; + case "stroke-width": + (1 != d._.sx || 1 != d._.sy) && (p /= g(h(d._.sx), h(d._.sy)) || 1), + i.setAttribute(o, p), + k["stroke-dasharray"] && v(d, k["stroke-dasharray"], f), + d._.arrows && ("startString" in d._.arrows && t(d, d._.arrows.startString), "endString" in d._.arrows && t(d, d._.arrows.endString, 1)); + break; + case "stroke-dasharray": + v(d, p, f); + break; + case "fill": + var F = c(p).match(a._ISURL); + if (F) { + B = q("pattern"); + var G = q("image"); + B.id = a.createUUID(), + q(B, { + x: 0, + y: 0, + patternUnits: "userSpaceOnUse", + height: 1, + width: 1 + }), + q(G, { + x: 0, + y: 0, + "xlink:href": F[1] + }), + B.appendChild(G), + function (b) { + a._preload(F[1], function () { + var a = this.offsetWidth, + c = this.offsetHeight; + q(b, { + width: a, + height: c + }), + q(G, { + width: a, + height: c + }) + }) + } + (B), + d.paper.defs.appendChild(B), + q(i, { + fill: "url(#" + B.id + ")" + }), + d.pattern = B, + d.pattern && s(d); + break + } + var H = a.getRGB(p); + if (H.error) { + if (("circle" == d.type || "ellipse" == d.type || "r" != c(p).charAt()) && r(d, p)) { + if ("opacity" in k || "fill-opacity" in k) { + var I = a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g, l)); + if (I) { + var J = I.getElementsByTagName("stop"); + q(J[J.length - 1], { + "stop-opacity": ("opacity" in k ? k.opacity : 1) * ("fill-opacity" in k ? k["fill-opacity"] : 1) + }) + } + } + k.gradient = p, + k.fill = "none"; + break + } + } else + delete f.gradient, delete k.gradient, !a.is(k.opacity, "undefined") && a.is(f.opacity, "undefined") && q(i, { + opacity: k.opacity + }), !a.is(k["fill-opacity"], "undefined") && a.is(f["fill-opacity"], "undefined") && q(i, { + "fill-opacity": k["fill-opacity"] + }); + H[b]("opacity") && q(i, { + "fill-opacity": H.opacity > 1 ? H.opacity / 100 : H.opacity + }); + case "stroke": + H = a.getRGB(p), + i.setAttribute(o, H.hex), + "stroke" == o && H[b]("opacity") && q(i, { + "stroke-opacity": H.opacity > 1 ? H.opacity / 100 : H.opacity + }), + "stroke" == o && d._.arrows && ("startString" in d._.arrows && t(d, d._.arrows.startString), "endString" in d._.arrows && t(d, d._.arrows.endString, 1)); + break; + case "gradient": + ("circle" == d.type || "ellipse" == d.type || "r" != c(p).charAt()) && r(d, p); + break; + case "opacity": + k.gradient && !k[b]("stroke-opacity") && q(i, { + "stroke-opacity": p > 1 ? p / 100 : p + }); + case "fill-opacity": + if (k.gradient) { + I = a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g, l)), + I && (J = I.getElementsByTagName("stop"), q(J[J.length - 1], { + "stop-opacity": p + })); + break + } + default: + "font-size" == o && (p = e(p, 10) + "px"); + var K = o.replace(/(\-.)/g, function (a) { + return a.substring(1).toUpperCase() + }); + i.style[K] = p, + d._.dirty = 1, + i.setAttribute(o, p) + } + } + y(d, f), + i.style.visibility = m + }, + x = 1.2, + y = function (d, f) { + if ("text" == d.type && (f[b]("text") || f[b]("font") || f[b]("font-size") || f[b]("x") || f[b]("y"))) { + var g = d.attrs, + h = d.node, + i = h.firstChild ? e(a._g.doc.defaultView.getComputedStyle(h.firstChild, l).getPropertyValue("font-size"), 10) : 10; + if (f[b]("text")) { + for (g.text = f.text; h.firstChild; ) + h.removeChild(h.firstChild); + for (var j, k = c(f.text).split("\n"), m = [], n = 0, o = k.length; o > n; n++) + j = q("tspan"), n && q(j, { + dy: i * x, + x: g.x + }), j.appendChild(a._g.doc.createTextNode(k[n])), h.appendChild(j), m[n] = j + } else + for (m = h.getElementsByTagName("tspan"), n = 0, o = m.length; o > n; n++) + n ? q(m[n], { + dy: i * x, + x: g.x + }) : q(m[0], { + dy: 0 + }); + q(h, { + x: g.x, + y: g.y + }), + d._.dirty = 1; + var p = d._getBBox(), + r = g.y - (p.y + p.height / 2); + r && a.is(r, "finite") && q(m[0], { + dy: r + }) + } + }, + z = function (a) { + return a.parentNode && "a" === a.parentNode.tagName.toLowerCase() ? a.parentNode : a + }, + A = function (b, c) { + this[0] = this.node = b, + b.raphael = !0, + this.id = a._oid++, + b.raphaelid = this.id, + this.matrix = a.matrix(), + this.realPath = null, + this.paper = c, + this.attrs = this.attrs || {}, + this._ = { + transform: [], + sx: 1, + sy: 1, + deg: 0, + dx: 0, + dy: 0, + dirty: 1 + }, + !c.bottom && (c.bottom = this), + this.prev = c.top, + c.top && (c.top.next = this), + c.top = this, + this.next = null + }, + B = a.el; + A.prototype = B, + B.constructor = A, + a._engine.path = function (a, b) { + var c = q("path"); + b.canvas && b.canvas.appendChild(c); + var d = new A(c, b); + return d.type = "path", + w(d, { + fill: "none", + stroke: "#000", + path: a + }), + d + }, + B.rotate = function (a, b, e) { + if (this.removed) + return this; + if (a = c(a).split(j), a.length - 1 && (b = d(a[1]), e = d(a[2])), a = d(a[0]), null == e && (b = e), null == b || null == e) { + var f = this.getBBox(1); + b = f.x + f.width / 2, + e = f.y + f.height / 2 + } + return this.transform(this._.transform.concat([["r", a, b, e]])), + this + }, + B.scale = function (a, b, e, f) { + if (this.removed) + return this; + if (a = c(a).split(j), a.length - 1 && (b = d(a[1]), e = d(a[2]), f = d(a[3])), a = d(a[0]), null == b && (b = a), null == f && (e = f), null == e || null == f) + var g = this.getBBox(1); + return e = null == e ? g.x + g.width / 2 : e, + f = null == f ? g.y + g.height / 2 : f, + this.transform(this._.transform.concat([["s", a, b, e, f]])), + this + }, + B.translate = function (a, b) { + return this.removed ? this : (a = c(a).split(j), a.length - 1 && (b = d(a[1])), a = d(a[0]) || 0, b = +b || 0, this.transform(this._.transform.concat([["t", a, b]])), this) + }, + B.transform = function (c) { + var d = this._; + if (null == c) + return d.transform; + if (a._extractTransform(this, c), this.clip && q(this.clip, { + transform: this.matrix.invert() + }), this.pattern && s(this), this.node && q(this.node, { + transform: this.matrix + }), 1 != d.sx || 1 != d.sy) { + var e = this.attrs[b]("stroke-width") ? this.attrs["stroke-width"] : 1; + this.attr({ + "stroke-width": e + }) + } + return this + }, + B.hide = function () { + return this.removed || (this.node.style.display = "none"), + this + }, + B.show = function () { + return this.removed || (this.node.style.display = ""), + this + }, + B.remove = function () { + var b = z(this.node); + if (!this.removed && b.parentNode) { + var c = this.paper; + c.__set__ && c.__set__.exclude(this), + k.unbind("raphael.*.*." + this.id), + this.gradient && c.defs.removeChild(this.gradient), + a._tear(this, c), + b.parentNode.removeChild(b), + this.removeData(); + for (var d in this) + this[d] = "function" == typeof this[d] ? a._removedFactory(d) : null; + this.removed = !0 + } + }, + B._getBBox = function () { + if ("none" == this.node.style.display) { + this.show(); + var a = !0 + } + var b, + c = !1; + this.paper.canvas.parentElement ? b = this.paper.canvas.parentElement.style : this.paper.canvas.parentNode && (b = this.paper.canvas.parentNode.style), + b && "none" == b.display && (c = !0, b.display = ""); + var d = {}; + try { + d = this.node.getBBox() + } catch (e) { + d = { + x: this.node.clientLeft, + y: this.node.clientTop, + width: this.node.clientWidth, + height: this.node.clientHeight + } + } + finally { + d = d || {}, + c && (b.display = "none") + } + return a && this.hide(), + d + }, + B.attr = function (c, d) { + if (this.removed) + return this; + if (null == c) { + var e = {}; + for (var f in this.attrs) + this.attrs[b](f) && (e[f] = this.attrs[f]); + return e.gradient && "none" == e.fill && (e.fill = e.gradient) && delete e.gradient, + e.transform = this._.transform, + e + } + if (null == d && a.is(c, "string")) { + if ("fill" == c && "none" == this.attrs.fill && this.attrs.gradient) + return this.attrs.gradient; + if ("transform" == c) + return this._.transform; + for (var g = c.split(j), h = {}, i = 0, l = g.length; l > i; i++) + c = g[i], c in this.attrs ? h[c] = this.attrs[c] : a.is(this.paper.customAttributes[c], "function") ? h[c] = this.paper.customAttributes[c].def : h[c] = a._availableAttrs[c]; + return l - 1 ? h : h[g[0]] + } + if (null == d && a.is(c, "array")) { + for (h = {}, i = 0, l = c.length; l > i; i++) + h[c[i]] = this.attr(c[i]); + return h + } + if (null != d) { + var m = {}; + m[c] = d + } else + null != c && a.is(c, "object") && (m = c); + for (var n in m) + k("raphael.attr." + n + "." + this.id, this, m[n]); + for (n in this.paper.customAttributes) + if (this.paper.customAttributes[b](n) && m[b](n) && a.is(this.paper.customAttributes[n], "function")) { + var o = this.paper.customAttributes[n].apply(this, [].concat(m[n])); + this.attrs[n] = m[n]; + for (var p in o) + o[b](p) && (m[p] = o[p]) + } + return w(this, m), + this + }, + B.toFront = function () { + if (this.removed) + return this; + var b = z(this.node); + b.parentNode.appendChild(b); + var c = this.paper; + return c.top != this && a._tofront(this, c), + this + }, + B.toBack = function () { + if (this.removed) + return this; + var b = z(this.node), + c = b.parentNode; + c.insertBefore(b, c.firstChild), + a._toback(this, this.paper); + this.paper; + return this + }, + B.insertAfter = function (b) { + if (this.removed || !b) + return this; + var c = z(this.node), + d = z(b.node || b[b.length - 1].node); + return d.nextSibling ? d.parentNode.insertBefore(c, d.nextSibling) : d.parentNode.appendChild(c), + a._insertafter(this, b, this.paper), + this + }, + B.insertBefore = function (b) { + if (this.removed || !b) + return this; + var c = z(this.node), + d = z(b.node || b[0].node); + return d.parentNode.insertBefore(c, d), + a._insertbefore(this, b, this.paper), + this + }, + B.blur = function (b) { + var c = this; + if (0 !== +b) { + var d = q("filter"), + e = q("feGaussianBlur"); + c.attrs.blur = b, + d.id = a.createUUID(), + q(e, { + stdDeviation: +b || 1.5 + }), + d.appendChild(e), + c.paper.defs.appendChild(d), + c._blur = d, + q(c.node, { + filter: "url(#" + d.id + ")" + }) + } else + c._blur && (c._blur.parentNode.removeChild(c._blur), delete c._blur, delete c.attrs.blur), c.node.removeAttribute("filter"); + return c + }, + a._engine.circle = function (a, b, c, d) { + var e = q("circle"); + a.canvas && a.canvas.appendChild(e); + var f = new A(e, a); + return f.attrs = { + cx: b, + cy: c, + r: d, + fill: "none", + stroke: "#000" + }, + f.type = "circle", + q(e, f.attrs), + f + }, + a._engine.rect = function (a, b, c, d, e, f) { + var g = q("rect"); + a.canvas && a.canvas.appendChild(g); + var h = new A(g, a); + return h.attrs = { + x: b, + y: c, + width: d, + height: e, + rx: f || 0, + ry: f || 0, + fill: "none", + stroke: "#000" + }, + h.type = "rect", + q(g, h.attrs), + h + }, + a._engine.ellipse = function (a, b, c, d, e) { + var f = q("ellipse"); + a.canvas && a.canvas.appendChild(f); + var g = new A(f, a); + return g.attrs = { + cx: b, + cy: c, + rx: d, + ry: e, + fill: "none", + stroke: "#000" + }, + g.type = "ellipse", + q(f, g.attrs), + g + }, + a._engine.image = function (a, b, c, d, e, f) { + var g = q("image"); + q(g, { + x: c, + y: d, + width: e, + height: f, + preserveAspectRatio: "none" + }), + g.setAttributeNS(n, "href", b), + a.canvas && a.canvas.appendChild(g); + var h = new A(g, a); + return h.attrs = { + x: c, + y: d, + width: e, + height: f, + src: b + }, + h.type = "image", + h + }, + a._engine.text = function (b, c, d, e) { + var f = q("text"); + b.canvas && b.canvas.appendChild(f); + var g = new A(f, b); + return g.attrs = { + x: c, + y: d, + "text-anchor": "middle", + text: e, + "font-family": a._availableAttrs["font-family"], + "font-size": a._availableAttrs["font-size"], + stroke: "none", + fill: "#000" + }, + g.type = "text", + w(g, g.attrs), + g + }, + a._engine.setSize = function (a, b) { + return this.width = a || this.width, + this.height = b || this.height, + this.canvas.setAttribute("width", this.width), + this.canvas.setAttribute("height", this.height), + this._viewBox && this.setViewBox.apply(this, this._viewBox), + this + }, + a._engine.create = function () { + var b = a._getContainer.apply(0, arguments), + c = b && b.container, + d = b.x, + e = b.y, + f = b.width, + g = b.height; + if (!c) + throw new Error("SVG container not found."); + var h, + i = q("svg"), + j = "overflow:hidden;"; + return d = d || 0, + e = e || 0, + f = f || 512, + g = g || 342, + q(i, { + height: g, + version: 1.1, + width: f, + xmlns: "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink" + }), + 1 == c ? (i.style.cssText = j + "position:absolute;left:" + d + "px;top:" + e + "px", a._g.doc.body.appendChild(i), h = 1) : (i.style.cssText = j + "position:relative", c.firstChild ? c.insertBefore(i, c.firstChild) : c.appendChild(i)), + c = new a._Paper, + c.width = f, + c.height = g, + c.canvas = i, + c.clear(), + c._left = c._top = 0, + h && (c.renderfix = function () {}), + c.renderfix(), + c + }, + a._engine.setViewBox = function (a, b, c, d, e) { + k("raphael.setViewBox", this, this._viewBox, [a, b, c, d, e]); + var f, + h, + i = this.getSize(), + j = g(c / i.width, d / i.height), + l = this.top, + n = e ? "xMidYMid meet" : "xMinYMin"; + for (null == a ? (this._vbSize && (j = 1), delete this._vbSize, f = "0 0 " + this.width + m + this.height) : (this._vbSize = j, f = a + m + b + m + c + m + d), q(this.canvas, { + viewBox: f, + preserveAspectRatio: n + }); j && l; ) + h = "stroke-width" in l.attrs ? l.attrs["stroke-width"] : 1, l.attr({ + "stroke-width": h + }), l._.dirty = 1, l._.dirtyT = 1, l = l.prev; + return this._viewBox = [a, b, c, d, !!e], + this + }, + a.prototype.renderfix = function () { + var a, + b = this.canvas, + c = b.style; + try { + a = b.getScreenCTM() || b.createSVGMatrix() + } catch (d) { + a = b.createSVGMatrix() + } + var e = -a.e % 1, + f = -a.f % 1; + (e || f) && (e && (this._left = (this._left + e) % 1, c.left = this._left + "px"), f && (this._top = (this._top + f) % 1, c.top = this._top + "px")) + }, + a.prototype.clear = function () { + a.eve("raphael.clear", this); + for (var b = this.canvas; b.firstChild; ) + b.removeChild(b.firstChild); + this.bottom = this.top = null, + (this.desc = q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël " + a.version)), + b.appendChild(this.desc), + b.appendChild(this.defs = q("defs")) + }, + a.prototype.remove = function () { + k("raphael.remove", this), + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var b in this) + this[b] = "function" == typeof this[b] ? a._removedFactory(b) : null + }; + var C = a.st; + for (var D in B) + B[b](D) && !C[b](D) && (C[D] = function (a) { + return function () { + var b = arguments; + return this.forEach(function (c) { + c[a].apply(c, b) + }) + } + } + (D)) + } +}), function (a, b) { + "function" == typeof define && define.amd ? define("raphael.vml", ["raphael.core"], function (a) { + return b(a) + }) : b("object" == typeof exports ? require("./raphael.core") : a.Raphael) +} +(this, function (a) { + if (!a || a.vml) { + var b = "hasOwnProperty", + c = String, + d = parseFloat, + e = Math, + f = e.round, + g = e.max, + h = e.min, + i = e.abs, + j = "fill", + k = /[, ]+/, + l = a.eve, + m = " progid:DXImageTransform.Microsoft", + n = " ", + o = "", + p = { + M: "m", + L: "l", + C: "c", + Z: "x", + m: "t", + l: "r", + c: "v", + z: "x" + }, + q = /([clmz]),?([^clmz]*)/gi, + r = / progid:\S+Blur\([^\)]+\)/g, + s = /-?[^,\s-]+/g, + t = "position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)", + u = 21600, + v = { + path: 1, + rect: 1, + image: 1 + }, + w = { + circle: 1, + ellipse: 1 + }, + x = function (b) { + var d = /[ahqstv]/gi, + e = a._pathToAbsolute; + if (c(b).match(d) && (e = a._path2curve), d = /[clmz]/g, e == a._pathToAbsolute && !c(b).match(d)) { + var g = c(b).replace(q, function (a, b, c) { + var d = [], + e = "m" == b.toLowerCase(), + g = p[b]; + return c.replace(s, function (a) { + e && 2 == d.length && (g += d + p["m" == b ? "l" : "L"], d = []), + d.push(f(a * u)) + }), + g + d + }); + return g + } + var h, + i, + j = e(b); + g = []; + for (var k = 0, l = j.length; l > k; k++) { + h = j[k], + i = j[k][0].toLowerCase(), + "z" == i && (i = "x"); + for (var m = 1, r = h.length; r > m; m++) + i += f(h[m] * u) + (m != r - 1 ? "," : o); + g.push(i) + } + return g.join(n) + }, + y = function (b, c, d) { + var e = a.matrix(); + return e.rotate(-b, .5, .5), { + dx: e.x(c, d), + dy: e.y(c, d) + } + }, + z = function (a, b, c, d, e, f) { + var g = a._, + h = a.matrix, + k = g.fillpos, + l = a.node, + m = l.style, + o = 1, + p = "", + q = u / b, + r = u / c; + if (m.visibility = "hidden", b && c) { + if (l.coordsize = i(q) + n + i(r), m.rotation = f * (0 > b * c ? -1 : 1), f) { + var s = y(f, d, e); + d = s.dx, + e = s.dy + } + if (0 > b && (p += "x"), 0 > c && (p += " y") && (o = -1), m.flip = p, l.coordorigin = d * -q + n + e * -r, k || g.fillsize) { + var t = l.getElementsByTagName(j); + t = t && t[0], + l.removeChild(t), + k && (s = y(f, h.x(k[0], k[1]), h.y(k[0], k[1])), t.position = s.dx * o + n + s.dy * o), + g.fillsize && (t.size = g.fillsize[0] * i(b) + n + g.fillsize[1] * i(c)), + l.appendChild(t) + } + m.visibility = "visible" + } + }; + a.toString = function () { + return "Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël " + this.version + }; + var A = function (a, b, d) { + for (var e = c(b).toLowerCase().split("-"), f = d ? "end" : "start", g = e.length, h = "classic", i = "medium", j = "medium"; g--; ) + switch (e[g]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + h = e[g]; + break; + case "wide": + case "narrow": + j = e[g]; + break; + case "long": + case "short": + i = e[g] + } + var k = a.node.getElementsByTagName("stroke")[0]; + k[f + "arrow"] = h, + k[f + "arrowlength"] = i, + k[f + "arrowwidth"] = j + }, + B = function (e, i) { + e.attrs = e.attrs || {}; + var l = e.node, + m = e.attrs, + p = l.style, + q = v[e.type] && (i.x != m.x || i.y != m.y || i.width != m.width || i.height != m.height || i.cx != m.cx || i.cy != m.cy || i.rx != m.rx || i.ry != m.ry || i.r != m.r), + r = w[e.type] && (m.cx != i.cx || m.cy != i.cy || m.r != i.r || m.rx != i.rx || m.ry != i.ry), + s = e; + for (var t in i) + i[b](t) && (m[t] = i[t]); + if (q && (m.path = a._getPath[e.type](e), e._.dirty = 1), i.href && (l.href = i.href), i.title && (l.title = i.title), i.target && (l.target = i.target), i.cursor && (p.cursor = i.cursor), "blur" in i && e.blur(i.blur), (i.path && "path" == e.type || q) && (l.path = x(~c(m.path).toLowerCase().indexOf("r") ? a._pathToAbsolute(m.path) : m.path), e._.dirty = 1, "image" == e.type && (e._.fillpos = [m.x, m.y], e._.fillsize = [m.width, m.height], z(e, 1, 1, 0, 0, 0))), "transform" in i && e.transform(i.transform), r) { + var y = +m.cx, + B = +m.cy, + D = +m.rx || +m.r || 0, + E = +m.ry || +m.r || 0; + l.path = a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", f((y - D) * u), f((B - E) * u), f((y + D) * u), f((B + E) * u), f(y * u)), + e._.dirty = 1 + } + if ("clip-rect" in i) { + var G = c(i["clip-rect"]).split(k); + if (4 == G.length) { + G[2] = +G[2] + +G[0], + G[3] = +G[3] + +G[1]; + var H = l.clipRect || a._g.doc.createElement("div"), + I = H.style; + I.clip = a.format("rect({1}px {2}px {3}px {0}px)", G), + l.clipRect || (I.position = "absolute", I.top = 0, I.left = 0, I.width = e.paper.width + "px", I.height = e.paper.height + "px", l.parentNode.insertBefore(H, l), H.appendChild(l), l.clipRect = H) + } + i["clip-rect"] || l.clipRect && (l.clipRect.style.clip = "auto") + } + if (e.textpath) { + var J = e.textpath.style; + i.font && (J.font = i.font), + i["font-family"] && (J.fontFamily = '"' + i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, o) + '"'), + i["font-size"] && (J.fontSize = i["font-size"]), + i["font-weight"] && (J.fontWeight = i["font-weight"]), + i["font-style"] && (J.fontStyle = i["font-style"]) + } + if ("arrow-start" in i && A(s, i["arrow-start"]), "arrow-end" in i && A(s, i["arrow-end"], 1), null != i.opacity || null != i["stroke-width"] || null != i.fill || null != i.src || null != i.stroke || null != i["stroke-width"] || null != i["stroke-opacity"] || null != i["fill-opacity"] || null != i["stroke-dasharray"] || null != i["stroke-miterlimit"] || null != i["stroke-linejoin"] || null != i["stroke-linecap"]) { + var K = l.getElementsByTagName(j), + L = !1; + if (K = K && K[0], !K && (L = K = F(j)), "image" == e.type && i.src && (K.src = i.src), i.fill && (K.on = !0), (null == K.on || "none" == i.fill || null === i.fill) && (K.on = !1), K.on && i.fill) { + var M = c(i.fill).match(a._ISURL); + if (M) { + K.parentNode == l && l.removeChild(K), + K.rotate = !0, + K.src = M[1], + K.type = "tile"; + var N = e.getBBox(1); + K.position = N.x + n + N.y, + e._.fillpos = [N.x, N.y], + a._preload(M[1], function () { + e._.fillsize = [this.offsetWidth, this.offsetHeight] + }) + } else + K.color = a.getRGB(i.fill).hex, K.src = o, K.type = "solid", a.getRGB(i.fill).error && (s.type in { + circle: 1, + ellipse: 1 + } + || "r" != c(i.fill).charAt()) && C(s, i.fill, K) && (m.fill = "none", m.gradient = i.fill, K.rotate = !1) + } + if ("fill-opacity" in i || "opacity" in i) { + var O = ((+m["fill-opacity"] + 1 || 2) - 1) * ((+m.opacity + 1 || 2) - 1) * ((+a.getRGB(i.fill).o + 1 || 2) - 1); + O = h(g(O, 0), 1), + K.opacity = O, + K.src && (K.color = "none") + } + l.appendChild(K); + var P = l.getElementsByTagName("stroke") && l.getElementsByTagName("stroke")[0], + Q = !1; + !P && (Q = P = F("stroke")), + (i.stroke && "none" != i.stroke || i["stroke-width"] || null != i["stroke-opacity"] || i["stroke-dasharray"] || i["stroke-miterlimit"] || i["stroke-linejoin"] || i["stroke-linecap"]) && (P.on = !0), + ("none" == i.stroke || null === i.stroke || null == P.on || 0 == i.stroke || 0 == i["stroke-width"]) && (P.on = !1); + var R = a.getRGB(i.stroke); + P.on && i.stroke && (P.color = R.hex), + O = ((+m["stroke-opacity"] + 1 || 2) - 1) * ((+m.opacity + 1 || 2) - 1) * ((+R.o + 1 || 2) - 1); + var S = .75 * (d(i["stroke-width"]) || 1); + if (O = h(g(O, 0), 1), null == i["stroke-width"] && (S = m["stroke-width"]), i["stroke-width"] && (P.weight = S), S && 1 > S && (O *= S) && (P.weight = 1), P.opacity = O, i["stroke-linejoin"] && (P.joinstyle = i["stroke-linejoin"] || "miter"), P.miterlimit = i["stroke-miterlimit"] || 8, i["stroke-linecap"] && (P.endcap = "butt" == i["stroke-linecap"] ? "flat" : "square" == i["stroke-linecap"] ? "square" : "round"), "stroke-dasharray" in i) { + var T = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + P.dashstyle = T[b](i["stroke-dasharray"]) ? T[i["stroke-dasharray"]] : o + } + Q && l.appendChild(P) + } + if ("text" == s.type) { + s.paper.canvas.style.display = o; + var U = s.paper.span, + V = 100, + W = m.font && m.font.match(/\d+(?:\.\d*)?(?=px)/); + p = U.style, + m.font && (p.font = m.font), + m["font-family"] && (p.fontFamily = m["font-family"]), + m["font-weight"] && (p.fontWeight = m["font-weight"]), + m["font-style"] && (p.fontStyle = m["font-style"]), + W = d(m["font-size"] || W && W[0]) || 10, + p.fontSize = W * V + "px", + s.textpath.string && (U.innerHTML = c(s.textpath.string).replace(/")); + var X = U.getBoundingClientRect(); + s.W = m.w = (X.right - X.left) / V, + s.H = m.h = (X.bottom - X.top) / V, + s.X = m.x, + s.Y = m.y + s.H / 2, + ("x" in i || "y" in i) && (s.path.v = a.format("m{0},{1}l{2},{1}", f(m.x * u), f(m.y * u), f(m.x * u) + 1)); + for (var Y = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"], Z = 0, $ = Y.length; $ > Z; Z++) + if (Y[Z]in i) { + s._.dirty = 1; + break + } + switch (m["text-anchor"]) { + case "start": + s.textpath.style["v-text-align"] = "left", + s.bbx = s.W / 2; + break; + case "end": + s.textpath.style["v-text-align"] = "right", + s.bbx = -s.W / 2; + break; + default: + s.textpath.style["v-text-align"] = "center", + s.bbx = 0 + } + s.textpath.style["v-text-kern"] = !0 + } + }, + C = function (b, f, g) { + b.attrs = b.attrs || {}; + var h = (b.attrs, Math.pow), + i = "linear", + j = ".5 .5"; + if (b.attrs.gradient = f, f = c(f).replace(a._radial_gradient, function (a, b, c) { + return i = "radial", + b && c && (b = d(b), c = d(c), h(b - .5, 2) + h(c - .5, 2) > .25 && (c = e.sqrt(.25 - h(b - .5, 2)) * (2 * (c > .5) - 1) + .5), j = b + n + c), + o + }), f = f.split(/\s*\-\s*/), "linear" == i) { + var k = f.shift(); + if (k = -d(k), isNaN(k)) + return null + } + var l = a._parseDots(f); + if (!l) + return null; + if (b = b.shape || b.node, l.length) { + b.removeChild(g), + g.on = !0, + g.method = "none", + g.color = l[0].color, + g.color2 = l[l.length - 1].color; + for (var m = [], p = 0, q = l.length; q > p; p++) + l[p].offset && m.push(l[p].offset + n + l[p].color); + g.colors = m.length ? m.join() : "0% " + g.color, + "radial" == i ? (g.type = "gradientTitle", g.focus = "100%", g.focussize = "0 0", g.focusposition = j, g.angle = 0) : (g.type = "gradient", g.angle = (270 - k) % 360), + b.appendChild(g) + } + return 1 + }, + D = function (b, c) { + this[0] = this.node = b, + b.raphael = !0, + this.id = a._oid++, + b.raphaelid = this.id, + this.X = 0, + this.Y = 0, + this.attrs = {}, + this.paper = c, + this.matrix = a.matrix(), + this._ = { + transform: [], + sx: 1, + sy: 1, + dx: 0, + dy: 0, + deg: 0, + dirty: 1, + dirtyT: 1 + }, + !c.bottom && (c.bottom = this), + this.prev = c.top, + c.top && (c.top.next = this), + c.top = this, + this.next = null + }, + E = a.el; + D.prototype = E, + E.constructor = D, + E.transform = function (b) { + if (null == b) + return this._.transform; + var d, + e = this.paper._viewBoxShift, + f = e ? "s" + [e.scale, e.scale] + "-1-1t" + [e.dx, e.dy] : o; + e && (d = b = c(b).replace(/\.{3}|\u2026/g, this._.transform || o)), + a._extractTransform(this, f + b); + var g, + h = this.matrix.clone(), + i = this.skew, + j = this.node, + k = ~c(this.attrs.fill).indexOf("-"), + l = !c(this.attrs.fill).indexOf("url("); + if (h.translate(1, 1), l || k || "image" == this.type) + if (i.matrix = "1 0 0 1", i.offset = "0 0", g = h.split(), k && g.noRotation || !g.isSimple) { + j.style.filter = h.toFilter(); + var m = this.getBBox(), + p = this.getBBox(1), + q = m.x - p.x, + r = m.y - p.y; + j.coordorigin = q * -u + n + r * -u, + z(this, 1, 1, q, r, 0) + } else + j.style.filter = o, z(this, g.scalex, g.scaley, g.dx, g.dy, g.rotate); + else + j.style.filter = o, i.matrix = c(h), i.offset = h.offset(); + return null !== d && (this._.transform = d, a._extractTransform(this, d)), + this + }, + E.rotate = function (a, b, e) { + if (this.removed) + return this; + if (null != a) { + if (a = c(a).split(k), a.length - 1 && (b = d(a[1]), e = d(a[2])), a = d(a[0]), null == e && (b = e), null == b || null == e) { + var f = this.getBBox(1); + b = f.x + f.width / 2, + e = f.y + f.height / 2 + } + return this._.dirtyT = 1, + this.transform(this._.transform.concat([["r", a, b, e]])), + this + } + }, + E.translate = function (a, b) { + return this.removed ? this : (a = c(a).split(k), a.length - 1 && (b = d(a[1])), a = d(a[0]) || 0, b = +b || 0, this._.bbox && (this._.bbox.x += a, this._.bbox.y += b), this.transform(this._.transform.concat([["t", a, b]])), this) + }, + E.scale = function (a, b, e, f) { + if (this.removed) + return this; + if (a = c(a).split(k), a.length - 1 && (b = d(a[1]), e = d(a[2]), f = d(a[3]), isNaN(e) && (e = null), isNaN(f) && (f = null)), a = d(a[0]), null == b && (b = a), null == f && (e = f), null == e || null == f) + var g = this.getBBox(1); + return e = null == e ? g.x + g.width / 2 : e, + f = null == f ? g.y + g.height / 2 : f, + this.transform(this._.transform.concat([["s", a, b, e, f]])), + this._.dirtyT = 1, + this + }, + E.hide = function () { + return !this.removed && (this.node.style.display = "none"), + this + }, + E.show = function () { + return !this.removed && (this.node.style.display = o), + this + }, + E.auxGetBBox = a.el.getBBox, + E.getBBox = function () { + var a = this.auxGetBBox(); + if (this.paper && this.paper._viewBoxShift) { + var b = {}, + c = 1 / this.paper._viewBoxShift.scale; + return b.x = a.x - this.paper._viewBoxShift.dx, + b.x *= c, + b.y = a.y - this.paper._viewBoxShift.dy, + b.y *= c, + b.width = a.width * c, + b.height = a.height * c, + b.x2 = b.x + b.width, + b.y2 = b.y + b.height, + b + } + return a + }, + E._getBBox = function () { + return this.removed ? {} + : { + x: this.X + (this.bbx || 0) - this.W / 2, + y: this.Y - this.H, + width: this.W, + height: this.H + } + }, + E.remove = function () { + if (!this.removed && this.node.parentNode) { + this.paper.__set__ && this.paper.__set__.exclude(this), + a.eve.unbind("raphael.*.*." + this.id), + a._tear(this, this.paper), + this.node.parentNode.removeChild(this.node), + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var b in this) + this[b] = "function" == typeof this[b] ? a._removedFactory(b) : null; + this.removed = !0 + } + }, + E.attr = function (c, d) { + if (this.removed) + return this; + if (null == c) { + var e = {}; + for (var f in this.attrs) + this.attrs[b](f) && (e[f] = this.attrs[f]); + return e.gradient && "none" == e.fill && (e.fill = e.gradient) && delete e.gradient, + e.transform = this._.transform, + e + } + if (null == d && a.is(c, "string")) { + if (c == j && "none" == this.attrs.fill && this.attrs.gradient) + return this.attrs.gradient; + for (var g = c.split(k), h = {}, i = 0, m = g.length; m > i; i++) + c = g[i], c in this.attrs ? h[c] = this.attrs[c] : a.is(this.paper.customAttributes[c], "function") ? h[c] = this.paper.customAttributes[c].def : h[c] = a._availableAttrs[c]; + return m - 1 ? h : h[g[0]] + } + if (this.attrs && null == d && a.is(c, "array")) { + for (h = {}, i = 0, m = c.length; m > i; i++) + h[c[i]] = this.attr(c[i]); + return h + } + var n; + null != d && (n = {}, n[c] = d), + null == d && a.is(c, "object") && (n = c); + for (var o in n) + l("raphael.attr." + o + "." + this.id, this, n[o]); + if (n) { + for (o in this.paper.customAttributes) + if (this.paper.customAttributes[b](o) && n[b](o) && a.is(this.paper.customAttributes[o], "function")) { + var p = this.paper.customAttributes[o].apply(this, [].concat(n[o])); + this.attrs[o] = n[o]; + for (var q in p) + p[b](q) && (n[q] = p[q]) + } + n.text && "text" == this.type && (this.textpath.string = n.text), + B(this, n) + } + return this + }, + E.toFront = function () { + return !this.removed && this.node.parentNode.appendChild(this.node), + this.paper && this.paper.top != this && a._tofront(this, this.paper), + this + }, + E.toBack = function () { + return this.removed ? this : (this.node.parentNode.firstChild != this.node && (this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild), a._toback(this, this.paper)), this) + }, + E.insertAfter = function (b) { + return this.removed ? this : (b.constructor == a.st.constructor && (b = b[b.length - 1]), b.node.nextSibling ? b.node.parentNode.insertBefore(this.node, b.node.nextSibling) : b.node.parentNode.appendChild(this.node), a._insertafter(this, b, this.paper), this) + }, + E.insertBefore = function (b) { + return this.removed ? this : (b.constructor == a.st.constructor && (b = b[0]), b.node.parentNode.insertBefore(this.node, b.node), a._insertbefore(this, b, this.paper), this) + }, + E.blur = function (b) { + var c = this.node.runtimeStyle, + d = c.filter; + return d = d.replace(r, o), + 0 !== +b ? (this.attrs.blur = b, c.filter = d + n + m + ".Blur(pixelradius=" + (+b || 1.5) + ")", c.margin = a.format("-{0}px 0 0 -{0}px", f(+b || 1.5))) : (c.filter = d, c.margin = 0, delete this.attrs.blur), + this + }, + a._engine.path = function (a, b) { + var c = F("shape"); + c.style.cssText = t, + c.coordsize = u + n + u, + c.coordorigin = b.coordorigin; + var d = new D(c, b), + e = { + fill: "none", + stroke: "#000" + }; + a && (e.path = a), + d.type = "path", + d.path = [], + d.Path = o, + B(d, e), + b.canvas.appendChild(c); + var f = F("skew"); + return f.on = !0, + c.appendChild(f), + d.skew = f, + d.transform(o), + d + }, + a._engine.rect = function (b, c, d, e, f, g) { + var h = a._rectPath(c, d, e, f, g), + i = b.path(h), + j = i.attrs; + return i.X = j.x = c, + i.Y = j.y = d, + i.W = j.width = e, + i.H = j.height = f, + j.r = g, + j.path = h, + i.type = "rect", + i + }, + a._engine.ellipse = function (a, b, c, d, e) { { + var f = a.path(); + f.attrs + } + return f.X = b - d, + f.Y = c - e, + f.W = 2 * d, + f.H = 2 * e, + f.type = "ellipse", + B(f, { + cx: b, + cy: c, + rx: d, + ry: e + }), + f + }, + a._engine.circle = function (a, b, c, d) { { + var e = a.path(); + e.attrs + } + return e.X = b - d, + e.Y = c - d, + e.W = e.H = 2 * d, + e.type = "circle", + B(e, { + cx: b, + cy: c, + r: d + }), + e + }, + a._engine.image = function (b, c, d, e, f, g) { + var h = a._rectPath(d, e, f, g), + i = b.path(h).attr({ + stroke: "none" + }), + k = i.attrs, + l = i.node, + m = l.getElementsByTagName(j)[0]; + return k.src = c, + i.X = k.x = d, + i.Y = k.y = e, + i.W = k.width = f, + i.H = k.height = g, + k.path = h, + i.type = "image", + m.parentNode == l && l.removeChild(m), + m.rotate = !0, + m.src = c, + m.type = "tile", + i._.fillpos = [d, e], + i._.fillsize = [f, g], + l.appendChild(m), + z(i, 1, 1, 0, 0, 0), + i + }, + a._engine.text = function (b, d, e, g) { + var h = F("shape"), + i = F("path"), + j = F("textpath"); + d = d || 0, + e = e || 0, + g = g || "", + i.v = a.format("m{0},{1}l{2},{1}", f(d * u), f(e * u), f(d * u) + 1), + i.textpathok = !0, + j.string = c(g), + j.on = !0, + h.style.cssText = t, + h.coordsize = u + n + u, + h.coordorigin = "0 0"; + var k = new D(h, b), + l = { + fill: "#000", + stroke: "none", + font: a._availableAttrs.font, + text: g + }; + k.shape = h, + k.path = i, + k.textpath = j, + k.type = "text", + k.attrs.text = c(g), + k.attrs.x = d, + k.attrs.y = e, + k.attrs.w = 1, + k.attrs.h = 1, + B(k, l), + h.appendChild(j), + h.appendChild(i), + b.canvas.appendChild(h); + var m = F("skew"); + return m.on = !0, + h.appendChild(m), + k.skew = m, + k.transform(o), + k + }, + a._engine.setSize = function (b, c) { + var d = this.canvas.style; + return this.width = b, + this.height = c, + b == +b && (b += "px"), + c == +c && (c += "px"), + d.width = b, + d.height = c, + d.clip = "rect(0 " + b + " " + c + " 0)", + this._viewBox && a._engine.setViewBox.apply(this, this._viewBox), + this + }, + a._engine.setViewBox = function (b, c, d, e, f) { + a.eve("raphael.setViewBox", this, this._viewBox, [b, c, d, e, f]); + var g, + h, + i = this.getSize(), + j = i.width, + k = i.height; + return f && (g = k / e, h = j / d, j > d * g && (b -= (j - d * g) / 2 / g), k > e * h && (c -= (k - e * h) / 2 / h)), + this._viewBox = [b, c, d, e, !!f], + this._viewBoxShift = { + dx: -b, + dy: -c, + scale: i + }, + this.forEach(function (a) { + a.transform("...") + }), + this + }; + var F; + a._engine.initWin = function (a) { + var b = a.document; + b.styleSheets.length < 31 ? b.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)") : b.styleSheets[0].addRule(".rvml", "behavior:url(#default#VML)"); + try { + !b.namespaces.rvml && b.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"), + F = function (a) { + return b.createElement("') + } + } catch (c) { + F = function (a) { + return b.createElement("<" + a + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">') + } + } + }, + a._engine.initWin(a._g.win), + a._engine.create = function () { + var b = a._getContainer.apply(0, arguments), + c = b.container, + d = b.height, + e = b.width, + f = b.x, + g = b.y; + if (!c) + throw new Error("VML container not found."); + var h = new a._Paper, + i = h.canvas = a._g.doc.createElement("div"), + j = i.style; + return f = f || 0, + g = g || 0, + e = e || 512, + d = d || 342, + h.width = e, + h.height = d, + e == +e && (e += "px"), + d == +d && (d += "px"), + h.coordsize = 1e3 * u + n + 1e3 * u, + h.coordorigin = "0 0", + h.span = a._g.doc.createElement("span"), + h.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;", + i.appendChild(h.span), + j.cssText = a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", e, d), + 1 == c ? (a._g.doc.body.appendChild(i), j.left = f + "px", j.top = g + "px", j.position = "absolute") : c.firstChild ? c.insertBefore(i, c.firstChild) : c.appendChild(i), + h.renderfix = function () {}, + h + }, + a.prototype.clear = function () { + a.eve("raphael.clear", this), + this.canvas.innerHTML = o, + this.span = a._g.doc.createElement("span"), + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;", + this.canvas.appendChild(this.span), + this.bottom = this.top = null + }, + a.prototype.remove = function () { + a.eve("raphael.remove", this), + this.canvas.parentNode.removeChild(this.canvas); + for (var b in this) + this[b] = "function" == typeof this[b] ? a._removedFactory(b) : null; + return !0 + }; + var G = a.st; + for (var H in E) + E[b](H) && !G[b](H) && (G[H] = function (a) { + return function () { + var b = arguments; + return this.forEach(function (c) { + c[a].apply(c, b) + }) + } + } + (H)) + } +}); +JustGage = function (config) { + var obj = this; + if (config === null || config === undefined) { + console.log('* justgage: Make sure to pass options to the constructor!'); + return false; + } + var node; + if (config.id !== null && config.id !== undefined) { + node = document.getElementById(config.id); + if (!node) { + console.log('* justgage: No element with id : %s found', config.id); + return false; + } + } else if (config.parentNode !== null && config.parentNode !== undefined) { + node = config.parentNode; + } else { + console.log('* justgage: Make sure to pass the existing element id or parentNode to the constructor.'); + return false; + } + var dataset = node.dataset ? node.dataset : {}; + var defaults = (config.defaults !== null && config.defaults !== undefined) ? config.defaults : false; + if (defaults !== false) { + config = extend({}, config, defaults); + delete config.defaults; + } + obj.config = { + id: config.id, + value: kvLookup('value', config, dataset, 0, 'float'), + defaults: kvLookup('defaults', config, dataset, 0, false), + parentNode: kvLookup('parentNode', config, dataset, null), + width: kvLookup('width', config, dataset, null), + height: kvLookup('height', config, dataset, null), + title: kvLookup('title', config, dataset, ""), + titleFontColor: kvLookup('titleFontColor', config, dataset, "#999999"), + titleFontFamily: kvLookup('titleFontFamily', config, dataset, "sans-serif"), + titlePosition: kvLookup('titlePosition', config, dataset, "above"), + valueFontColor: kvLookup('valueFontColor', config, dataset, "#010101"), + valueFontFamily: kvLookup('valueFontFamily', config, dataset, "Arial"), + symbol: kvLookup('symbol', config, dataset, ''), + min: kvLookup('min', config, dataset, 0, 'float'), + max: kvLookup('max', config, dataset, 100, 'float'), + reverse: kvLookup('reverse', config, dataset, false), + humanFriendlyDecimal: kvLookup('humanFriendlyDecimal', config, dataset, 0), + textRenderer: kvLookup('textRenderer', config, dataset, null), + gaugeWidthScale: kvLookup('gaugeWidthScale', config, dataset, 1.0), + gaugeColor: kvLookup('gaugeColor', config, dataset, "#edebeb"), + label: kvLookup('label', config, dataset, ''), + labelFontColor: kvLookup('labelFontColor', config, dataset, "#b3b3b3"), + shadowOpacity: kvLookup('shadowOpacity', config, dataset, 0.2), + shadowSize: kvLookup('shadowSize', config, dataset, 5), + shadowVerticalOffset: kvLookup('shadowVerticalOffset', config, dataset, 3), + levelColors: kvLookup('levelColors', config, dataset, ["#a9d70b", "#f9c802", "#ff0000"], 'array', ','), + startAnimationTime: kvLookup('startAnimationTime', config, dataset, 700), + startAnimationType: kvLookup('startAnimationType', config, dataset, '>'), + refreshAnimationTime: kvLookup('refreshAnimationTime', config, dataset, 700), + refreshAnimationType: kvLookup('refreshAnimationType', config, dataset, '>'), + donutStartAngle: kvLookup('donutStartAngle', config, dataset, 90), + valueMinFontSize: kvLookup('valueMinFontSize', config, dataset, 16), + titleMinFontSize: kvLookup('titleMinFontSize', config, dataset, 10), + labelMinFontSize: kvLookup('labelMinFontSize', config, dataset, 10), + minLabelMinFontSize: kvLookup('minLabelMinFontSize', config, dataset, 10), + maxLabelMinFontSize: kvLookup('maxLabelMinFontSize', config, dataset, 10), + hideValue: kvLookup('hideValue', config, dataset, false), + hideMinMax: kvLookup('hideMinMax', config, dataset, false), + hideInnerShadow: kvLookup('hideInnerShadow', config, dataset, false), + humanFriendly: kvLookup('humanFriendly', config, dataset, false), + noGradient: kvLookup('noGradient', config, dataset, false), + donut: kvLookup('donut', config, dataset, false), + relativeGaugeSize: kvLookup('relativeGaugeSize', config, dataset, false), + counter: kvLookup('counter', config, dataset, false), + decimals: kvLookup('decimals', config, dataset, 0), + customSectors: kvLookup('customSectors', config, dataset, []), + formatNumber: kvLookup('formatNumber', config, dataset, false), + pointer: kvLookup('pointer', config, dataset, false), + pointerOptions: kvLookup('pointerOptions', config, dataset, []) + }; + var + canvasW, + canvasH, + widgetW, + widgetH, + aspect, + dx, + dy, + titleFontSize, + titleX, + titleY, + valueFontSize, + valueX, + valueY, + labelFontSize, + labelX, + labelY, + minFontSize, + minX, + minY, + maxFontSize, + maxX, + maxY; + if (obj.config.value > obj.config.max) + obj.config.value = obj.config.max; + if (obj.config.value < obj.config.min) + obj.config.value = obj.config.min; + obj.originalValue = kvLookup('value', config, dataset, -1, 'float'); + if (obj.config.id !== null && (document.getElementById(obj.config.id)) !== null) { + obj.canvas = Raphael(obj.config.id, "100%", "100%"); + } else if (obj.config.parentNode !== null) { + obj.canvas = Raphael(obj.config.parentNode, "100%", "100%"); + } + if (obj.config.relativeGaugeSize === true) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + } + if (obj.config.relativeGaugeSize === true) { + canvasW = 200; + canvasH = 150; + } else if (obj.config.width !== null && obj.config.height !== null) { + canvasW = obj.config.width; + canvasH = obj.config.height; + } else if (obj.config.parentNode !== null) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + canvasW = 200; + canvasH = 150; + } else { + canvasW = getStyle(document.getElementById(obj.config.id), "width").slice(0, -2) * 1; + canvasH = getStyle(document.getElementById(obj.config.id), "height").slice(0, -2) * 1; + } + if (obj.config.donut === true) { + if (canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH; + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW; + if (widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + } else { + widgetW = canvasW; + widgetH = widgetW; + } + dx = (canvasW - widgetW) / 2; + dy = (canvasH - widgetH) / 2; + titleFontSize = ((widgetH / 8) > 10) ? (widgetH / 10) : 10; + titleX = dx + widgetW / 2; + titleY = dy + widgetH / 11; + valueFontSize = ((widgetH / 6.4) > 16) ? (widgetH / 5.4) : 18; + valueX = dx + widgetW / 2; + if (obj.config.label !== '') { + valueY = dy + widgetH / 1.85; + } else { + valueY = dy + widgetH / 1.7; + } + labelFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + labelX = dx + widgetW / 2; + labelY = valueY + labelFontSize; + minFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + minY = labelY; + maxFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + maxY = labelY; + } else { + if (canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH * 1.25; + if (widgetW > canvasW) { + aspect = widgetW / canvasW; + widgetW = widgetW / aspect; + widgetH = widgetH / aspect; + } + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW / 1.25; + if (widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + } else { + widgetW = canvasW; + widgetH = widgetW * 0.75; + } + dx = (canvasW - widgetW) / 2; + dy = (canvasH - widgetH) / 2; + if (obj.config.titlePosition === 'below') { + dy -= (widgetH / 6.4); + } + titleFontSize = ((widgetH / 8) > obj.config.titleMinFontSize) ? (widgetH / 10) : obj.config.titleMinFontSize; + titleX = dx + widgetW / 2; + titleY = dy + (obj.config.titlePosition === 'below' ? (widgetH * 1.07) : (widgetH / 6.4)); + valueFontSize = ((widgetH / 6.5) > obj.config.valueMinFontSize) ? (widgetH / 6.5) : obj.config.valueMinFontSize; + valueX = dx + widgetW / 2; + valueY = dy + widgetH / 1.275; + labelFontSize = ((widgetH / 16) > obj.config.labelMinFontSize) ? (widgetH / 16) : obj.config.labelMinFontSize; + labelX = dx + widgetW / 2; + labelY = valueY + valueFontSize / 2 + 5; + minFontSize = ((widgetH / 16) > obj.config.minLabelMinFontSize) ? (widgetH / 16) : obj.config.minLabelMinFontSize; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + minY = labelY; + maxFontSize = ((widgetH / 16) > obj.config.maxLabelMinFontSize) ? (widgetH / 16) : obj.config.maxLabelMinFontSize; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + maxY = labelY; + } + obj.params = { + canvasW: canvasW, + canvasH: canvasH, + widgetW: widgetW, + widgetH: widgetH, + dx: dx, + dy: dy, + titleFontSize: titleFontSize, + titleX: titleX, + titleY: titleY, + valueFontSize: valueFontSize, + valueX: valueX, + valueY: valueY, + labelFontSize: labelFontSize, + labelX: labelX, + labelY: labelY, + minFontSize: minFontSize, + minX: minX, + minY: minY, + maxFontSize: maxFontSize, + maxX: maxX, + maxY: maxY + }; + canvasW, + canvasH, + widgetW, + widgetH, + aspect, + dx, + dy, + titleFontSize, + titleX, + titleY, + valueFontSize, + valueX, + valueY, + labelFontSize, + labelX, + labelY, + minFontSize, + minX, + minY, + maxFontSize, + maxX, + maxY = null; + obj.canvas.customAttributes.pki = function (value, min, max, w, h, dx, dy, gws, donut, reverse) { + var alpha, + Ro, + Ri, + Cx, + Cy, + Xo, + Yo, + Xi, + Yi, + path; + if (donut) { + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + path = "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ro + "," + Ro + " 0 0 1 " + (Cx + Ro) + "," + Cy + " "; + } + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx + Ri) + "," + Cy + " "; + } + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + return { + path: path + }; + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + path = "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + return { + path: path + }; + } + alpha, + Ro, + Ri, + Cx, + Cy, + Xo, + Yo, + Xi, + Yi, + path = null; + }; + obj.canvas.customAttributes.ndl = function (value, min, max, w, h, dx, dy, gws, donut) { + var dlt = w * 3.5 / 100; + var dlb = w / 15; + var dw = w / 100; + if (obj.config.pointerOptions.toplength != null && obj.config.pointerOptions.toplength != undefined) + dlt = obj.config.pointerOptions.toplength; + if (obj.config.pointerOptions.bottomlength != null && obj.config.pointerOptions.bottomlength != undefined) + dlb = obj.config.pointerOptions.bottomlength; + if (obj.config.pointerOptions.bottomwidth != null && obj.config.pointerOptions.bottomwidth != undefined) + dw = obj.config.pointerOptions.bottomwidth; + var alpha, + Ro, + Ri, + Cx, + Cy, + Xo, + Yo, + Xi, + Yi, + Xc, + Yc, + Xz, + Yz, + Xa, + Ya, + Xb, + Yb, + path; + if (donut) { + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + Xc = Xo + dlt * Math.cos(alpha); + Yc = Yo - dlt * Math.sin(alpha); + Xz = Xi - dlb * Math.cos(alpha); + Yz = Yi + dlb * Math.sin(alpha); + Xa = Xz + dw * Math.sin(alpha); + Ya = Yz + dw * Math.cos(alpha); + Xb = Xz - dw * Math.sin(alpha); + Yb = Yz - dw * Math.cos(alpha); + path = 'M' + Xa + ',' + Ya + ' '; + path += 'L' + Xb + ',' + Yb + ' '; + path += 'L' + Xc + ',' + Yc + ' '; + path += 'Z '; + return { + path: path + }; + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + Xc = Xo + dlt * Math.cos(alpha); + Yc = Yo - dlt * Math.sin(alpha); + Xz = Xi - dlb * Math.cos(alpha); + Yz = Yi + dlb * Math.sin(alpha); + Xa = Xz + dw * Math.sin(alpha); + Ya = Yz + dw * Math.cos(alpha); + Xb = Xz - dw * Math.sin(alpha); + Yb = Yz - dw * Math.cos(alpha); + path = 'M' + Xa + ',' + Ya + ' '; + path += 'L' + Xb + ',' + Yb + ' '; + path += 'L' + Xc + ',' + Yc + ' '; + path += 'Z '; + return { + path: path + }; + } + alpha, + Ro, + Ri, + Cx, + Cy, + Xo, + Yo, + Xi, + Yi, + Xc, + Yc, + Xz, + Yz, + Xa, + Ya, + Xb, + Yb, + path = null; + }; + obj.gauge = obj.canvas.path().attr({ + "stroke": "none", + "fill": obj.config.gaugeColor, + pki: [obj.config.max, obj.config.min, obj.config.max, obj.params.widgetW, obj.params.widgetH, obj.params.dx, obj.params.dy, obj.config.gaugeWidthScale, obj.config.donut, obj.config.reverse] + }); + obj.level = obj.canvas.path().attr({ + "stroke": "none", + "fill": getColor(obj.config.value, (obj.config.value - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors), + pki: [obj.config.min, obj.config.min, obj.config.max, obj.params.widgetW, obj.params.widgetH, obj.params.dx, obj.params.dy, obj.config.gaugeWidthScale, obj.config.donut, obj.config.reverse] + }); + if (obj.config.donut) { + obj.level.transform("r" + obj.config.donutStartAngle + ", " + (obj.params.widgetW / 2 + obj.params.dx) + ", " + (obj.params.widgetH / 1.95 + obj.params.dy)); + } + if (obj.config.pointer) { + obj.needle = obj.canvas.path().attr({ + "stroke": (obj.config.pointerOptions.stroke !== null && obj.config.pointerOptions.stroke !== undefined) ? obj.config.pointerOptions.stroke : "none", + "stroke-width": (obj.config.pointerOptions.stroke_width !== null && obj.config.pointerOptions.stroke_width !== undefined) ? obj.config.pointerOptions.stroke_width : 0, + "stroke-linecap": (obj.config.pointerOptions.stroke_linecap !== null && obj.config.pointerOptions.stroke_linecap !== undefined) ? obj.config.pointerOptions.stroke_linecap : "square", + "fill": (obj.config.pointerOptions.color !== null && obj.config.pointerOptions.color !== undefined) ? obj.config.pointerOptions.color : "#000000", + ndl: [obj.config.min, obj.config.min, obj.config.max, obj.params.widgetW, obj.params.widgetH, obj.params.dx, obj.params.dy, obj.config.gaugeWidthScale, obj.config.donut] + }); + if (obj.config.donut) { + obj.needle.transform("r" + obj.config.donutStartAngle + ", " + (obj.params.widgetW / 2 + obj.params.dx) + ", " + (obj.params.widgetH / 1.95 + obj.params.dy)); + } + } + obj.txtTitle = obj.canvas.text(obj.params.titleX, obj.params.titleY, obj.config.title); + obj.txtTitle.attr({ + "font-size": obj.params.titleFontSize, + "font-weight": "bold", + "font-family": obj.config.titleFontFamily, + "fill": obj.config.titleFontColor, + "fill-opacity": "1" + }); + setDy(obj.txtTitle, obj.params.titleFontSize, obj.params.titleY); + obj.txtValue = obj.canvas.text(obj.params.valueX, obj.params.valueY, 0); + obj.txtValue.attr({ + "font-size": obj.params.valueFontSize, + "font-weight": "bold", + "font-family": obj.config.valueFontFamily, + "fill": obj.config.valueFontColor, + "fill-opacity": "0" + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + obj.txtLabel = obj.canvas.text(obj.params.labelX, obj.params.labelY, obj.config.label); + obj.txtLabel.attr({ + "font-size": obj.params.labelFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": "0" + }); + setDy(obj.txtLabel, obj.params.labelFontSize, obj.params.labelY); + var min = obj.config.min; + if (obj.config.reverse) { + min = obj.config.max; + } + obj.txtMinimum = min; + if (obj.config.humanFriendly) { + obj.txtMinimum = humanFriendlyNumber(min, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMinimum = formatNumber(min); + } + obj.txtMin = obj.canvas.text(obj.params.minX, obj.params.minY, obj.txtMinimum); + obj.txtMin.attr({ + "font-size": obj.params.minFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut) ? "0" : "1" + }); + setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY); + var max = obj.config.max; + if (obj.config.reverse) { + max = obj.config.min; + } + obj.txtMaximum = max; + if (obj.config.humanFriendly) { + obj.txtMaximum = humanFriendlyNumber(max, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMaximum = formatNumber(max); + } + obj.txtMax = obj.canvas.text(obj.params.maxX, obj.params.maxY, obj.txtMaximum); + obj.txtMax.attr({ + "font-size": obj.params.maxFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut) ? "0" : "1" + }); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + var defs = obj.canvas.canvas.childNodes[1]; + var svg = "http://www.w3.org/2000/svg"; + if (ie !== 'undefined' && ie < 9) {} + else if (ie !== 'undefined') { + onCreateElementNsReady(function () { + obj.generateShadow(svg, defs); + }); + } else { + obj.generateShadow(svg, defs); + } + defs, + svg = null; + if (obj.config.textRenderer) { + obj.originalValue = obj.config.textRenderer(obj.originalValue); + } else if (obj.config.humanFriendly) { + obj.originalValue = humanFriendlyNumber(obj.originalValue, obj.config.humanFriendlyDecimal) + obj.config.symbol; + } else if (obj.config.formatNumber) { + obj.originalValue = formatNumber(obj.originalValue) + obj.config.symbol; + } else { + obj.originalValue = (obj.originalValue * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + if (obj.config.counter === true) { + eve.on("raphael.anim.frame." + (obj.level.id), function () { + var currentValue = obj.level.attr("pki")[0]; + if (obj.config.reverse) { + currentValue = (obj.config.max * 1) + (obj.config.min * 1) - (obj.level.attr("pki")[0] * 1); + } + if (obj.config.textRenderer) { + obj.txtValue.attr("text", obj.config.textRenderer(Math.floor(currentValue))); + } else if (obj.config.humanFriendly) { + obj.txtValue.attr("text", humanFriendlyNumber(Math.floor(currentValue), obj.config.humanFriendlyDecimal) + obj.config.symbol); + } else if (obj.config.formatNumber) { + obj.txtValue.attr("text", formatNumber(Math.floor(currentValue)) + obj.config.symbol); + } else { + obj.txtValue.attr("text", (currentValue * 1).toFixed(obj.config.decimals) + obj.config.symbol); + } + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + currentValue = null; + }); + eve.on("raphael.anim.finish." + (obj.level.id), function () { + obj.txtValue.attr({ + "text": obj.originalValue + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } else { + eve.on("raphael.anim.start." + (obj.level.id), function () { + obj.txtValue.attr({ + "text": obj.originalValue + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } + var rvl = obj.config.value; + if (obj.config.reverse) { + rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1); + } + obj.level.animate({ + pki: [rvl, obj.config.min, obj.config.max, obj.params.widgetW, obj.params.widgetH, obj.params.dx, obj.params.dy, obj.config.gaugeWidthScale, obj.config.donut, obj.config.reverse] + }, obj.config.startAnimationTime, obj.config.startAnimationType); + if (obj.config.pointer) { + obj.needle.animate({ + ndl: [rvl, obj.config.min, obj.config.max, obj.params.widgetW, obj.params.widgetH, obj.params.dx, obj.params.dy, obj.config.gaugeWidthScale, obj.config.donut] + }, obj.config.startAnimationTime, obj.config.startAnimationType); + } + obj.txtValue.animate({ + "fill-opacity": (obj.config.hideValue) ? "0" : "1" + }, obj.config.startAnimationTime, obj.config.startAnimationType); + obj.txtLabel.animate({ + "fill-opacity": "1" + }, obj.config.startAnimationTime, obj.config.startAnimationType); +}; +JustGage.prototype.refresh = function (val, max) { + var obj = this; + var displayVal, + color, + max = max || null; + if (max !== null) { + obj.config.max = max; + obj.txtMaximum = obj.config.max; + if (obj.config.humanFriendly) { + obj.txtMaximum = humanFriendlyNumber(obj.config.max, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMaximum = formatNumber(obj.config.max); + } + if (!obj.config.reverse) { + obj.txtMax.attr({ + "text": obj.txtMaximum + }); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + } else { + obj.txtMin.attr({ + "text": obj.txtMaximum + }); + setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY); + } + } + displayVal = val; + if ((val * 1) > (obj.config.max * 1)) { + val = (obj.config.max * 1); + } + if ((val * 1) < (obj.config.min * 1)) { + val = (obj.config.min * 1); + } + color = getColor(val, (val - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors); + if (obj.config.textRenderer) { + displayVal = obj.config.textRenderer(displayVal); + } else if (obj.config.humanFriendly) { + displayVal = humanFriendlyNumber(displayVal, obj.config.humanFriendlyDecimal) + obj.config.symbol; + } else if (obj.config.formatNumber) { + displayVal = formatNumber((displayVal * 1).toFixed(obj.config.decimals)) + obj.config.symbol; + } else { + displayVal = (displayVal * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + obj.originalValue = displayVal; + obj.config.value = val * 1; + if (!obj.config.counter) { + obj.txtValue.attr({ + "text": displayVal + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + } + var rvl = obj.config.value; + if (obj.config.reverse) { + rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1); + } + obj.level.animate({ + pki: [rvl, obj.config.min, obj.config.max, obj.params.widgetW, obj.params.widgetH, obj.params.dx, obj.params.dy, obj.config.gaugeWidthScale, obj.config.donut, obj.config.reverse], + "fill": color + }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType); + if (obj.config.pointer) { + obj.needle.animate({ + ndl: [rvl, obj.config.min, obj.config.max, obj.params.widgetW, obj.params.widgetH, obj.params.dx, obj.params.dy, obj.config.gaugeWidthScale, obj.config.donut] + }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType); + } + obj, + displayVal, + color, + max = null; +}; +JustGage.prototype.generateShadow = function (svg, defs) { + var obj = this; + var sid = "inner-shadow-" + obj.config.id; + var gaussFilter, + feOffset, + feGaussianBlur, + feComposite1, + feFlood, + feComposite2, + feComposite3; + gaussFilter = document.createElementNS(svg, "filter"); + gaussFilter.setAttribute("id", sid); + defs.appendChild(gaussFilter); + feOffset = document.createElementNS(svg, "feOffset"); + feOffset.setAttribute("dx", 0); + feOffset.setAttribute("dy", obj.config.shadowVerticalOffset); + gaussFilter.appendChild(feOffset); + feGaussianBlur = document.createElementNS(svg, "feGaussianBlur"); + feGaussianBlur.setAttribute("result", "offset-blur"); + feGaussianBlur.setAttribute("stdDeviation", obj.config.shadowSize); + gaussFilter.appendChild(feGaussianBlur); + feComposite1 = document.createElementNS(svg, "feComposite"); + feComposite1.setAttribute("operator", "out"); + feComposite1.setAttribute("in", "SourceGraphic"); + feComposite1.setAttribute("in2", "offset-blur"); + feComposite1.setAttribute("result", "inverse"); + gaussFilter.appendChild(feComposite1); + feFlood = document.createElementNS(svg, "feFlood"); + feFlood.setAttribute("flood-color", "black"); + feFlood.setAttribute("flood-opacity", obj.config.shadowOpacity); + feFlood.setAttribute("result", "color"); + gaussFilter.appendChild(feFlood); + feComposite2 = document.createElementNS(svg, "feComposite"); + feComposite2.setAttribute("operator", "in"); + feComposite2.setAttribute("in", "color"); + feComposite2.setAttribute("in2", "inverse"); + feComposite2.setAttribute("result", "shadow"); + gaussFilter.appendChild(feComposite2); + feComposite3 = document.createElementNS(svg, "feComposite"); + feComposite3.setAttribute("operator", "over"); + feComposite3.setAttribute("in", "shadow"); + feComposite3.setAttribute("in2", "SourceGraphic"); + gaussFilter.appendChild(feComposite3); + if (!obj.config.hideInnerShadow) { + obj.canvas.canvas.childNodes[2].setAttribute("filter", "url(#" + sid + ")"); + obj.canvas.canvas.childNodes[3].setAttribute("filter", "url(#" + sid + ")"); + } + gaussFilter, + feOffset, + feGaussianBlur, + feComposite1, + feFlood, + feComposite2, + feComposite3 = null; +}; +function kvLookup(key, tablea, tableb, defval, datatype, delimiter) { + var val = defval; + var canConvert = false; + if (!(key === null || key === undefined)) { + if (tableb !== null && tableb !== undefined && typeof tableb === "object" && key in tableb) { + val = tableb[key]; + canConvert = true; + } else if (tablea !== null && tablea !== undefined && typeof tablea === "object" && key in tablea) { + val = tablea[key]; + canConvert = true; + } else { + val = defval; + } + if (canConvert === true) { + if (datatype !== null && datatype !== undefined) { + switch (datatype) { + case 'int': + val = parseInt(val, 10); + break; + case 'float': + val = parseFloat(val); + break; + default: + break; + } + } + } + } + return val; +}; +function getColor(val, pct, col, noGradient, custSec) { + var no, + inc, + colors, + percentage, + rval, + gval, + bval, + lower, + upper, + range, + rangePct, + pctLower, + pctUpper, + color; + var noGradient = noGradient || custSec.length > 0; + if (custSec.length > 0) { + for (var i = 0; i < custSec.length; i++) { + if (val > custSec[i].lo && val <= custSec[i].hi) { + return custSec[i].color; + } + } + } + no = col.length; + if (no === 1) + return col[0]; + inc = (noGradient) ? (1 / no) : (1 / (no - 1)); + colors = []; + for (i = 0; i < col.length; i++) { + percentage = (noGradient) ? (inc * (i + 1)) : (inc * i); + rval = parseInt((cutHex(col[i])).substring(0, 2), 16); + gval = parseInt((cutHex(col[i])).substring(2, 4), 16); + bval = parseInt((cutHex(col[i])).substring(4, 6), 16); + colors[i] = { + pct: percentage, + color: { + r: rval, + g: gval, + b: bval + } + }; + } + if (pct === 0) { + return 'rgb(' + [colors[0].color.r, colors[0].color.g, colors[0].color.b].join(',') + ')'; + } + for (var j = 0; j < colors.length; j++) { + if (pct <= colors[j].pct) { + if (noGradient) { + return 'rgb(' + [colors[j].color.r, colors[j].color.g, colors[j].color.b].join(',') + ')'; + } else { + lower = colors[j - 1]; + upper = colors[j]; + range = upper.pct - lower.pct; + rangePct = (pct - lower.pct) / range; + pctLower = 1 - rangePct; + pctUpper = rangePct; + color = { + r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper), + g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper), + b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper) + }; + return 'rgb(' + [color.r, color.g, color.b].join(',') + ')'; + } + } + } +} +function setDy(elem, fontSize, txtYpos) { + if ((!ie || ie > 9) && elem.node.firstChild.attributes.dy) { + elem.node.firstChild.attributes.dy.value = 0; + } +} +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} +function cutHex(str) { + return (str.charAt(0) == "#") ? str.substring(1, 7) : str; +} +function humanFriendlyNumber(n, d) { + var p, + d2, + i, + s; + p = Math.pow; + d2 = p(10, d); + i = 7; + while (i) { + s = p(10, i-- * 3); + if (s <= n) { + n = Math.round(n * d2 / s) / d2 + "KMGTPE"[i]; + } + } + return n; +} +function formatNumber(x) { + var parts = x.toString().split("."); + parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return parts.join("."); +} +function getStyle(oElm, strCssRule) { + var strValue = ""; + if (document.defaultView && document.defaultView.getComputedStyle) { + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } else if (oElm.currentStyle) { + strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1) { + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} +function onCreateElementNsReady(func) { + if (document.createElementNS !== undefined) { + func(); + } else { + setTimeout(function () { + onCreateElementNsReady(func); + }, 100); + } +} +var ie = (function () { + var undef, + v = 3, + div = document.createElement('div'), + all = div.getElementsByTagName('i'); + while (div.innerHTML = '', all[0]); + return v > 4 ? v : undef; +} + ()); +function extend(out) { + out = out || {}; + for (var i = 1; i < arguments.length; i++) { + if (!arguments[i]) + continue; + for (var key in arguments[i]) { + if (arguments[i].hasOwnProperty(key)) + out[key] = arguments[i][key]; + } + } + return out; +}; diff --git a/examples/SmartSwitch/data_src/js_css_src/js-time-picker/1-inline.html b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/1-inline.html new file mode 100644 index 0000000..22160e9 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/1-inline.html @@ -0,0 +1,30 @@ + + + + Inline Timepicker Example + + + + + + +

Inline Time Picker

+ +
TIME ON
+
+
TIME OFF
+ + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/js-time-picker/2-popup.html b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/2-popup.html new file mode 100644 index 0000000..162339a --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/2-popup.html @@ -0,0 +1,27 @@ + + + + Popup Timeicker Example + + + + + + +

Popup Time Picker

+ + + ON/OFF +

Line

+ + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/js-time-picker/README.txt b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/README.txt new file mode 100644 index 0000000..b09dd21 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/README.txt @@ -0,0 +1,29 @@ +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +LICENSE +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +Copyright 2018 by Code Boxx + +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. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +MORE +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Please visit https://code-boxx.com/ for more! \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light-pop.css b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light-pop.css new file mode 100644 index 0000000..cacbdb3 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light-pop.css @@ -0,0 +1,65 @@ +/* [CONTAINER] */ +.tpop { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + background: rgba(0, 0, 0, 0.7); + transition: all 0.5s; + visibility: hidden; + opacity: 0; +} +.tpop.show { + visibility: visible; + opacity: 1; +} +.tpicker { + background: #f2f2f2; + padding: 10px; + width: 100%; + max-width: 320px; + white-space: nowrap; + font-size: 32px; + font-weight: bold; + text-align: center; +} +.tpop .tpicker { + margin: 20px auto 0 auto; +} + +/* [HR + MIN + AM/PM] */ +.tpicker-h, .tpicker-m, .tpicker-ap { + display: inline-block; + width: 30%; +} +.tpicker input[type=text] { + box-sizing: border-box; + width: 70%; + padding: 10px; + margin: 5px 0; + border: 0; + background: #fff; + color: #888; + text-align: center; + font-size: 28px; +} +.tpicker-up, .tpicker-down { + text-align: center; + color: #ff853f; + cursor: pointer; +} + +/* [CANCEL + OK BUTTON] */ +.tpicker-btn { + margin-top: 10px; +} +.tpicker-btn input[type=button] { + width: 50%; + padding: 10px 0; + border: 0; + background: #a83a0b; + color: #fff; + font-size: 20px; + cursor: pointer; +} \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light.css b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light.css new file mode 100644 index 0000000..58676b4 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-light.css @@ -0,0 +1,47 @@ +/* [CONTAINER] */ +.tpicker { + background: #f2f2f2; + padding: 10px; + width: 100%; + max-width: 320px; + white-space: nowrap; + font-size: 32px; + font-weight: bold; + text-align: center; +} + +/* [HR + MIN + AM/PM] */ +.tpicker-h, .tpicker-m, .tpicker-ap { + display: inline-block; + width: 30%; +} +.tpicker input[type=text] { + box-sizing: border-box; + width: 70%; + padding: 10px; + margin: 5px 0; + border: 0; + background: #fff; + color: #888; + text-align: center; + font-size: 28px; +} +.tpicker-up, .tpicker-down { + text-align: center; + color: #ff853f; + cursor: pointer; +} + +/* [CANCEL + OK BUTTON] */ +.tpicker-btn { + margin-top: 10px; +} +.tpicker-btn input[type=button] { + width: 50%; + padding: 10px 0; + border: 0; + background: #a83a0b; + color: #fff; + font-size: 20px; + cursor: pointer; +} \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-pop.js b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-pop.js new file mode 100644 index 0000000..c52a2da --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick-pop.js @@ -0,0 +1,136 @@ +var tpick = { + attach : function (target) { + // attach() : attach time picker to target + + // Generate a unique random ID for the time picker + var uniqueID = 0; + while (document.getElementById("tpick-" + uniqueID) != null) { + uniqueID = Math.floor(Math.random() * (100 - 2)) + 1; + } + + // Create wrapper + var tw = document.createElement("div"); + tw.id = "tpick-" + uniqueID; + tw.classList.add("tpop"); + tw.dataset.target = target; + tw.addEventListener("click", function (evt) { + if (evt.target.classList.contains("tpop")) { + this.classList.remove("show"); + } + }); + + // Create new time picker + var tp = document.createElement("div"); + tp.classList.add("tpicker"); + + // Create hour picker + tp.appendChild(this.draw("h")); + tp.appendChild(this.draw("m")); + tp.appendChild(this.draw("ap")); + + // OK button + var bottom = document.createElement("div"), + ok = document.createElement("input"); + ok.setAttribute("type", "button"); + ok.value = "OK"; + ok.addEventListener("click", function(){ tpick.set(this); }); + bottom.classList.add("tpicker-btn"); + bottom.appendChild(ok); + tp.appendChild(bottom); + + // Attach time picker to body + tw.appendChild(tp); + document.body.appendChild(tw); + + // Attach on focus event + var target = document.getElementById(target); + target.dataset.dp = uniqueID; + target.onfocus = function () { + document.getElementById("tpick-" + this.dataset.dp).classList.add("show"); + }; + }, + + draw : function (type) { + // draw() : support function to create the hr, min, am/pm selector + + // Create the controls + var docket = document.createElement("div"), + up = document.createElement("div"), + down = document.createElement("div"), + text = document.createElement("input"); + docket.classList.add("tpicker-" + type); + up.classList.add("tpicker-up"); + down.classList.add("tpicker-down"); + up.innerHTML = "︿"; + down.innerHTML = "﹀"; + text.readOnly = true; + text.setAttribute("type", "text"); + + // Default values + click event + // You can do your own modifications here + if (type=="h") { + text.value = "12"; + up.addEventListener("click", function(){ tpick.spin("h", 1, this); }); + down.addEventListener("click", function(){ tpick.spin("h", 0, this); }); + } else if (type=="m") { + text.value = "10"; + up.addEventListener("click", function(){ tpick.spin("m", 1, this); }); + down.addEventListener("click", function(){ tpick.spin("m", 0, this); }); + } else { + text.value = "AM"; + up.addEventListener("click", function(){ tpick.spin("ap", 1, this); }); + down.addEventListener("click", function(){ tpick.spin("ap", 0, this); }); + } + + // Complete + return the docket + docket.appendChild(up); + docket.appendChild(text); + docket.appendChild(down); + return docket; + }, + + spin : function (type, direction, el) { + // spin() : when the up/down button is pressed + + // Get current field + value + var parent = el.parentElement, + field = parent.getElementsByTagName("input")[0], + value = field.value; + + // Spin it + if (type=="h") { + value = parseInt(value); + if (direction) { value++; } else { value--; } + if (value==0) { value = 12; } + else if (value>12) { value = 1; } + } else if (type=="m") { + value = parseInt(value); + if (direction) { value+=5; } else { value-=5; } + if (value<0) { value = 55; } + else if (value>60) { value = 0; } + if (value<10) { value = "0" + value; } + } + else { + value = value=="PM" ? "AM" : "PM"; + } + field.value = value; + }, + + set : function (el) { + // set() : set the selected time on the target + + // Get the parent container + var parent = el.parentElement; + while (parent.classList.contains("tpop") == false) { + parent = parent.parentElement; + } + + // Formulate + set selected time + var input = parent.querySelectorAll("input[type=text]"); + var time = input[0].value + ":" + input[1].value + " " + input[2].value; + document.getElementById(parent.dataset.target).value = time; + + // Close popup + parent.classList.remove("show"); + } +}; \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick.js b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick.js new file mode 100644 index 0000000..799142c --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/js-time-picker/tpick.js @@ -0,0 +1,116 @@ +var tpick = { + attach : function (container, target) { + // attach() : attach time picker to target + + // Generate a unique random ID for the time picker + var uniqueID = 0; + while (document.getElementById("tpick-" + uniqueID) != null) { + uniqueID = Math.floor(Math.random() * (100 - 2)) + 1; + } + + // Create new time picker + var tp = document.createElement("div"); + tp.id = "tpick-" + uniqueID; + tp.dataset.target = target; + tp.classList.add("tpicker"); + + // Create hour picker + tp.appendChild(this.draw("h")); + tp.appendChild(this.draw("m")); + tp.appendChild(this.draw("ap")); + + // OK button + var bottom = document.createElement("div"), + ok = document.createElement("input"); + ok.setAttribute("type", "button"); + ok.value = "OK"; + ok.addEventListener("click", function(){ tpick.set(this); }); + bottom.classList.add("tpicker-btn"); + bottom.appendChild(ok); + tp.appendChild(bottom); + + // Attach time picker to target container + document.getElementById(container).appendChild(tp); + }, + + draw : function (type) { + // draw() : support function to create the hr, min, am/pm selector + + // Create the controls + var docket = document.createElement("div"), + up = document.createElement("div"), + down = document.createElement("div"), + text = document.createElement("input"); + docket.classList.add("tpicker-" + type); + up.classList.add("tpicker-up"); + down.classList.add("tpicker-down"); + up.innerHTML = "︿"; + down.innerHTML = "﹀"; + text.readOnly = true; + text.setAttribute("type", "text"); + + // Default values + click event + // You can do your own modifications here + if (type=="h") { + text.value = "12"; + up.addEventListener("click", function(){ tpick.spin("h", 1, this); }); + down.addEventListener("click", function(){ tpick.spin("h", 0, this); }); + } else if (type=="m") { + text.value = "10"; + up.addEventListener("click", function(){ tpick.spin("m", 1, this); }); + down.addEventListener("click", function(){ tpick.spin("m", 0, this); }); + } else { + text.value = "AM"; + up.addEventListener("click", function(){ tpick.spin("ap", 1, this); }); + down.addEventListener("click", function(){ tpick.spin("ap", 0, this); }); + } + + // Complete + return the docket + docket.appendChild(up); + docket.appendChild(text); + docket.appendChild(down); + return docket; + }, + + spin : function (type, direction, el) { + // spin() : when the up/down button is pressed + + // Get current field + value + var parent = el.parentElement, + field = parent.getElementsByTagName("input")[0], + value = field.value; + + // Spin it + if (type=="h") { + value = parseInt(value); + if (direction) { value++; } else { value--; } + if (value==0) { value = 12; } + else if (value>12) { value = 1; } + } else if (type=="m") { + value = parseInt(value); + if (direction) { value+=5; } else { value-=5; } + if (value<0) { value = 55; } + else if (value>60) { value = 0; } + if (value<10) { value = "0" + value; } + } + else { + value = value=="PM" ? "AM" : "PM"; + } + field.value = value; + }, + + set : function (el) { + // set() : set the selected time on the target + + // Get the parent container + var parent = el.parentElement; + while (parent.classList.contains("tpicker") == false) { + parent = parent.parentElement; + } + + // Formulate + set selected time + var input = parent.querySelectorAll("input[type=text]"); + var time = input[0].value + ":" + input[1].value + " " + input[2].value; + document.getElementById(parent.dataset.target).value = time; + } +}; \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/auto-adjust.htm b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/auto-adjust.htm new file mode 100644 index 0000000..28903cf --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/auto-adjust.htm @@ -0,0 +1,94 @@ + + + + + Auto-adjust + + + + + + +
+
+
+
+

+ JustGage auto-adjusts to the size of containing element. And to the screen zoom level. And screen density. Nice. This means you’ll get clean, sharp and nice looking gauge at all times. Try zooming the page to see the results. +

+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/counter.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/counter.html new file mode 100644 index 0000000..4069593 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/counter.html @@ -0,0 +1,58 @@ + + + + + + Counter + + + + + + + + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-interval.htm b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-interval.htm new file mode 100644 index 0000000..6c58bda --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-interval.htm @@ -0,0 +1,82 @@ + + + + + Custom interval + + + + + +
+
+
+

+ You need to measure, say, between 350 and 980? No problem, just tell it to justGage. Displayed value and color are calculated as a percentage in defined range, with optional min and max labels shown. +

+

+ Also, if displayed value is out of range, relax and kick your feet up - justGage will take care of it for you. +

+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-node.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-node.html new file mode 100644 index 0000000..98964e1 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-node.html @@ -0,0 +1,130 @@ + + + + + Custom Node + + + + + + +
+
+
+
+
+ + +
+
+ + + + +
+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-sectors.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-sectors.html new file mode 100644 index 0000000..a868de6 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-sectors.html @@ -0,0 +1,88 @@ + + + + + + Custom Sectors + + + + + + + + + +
+
+

0-50 is green, 51-100 is red

+ Random Refresh + Update Sectors +
+ + + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-value-renderer.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-value-renderer.html new file mode 100644 index 0000000..2e5b0f3 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/custom-value-renderer.html @@ -0,0 +1,116 @@ + + + + + + Custom Render Function + + + + +
+ Random Refresh + + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/customize-style.htm b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/customize-style.htm new file mode 100644 index 0000000..9be11d1 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/customize-style.htm @@ -0,0 +1,137 @@ + + + + + Customize style + + + + + + +
+
+
+
+
+
+

+ Not digging default style? Then mock your own, Picasso! JustGage features bunch of styling options including gauge width, gauge color and shadow, gauge level colors, colors for title, value, min & max etc. +

+

+ Check non-minified version of justgage.js for list of all setup parameters. +

+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/defaults.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/defaults.html new file mode 100644 index 0000000..99f8827 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/defaults.html @@ -0,0 +1,60 @@ + + + + + + Defaults + + + + + +
+
+
+
+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/font-options.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/font-options.html new file mode 100644 index 0000000..11063c7 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/font-options.html @@ -0,0 +1,62 @@ + + + + + + Counter + + + + + + + + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/format-number.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/format-number.html new file mode 100644 index 0000000..4bf2c36 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/format-number.html @@ -0,0 +1,56 @@ + + + + + + Counter + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/html5-data-attribute-config.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/html5-data-attribute-config.html new file mode 100644 index 0000000..3c2ab0b --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/html5-data-attribute-config.html @@ -0,0 +1,54 @@ + + + + + + html5 data-attribute setup + + + + + + + + + +
+
+ +
+ + + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/human-friendly-numbers.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/human-friendly-numbers.html new file mode 100644 index 0000000..f0e7ddc --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/human-friendly-numbers.html @@ -0,0 +1,109 @@ + + + + + + Guage + + + + +
+ Random Refresh + + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/pointer.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/pointer.html new file mode 100644 index 0000000..b20ae5f --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/pointer.html @@ -0,0 +1,168 @@ + + + + + + Pointer + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/refresh-maximum.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/refresh-maximum.html new file mode 100644 index 0000000..e1502a1 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/refresh-maximum.html @@ -0,0 +1,91 @@ + + + + + + Donuts, baby! + + + + + + + + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/responsive-gauges.htm b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/responsive-gauges.htm new file mode 100644 index 0000000..68680c6 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/responsive-gauges.htm @@ -0,0 +1,71 @@ + + + + + Dynamic Resize + + + + + +
+
+
+
+
+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/reverse.html b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/reverse.html new file mode 100644 index 0000000..e17b675 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/examples/reverse.html @@ -0,0 +1,144 @@ + + + + + + Reverse + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + + + + diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/justgage.js b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/justgage.js new file mode 100644 index 0000000..c852491 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/justgage.js @@ -0,0 +1,1220 @@ +/** + * JustGage - animated gauges using RaphaelJS + * Check http://www.justgage.com for official releases + * Licensed under MIT. + * @author Bojan Djuricic (@Toorshia) + **/ + +JustGage = function(config) { + + var obj = this; + + // Helps in case developer wants to debug it. unobtrusive + if (config === null || config === undefined) { + console.log('* justgage: Make sure to pass options to the constructor!'); + return false; + } + + var node; + + if (config.id !== null && config.id !== undefined) { + node = document.getElementById(config.id); + if (!node) { + console.log('* justgage: No element with id : %s found', config.id); + return false; + } + } else if (config.parentNode !== null && config.parentNode !== undefined) { + node = config.parentNode; + } else { + console.log('* justgage: Make sure to pass the existing element id or parentNode to the constructor.'); + return false; + } + + var dataset = node.dataset ? node.dataset : {}; + + // check for defaults + var defaults = (config.defaults !== null && config.defaults !== undefined) ? config.defaults : false; + if (defaults !== false) { + config = extend({}, config, defaults); + delete config.defaults; + } + + // configurable parameters + obj.config = { + // id : string + // this is container element id + id: config.id, + + // value : float + // value gauge is showing + value: kvLookup('value', config, dataset, 0, 'float'), + + // defaults : bool + // defaults parameter to use + defaults: kvLookup('defaults', config, dataset, 0, false), + + // parentNode : node object + // this is container element + parentNode: kvLookup('parentNode', config, dataset, null), + + // width : int + // gauge width + width: kvLookup('width', config, dataset, null), + + // height : int + // gauge height + height: kvLookup('height', config, dataset, null), + + // title : string + // gauge title + title: kvLookup('title', config, dataset, ""), + + // titleFontColor : string + // color of gauge title + titleFontColor: kvLookup('titleFontColor', config, dataset, "#999999"), + + // titleFontFamily : string + // color of gauge title + titleFontFamily: kvLookup('titleFontFamily', config, dataset, "sans-serif"), + + // titlePosition : string + // 'above' or 'below' + titlePosition: kvLookup('titlePosition', config, dataset, "above"), + + // valueFontColor : string + // color of label showing current value + valueFontColor: kvLookup('valueFontColor', config, dataset, "#010101"), + + // valueFontFamily : string + // color of label showing current value + valueFontFamily: kvLookup('valueFontFamily', config, dataset, "Arial"), + + // symbol : string + // special symbol to show next to value + symbol: kvLookup('symbol', config, dataset, ''), + + // min : float + // min value + min: kvLookup('min', config, dataset, 0, 'float'), + + // max : float + // max value + max: kvLookup('max', config, dataset, 100, 'float'), + + // reverse : bool + // reverse min and max + reverse: kvLookup('reverse', config, dataset, false), + + // humanFriendlyDecimal : int + // number of decimal places for our human friendly number to contain + humanFriendlyDecimal: kvLookup('humanFriendlyDecimal', config, dataset, 0), + + + // textRenderer: func + // function applied before rendering text + textRenderer: kvLookup('textRenderer', config, dataset, null), + + // gaugeWidthScale : float + // width of the gauge element + gaugeWidthScale: kvLookup('gaugeWidthScale', config, dataset, 1.0), + + // gaugeColor : string + // background color of gauge element + gaugeColor: kvLookup('gaugeColor', config, dataset, "#edebeb"), + + // label : string + // text to show below value + label: kvLookup('label', config, dataset, ''), + + // labelFontColor : string + // color of label showing label under value + labelFontColor: kvLookup('labelFontColor', config, dataset, "#b3b3b3"), + + // shadowOpacity : int + // 0 ~ 1 + shadowOpacity: kvLookup('shadowOpacity', config, dataset, 0.2), + + // shadowSize: int + // inner shadow size + shadowSize: kvLookup('shadowSize', config, dataset, 5), + + // shadowVerticalOffset : int + // how much shadow is offset from top + shadowVerticalOffset: kvLookup('shadowVerticalOffset', config, dataset, 3), + + // levelColors : string[] + // colors of indicator, from lower to upper, in RGB format + levelColors: kvLookup('levelColors', config, dataset, ["#a9d70b", "#f9c802", "#ff0000"], 'array', ','), + + // startAnimationTime : int + // length of initial animation + startAnimationTime: kvLookup('startAnimationTime', config, dataset, 700), + + // startAnimationType : string + // type of initial animation (linear, >, <, <>, bounce) + startAnimationType: kvLookup('startAnimationType', config, dataset, '>'), + + // refreshAnimationTime : int + // length of refresh animation + refreshAnimationTime: kvLookup('refreshAnimationTime', config, dataset, 700), + + // refreshAnimationType : string + // type of refresh animation (linear, >, <, <>, bounce) + refreshAnimationType: kvLookup('refreshAnimationType', config, dataset, '>'), + + // donutStartAngle : int + // angle to start from when in donut mode + donutStartAngle: kvLookup('donutStartAngle', config, dataset, 90), + + // valueMinFontSize : int + // absolute minimum font size for the value + valueMinFontSize: kvLookup('valueMinFontSize', config, dataset, 16), + + // titleMinFontSize + // absolute minimum font size for the title + titleMinFontSize: kvLookup('titleMinFontSize', config, dataset, 10), + + // labelMinFontSize + // absolute minimum font size for the label + labelMinFontSize: kvLookup('labelMinFontSize', config, dataset, 10), + + // minLabelMinFontSize + // absolute minimum font size for the minimum label + minLabelMinFontSize: kvLookup('minLabelMinFontSize', config, dataset, 10), + + // maxLabelMinFontSize + // absolute minimum font size for the maximum label + maxLabelMinFontSize: kvLookup('maxLabelMinFontSize', config, dataset, 10), + + // hideValue : bool + // hide value text + hideValue: kvLookup('hideValue', config, dataset, false), + + // hideMinMax : bool + // hide min and max values + hideMinMax: kvLookup('hideMinMax', config, dataset, false), + + // hideInnerShadow : bool + // hide inner shadow + hideInnerShadow: kvLookup('hideInnerShadow', config, dataset, false), + + // humanFriendly : bool + // convert large numbers for min, max, value to human friendly (e.g. 1234567 -> 1.23M) + humanFriendly: kvLookup('humanFriendly', config, dataset, false), + + // noGradient : bool + // whether to use gradual color change for value, or sector-based + noGradient: kvLookup('noGradient', config, dataset, false), + + // donut : bool + // show full donut gauge + donut: kvLookup('donut', config, dataset, false), + + // relativeGaugeSize : bool + // whether gauge size should follow changes in container element size + relativeGaugeSize: kvLookup('relativeGaugeSize', config, dataset, false), + + // counter : bool + // animate level number change + counter: kvLookup('counter', config, dataset, false), + + // decimals : int + // number of digits after floating point + decimals: kvLookup('decimals', config, dataset, 0), + + // customSectors : [] of objects + // number of digits after floating point + customSectors: kvLookup('customSectors', config, dataset, []), + + // formatNumber: boolean + // formats numbers with commas where appropriate + formatNumber: kvLookup('formatNumber', config, dataset, false), + + // pointer : bool + // show value pointer + pointer: kvLookup('pointer', config, dataset, false), + + // pointerOptions : object + // define pointer look + pointerOptions: kvLookup('pointerOptions', config, dataset, []) + }; + + // variables + var + canvasW, + canvasH, + widgetW, + widgetH, + aspect, + dx, + dy, + titleFontSize, + titleX, + titleY, + valueFontSize, + valueX, + valueY, + labelFontSize, + labelX, + labelY, + minFontSize, + minX, + minY, + maxFontSize, + maxX, + maxY; + + // overflow values + if (obj.config.value > obj.config.max) obj.config.value = obj.config.max; + if (obj.config.value < obj.config.min) obj.config.value = obj.config.min; + obj.originalValue = kvLookup('value', config, dataset, -1, 'float'); + + // create canvas + if (obj.config.id !== null && (document.getElementById(obj.config.id)) !== null) { + obj.canvas = Raphael(obj.config.id, "100%", "100%"); + } else if (obj.config.parentNode !== null) { + obj.canvas = Raphael(obj.config.parentNode, "100%", "100%"); + } + + if (obj.config.relativeGaugeSize === true) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + } + + // canvas dimensions + if (obj.config.relativeGaugeSize === true) { + canvasW = 200; + canvasH = 150; + } else if (obj.config.width !== null && obj.config.height !== null) { + canvasW = obj.config.width; + canvasH = obj.config.height; + } else if (obj.config.parentNode !== null) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + canvasW = 200; + canvasH = 150; + } else { + canvasW = getStyle(document.getElementById(obj.config.id), "width").slice(0, -2) * 1; + canvasH = getStyle(document.getElementById(obj.config.id), "height").slice(0, -2) * 1; + } + + // widget dimensions + if (obj.config.donut === true) { + + // DONUT ******************************* + + // width more than height + if (canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH; + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW; + // if height don't fit, rescale both + if (widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW; + } + + // delta + dx = (canvasW - widgetW) / 2; + dy = (canvasH - widgetH) / 2; + + // title + titleFontSize = ((widgetH / 8) > 10) ? (widgetH / 10) : 10; + titleX = dx + widgetW / 2; + titleY = dy + widgetH / 11; + + // value + valueFontSize = ((widgetH / 6.4) > 16) ? (widgetH / 5.4) : 18; + valueX = dx + widgetW / 2; + if (obj.config.label !== '') { + valueY = dy + widgetH / 1.85; + } else { + valueY = dy + widgetH / 1.7; + } + + // label + labelFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + labelX = dx + widgetW / 2; + labelY = valueY + labelFontSize; + + // min + minFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + maxY = labelY; + + } else { + // HALF ******************************* + + // width more than height + if (canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH * 1.25; + //if width doesn't fit, rescale both + if (widgetW > canvasW) { + aspect = widgetW / canvasW; + widgetW = widgetW / aspect; + widgetH = widgetH / aspect; + } + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW / 1.25; + // if height don't fit, rescale both + if (widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW * 0.75; + } + + // delta + dx = (canvasW - widgetW) / 2; + dy = (canvasH - widgetH) / 2; + if (obj.config.titlePosition === 'below') { + // shift whole thing down + dy -= (widgetH / 6.4); + } + + // title + titleFontSize = ((widgetH / 8) > obj.config.titleMinFontSize) ? (widgetH / 10) : obj.config.titleMinFontSize; + titleX = dx + widgetW / 2; + titleY = dy + (obj.config.titlePosition === 'below' ? (widgetH * 1.07) : (widgetH / 6.4)); + + // value + valueFontSize = ((widgetH / 6.5) > obj.config.valueMinFontSize) ? (widgetH / 6.5) : obj.config.valueMinFontSize; + valueX = dx + widgetW / 2; + valueY = dy + widgetH / 1.275; + + // label + labelFontSize = ((widgetH / 16) > obj.config.labelMinFontSize) ? (widgetH / 16) : obj.config.labelMinFontSize; + labelX = dx + widgetW / 2; + labelY = valueY + valueFontSize / 2 + 5; + + // min + minFontSize = ((widgetH / 16) > obj.config.minLabelMinFontSize) ? (widgetH / 16) : obj.config.minLabelMinFontSize; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > obj.config.maxLabelMinFontSize) ? (widgetH / 16) : obj.config.maxLabelMinFontSize; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + maxY = labelY; + } + + // parameters + obj.params = { + canvasW: canvasW, + canvasH: canvasH, + widgetW: widgetW, + widgetH: widgetH, + dx: dx, + dy: dy, + titleFontSize: titleFontSize, + titleX: titleX, + titleY: titleY, + valueFontSize: valueFontSize, + valueX: valueX, + valueY: valueY, + labelFontSize: labelFontSize, + labelX: labelX, + labelY: labelY, + minFontSize: minFontSize, + minX: minX, + minY: minY, + maxFontSize: maxFontSize, + maxX: maxX, + maxY: maxY + }; + + // var clear + canvasW, canvasH, widgetW, widgetH, aspect, dx, dy, titleFontSize, titleX, titleY, valueFontSize, valueX, valueY, labelFontSize, labelX, labelY, minFontSize, minX, minY, maxFontSize, maxX, maxY = null; + + // pki - custom attribute for generating gauge paths + obj.canvas.customAttributes.pki = function(value, min, max, w, h, dx, dy, gws, donut, reverse) { + + var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path; + + if (donut) { + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + path = "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ro + "," + Ro + " 0 0 1 " + (Cx + Ro) + "," + Cy + " "; + } + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx + Ri) + "," + Cy + " "; + } + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { + path: path + }; + + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + path = "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { + path: path + }; + } + + // var clear + alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path = null; + }; + + // ndl - custom attribute for generating needle path + obj.canvas.customAttributes.ndl = function(value, min, max, w, h, dx, dy, gws, donut) { + + var dlt = w * 3.5 / 100; + var dlb = w / 15; + var dw = w / 100; + + if (obj.config.pointerOptions.toplength != null && obj.config.pointerOptions.toplength != undefined) dlt = obj.config.pointerOptions.toplength; + if (obj.config.pointerOptions.bottomlength != null && obj.config.pointerOptions.bottomlength != undefined) dlb = obj.config.pointerOptions.bottomlength; + if (obj.config.pointerOptions.bottomwidth != null && obj.config.pointerOptions.bottomwidth != undefined) dw = obj.config.pointerOptions.bottomwidth; + + var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, Xc, Yc, Xz, Yz, Xa, Ya, Xb, Yb, path; + + if (donut) { + + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + Xc = Xo + dlt * Math.cos(alpha); + Yc = Yo - dlt * Math.sin(alpha); + Xz = Xi - dlb * Math.cos(alpha); + Yz = Yi + dlb * Math.sin(alpha); + + Xa = Xz + dw * Math.sin(alpha); + Ya = Yz + dw * Math.cos(alpha); + Xb = Xz - dw * Math.sin(alpha); + Yb = Yz - dw * Math.cos(alpha); + + path = 'M' + Xa + ',' + Ya + ' '; + path += 'L' + Xb + ',' + Yb + ' '; + path += 'L' + Xc + ',' + Yc + ' '; + path += 'Z '; + + return { + path: path + }; + + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + Xc = Xo + dlt * Math.cos(alpha); + Yc = Yo - dlt * Math.sin(alpha); + Xz = Xi - dlb * Math.cos(alpha); + Yz = Yi + dlb * Math.sin(alpha); + + Xa = Xz + dw * Math.sin(alpha); + Ya = Yz + dw * Math.cos(alpha); + Xb = Xz - dw * Math.sin(alpha); + Yb = Yz - dw * Math.cos(alpha); + + path = 'M' + Xa + ',' + Ya + ' '; + path += 'L' + Xb + ',' + Yb + ' '; + path += 'L' + Xc + ',' + Yc + ' '; + path += 'Z '; + + return { + path: path + }; + } + + // var clear + alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, Xc, Yc, Xz, Yz, Xa, Ya, Xb, Yb, path = null; + }; + + // gauge + obj.gauge = obj.canvas.path().attr({ + "stroke": "none", + "fill": obj.config.gaugeColor, + pki: [ + obj.config.max, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ] + }); + + // level + obj.level = obj.canvas.path().attr({ + "stroke": "none", + "fill": getColor(obj.config.value, (obj.config.value - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors), + pki: [ + obj.config.min, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ] + }); + if (obj.config.donut) { + obj.level.transform("r" + obj.config.donutStartAngle + ", " + (obj.params.widgetW / 2 + obj.params.dx) + ", " + (obj.params.widgetH / 1.95 + obj.params.dy)); + } + + if (obj.config.pointer) { + // needle + obj.needle = obj.canvas.path().attr({ + "stroke": (obj.config.pointerOptions.stroke !== null && obj.config.pointerOptions.stroke !== undefined) ? obj.config.pointerOptions.stroke : "none", + "stroke-width": (obj.config.pointerOptions.stroke_width !== null && obj.config.pointerOptions.stroke_width !== undefined) ? obj.config.pointerOptions.stroke_width : 0, + "stroke-linecap": (obj.config.pointerOptions.stroke_linecap !== null && obj.config.pointerOptions.stroke_linecap !== undefined) ? obj.config.pointerOptions.stroke_linecap : "square", + "fill": (obj.config.pointerOptions.color !== null && obj.config.pointerOptions.color !== undefined) ? obj.config.pointerOptions.color : "#000000", + ndl: [ + obj.config.min, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }); + + if (obj.config.donut) { + obj.needle.transform("r" + obj.config.donutStartAngle + ", " + (obj.params.widgetW / 2 + obj.params.dx) + ", " + (obj.params.widgetH / 1.95 + obj.params.dy)); + } + + } + + // title + obj.txtTitle = obj.canvas.text(obj.params.titleX, obj.params.titleY, obj.config.title); + obj.txtTitle.attr({ + "font-size": obj.params.titleFontSize, + "font-weight": "bold", + "font-family": obj.config.titleFontFamily, + "fill": obj.config.titleFontColor, + "fill-opacity": "1" + }); + setDy(obj.txtTitle, obj.params.titleFontSize, obj.params.titleY); + + // value + obj.txtValue = obj.canvas.text(obj.params.valueX, obj.params.valueY, 0); + obj.txtValue.attr({ + "font-size": obj.params.valueFontSize, + "font-weight": "bold", + "font-family": obj.config.valueFontFamily, + "fill": obj.config.valueFontColor, + "fill-opacity": "0" + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + + // label + obj.txtLabel = obj.canvas.text(obj.params.labelX, obj.params.labelY, obj.config.label); + obj.txtLabel.attr({ + "font-size": obj.params.labelFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": "0" + }); + setDy(obj.txtLabel, obj.params.labelFontSize, obj.params.labelY); + + // min + var min = obj.config.min; + if (obj.config.reverse) { + min = obj.config.max; + } + + obj.txtMinimum = min; + if (obj.config.humanFriendly) { + obj.txtMinimum = humanFriendlyNumber(min, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMinimum = formatNumber(min); + } + obj.txtMin = obj.canvas.text(obj.params.minX, obj.params.minY, obj.txtMinimum); + obj.txtMin.attr({ + "font-size": obj.params.minFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut) ? "0" : "1" + }); + setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY); + + // max + var max = obj.config.max; + if (obj.config.reverse) { + max = obj.config.min; + } + obj.txtMaximum = max; + if (obj.config.humanFriendly) { + obj.txtMaximum = humanFriendlyNumber(max, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMaximum = formatNumber(max); + } + obj.txtMax = obj.canvas.text(obj.params.maxX, obj.params.maxY, obj.txtMaximum); + obj.txtMax.attr({ + "font-size": obj.params.maxFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut) ? "0" : "1" + }); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + + var defs = obj.canvas.canvas.childNodes[1]; + var svg = "http://www.w3.org/2000/svg"; + + if (ie !== 'undefined' && ie < 9) { + // VML mode - no SVG & SVG filter support + } else if (ie !== 'undefined') { + onCreateElementNsReady(function() { + obj.generateShadow(svg, defs); + }); + } else { + obj.generateShadow(svg, defs); + } + + // var clear + defs, svg = null; + + // set value to display + if (obj.config.textRenderer) { + obj.originalValue = obj.config.textRenderer(obj.originalValue); + } else if (obj.config.humanFriendly) { + obj.originalValue = humanFriendlyNumber(obj.originalValue, obj.config.humanFriendlyDecimal) + obj.config.symbol; + } else if (obj.config.formatNumber) { + obj.originalValue = formatNumber(obj.originalValue) + obj.config.symbol; + } else { + obj.originalValue = (obj.originalValue * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + + if (obj.config.counter === true) { + //on each animation frame + eve.on("raphael.anim.frame." + (obj.level.id), function() { + var currentValue = obj.level.attr("pki")[0]; + if (obj.config.reverse) { + currentValue = (obj.config.max * 1) + (obj.config.min * 1) - (obj.level.attr("pki")[0] * 1); + } + if (obj.config.textRenderer) { + obj.txtValue.attr("text", obj.config.textRenderer(Math.floor(currentValue))); + } else if (obj.config.humanFriendly) { + obj.txtValue.attr("text", humanFriendlyNumber(Math.floor(currentValue), obj.config.humanFriendlyDecimal) + obj.config.symbol); + } else if (obj.config.formatNumber) { + obj.txtValue.attr("text", formatNumber(Math.floor(currentValue)) + obj.config.symbol); + } else { + obj.txtValue.attr("text", (currentValue * 1).toFixed(obj.config.decimals) + obj.config.symbol); + } + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + currentValue = null; + }); + //on animation end + eve.on("raphael.anim.finish." + (obj.level.id), function() { + obj.txtValue.attr({ + "text": obj.originalValue + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } else { + //on animation start + eve.on("raphael.anim.start." + (obj.level.id), function() { + obj.txtValue.attr({ + "text": obj.originalValue + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } + + // animate gauge level, value & label + var rvl = obj.config.value; + if (obj.config.reverse) { + rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1); + } + obj.level.animate({ + pki: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ] + }, obj.config.startAnimationTime, obj.config.startAnimationType); + + if (obj.config.pointer) { + obj.needle.animate({ + ndl: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }, obj.config.startAnimationTime, obj.config.startAnimationType); + } + + obj.txtValue.animate({ + "fill-opacity": (obj.config.hideValue) ? "0" : "1" + }, obj.config.startAnimationTime, obj.config.startAnimationType); + obj.txtLabel.animate({ + "fill-opacity": "1" + }, obj.config.startAnimationTime, obj.config.startAnimationType); +}; + +/** Refresh gauge level */ +JustGage.prototype.refresh = function(val, max) { + + var obj = this; + var displayVal, color, max = max || null; + + // set new max + if (max !== null) { + obj.config.max = max; + // TODO: update customSectors + + obj.txtMaximum = obj.config.max; + if (obj.config.humanFriendly) { + obj.txtMaximum = humanFriendlyNumber(obj.config.max, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMaximum = formatNumber(obj.config.max); + } + if (!obj.config.reverse) { + obj.txtMax.attr({ + "text": obj.txtMaximum + }); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + } else { + obj.txtMin.attr({ + "text": obj.txtMaximum + }); + setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY); + } + } + + // overflow values + displayVal = val; + if ((val * 1) > (obj.config.max * 1)) { + val = (obj.config.max * 1); + } + if ((val * 1) < (obj.config.min * 1)) { + val = (obj.config.min * 1); + } + + color = getColor(val, (val - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors); + + if (obj.config.textRenderer) { + displayVal = obj.config.textRenderer(displayVal); + } else if (obj.config.humanFriendly) { + displayVal = humanFriendlyNumber(displayVal, obj.config.humanFriendlyDecimal) + obj.config.symbol; + } else if (obj.config.formatNumber) { + displayVal = formatNumber((displayVal * 1).toFixed(obj.config.decimals)) + obj.config.symbol; + } else { + displayVal = (displayVal * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + obj.originalValue = displayVal; + obj.config.value = val * 1; + + if (!obj.config.counter) { + obj.txtValue.attr({ + "text": displayVal + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + } + + var rvl = obj.config.value; + if (obj.config.reverse) { + rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1); + } + obj.level.animate({ + pki: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ], + "fill": color + }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType); + + if (obj.config.pointer) { + obj.needle.animate({ + ndl: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType); + } + + // var clear + obj, displayVal, color, max = null; +}; + +/** Generate shadow */ +JustGage.prototype.generateShadow = function(svg, defs) { + + var obj = this; + var sid = "inner-shadow-" + obj.config.id; + var gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3; + + // FILTER + gaussFilter = document.createElementNS(svg, "filter"); + gaussFilter.setAttribute("id", sid); + defs.appendChild(gaussFilter); + + // offset + feOffset = document.createElementNS(svg, "feOffset"); + feOffset.setAttribute("dx", 0); + feOffset.setAttribute("dy", obj.config.shadowVerticalOffset); + gaussFilter.appendChild(feOffset); + + // blur + feGaussianBlur = document.createElementNS(svg, "feGaussianBlur"); + feGaussianBlur.setAttribute("result", "offset-blur"); + feGaussianBlur.setAttribute("stdDeviation", obj.config.shadowSize); + gaussFilter.appendChild(feGaussianBlur); + + // composite 1 + feComposite1 = document.createElementNS(svg, "feComposite"); + feComposite1.setAttribute("operator", "out"); + feComposite1.setAttribute("in", "SourceGraphic"); + feComposite1.setAttribute("in2", "offset-blur"); + feComposite1.setAttribute("result", "inverse"); + gaussFilter.appendChild(feComposite1); + + // flood + feFlood = document.createElementNS(svg, "feFlood"); + feFlood.setAttribute("flood-color", "black"); + feFlood.setAttribute("flood-opacity", obj.config.shadowOpacity); + feFlood.setAttribute("result", "color"); + gaussFilter.appendChild(feFlood); + + // composite 2 + feComposite2 = document.createElementNS(svg, "feComposite"); + feComposite2.setAttribute("operator", "in"); + feComposite2.setAttribute("in", "color"); + feComposite2.setAttribute("in2", "inverse"); + feComposite2.setAttribute("result", "shadow"); + gaussFilter.appendChild(feComposite2); + + // composite 3 + feComposite3 = document.createElementNS(svg, "feComposite"); + feComposite3.setAttribute("operator", "over"); + feComposite3.setAttribute("in", "shadow"); + feComposite3.setAttribute("in2", "SourceGraphic"); + gaussFilter.appendChild(feComposite3); + + // set shadow + if (!obj.config.hideInnerShadow) { + obj.canvas.canvas.childNodes[2].setAttribute("filter", "url(#" + sid + ")"); + obj.canvas.canvas.childNodes[3].setAttribute("filter", "url(#" + sid + ")"); + } + + // var clear + gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3 = null; +}; + +// +// tiny helper function to lookup value of a key from two hash tables +// if none found, return defaultvalue +// +// key: string +// tablea: object +// tableb: DOMStringMap|object +// defval: string|integer|float|null +// datatype: return datatype +// delimiter: delimiter to be used in conjunction with datatype formatting +// +function kvLookup(key, tablea, tableb, defval, datatype, delimiter) { + var val = defval; + var canConvert = false; + if (!(key === null || key === undefined)) { + if (tableb !== null && tableb !== undefined && typeof tableb === "object" && key in tableb) { + val = tableb[key]; + canConvert = true; + } else if (tablea !== null && tablea !== undefined && typeof tablea === "object" && key in tablea) { + val = tablea[key]; + canConvert = true; + } else { + val = defval; + } + if (canConvert === true) { + if (datatype !== null && datatype !== undefined) { + switch (datatype) { + case 'int': + val = parseInt(val, 10); + break; + case 'float': + val = parseFloat(val); + break; + default: + break; + } + } + } + } + return val; +}; + +/** Get color for value */ +function getColor(val, pct, col, noGradient, custSec) { + + var no, inc, colors, percentage, rval, gval, bval, lower, upper, range, rangePct, pctLower, pctUpper, color; + var noGradient = noGradient || custSec.length > 0; + + if (custSec.length > 0) { + for (var i = 0; i < custSec.length; i++) { + if (val > custSec[i].lo && val <= custSec[i].hi) { + return custSec[i].color; + } + } + } + + no = col.length; + if (no === 1) return col[0]; + inc = (noGradient) ? (1 / no) : (1 / (no - 1)); + colors = []; + for (i = 0; i < col.length; i++) { + percentage = (noGradient) ? (inc * (i + 1)) : (inc * i); + rval = parseInt((cutHex(col[i])).substring(0, 2), 16); + gval = parseInt((cutHex(col[i])).substring(2, 4), 16); + bval = parseInt((cutHex(col[i])).substring(4, 6), 16); + colors[i] = { + pct: percentage, + color: { + r: rval, + g: gval, + b: bval + } + }; + } + + if (pct === 0) { + return 'rgb(' + [colors[0].color.r, colors[0].color.g, colors[0].color.b].join(',') + ')'; + } + + for (var j = 0; j < colors.length; j++) { + if (pct <= colors[j].pct) { + if (noGradient) { + return 'rgb(' + [colors[j].color.r, colors[j].color.g, colors[j].color.b].join(',') + ')'; + } else { + lower = colors[j - 1]; + upper = colors[j]; + range = upper.pct - lower.pct; + rangePct = (pct - lower.pct) / range; + pctLower = 1 - rangePct; + pctUpper = rangePct; + color = { + r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper), + g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper), + b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper) + }; + return 'rgb(' + [color.r, color.g, color.b].join(',') + ')'; + } + } + } + +} + +/** Fix Raphael display:none tspan dy attribute bug */ +function setDy(elem, fontSize, txtYpos) { + if ((!ie || ie > 9) && elem.node.firstChild.attributes.dy) { + elem.node.firstChild.attributes.dy.value = 0; + } +} + +/** Random integer */ +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +/** Cut hex */ +function cutHex(str) { + return (str.charAt(0) == "#") ? str.substring(1, 7) : str; +} + +/** Human friendly number suffix - From: http://stackoverflow.com/questions/2692323/code-golf-friendly-number-abbreviator */ +function humanFriendlyNumber(n, d) { + var p, d2, i, s; + + p = Math.pow; + d2 = p(10, d); + i = 7; + while (i) { + s = p(10, i-- * 3); + if (s <= n) { + n = Math.round(n * d2 / s) / d2 + "KMGTPE" [i]; + } + } + return n; +} + +/** Format numbers with commas - From: http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript */ +function formatNumber(x) { + var parts = x.toString().split("."); + parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return parts.join("."); +} + +/** Get style */ +function getStyle(oElm, strCssRule) { + var strValue = ""; + if (document.defaultView && document.defaultView.getComputedStyle) { + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } else if (oElm.currentStyle) { + strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) { + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} + +/** Create Element NS Ready */ +function onCreateElementNsReady(func) { + if (document.createElementNS !== undefined) { + func(); + } else { + setTimeout(function() { + onCreateElementNsReady(func); + }, 100); + } +} + +/** Get IE version */ +// ---------------------------------------------------------- +// A short snippet for detecting versions of IE in JavaScript +// without resorting to user-agent sniffing +// ---------------------------------------------------------- +// If you're not in IE (or IE version is less than 5) then: +// ie === undefined +// If you're in IE (>=5) then you can determine which version: +// ie === 7; // IE7 +// Thus, to detect IE: +// if (ie) {} +// And to detect the version: +// ie === 6 // IE6 +// ie > 7 // IE8, IE9 ... +// ie < 9 // Anything less than IE9 +// ---------------------------------------------------------- +// UPDATE: Now using Live NodeList idea from @jdalton +var ie = (function() { + + var undef, + v = 3, + div = document.createElement('div'), + all = div.getElementsByTagName('i'); + + while ( + div.innerHTML = '', + all[0] + ); + return v > 4 ? v : undef; +}()); + +// extend target object with second object +function extend(out) { + out = out || {}; + + for (var i = 1; i < arguments.length; i++) { + if (!arguments[i]) + continue; + + for (var key in arguments[i]) { + if (arguments[i].hasOwnProperty(key)) + out[key] = arguments[i][key]; + } + } + + return out; +}; diff --git a/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/raphael-2.1.4.min.js b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/raphael-2.1.4.min.js new file mode 100644 index 0000000..b907338 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/justgage-1.2.2/raphael-2.1.4.min.js @@ -0,0 +1,12 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.4 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +!function(a,b){"function"==typeof define&&define.amd?define("eve",function(){return b()}):"object"==typeof exports?module.exports=b():a.eve=b()}(this,function(){var a,b,c="0.4.2",d="hasOwnProperty",e=/[\.\/]/,f="*",g=function(){},h=function(a,b){return a-b},i={n:{}},j=function(c,d){c=String(c);var e,f=b,g=Array.prototype.slice.call(arguments,2),i=j.listeners(c),k=0,l=[],m={},n=[],o=a;a=c,b=0;for(var p=0,q=i.length;q>p;p++)"zIndex"in i[p]&&(l.push(i[p].zIndex),i[p].zIndex<0&&(m[i[p].zIndex]=i[p]));for(l.sort(h);l[k]<0;)if(e=m[l[k++]],n.push(e.apply(d,g)),b)return b=f,n;for(p=0;q>p;p++)if(e=i[p],"zIndex"in e)if(e.zIndex==l[k]){if(n.push(e.apply(d,g)),b)break;do if(k++,e=m[l[k]],e&&n.push(e.apply(d,g)),b)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),b)break;return b=f,a=o,n.length?n:null};return j._events=i,j.listeners=function(a){var b,c,d,g,h,j,k,l,m=a.split(e),n=i,o=[n],p=[];for(g=0,h=m.length;h>g;g++){for(l=[],j=0,k=o.length;k>j;j++)for(n=o[j].n,c=[n[m[g]],n[f]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},j.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(e),d=i,f=0,h=c.length;h>f;f++)d=d.n,d=d.hasOwnProperty(c[f])&&d[c[f]]||(d[c[f]]={n:{}});for(d.f=d.f||[],f=0,h=d.f.length;h>f;f++)if(d.f[f]==b)return g;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},j.f=function(a){var b=[].slice.call(arguments,1);return function(){j.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},j.stop=function(){b=1},j.nt=function(b){return b?new RegExp("(?:\\.|\\/|^)"+b+"(?:\\.|\\/|$)").test(a):a},j.nts=function(){return a.split(e)},j.off=j.unbind=function(a,b){if(!a)return void(j._events=i={n:{}});var c,g,h,k,l,m,n,o=a.split(e),p=[i];for(k=0,l=o.length;l>k;k++)for(m=0;mk;k++)for(c=p[k];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(g in c.n)if(c.n[d](g)&&c.n[g].f){var q=c.n[g].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[g].f}}else{delete c.f;for(g in c.n)c.n[d](g)&&c.n[g].f&&delete c.n[g].f}c=c.n}},j.once=function(a,b){var c=function(){return j.unbind(a,c),b.apply(this,arguments)};return j.on(a,c)},j.version=c,j.toString=function(){return"You are running Eve "+c},j}),function(a,b){"function"==typeof define&&define.amd?define("raphael.core",["eve"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("eve")):a.Raphael=b(a.eve)}(this,function(a){function b(c){if(b.is(c,"function"))return t?c():a.on("raphael.DOMload",c);if(b.is(c,U))return b._engine.create[C](b,c.splice(0,3+b.is(c[0],S))).add(c);var d=Array.prototype.slice.call(arguments,0);if(b.is(d[d.length-1],"function")){var e=d.pop();return t?e.call(b._engine.create[C](b,d)):a.on("raphael.DOMload",function(){e.call(b._engine.create[C](b,d))})}return b._engine.create[C](b,arguments)}function c(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var d in a)a[y](d)&&(b[d]=c(a[d]));return b}function d(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function e(a,b,c){function e(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=e.cache=e.cache||{},i=e.count=e.count||[];return h[y](g)?(d(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[C](b,f),c?c(h[g]):h[g])}return e}function f(){return this.hex}function g(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function h(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function i(a,b,c,d,e,f,g,i,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=h(q,a,c,e,g),s=h(q,b,d,f,i),t=r*r+s*s;o+=n[p]*M.sqrt(t)}return k*o}function j(a,b,c,d,e,f,g,h,j){if(!(0>j||i(a,b,c,d,e,f,g,h)o;)m/=2,n+=(j>k?1:-1)*m,k=i(a,b,c,d,e,f,g,h,n);return n}}function k(a,b,c,d,e,f,g,h){if(!(N(a,c)N(e,g)||N(b,d)N(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+O(a,c).toFixed(2)||n>+N(a,c).toFixed(2)||n<+O(e,g).toFixed(2)||n>+N(e,g).toFixed(2)||o<+O(b,d).toFixed(2)||o>+N(b,d).toFixed(2)||o<+O(f,h).toFixed(2)||o>+N(f,h).toFixed(2)))return{x:l,y:m}}}}function l(a,c,d){var e=b.bezierBBox(a),f=b.bezierBBox(c);if(!b.isBBoxIntersect(e,f))return d?0:[];for(var g=i.apply(0,a),h=i.apply(0,c),j=N(~~(g/5),1),l=N(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;j+1>q;q++){var r=b.findDotsAtSegment.apply(b,a.concat(q/j));m.push({x:r.x,y:r.y,t:q/j})}for(q=0;l+1>q;q++)r=b.findDotsAtSegment.apply(b,c.concat(q/l)),n.push({x:r.x,y:r.y,t:q/l});for(q=0;j>q;q++)for(var s=0;l>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=P(u.x-t.x)<.001?"y":"x",y=P(w.x-v.x)<.001?"y":"x",z=k(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+P((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+P((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:O(A,1),t2:O(B,1)}))}}return p}function m(a,c,d){a=b._path2curve(a),c=b._path2curve(c);for(var e,f,g,h,i,j,k,m,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=c.length;u>t;t++){var v=c[t];if("M"==v[0])g=k=v[1],h=m=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,m,k,m],g=k,h=m);var w=l(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function n(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function o(){return this.x+G+this.y+G+this.width+" × "+this.height}function p(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,P(f)e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),P(f-a)f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function q(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[y](e)&&(d[$(e)]=a[e],c.push($(e)));c.sort(ka)}this.anim=d,this.top=c[c.length-1],this.percents=c}function r(c,d,e,f,g,h){e=$(e);var i,j,k,l,m,o,q=c.ms,r={},s={},t={};if(f)for(w=0,x=fb.length;x>w;w++){var u=fb[w];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(fb.splice(w,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var w=0,x=c.percents.length;x>w;w++){if(c.percents[w]==e||c.percents[w]>f*c.top){e=c.percents[w],m=c.percents[w-1]||0,q=q/c.top*(e-m),l=c.percents[w+1],i=c.anim[e];break}f&&d.attr(c.anim[c.percents[w]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var z in i)if(i[y](z)&&(ca[y](z)||d.paper.customAttributes[y](z)))switch(r[z]=d.attr(z),null==r[z]&&(r[z]=ba[z]),s[z]=i[z],ca[z]){case S:t[z]=(s[z]-r[z])/q;break;case"colour":r[z]=b.getRGB(r[z]);var A=b.getRGB(s[z]);t[z]={r:(A.r-r[z].r)/q,g:(A.g-r[z].g)/q,b:(A.b-r[z].b)/q};break;case"path":var B=Ia(r[z],s[z]),C=B[1];for(r[z]=B[0],t[z]=[],w=0,x=r[z].length;x>w;w++){t[z][w]=[0];for(var E=1,F=r[z][w].length;F>E;E++)t[z][w][E]=(C[w][E]-r[z][w][E])/q}break;case"transform":var G=d._,J=Na(G[z],s[z]);if(J)for(r[z]=J.from,s[z]=J.to,t[z]=[],t[z].real=!0,w=0,x=r[z].length;x>w;w++)for(t[z][w]=[r[z][w][0]],E=1,F=r[z][w].length;F>E;E++)t[z][w][E]=(s[z][w][E]-r[z][w][E])/q;else{var K=d.matrix||new n,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[z]=[K.a,K.b,K.c,K.d,K.e,K.f],La(L,s[z]),s[z]=L._.transform,t[z]=[(L.matrix.a-K.a)/q,(L.matrix.b-K.b)/q,(L.matrix.c-K.c)/q,(L.matrix.d-K.d)/q,(L.matrix.e-K.e)/q,(L.matrix.f-K.f)/q]}break;case"csv":var M=H(i[z])[I](v),N=H(r[z])[I](v);if("clip-rect"==z)for(r[z]=N,t[z]=[],w=N.length;w--;)t[z][w]=(M[w]-r[z][w])/q;s[z]=M;break;default:for(M=[][D](i[z]),N=[][D](r[z]),t[z]=[],w=d.paper.customAttributes[z].length;w--;)t[z][w]=((M[w]||0)-(N[w]||0))/q}var O=i.easing,P=b.easing_formulas[O];if(!P)if(P=H(O).match(Y),P&&5==P.length){var Q=P;P=function(a){return p(a,+Q[1],+Q[2],+Q[3],+Q[4],q)}}else P=la;if(o=i.start||c.start||+new Date,u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:f||0,stop:!1,ms:q,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||c.times,origin:d.attr(),totalOrigin:g},fb.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-q*f,1==fb.length))return hb();k&&(u.start=new Date-u.ms*f),1==fb.length&&gb(hb)}a("raphael.anim.start."+d.id,d,c)}}function s(a){for(var b=0;be;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(b._g=z,b.type=z.win.SVGAngle||z.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==b.type){var qa,ra=z.doc.createElement("div");if(ra.innerHTML='',qa=ra.firstChild,qa.style.behavior="url(#default#VML)",!qa||"object"!=typeof qa.adj)return b.type=F;ra=null}b.svg=!(b.vml="VML"==b.type),b._Paper=B,b.fn=u=B.prototype=b.prototype,b._id=0,b._oid=0,b.is=function(a,b){return b=L.call(b),"finite"==b?!X[y](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||V.call(a).slice(8,-1).toLowerCase()==b},b.angle=function(a,c,d,e,f,g){if(null==f){var h=a-d,i=c-e;return h||i?(180+180*M.atan2(-i,-h)/R+360)%360:0}return b.angle(a,c,f,g)-b.angle(d,e,f,g)},b.rad=function(a){return a%360*R/180},b.deg=function(a){return Math.round(180*a/R%360*1e3)/1e3},b.snapTo=function(a,c,d){if(d=b.is(d,"finite")?d:10,b.is(a,U)){for(var e=a.length;e--;)if(P(a[e]-c)<=d)return a[e]}else{a=+a;var f=c%a;if(d>f)return c-f;if(f>a-d)return c-f+a}return c};b.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*M.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});b.setWindow=function(c){a("raphael.setWindow",b,z.win,c),z.win=c,z.doc=z.win.document,b._engine.initWin&&b._engine.initWin(z.win)};var sa=function(a){if(b.vml){var c,d=/^\s+|\s+$/g;try{var f=new ActiveXObject("htmlfile");f.write(""),f.close(),c=f.body}catch(g){c=createPopup().document.body}var h=c.createTextRange();sa=e(function(a){try{c.style.color=H(a).replace(d,F);var b=h.queryCommandValue("ForeColor");return b=(255&b)<<16|65280&b|(16711680&b)>>>16,"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=z.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",z.doc.body.appendChild(i),sa=e(function(a){return i.style.color=a,z.doc.defaultView.getComputedStyle(i,F).getPropertyValue("color")})}return sa(a)},ta=function(){return"hsb("+[this.h,this.s,this.b]+")"},ua=function(){return"hsl("+[this.h,this.s,this.l]+")"},va=function(){return this.hex},wa=function(a,c,d){if(null==c&&b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,c=a.g,a=a.r),null==c&&b.is(a,T)){var e=b.getRGB(a);a=e.r,c=e.g,d=e.b}return(a>1||c>1||d>1)&&(a/=255,c/=255,d/=255),[a,c,d]},xa=function(a,c,d,e){a*=255,c*=255,d*=255;var f={r:a,g:c,b:d,hex:b.rgb(a,c,d),toString:va};return b.is(e,"finite")&&(f.opacity=e),f};b.color=function(a){var c;return b.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(c=b.hsb2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):b.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(c=b.hsl2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):(b.is(a,"string")&&(a=b.getRGB(a)),b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(c=b.rgb2hsl(a),a.h=c.h,a.s=c.s,a.l=c.l,c=b.rgb2hsb(a),a.v=c.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=va,a},b.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-P(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-P(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.rgb2hsb=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=N(a,b,c),g=f-O(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:ta}},b.rgb2hsl=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=N(a,b,c),h=O(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:ua}},b._path2string=function(){return this.join(",").replace(fa,"$1")};b._preload=function(a,b){var c=z.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,z.doc.body.removeChild(this)},c.onerror=function(){z.doc.body.removeChild(this)},z.doc.body.appendChild(c),c.src=a};b.getRGB=e(function(a){if(!a||(a=H(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:f};!(ea[y](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=sa(a));var c,d,e,g,h,i,j=a.match(W);return j?(j[2]&&(e=_(j[2].substring(5),16),d=_(j[2].substring(3,5),16),c=_(j[2].substring(1,3),16)),j[3]&&(e=_((h=j[3].charAt(3))+h,16),d=_((h=j[3].charAt(2))+h,16),c=_((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsb2rgb(c,d,e,g)):j[6]?(i=j[6][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsl2rgb(c,d,e,g)):(j={r:c,g:d,b:e,toString:f},j.hex="#"+(16777216|e|d<<8|c<<16).toString(16).slice(1),b.is(g,"finite")&&(j.opacity=g),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f}},b),b.hsb=e(function(a,c,d){return b.hsb2rgb(a,c,d).hex}),b.hsl=e(function(a,c,d){return b.hsl2rgb(a,c,d).hex}),b.rgb=e(function(a,b,c){function d(a){return a+.5|0}return"#"+(16777216|d(c)|d(b)<<8|d(a)<<16).toString(16).slice(1)}),b.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},b.getColor.reset=function(){delete this.start},b.parsePathString=function(a){if(!a)return null;var c=ya(a);if(c.arr)return Aa(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return b.is(a,U)&&b.is(a[0],U)&&(e=Aa(a)),e.length||H(a).replace(ga,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(ia,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][D](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][D](f));else for(;f.length>=d[g]&&(e.push([b][D](f.splice(0,d[g]))),d[g]););}),e.toString=b._path2string,c.arr=Aa(e),e},b.parseTransformString=e(function(a){if(!a)return null;var c=[];return b.is(a,U)&&b.is(a[0],U)&&(c=Aa(a)),c.length||H(a).replace(ha,function(a,b,d){{var e=[];L.call(b)}d.replace(ia,function(a,b){b&&e.push(+b)}),c.push([b][D](e))}),c.toString=b._path2string,c});var ya=function(a){var b=ya.ps=ya.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[y](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};b.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=Q(j,3),l=Q(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*M.atan2(q-s,r-t)/R;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},b.bezierBBox=function(a,c,d,e,f,g,h,i){b.is(a,"array")||(a=[a,c,d,e,f,g,h,i]);var j=Ha.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},b.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},b.isBBoxIntersect=function(a,c){var d=b.isPointInsideBBox;return d(c,a.x,a.y)||d(c,a.x2,a.y)||d(c,a.x,a.y2)||d(c,a.x2,a.y2)||d(a,c.x,c.y)||d(a,c.x2,c.y)||d(a,c.x,c.y2)||d(a,c.x2,c.y2)||(a.xc.x||c.xa.x)&&(a.yc.y||c.ya.y)},b.pathIntersection=function(a,b){return m(a,b)},b.pathIntersectionNumber=function(a,b){return m(a,b,1)},b.isPointInsidePath=function(a,c,d){var e=b.pathBBox(a);return b.isPointInsideBBox(e,c,d)&&m(a,[["M",c,d],["H",e.x2+10]],1)%2==1},b._removedFactory=function(b){return function(){a("raphael.log",null,"Raphaël: you are calling to method “"+b+"” of removed object",b)}};var za=b.pathBBox=function(a){var b=ya(a);if(b.bbox)return c(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Ia(a);for(var d,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(d=a[i],"M"==d[0])e=d[1],f=d[2],g.push(e),h.push(f);else{var k=Ha(e,f,d[1],d[2],d[3],d[4],d[5],d[6]);g=g[D](k.min.x,k.max.x),h=h[D](k.min.y,k.max.y),e=d[5],f=d[6]}var l=O[C](0,g),m=O[C](0,h),n=N[C](0,g),o=N[C](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=c(r),r},Aa=function(a){var d=c(a);return d.toString=b._path2string,d},Ba=b._pathToRelative=function(a){var c=ya(a);if(c.rel)return Aa(c.rel);b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=L.call(m[0]))switch(l[0]=L.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=b._path2string,c.rel=Aa(d),d},Ca=b._pathToAbsolute=function(a){var c=ya(a);if(c.abs)return Aa(c.abs);if(b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,h=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],h=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=aa.call(l[0]))switch(k[0]=aa.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][D](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[D](g(p,m));break;case"M":h=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][D](l.slice(1)),d.pop(),d=d[D](g(p,m)),k=["R"][D](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=h,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":h=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=b._path2string,c.abs=Aa(d),d},Da=function(a,b,c,d){return[a,b,c,d,c,d]},Ea=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Fa=function(a,b,c,d,f,g,h,i,j,k){var l,m=120*R/180,n=R/180*(+f||0),o=[],p=e(function(a,b,c){var d=a*M.cos(c)-b*M.sin(c),e=a*M.sin(c)+b*M.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(M.cos(R/180*f),M.sin(R/180*f),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=M.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*M.sqrt(P((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=M.asin(((b-x)/d).toFixed(9)),z=M.asin(((j-x)/d).toFixed(9));y=w>a?R-y:y,z=w>i?R-z:z,0>y&&(y=2*R+y),0>z&&(z=2*R+z),h&&y>z&&(y-=2*R),!h&&z>y&&(z-=2*R)}var A=z-y;if(P(A)>m){var B=z,C=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+c*M.cos(z),j=x+d*M.sin(z),o=Fa(i,j,c,d,f,0,h,C,E,[z,B,w,x])}A=z-y;var F=M.cos(y),G=M.sin(y),H=M.cos(z),J=M.sin(z),K=M.tan(A/4),L=4/3*c*K,N=4/3*d*K,O=[a,b],Q=[a+L*G,b-N*F],S=[i+L*J,j-N*H],T=[i,j];if(Q[0]=2*O[0]-Q[0],Q[1]=2*O[1]-Q[1],k)return[Q,S,T][D](o);o=[Q,S,T][D](o).join()[I](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ga=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:Q(j,3)*a+3*Q(j,2)*i*c+3*j*i*i*e+Q(i,3)*g,y:Q(j,3)*b+3*Q(j,2)*i*d+3*j*i*i*f+Q(i,3)*h}},Ha=e(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:O[C](0,p),y:O[C](0,o)},max:{x:N[C](0,p),y:N[C](0,o)}}}),Ia=b._path2curve=e(function(a,b){var c=!b&&ya(a);if(!b&&c.curve)return Aa(c.curve);for(var d=Ca(a),e=b&&Ca(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][D](Fa[C](0,[b.x,b.y][D](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][D](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][D](Ea(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][D](Ea(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][D](Da(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][D](Da(b.x,b.y,a[1],b.y));break;case"V":a=["C"][D](Da(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][D](Da(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)k[b]="A",e&&(l[b]="A"),a.splice(b++,0,["C"][D](c.splice(0,6)));a.splice(b,1),p=N(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],p=N(d.length,e&&e.length||0))},k=[],l=[],m="",n="",o=0,p=N(d.length,e&&e.length||0);p>o;o++){d[o]&&(m=d[o][0]),"C"!=m&&(k[o]=m,o&&(n=k[o-1])),d[o]=h(d[o],f,n),"A"!=k[o]&&"C"==m&&(k[o]="C"),i(d,o),e&&(e[o]&&(m=e[o][0]),"C"!=m&&(l[o]=m,o&&(n=l[o-1])),e[o]=h(e[o],g,n),"A"!=l[o]&&"C"==m&&(l[o]="C"),i(e,o)),j(d,e,f,g,o),j(e,d,g,f,o);var q=d[o],r=e&&e[o],s=q.length,t=e&&r.length;f.x=q[s-2],f.y=q[s-1],f.bx=$(q[s-4])||f.x,f.by=$(q[s-3])||f.y,g.bx=e&&($(r[t-4])||g.x),g.by=e&&($(r[t-3])||g.y),g.x=e&&r[t-2],g.y=e&&r[t-1]}return e||(c.curve=Aa(d)),e?[d,e]:d},null,Aa),Ja=(b._parseDots=e(function(a){for(var c=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=b.getRGB(g[1]),f.color.error)return null;f.opacity=f.color.opacity,f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;e>d;d++)if(!c[d].offset){for(var h=$(c[d-1].offset||0),i=0,j=d+1;e>j;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=$(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,c[d].offset=h+"%"}return c}),b._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Ka=(b._tofront=function(a,b){b.top!==a&&(Ja(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},b._toback=function(a,b){b.bottom!==a&&(Ja(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},b._insertafter=function(a,b,c){Ja(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},b._insertbefore=function(a,b,c){Ja(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},b.toMatrix=function(a,b){var c=za(a),d={_:{transform:F},getBBox:function(){return c}};return La(d,b),d.matrix}),La=(b.transformPath=function(a,b){return pa(a,Ka(a,b))},b._extractTransform=function(a,c){if(null==c)return a._.transform;c=H(c).replace(/\.{3}|\u2026/g,a._.transform||F);var d=b.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=a._,k=new n;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var o,p,q,r,s,t=d[l],u=t.length,v=H(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(o=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-o,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ma=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Na=b._equaliseTransform=function(a,c){ +c=H(c).replace(/\.{3}|\u2026/g,a),a=b.parseTransformString(a)||[],c=b.parseTransformString(c)||[];for(var d,e,f,g,h=N(a.length,c.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ma(c[k]),g=c[k]||Ma(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=N(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])}return{from:i,to:j}};b._getContainer=function(a,c,d,e){var f;return f=null!=e||b.is(a,"object")?a:z.doc.getElementById(a),null!=f?f.tagName?null==c?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}:{container:1,x:a,y:c,width:d,height:e}:void 0},b.pathToRelative=Ba,b._engine={},b.path2curve=Ia,b.matrix=function(a,b,c,d,e,f){return new n(a,b,c,d,e,f)},function(a){function c(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var b=M.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof n&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new n(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new n(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,c,d){a=b.rad(a),c=c||0,d=d||0;var e=+M.cos(a).toFixed(9),f=+M.sin(a).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[H.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return b.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=M.sqrt(c(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=M.sqrt(c(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=b.deg(M.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=b.deg(M.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[I]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:F)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:F)+(b.rotate?"r"+[b.rotate,0,0]:F)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(n.prototype);for(var Oa=function(){this.returnValue=!1},Pa=function(){return this.originalEvent.preventDefault()},Qa=function(){this.cancelBubble=!0},Ra=function(){return this.originalEvent.stopPropagation()},Sa=function(a){var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,c=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Ta=function(){return z.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Sa(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),E&&K[b]){var f=function(b){for(var e=Sa(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Pa,b.stopPropagation=Ra;break}return c.call(d,b,e.x,e.y)};a.addEventListener(K[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),E&&K[b]&&a.removeEventListener(K[b],f,!1),!0}}:z.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||z.win.event;var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,e=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Oa,a.stopPropagation=a.stopPropagation||Qa,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Ua=[],Va=function(b){for(var c,d=b.clientX,e=b.clientY,f=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,g=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,h=Ua.length;h--;){if(c=Ua[h],E&&b.touches){for(var i,j=b.touches.length;j--;)if(i=b.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(b.originalEvent?b.originalEvent:b).preventDefault();break}}else b.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;z.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,z.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&a("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,a("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,b)}},Wa=function(c){b.unmousemove(Va).unmouseup(Wa);for(var d,e=Ua.length;e--;)d=Ua[e],d.el._drag={},a("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c);Ua=[]},Xa=b.el={},Ya=J.length;Ya--;)!function(a){b[a]=Xa[a]=function(c,d){return b.is(c,"function")&&(this.events=this.events||[],this.events.push({name:a,f:c,unbind:Ta(this.shape||this.node||z.doc,a,c,d||this)})),this},b["un"+a]=Xa["un"+a]=function(c){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!b.is(c,"undefined")&&d[e].f!=c||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(J[Ya]);Xa.data=function(c,d){var e=ja[this.id]=ja[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(b.is(c,"object")){for(var f in c)c[y](f)&&this.data(f,c[f]);return this}return a("raphael.data.get."+this.id,this,e[c],c),e[c]}return e[c]=d,a("raphael.data.set."+this.id,this,d,c),this},Xa.removeData=function(a){return null==a?ja[this.id]={}:ja[this.id]&&delete ja[this.id][a],this},Xa.getData=function(){return c(ja[this.id]||{})},Xa.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},Xa.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var Za=[];Xa.drag=function(c,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,m=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;if(this._drag.id=i.identifier,E&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Ua.length&&b.mousemove(Va).mouseup(Wa),Ua.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&a.on("raphael.drag.start."+this.id,d),c&&a.on("raphael.drag.move."+this.id,c),e&&a.on("raphael.drag.end."+this.id,e),a("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},Za.push({el:this,start:i}),this.mousedown(i),this},Xa.onDragOver=function(b){b?a.on("raphael.drag.over."+this.id,b):a.unbind("raphael.drag.over."+this.id)},Xa.undrag=function(){for(var c=Za.length;c--;)Za[c].el==this&&(this.unmousedown(Za[c].start),Za.splice(c,1),a.unbind("raphael.drag.*."+this.id));!Za.length&&b.unmousemove(Va).unmouseup(Wa),Ua=[]},u.circle=function(a,c,d){var e=b._engine.circle(this,a||0,c||0,d||0);return this.__set__&&this.__set__.push(e),e},u.rect=function(a,c,d,e,f){var g=b._engine.rect(this,a||0,c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.ellipse=function(a,c,d,e){var f=b._engine.ellipse(this,a||0,c||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},u.path=function(a){a&&!b.is(a,T)&&!b.is(a[0],U)&&(a+=F);var c=b._engine.path(b.format[C](b,arguments),this);return this.__set__&&this.__set__.push(c),c},u.image=function(a,c,d,e,f){var g=b._engine.image(this,a||"about:blank",c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.text=function(a,c,d){var e=b._engine.text(this,a||0,c||0,H(d));return this.__set__&&this.__set__.push(e),e},u.set=function(a){!b.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var c=new jb(a);return this.__set__&&this.__set__.push(c),c.paper=this,c.type="set",c},u.setStart=function(a){this.__set__=a||this.set()},u.setFinish=function(a){var b=this.__set__;return delete this.__set__,b},u.getSize=function(){var a=this.canvas.parentNode;return{width:a.offsetWidth,height:a.offsetHeight}},u.setSize=function(a,c){return b._engine.setSize.call(this,a,c)},u.setViewBox=function(a,c,d,e,f){return b._engine.setViewBox.call(this,a,c,d,e,f)},u.top=u.bottom=null,u.raphael=b;var $a=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(z.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(z.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};u.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=z.doc.elementFromPoint(a,b);if(z.win.opera&&"svg"==e.tagName){var f=$a(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},u.getElementsByBBox=function(a){var c=this.set();return this.forEach(function(d){b.isBBoxIntersect(d.getBBox(),a)&&c.push(d)}),c},u.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},u.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},u.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},Xa.isPointInside=function(a,c){var d=this.realPath=oa[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=b.transformPath(d,this.attr("transform"))),b.isPointInsidePath(d,a,c)},Xa.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=oa[this.type](this),b.bboxwt=za(this.realPath),b.bboxwt.toString=o,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=oa[this.type](this)),b.bbox=za(pa(this.realPath,this.matrix)),b.bbox.toString=o,b.dirty=b.dirtyT=0),b.bbox)},Xa.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},Xa.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:null==a.opacity?.5:a.opacity,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||oa[this.type](this);f=this.matrix?pa(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var _a=function(a,c,d,e,f,g,h,k,l){return null==l?i(a,c,d,e,f,g,h,k):b.findDotsAtSegment(a,c,d,e,f,g,h,k,j(a,c,d,e,f,g,h,k,l))},ab=function(a,c){return function(d,e,f){d=Ia(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(c&&!m.start){if(k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!c)return k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:c?m:b.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},bb=ab(1),cb=ab(),db=ab(0,1);b.getTotalLength=bb,b.getPointAtLength=cb,b.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return db(a,b).end;var d=db(a,c,1);return b?db(d,b).end:d},Xa.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():bb(a)},Xa.getPointAtLength=function(a){var b=this.getPath();if(b)return cb(b,a)},Xa.getPath=function(){var a,c=b._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return c&&(a=c(this)),a},Xa.getSubpath=function(a,c){var d=this.getPath();if(d)return b.getSubpath(d,a,c)};var eb=b.easing_formulas={linear:function(a){return a},"<":function(a){return Q(a,1.7)},">":function(a){return Q(a,.48)},"<>":function(a){var b=.48-a/1.04,c=M.sqrt(.1734+b*b),d=c-b,e=Q(P(d),1/3)*(0>d?-1:1),f=-c-b,g=Q(P(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:Q(2,-10*a)*M.sin(2*(a-.075)*R/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};eb.easeIn=eb["ease-in"]=eb["<"],eb.easeOut=eb["ease-out"]=eb[">"],eb.easeInOut=eb["ease-in-out"]=eb["<>"],eb["back-in"]=eb.backIn,eb["back-out"]=eb.backOut;var fb=[],gb=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},hb=function(){for(var c=+new Date,d=0;dh))if(i>h){var q=j(h/i);for(var s in k)if(k[y](s)){switch(ca[s]){case S:f=+k[s]+q*i*l[s];break;case"colour":f="rgb("+[ib(Z(k[s].r+q*i*l[s].r)),ib(Z(k[s].g+q*i*l[s].g)),ib(Z(k[s].b+q*i*l[s].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[s].length;u>t;t++){f[t]=[k[s][t][0]];for(var v=1,w=k[s][t].length;w>v;v++)f[t][v]=+k[s][t][v]+q*i*l[s][t][v];f[t]=f[t].join(G)}f=f.join(G);break;case"transform":if(l[s].real)for(f=[],t=0,u=k[s].length;u>t;t++)for(f[t]=[k[s][t][0]],v=1,w=k[s][t].length;w>v;v++)f[t][v]=k[s][t][v]+q*i*l[s][t][v];else{var x=function(a){return+k[s][a]+q*i*l[s][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==s)for(f=[],t=4;t--;)f[t]=+k[s][t]+q*i*l[s][t];break;default:var z=[][D](k[s]);for(f=[],t=n.paper.customAttributes[s].length;t--;)f[t]=+z[t]+q*i*l[s][t]}o[s]=f}n.attr(o),function(b,c,d){setTimeout(function(){a("raphael.anim.frame."+b,c,d)})}(n.id,n,e.anim)}else{if(function(c,d,e){setTimeout(function(){a("raphael.anim.frame."+d.id,d,e),a("raphael.anim.finish."+d.id,d,e),b.is(c,"function")&&c.call(d)})}(e.callback,n,e.anim),n.attr(m),fb.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[y](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),r(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&r(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}fb.length&&gb(hb)},ib=function(a){return a>255?255:0>a?0:a};Xa.animateWith=function(a,c,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof q?d:b.animation(d,e,f,g);r(i,h,i.percents[0],null,h.attr());for(var j=0,k=fb.length;k>j;j++)if(fb[j].anim==c&&fb[j].el==a){fb[k-1].start=fb[j].start;break}return h},Xa.onAnimation=function(b){return b?a.on("raphael.anim.frame."+this.id,b):a.unbind("raphael.anim.frame."+this.id),this},q.prototype.delay=function(a){var b=new q(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},q.prototype.repeat=function(a){var b=new q(this.anim,this.ms);return b.del=this.del,b.times=M.floor(N(a,0))||1,b},b.animation=function(a,c,d,e){if(a instanceof q)return a;(b.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),c=+c||0;var f,g,h={};for(g in a)a[y](g)&&$(g)!=g&&$(g)+"%"!=g&&(f=!0,h[g]=a[g]);if(f)return d&&(h.easing=d),e&&(h.callback=e),new q({100:h},c);if(e){var i=0;for(var j in a){var k=_(j);a[y](j)&&k>i&&(i=k)}i+="%",!a[i].callback&&(a[i].callback=e)}return new q(a,c)},Xa.animate=function(a,c,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof q?a:b.animation(a,c,d,e);return r(g,f,g.percents[0],null,f.attr()),f},Xa.setTime=function(a,b){return a&&null!=b&&this.status(a,O(b,a.ms)/a.ms),this},Xa.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return r(a,this,-1,O(b,1)),this;for(c=fb.length;c>f;f++)if(d=fb[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},Xa.pause=function(b){for(var c=0;cb;b++)!a[b]||a[b].constructor!=Xa.constructor&&a[b].constructor!=jb||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},kb=jb.prototype;kb.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=Xa.constructor&&a.constructor!=jb||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},kb.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},kb.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var lb in Xa)Xa[y](lb)&&(kb[lb]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][C](c,b)})}}(lb));return kb.attr=function(a,c){if(a&&b.is(a,U)&&b.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,c);return this},kb.clear=function(){for(;this.length;)this.pop()},kb.splice=function(a,b,c){a=0>a?N(this.length+a,0):a,b=N(0,O(this.length-a,b));var d,e=[],f=[],g=[];for(d=2;dd;d++)f.push(this[a+d]);for(;dd?g[d]:e[d-h];for(d=this.items.length=this.length-=b-h;this[d];)delete this[d++];return new jb(f)},kb.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},kb.animate=function(a,c,d,e){(b.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=b.is(d,T)?d:g;var k=b.animation(a,c,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},kb.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},kb.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=O[C](0,a),b=O[C](0,b),c=N[C](0,c),d=N[C](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},kb.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},kb.toString=function(){return"Raphaël‘s set"},kb.glow=function(a){var b=this.paper.set();return this.forEach(function(c,d){var e=c.glow(a);null!=e&&e.forEach(function(a,c){b.push(a)})}),b},kb.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},b.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[y](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=_(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[y](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[y](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},u.getFont=function(a,c,d,e){if(e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400,b.fonts){var f=b.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,F)+"(\\s|$)","i");for(var h in b.fonts)if(b.fonts[y](h)&&g.test(h)){f=b.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=c||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},u.print=function(a,c,d,e,f,g,h,i){g=g||"middle",h=N(O(h||0,1),-1),i=N(O(i||1,3),1);var j,k=H(d)[I](F),l=0,m=0,n=F;if(b.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[I](v),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var w=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(w.w||e.w)+(w.k&&w.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=b.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(c-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},u.add=function(a){if(b.is(a,"array"))for(var c,d=this.set(),e=0,f=a.length;f>e;e++)c=a[e]||{},w[y](c.type)&&d.push(this[c.type]().attr(c));return d},b.format=function(a,c){var d=b.is(c,U)?[0][D](c):arguments;return a&&b.is(a,T)&&d.length-1&&(a=a.replace(x,function(a,b){return null==d[++b]?F:d[b]})),a||F},b.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),b.ninja=function(){return A.was?z.win.Raphael=A.is:delete Raphael,b},b.st=kb,a.on("raphael.DOMload",function(){t=!0}),function(a,c,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):b.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(c,d=function(){a.removeEventListener(c,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b}),function(a,b){"function"==typeof define&&define.amd?define("raphael.svg",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)}(this,function(a){if(!a||a.svg){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[b](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){if(e=c(e).replace(a._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient),!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff","stop-opacity":isFinite(w[x].opacity)?w[x].opacity:1}))}}return q(o,{fill:"url('"+document.location.origin+document.location.pathname+"#"+k+"')",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=c(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y+"-obj"+d.id;a._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=a._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-E*u):(g=E*u,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=a.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-g):(g=0,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:a.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[b](k)&&!p[k]){var F=a._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){if(b=u[c(b).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;h--;)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}else q(a.node,{"stroke-dasharray":"none"})},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q("title");var w=a._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=c(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=a.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C}if(!p){var D=i.getAttribute("clip-path");if(D){var E=a._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=c(p).match(a._ISURL);if(F){B=q("pattern");var G=q("image");B.id=a.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(b){a._preload(F[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(G,{width:a,height:c})})}(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break}var H=a.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[b]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=a.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[b]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p); + +break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=c(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(a._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a){return a.parentNode&&"a"===a.parentNode.tagName.toLowerCase()?a.parentNode:a},A=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},B=a.el;A.prototype=B,B.constructor=A,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new A(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},B.rotate=function(a,b,e){if(this.removed)return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,b,e]])),this},B.scale=function(a,b,e,f){if(this.removed)return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this},B.translate=function(a,b){return this.removed?this:(a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]])),this)},B.transform=function(c){var d=this._;if(null==c)return d.transform;if(a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},B.hide=function(){return this.removed||(this.node.style.display="none"),this},B.show=function(){return this.removed||(this.node.style.display=""),this},B.remove=function(){var b=z(this.node);if(!this.removed&&b.parentNode){var c=this.paper;c.__set__&&c.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&c.defs.removeChild(this.gradient),a._tear(this,c),b.parentNode.removeChild(b),this.removeData();for(var d in this)this[d]="function"==typeof this[d]?a._removedFactory(d):null;this.removed=!0}},B._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b,c=!1;this.paper.canvas.parentElement?b=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(b=this.paper.canvas.parentNode.style),b&&"none"==b.display&&(c=!0,b.display="");var d={};try{d=this.node.getBBox()}catch(e){d={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{d=d||{},c&&(b.display="none")}return a&&this.hide(),d},B.attr=function(c,d){if(this.removed)return this;if(null==c){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&a.is(c,"string")){if("fill"==c&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==c)return this._.transform;for(var g=c.split(j),h={},i=0,l=g.length;l>i;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(null==d&&a.is(c,"array")){for(h={},i=0,l=c.length;l>i;i++)h[c[i]]=this.attr(c[i]);return h}if(null!=d){var m={};m[c]=d}else null!=c&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}return w(this,m),this},B.toFront=function(){if(this.removed)return this;var b=z(this.node);b.parentNode.appendChild(b);var c=this.paper;return c.top!=this&&a._tofront(this,c),this},B.toBack=function(){if(this.removed)return this;var b=z(this.node),c=b.parentNode;c.insertBefore(b,c.firstChild),a._toback(this,this.paper);this.paper;return this},B.insertAfter=function(b){if(this.removed||!b)return this;var c=z(this.node),d=z(b.node||b[b.length-1].node);return d.nextSibling?d.parentNode.insertBefore(c,d.nextSibling):d.parentNode.appendChild(c),a._insertafter(this,b,this.paper),this},B.insertBefore=function(b){if(this.removed||!b)return this;var c=z(this.node),d=z(b.node||b[0].node);return d.parentNode.insertBefore(c,d),a._insertbefore(this,b,this.paper),this},B.blur=function(b){var c=this;if(0!==+b){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter");return c},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new A(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:b,y:c,width:d,height:e,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new A(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new A(f,b);return g.attrs={x:c,y:d,"text-anchor":"middle",text:e,"font-family":a._availableAttrs["font-family"],"font-size":a._availableAttrs["font-size"],stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},a._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==c?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i)),c=new a._Paper,c.width=f,c.height=g,c.canvas=i,c.clear(),c._left=c._top=0,h&&(c.renderfix=function(){}),c.renderfix(),c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=this.getSize(),j=g(c/i.width,d/i.height),l=this.top,n=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(j=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=j,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:n});j&&l;)h="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":h}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[a,b,c,d,!!e],this},a.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},a.prototype.clear=function(){a.eve("raphael.clear",this);for(var b=this.canvas;b.firstChild;)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null};var C=a.st;for(var D in B)B[b](D)&&!C[b](D)&&(C[D]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(D))}}),function(a,b){"function"==typeof define&&define.amd?define("raphael.vml",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)}(this,function(a){if(!a||a.vml){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/gi,e=a._pathToAbsolute;if(c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g,e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(b);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(b,c,d){var e=a.matrix();return e.rotate(-b,.5,.5),{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){for(var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[b](t)&&(m[t]=i[t]);if(q&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e._.dirty=1,"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=c(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||a._g.doc.createElement("div"),I=H.style;I.clip=a.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=c(i.fill).match(a._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],a._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=a.getRGB(i.fill).hex,K.src=o,K.type="solid",a.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=c(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=a.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[b](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=c(s.textpath.string).replace(/"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=(b.attrs,Math.pow),i="linear",j=".5 .5";if(b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=a._parseDots(f);if(!l)return null;if(b=b.shape||b.node,l.length){b.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(null==b)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,f+b);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=c(h),i.offset=h.offset();return null!==d&&(this._.transform=d,a._extractTransform(this,d)),this},E.rotate=function(a,b,e){if(this.removed)return this;if(null!=a){if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]])),this}},E.translate=function(a,b){return this.removed?this:(a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]])),this)},E.scale=function(a,b,e,f){if(this.removed)return this;if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E.auxGetBBox=a.el.getBBox,E.getBBox=function(){var a=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var b={},c=1/this.paper._viewBoxShift.scale;return b.x=a.x-this.paper._viewBoxShift.dx,b.x*=c,b.y=a.y-this.paper._viewBoxShift.dy,b.y*=c,b.width=a.width*c,b.height=a.height*c,b.x2=b.x+b.width,b.y2=b.y+b.height,b}return a},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(null==c){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&a.is(c,"string")){if(c==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=c.split(k),h={},i=0,m=g.length;m>i;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&a.is(c,"array")){for(h={},i=0,m=c.length;m>i;i++)h[c[i]]=this.attr(c[i]);return h}var n;null!=d&&(n={},n[c]=d),null==d&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper)),this)},E.insertAfter=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper),this)},E.insertBefore=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper),this)},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;return d=d.replace(r,o),0!==+b?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur),this},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;return i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},a._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},a._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},a._engine.setSize=function(b,c){var d=this.canvas.style;return this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox),this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var g,h,i=this.getSize(),j=i.width,k=i.height;return f&&(g=k/e,h=j/d,j>d*g&&(b-=(j-d*g)/2/g),k>e*h&&(c-=(k-e*h)/2/h)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:i},this.forEach(function(a){a.transform("...")}),this};var F;a._engine.initWin=function(a){var b=a.document;b.styleSheets.length<31?b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):b.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e=b.width,f=b.x,g=b.y;if(!c)throw new Error("VML container not found.");var h=new a._Paper,i=h.canvas=a._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=a._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==c?(a._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i),h.renderfix=function(){},h},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}); \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.babelrc b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.babelrc new file mode 100644 index 0000000..377ca70 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.eslintrc.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.eslintrc.js new file mode 100644 index 0000000..5bebe58 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.eslintrc.js @@ -0,0 +1,31 @@ +module.exports = { + "env": { + "browser": true, + "commonjs": true, + "es6": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "indent": [ + "error", + "tab" + ], + "linebreak-style": [ + "error", + "windows" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ], + "no-console": 0, + "no-undef": 0 + } +}; \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.gitignore b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.gitignore new file mode 100644 index 0000000..f949f35 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.gitignore @@ -0,0 +1,30 @@ +# IDE files +.idea/ +.DS_Store + +# Build directories +build/ + +# Dependency directories +node_modules/ +jspm_packages/ + +# Lock files +yarn.lock +package-lock.json + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Yarn Integrity file +.yarn-integrity diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.travis.yml b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.travis.yml new file mode 100644 index 0000000..0fe294a --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "7" diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/LICENSE.md b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/LICENSE.md new file mode 100644 index 0000000..5506c2d --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/LICENSE.md @@ -0,0 +1,7 @@ +# Notifications license + +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. \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/helpers.test.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/helpers.test.js new file mode 100644 index 0000000..b97ad75 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/helpers.test.js @@ -0,0 +1,104 @@ +const { partial, append, isString, createElement, createParagraph } = require('../src/helpers'); + +const addNumbers = (x, y) => x + y; + +const sum = (...numbers) => numbers.reduce((total, current) => total + current, 0); + +describe('Helpers', () => { + beforeEach(() => { + document.body.innerHTML = ''; + }); + + describe('Partial', () => { + it('should return a partially applied function', () => { + expect(typeof partial(addNumbers, 10)).toEqual('function'); + }); + + it('should execute function when partially applied function is called', () => { + expect(partial(addNumbers, 20)(10)).toEqual(30); + }); + + it('should gather argument', () => { + expect(partial(sum, 5, 10)(15, 20, 25)).toEqual(75); + }); + }); + + describe('Append', () => { + const container = document.createElement('div'); + document.body.appendChild(container); + + const elementToAppend = document.createElement('h1'); + elementToAppend.classList.add('heading'); + elementToAppend.innerText = 'working'; + + append(container, elementToAppend); + + const element = document.querySelector('.heading'); + expect(element); + + expect(element.innerText).toEqual('working'); + }); + + describe('Is string', () => { + expect(isString(1)).toEqual(false); + expect(isString(null)).toEqual(false); + expect(isString(undefined)).toEqual(false); + expect(isString({})).toEqual(false); + + expect(isString('')).toEqual(true); + expect(isString('a')).toEqual(true); + expect(isString('1')).toEqual(true); + expect(isString('some string')).toEqual(true); + }); + + describe('Create element', () => { + it('should create an element', () => { + expect(createElement('p')).toEqual(document.createElement('p')); + expect(createElement('h1')).toEqual(document.createElement('h1')); + expect(createElement('ul')).toEqual(document.createElement('ul')); + expect(createElement('li')).toEqual(document.createElement('li')); + expect(createElement('div')).toEqual(document.createElement('div')); + expect(createElement('span')).toEqual(document.createElement('span')); + }); + + it('should add class names', () => { + expect(createElement('div', 'someclass1', 'someclass2').classList.contains('someclass2')); + expect(createElement('p', 'para', 'test').classList.contains('para')); + + const mockUl = document.createElement('ul'); + mockUl.classList.add('nav'); + mockUl.classList.add('foo'); + + expect(createElement('ul', 'nav', 'foo').classList).toEqual(mockUl.classList); + }); + }); + + describe('Create paragraph', () => { + it('should create a paragraph', () => { + const p = document.createElement('p'); + p.innerText = 'Some text'; + expect(createParagraph()('Some text')).toEqual(p); + }); + + it('should add class names', () => { + const p = document.createElement('p'); + p.classList.add('body-text'); + p.classList.add('para'); + + expect(createParagraph('body-text', 'para')('')).toEqual(p); + }); + + it('should set inner text', () => { + const p = document.createElement('p'); + p.innerText = 'Hello world!'; + p.classList.add('text'); + + expect(createParagraph('text')('Hello world!')).toEqual(p); + }); + + it('should append to DOM', () => { + append(document.body, createParagraph('text')('hello')); + expect(document.querySelector('.text').innerText).toEqual('hello'); + }); + }); +}); diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/index.tests.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/index.tests.js new file mode 100644 index 0000000..9a69d16 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/__tests__/index.tests.js @@ -0,0 +1,144 @@ +require('../src/index'); + +describe('Notifications', () => { + beforeEach(() => { + document.body.innerHTML = ''; + }); + + it('should display a console warning if no title or message is passed', () => { + jest.spyOn(global.console, 'warn'); + window.createNotification()(); + expect(console.warn).toBeCalled(); + }); + + it('should render a default notification', () => { + const notification = window.createNotification(); + + const title = 'I am a title'; + + // Should initially not contain any notifications + expect(document.querySelectorAll('.ncf').length).toEqual(0); + + // Create a notification instance with a title + notification({ title }); + + // Should be one notification with the title passed in + expect(document.querySelectorAll('.ncf').length).toEqual(1); + expect(document.querySelector('.ncf-title').innerText).toEqual(title); + + // Create a second instance so there should now be two instances + notification({ title }); + expect(document.querySelectorAll('.ncf').length).toEqual(2); + }); + + it('should close on click if the option is enabled', () => { + const notification = window.createNotification({ + closeOnClick: true + }); + + // Create a notification with a generic body + notification({ message: 'some text' }); + + // Should be one notification instance + expect(document.querySelectorAll('.ncf').length).toEqual(1); + + // Click the notification + document.querySelector('.ncf').click(); + + expect(document.querySelectorAll('.ncf').length).toEqual(0); + }); + + it('should not close on click if the option is disabled', () => { + const notification = window.createNotification({ + closeOnClick: false + }); + + // Create a notification with a generic body + notification({ message: 'some text' }); + + // Should be one notification instance + expect(document.querySelectorAll('.ncf').length).toEqual(1); + + // Click the notification + document.querySelector('.ncf').click(); + + expect(document.querySelectorAll('.ncf').length).toEqual(1); + }); + + it('should set position class if valid', () => { + const validPositions = [ + 'nfc-top-left', + 'nfc-top-right', + 'nfc-bottom-left', + 'nfc-bottom-right' + ]; + + validPositions.forEach(position => { + const notification = window.createNotification({ + positionClass: position + }); + + notification({ title: 'title here' }); + + const className = `.${position}`; + + expect(document.querySelectorAll(className).length).toEqual(1); + + const container = document.querySelector(className); + expect(container.querySelectorAll('.ncf').length).toEqual(1); + }); + }); + + it('should revert to default to default position and warn if class is invalid', () => { + const notification = window.createNotification({ + positionClass: 'invalid-name' + }); + + jest.spyOn(global.console, 'warn'); + + notification({ message: 'test' }); + + expect(console.warn).toBeCalled(); + + expect(document.querySelectorAll('.nfc-top-right').length).toEqual(1); + }); + + it('should allow a custom onclick callback', () => { + let a = 'not clicked'; + + const notification = window.createNotification({ + onclick: () => { + a = 'clicked'; + } + }); + + notification({ message: 'click test' }); + + expect(a).toEqual('not clicked'); + + // Click the notification + document.querySelector('.ncf').click(); + + expect(a).toEqual('clicked'); + }); + + it('should show for correct duration', () => { + const notification = window.createNotification({ + showDuration: 500 + }); + + notification({ message: 'test' }); + + expect(document.querySelectorAll('.ncf').length).toEqual(1); + + // Should exist after 400ms + setTimeout(() => { + expect(document.querySelectorAll('.ncf').length).toEqual(1); + }, 400); + + // Should delete after 500ms + setTimeout(() => { + expect(document.querySelectorAll('.ncf').length).toEqual(0); + }); + }, 501); +}); diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/demo.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/demo.js new file mode 100644 index 0000000..d2f0fad --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/demo.js @@ -0,0 +1,34 @@ +'use strict'; + +// Written using ES5 JS for browser support +window.addEventListener('DOMContentLoaded', function () { + var form = document.querySelector('form'); + + form.addEventListener('submit', function (e) { + e.preventDefault(); + + // Form elements + var title = form.querySelector('#title').value; + var message = form.querySelector('#message').value; + var position = form.querySelector('#position').value; + var duration = form.querySelector('#duration').value; + var theme = form.querySelector('#theme').value; + var closeOnClick = form.querySelector('#close').checked; + var displayClose = form.querySelector('#closeButton').checked; + + if(!message) { + message = 'You did not enter a message...'; + } + + window.createNotification({ + closeOnClick: closeOnClick, + displayCloseButton: displayClose, + positionClass: position, + showDuration: duration, + theme: theme + })({ + title: title, + message: message + }); + }); +}); \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index.html b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index.html new file mode 100644 index 0000000..d5dd6a6 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index.html @@ -0,0 +1,101 @@ + + + + +Notifications + + + + + + + + + +

Notifications

+
+ +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + +
+ + + + + +
+ + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index_my.html b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index_my.html new file mode 100644 index 0000000..412e25d --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/demo/index_my.html @@ -0,0 +1,37 @@ + + + + +Notifications + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.css b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.css new file mode 100644 index 0000000..90d9e61 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.css @@ -0,0 +1 @@ +.ncf-container{font-size:14px;box-sizing:border-box;position:fixed;z-index:999999}.ncf-container.nfc-top-left{top:12px;left:12px}.ncf-container.nfc-top-right{top:12px;right:12px}.ncf-container.nfc-bottom-right{bottom:12px;right:12px}.ncf-container.nfc-bottom-left{bottom:12px;left:12px}@media (max-width:767px){.ncf-container{left:0;right:0}}.ncf-container .ncf{background:#fff;transition:.3s ease;position:relative;pointer-events:auto;overflow:hidden;margin:0 0 6px;padding:30px;width:300px;border-radius:3px 3px 3px 3px;box-shadow:0 0 12px #999;color:#000;opacity:.9;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=90);filter:alpha(opacity=90);background-position:15px!important;background-repeat:no-repeat!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ncf-container .ncf:hover{box-shadow:0 0 12px #000;opacity:1;cursor:pointer}.ncf-container .ncf .ncf-title{font-weight:700;font-size:16px;text-align:left;margin-top:0;margin-bottom:6px;word-wrap:break-word}.ncf-container .ncf .nfc-message{margin:0;text-align:left;word-wrap:break-word}.ncf-container .success{background:#51a351;color:#fff;padding:15px 15px 15px 50px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==")}.ncf-container .info{background:#2f96b4;color:#fff;padding:15px 15px 15px 50px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=")}.ncf-container .warning{background:#f87400;color:#fff;padding:15px 15px 15px 50px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=")}.ncf-container .error{background:#bd362f;color:#fff;padding:15px 15px 15px 50px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=")!important}.ncf-container button{position:relative;right:-.3em;top:-.3em;float:right;font-weight:700;color:#fff;text-shadow:0 1px 0 #fff;opacity:.8;line-height:1;font-size:16px;padding:0;cursor:pointer;background:transparent;border:0}.ncf-container button:hover{opacity:1} \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.css.gz b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..b1e1ecb19e475a9932e331065120ac6a1bdbbc3c GIT binary patch literal 2487 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 B-pc?0 literal 0 HcmV?d00001 diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.js new file mode 100644 index 0000000..34b339e --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/dist/notifications.js @@ -0,0 +1 @@ +!function(t){function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:i})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=0)}([function(t,n,e){e(1),t.exports=e(4)},function(t,n,e){"use strict";var i=Object.assign||function(t){for(var n=1;n-1}(t.positionClass)||(console.warn("An invalid notification position class has been specified."),t.positionClass=c.positionClass),t.onclick&&"function"!=typeof t.onclick&&(console.warn("Notification on click must be a function."),t.onclick=c.onclick),"number"!=typeof t.showDuration&&(t.showDuration=c.showDuration),(0,o.isString)(t.theme)&&0!==t.theme.length||(console.warn("Notification theme must be a string with length"),t.theme=c.theme),t}function e(t){return t=n(t),function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=n.title,i=n.message,c=r(t.positionClass);if(!e&&!i)return console.warn("Notification must contain a title or a message!");var a=(0,o.createElement)("div","ncf",t.theme);if(!0===t.closeOnClick&&a.addEventListener("click",function(){return c.removeChild(a)}),t.onclick&&a.addEventListener("click",function(n){return t.onclick(n)}),t.displayCloseButton){var s=(0,o.createElement)("button");s.innerText="X",!1===t.closeOnClick&&s.addEventListener("click",function(){return c.removeChild(a)}),(0,o.append)(a,s)}if((0,o.isString)(e)&&e.length&&(0,o.append)(a,(0,o.createParagraph)("ncf-title")(e)),(0,o.isString)(i)&&i.length&&(0,o.append)(a,(0,o.createParagraph)("nfc-message")(i)),(0,o.append)(c,a),t.showDuration&&t.showDuration>0){var l=setTimeout(function(){c.removeChild(a),0===c.querySelectorAll(".ncf").length&&document.body.removeChild(c)},t.showDuration);(t.closeOnClick||t.displayCloseButton)&&a.addEventListener("click",function(){return clearTimeout(l)})}}}function r(t){var n=document.querySelector("."+t);return n||(n=(0,o.createElement)("div","ncf-container",t),(0,o.append)(document.body,n)),n}var c={closeOnClick:!0,displayCloseButton:!1,positionClass:"nfc-top-right",onclick:!1,showDuration:3500,theme:"success"};t.createNotification?console.warn("Window already contains a create notification function. Have you included the script twice?"):t.createNotification=e}(window)},function(t,n,e){"use strict";!function(){function t(t){this.el=t;for(var n=t.className.replace(/^\s+|\s+$/g,"").split(/\s+/),i=0;i1?n-1:0),i=1;i1?n-1:0),i=1;i1?n-1:0),i=1;i1?n-1:0),c=1;cLmfM||m-$;8>RU#q-s5XUMp@m@G?VkH3orlN<+fg?Z@TR&u{)6)+hLAf}EjW+Nsw+G1G zdDwPT)@<~)%;kp+0!UNtp_wiD7Tj7_tU~=p3|&!!aEpbD-@k|Au}#YiZgo4@u`w_l zD$C4O>zR+89}qqTP9#CN9Q<*1XpZSb8cPnjb=I99Al}L1=~vU*6nyCg0_1}rgd1w& zLM&NDUk^3nK}Vn~#$D@J0rVP*O*fIUfT(b}R*r~^8R-YCN(ppT;g!i}IM1!vrR8NLb@F(nw_GRG^MI@tE zS4;+H2-S`lCzxU%ARnGp?CjTjWgc|mf#U_CMpMSAF9*7Kj-)hOhP&Mk_JCwqo(a*+ z8pfSYzd|2&4xkr7WAs(KT~y1X4UIyf>i@VI*iWCUSir(FhI<7f{>A-BMl$bX3 zewi>h+K56YYMP+wkSd*eu3b{h6#5FbyE77fSk$S03YQIJ@ z!;R^ATcHZ9OSS0e66~*;=%M@q(YY-njflz=QeW4jLgo74BKK7*xJB4{4uF7)ehsJo zuJP#`h(Z70d_dh!7cpeQC4KMX;&3xRk$XTMqGuJ*%kSP47f<+m;qsOfq%C?}J9-&c zE;FvhGSN3o+b3!4lb~tlP(L@Jzwt$u)>nrRq6Qu}q&S^OIMb7qXcKk8ZwD=TS_bQ0wMksRQ5-QJx@NZXKpQPwK-vzmBP|;r^2d&Y9n#F4pWR4j`?&i zqG$+o@9Ey#Fn)zs3K}~Zt{C@)>Mz!~)+R?eztbtMA&4z{db=Q@MABj%tzMP2e!GHqeJMll7 z` + +2. Link to notifications.js `` + +## Usage +### Custom options +- closeOnClick - Close the notification dialog when a click is invoked. +- displayCloseButton - Display a close button in the top right hand corner of the notification. +- positionClass - Set the position of the notification dialog. Accepted positions: ('nfc-top-right', 'nfc-bottom-right', 'nfc-bottom-left', 'nfc-top-left'). +- onClick - Call a callback function when a click is invoked on a notification. +- showDuration - Milliseconds the notification should be visible (0 for a notification that will remain open until clicked) +- theme - Set the position of the notification dialog. Accepted positions: ('success', 'info', 'warning', 'error', 'A custom clasName'). +``` +const defaultOptions = { + closeOnClick: true, + displayCloseButton: false, + positionClass: 'nfc-top-right', + onclick: false, + showDuration: 3500, + theme: 'success' +}; +``` + +## Example + +### Success notification +``` +// Create a success notification instance +const successNotification = window.createNotification({ + theme: 'success', + showDuration: 5000 +}); + +// Invoke success notification +successNotification({ + message: 'Simple success notification' +}); + +// Use the same instance but pass a title +successNotification({ + title: 'Working', + message: 'Simple success notification' +}); +``` + +### Information notification +``` +// Only running it once? Invoke immediately like this +window.createNotification({ + theme: 'success', + showDuration: 5000 +})({ + message: 'I have some information for you...' +}); +``` + +### Todo +~~1. Add to NPM~~ +2. Improve documentation +3. Further device testing +4. Add contributor instructions \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/helpers.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/helpers.js new file mode 100644 index 0000000..5a7de2b --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/helpers.js @@ -0,0 +1,24 @@ +export const partial = (fn, ...presetArgs) => (...laterArgs) => fn(...presetArgs, ...laterArgs); + +export const append = (el, ...children) => children.forEach(child => el.appendChild(child)); + +export const isString = input => typeof input === 'string'; + +export const createElement = (elementType, ...classNames) => { + const element = document.createElement(elementType); + + if(classNames.length) { + classNames.forEach(currentClass => element.classList.add(currentClass)); + } + + return element; +}; + +const setInnerText = (element, text) => { + element.innerText = text; + return element; +}; + +const createTextElement = (elementType, ...classNames) => partial(setInnerText, createElement(elementType, ...classNames)); + +export const createParagraph = (...classNames) => createTextElement('p', ...classNames); \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/index.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/index.js new file mode 100644 index 0000000..51512ba --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/index.js @@ -0,0 +1,148 @@ +'use strict'; + +// Polyfills +import './polyfills/classList'; + +import { + append, + createElement, + createParagraph, + isString +} from './helpers'; + +(function Notifications(window) { + // Default notification options + const defaultOptions = { + closeOnClick: true, + displayCloseButton: false, + positionClass: 'nfc-top-right', + onclick: false, + showDuration: 3500, + theme: 'success' + }; + + function configureOptions(options) { + // Create a copy of options and merge with defaults + options = Object.assign({}, defaultOptions, options); + + // Validate position class + function validatePositionClass(className) { + const validPositions = [ + 'nfc-top-left', + 'nfc-top-right', + 'nfc-bottom-left', + 'nfc-bottom-right' + ]; + + return validPositions.indexOf(className) > -1; + } + + // Verify position, if invalid reset to default + if (!validatePositionClass(options.positionClass)) { + console.warn('An invalid notification position class has been specified.'); + options.positionClass = defaultOptions.positionClass; + } + + // Verify onClick is a function + if (options.onclick && typeof options.onclick !== 'function') { + console.warn('Notification on click must be a function.'); + options.onclick = defaultOptions.onclick; + } + + // Verify show duration + if(typeof options.showDuration !== 'number') { + options.showDuration = defaultOptions.showDuration; + } + + // Verify theme + if(!isString(options.theme) || options.theme.length === 0) { + console.warn('Notification theme must be a string with length'); + options.theme = defaultOptions.theme; + } + + return options; + } + + // Create a new notification instance + function createNotification(options) { + // Validate options and set defaults + options = configureOptions(options); + + // Return a notification function + return function notification({ title, message } = {}) { + const container = createNotificationContainer(options.positionClass); + + if(!title && !message) { + return console.warn('Notification must contain a title or a message!'); + } + + // Create the notification wrapper + const notificationEl = createElement('div', 'ncf', options.theme); + + // Close on click + if(options.closeOnClick === true) { + notificationEl.addEventListener('click', () => container.removeChild(notificationEl)); + } + + // Custom click callback + if(options.onclick) { + notificationEl.addEventListener('click', (e) => options.onclick(e)); + } + + // Display close button + if(options.displayCloseButton) { + const closeButton = createElement('button'); + closeButton.innerText = 'X'; + + // Use the wrappers close on click to avoid useless event listeners + if(options.closeOnClick === false){ + closeButton.addEventListener('click', () =>container.removeChild(notificationEl)); + } + + append(notificationEl, closeButton); + } + + // Append title and message + isString(title) && title.length && append(notificationEl, createParagraph('ncf-title')(title)); + isString(message) && message.length && append(notificationEl, createParagraph('nfc-message')(message)); + + // Append to container + append(container, notificationEl); + + // Remove element after duration + if(options.showDuration && options.showDuration > 0) { + const timeout = setTimeout(() => { + container.removeChild(notificationEl); + + // Remove container if empty + if(container.querySelectorAll('.ncf').length === 0) { + document.body.removeChild(container); + } + }, options.showDuration); + + // If close on click is enabled and the user clicks, cancel timeout + if(options.closeOnClick || options.displayCloseButton) { + notificationEl.addEventListener('click', () => clearTimeout(timeout)); + } + } + }; + } + + function createNotificationContainer(position) { + let container = document.querySelector(`.${position}`); + + if(!container) { + container = createElement('div', 'ncf-container', position); + append(document.body, container); + } + + return container; + } + + // Add Notifications to window to make globally accessible + if (window.createNotification) { + console.warn('Window already contains a create notification function. Have you included the script twice?'); + } else { + window.createNotification = createNotification; + } +})(window); diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/polyfills/classList.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/polyfills/classList.js new file mode 100644 index 0000000..e040d70 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/polyfills/classList.js @@ -0,0 +1,68 @@ +(function () { + if (typeof window.Element === 'undefined' || 'classList' in document.documentElement) return; + + var prototype = Array.prototype, + push = prototype.push, + splice = prototype.splice, + join = prototype.join; + + function DOMTokenList(el) { + this.el = el; + // The className needs to be trimmed and split on whitespace + // to retrieve a list of classes. + var classes = el.className.replace(/^\s+|\s+$/g,'').split(/\s+/); + for (var i = 0; i < classes.length; i++) { + push.call(this, classes[i]); + } + } + + DOMTokenList.prototype = { + add: function(token) { + if(this.contains(token)) return; + push.call(this, token); + this.el.className = this.toString(); + }, + contains: function(token) { + return this.el.className.indexOf(token) != -1; + }, + item: function(index) { + return this[index] || null; + }, + remove: function(token) { + if (!this.contains(token)) return; + for (var i = 0; i < this.length; i++) { + if (this[i] == token) break; + } + splice.call(this, i, 1); + this.el.className = this.toString(); + }, + toString: function() { + return join.call(this, ' '); + }, + toggle: function(token) { + if (!this.contains(token)) { + this.add(token); + } else { + this.remove(token); + } + + return this.contains(token); + } + }; + + window.DOMTokenList = DOMTokenList; + + function defineElementGetter (obj, prop, getter) { + if (Object.defineProperty) { + Object.defineProperty(obj, prop,{ + get : getter + }); + } else { + obj.__defineGetter__(prop, getter); + } + } + + defineElementGetter(Element.prototype, 'classList', function () { + return new DOMTokenList(this); + }); +})(); \ No newline at end of file diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/style.scss b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/style.scss new file mode 100644 index 0000000..733bfd5 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/src/style.scss @@ -0,0 +1,134 @@ +// Base colors +$success: #51A351; +$info: #2F96B4; +$warning: #f87400; +$error: #BD362F; +$grey: #999999; + +.ncf-container { + font-size: 14px; + box-sizing: border-box; + position: fixed; + z-index: 999999; + + &.nfc-top-left { + top: 12px; + left: 12px; + } + + &.nfc-top-right { + top: 12px; + right: 12px; + } + + &.nfc-bottom-right { + bottom: 12px; + right: 12px; + } + + &.nfc-bottom-left { + bottom: 12px; + left: 12px; + } + + @media (max-width: 767px) { + left: 0; + right: 0; + } + + .ncf { + background: #ffffff; + transition: .3s ease; + position: relative; + pointer-events: auto; + overflow: hidden; + margin: 0 0 6px; + padding: 30px; + width: 300px; + border-radius: 3px 3px 3px 3px; + box-shadow: 0 0 12px $grey; + color: #000000; + opacity: 0.9; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90); + filter: alpha(opacity=90); + background-position: 15px center !important; + background-repeat: no-repeat !important; + + // Prevent annoying text selection + -webkit-user-select: none; /* Chrome all / Safari all */ + -moz-user-select: none; /* Firefox all */ + -ms-user-select: none; /* IE 10+ */ + user-select: none; /* Likely future */ + + &:hover { + box-shadow: 0 0 12px #000000; + opacity: 1; + cursor: pointer; + } + + .ncf-title { + font-weight: bold; + font-size: 16px; + text-align: left; + margin-top: 0; + margin-bottom: 6px; + word-wrap: break-word; + } + + .nfc-message { + margin: 0; + text-align: left; + word-wrap: break-word; + } + } + + // Themes + .success { + background: $success; + color: #ffffff; + padding: 15px 15px 15px 50px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg=="); + } + + .info { + background: $info; + color: #ffffff; + padding: 15px 15px 15px 50px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII="); + } + + .warning { + background: $warning; + color: #ffffff; + padding: 15px 15px 15px 50px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII="); + } + + .error { + background: $error; + color: #ffffff; + padding: 15px 15px 15px 50px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important; + } + + button { + position: relative; + right: -0.3em; + top: -0.3em; + float: right; + font-weight: bold; + color: #FFFFFF; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.8; + line-height: 1; + font-size: 16px; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + + &:hover { + opacity: 1; + } + } +} diff --git a/examples/SmartSwitch/data_src/js_css_src/styled-notifications/webpack.config.js b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/webpack.config.js new file mode 100644 index 0000000..36a4ca3 --- /dev/null +++ b/examples/SmartSwitch/data_src/js_css_src/styled-notifications/webpack.config.js @@ -0,0 +1,41 @@ +const webpack = require('webpack'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); + +const extractSass = new ExtractTextPlugin({ + filename: 'notifications.css', + disable: process.env.NODE_ENV === 'development' +}); + +module.exports = { + entry: ['./src/index.js', './src/style.scss'], + output: { + path: __dirname + '/dist', + filename: 'notifications.js' + }, + module: { + rules: [ + { + test: /\.js$/, + loader: 'babel-loader', + query: { + presets: ['babel-preset-es2015', 'es2015-ie'] + } + }, + { + test: /\.scss$/, + use: extractSass.extract({ + use: [{ + loader: 'css-loader' + }, { + loader: 'sass-loader' + }], + // use style-loader in development + fallback: 'style-loader' + }) + } + ], + }, + plugins: [ + extractSass + ] +}; \ No newline at end of file diff --git a/extras/README.md b/extras/README.md new file mode 100644 index 0000000..ac24572 --- /dev/null +++ b/extras/README.md @@ -0,0 +1,25 @@ +### Extras +Additions to facilitate code modifications (for MS Win, similar can be done on Linux) + +- **ehg.c (ehg.exe):** Tool to generate C-code array from file' bytes +Based on [bin2array](https://github.com/TheLivingOne/bin2array/) PROGMEM keyword can optionally be added. + +- **rehg.c (rehg.exe):** Tool to reverse C-code array generated by **ehg.exe** back to a file +Based on [c2bin](https://github.com/birkett/cbintools/tree/master/c2bin) +First 4 lines of source are ignored, then parses the 0xHH - formated bytes +until a } is found on separate new line. + +### Tools +- [TCC : Tiny C Compiler](https://bellard.org/tcc/) for **ehg** and **rehg** compiling on MS Win +- [7-Zip](https://www.7-zip.org) Install 7z and use the included gzip as command line tool +- [Node.js](https://nodejs.org) Install Node with default settings, then run: + + ``` npm install html-minifier-terser -g, npm install -g github-files-fetcher ``` + +### Batch files provided +- **do_emb.bat:** Generates **edit.htm.gz.h** file for embedding to **SPIFFSEditor.cpp** as binary C array - +You need to comment **#define EDFS** at **SPIFFSEditor.cpp** for this choice +- **do_ed_fs.bat:** Alternatively, makes a gzip-ed **edit.htm** file for fs - +uncomment **#define EDFS** for this choice. Saves about 4k of program flash storage. +- **undo.bat:** Reverts **edit.htm** from C array header to file (still minified!) +- **update_ace.bat:** Updates **acefull.js.gz** file from latest GitHub Ace sources diff --git a/extras/do_ed_fs.bat b/extras/do_ed_fs.bat new file mode 100644 index 0000000..c88b646 --- /dev/null +++ b/extras/do_ed_fs.bat @@ -0,0 +1,9 @@ +copy ..\src\edit.htm edit_src.htm +call html-minifier-terser --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --minify-css true --minify-js true -o edit.htm edit_src.htm +"C:\Program Files\7-Zip\7z.exe" a -tgzip -mx9 edit.htm.gz edit.htm +copy edit.htm.gz ..\examples\SmartSwitch\data\edit_gz +copy edit.htm.gz ..\examples\ESP_AsyncFSBrowser\data\edit_gz +ehg edit.htm.gz PROGMEM +copy edit.htm.gz.h ..\src\edit.htm.gz.h +pause +del edit.htm edit.htm.gz edit.htm.gz.h edit_src.htm \ No newline at end of file diff --git a/extras/do_emb.bat b/extras/do_emb.bat new file mode 100644 index 0000000..cb116dc --- /dev/null +++ b/extras/do_emb.bat @@ -0,0 +1,9 @@ +copy ..\src\edit.htm edit_src.htm +call html-minifier-terser --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --minify-css true --minify-js true -o edit.htm edit_src.htm +"C:\Program Files\7-Zip\7z.exe" a -tgzip -mx9 edit.htm.gz edit.htm +del ..\examples\SmartSwitch\data\edit.htm +del ..\examples\ESP_AsyncFSBrowser\data\edit.htm +ehg edit.htm.gz PROGMEM +copy edit.htm.gz.h ..\src\edit.htm.gz.h +pause +del edit.htm edit.htm.gz edit.htm.gz.h edit_src.htm \ No newline at end of file diff --git a/extras/ehg.c b/extras/ehg.c new file mode 100644 index 0000000..0816c44 --- /dev/null +++ b/extras/ehg.c @@ -0,0 +1,124 @@ +/* + * Simple, but very fast converter of file to C++ array; written in old school C. + * ehg.c (ehg.exe) + * Based on https://github.com/TheLivingOne/bin2array/ + * by (C) Sergey A. Galin, 2019, sergey.galin@gmail.com, sergey.galin@yandex.ru + * and compiled with TynyCC https://bellard.org/tcc/ + * This file is a Public Domain. + */ + +#include +#include +#include + +char* replace_char(char* str, char find, char replace){ + char *current_pos = strchr(str,find); + for (char* p = current_pos; (current_pos = strchr(str, find)) != NULL; *current_pos = replace); + return str; +} + +int main(int argc, char * argv[]) +{ + if ((argc > 3)||(argc < 2)) { + printf("USAGE: %s [PROGMEM]\n", argv[0]); + return 1; + } + + const char * in = argv[1]; + const char * pr = argv[2]; + char pr_o[8] = " "; + + if (argv[2]) sprintf(pr_o, "%s", pr); + + // Hello stack overflow :) + char out_cpp[4096]; + char usname[4096]; + sprintf(usname, "%s", in); + sprintf(out_cpp, "%s.h", in); + + replace_char(usname,'.', '_'); + + printf("Input: %s, output: %s\n", in, out_cpp); + + // + // Working with the input file + // + FILE * fin = fopen(in, "rb"); + if (!fin) { + printf("Error opening input file!\n"); + return 2; + } + fseek(fin, 0, SEEK_END); + size_t size = (size_t)ftell(fin); + fseek(fin, 0, SEEK_SET); + printf("Input data size: %ld\n", (long)size); + + unsigned char * data = malloc(size); + if (fread(data, size, 1, fin) != 1) { + printf("Failed to read input file!\n"); + free(data); + fclose(fin); + return 2; + } + fclose(fin); + + unsigned char arr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + unsigned char * text = malloc(size * 6); + unsigned char * out_ptr = text; + unsigned char * in_ptr = data; + for (size_t i = 1, col = 1; i <= size; i++, in_ptr++) { + unsigned char x = *in_ptr; + unsigned char y = (x & 0xF0) >> 4; + unsigned char z = (x & 0x0F); + + *out_ptr++ = '0'; + *out_ptr++ = 'x'; + + *out_ptr++ = arr[y]; + *out_ptr++ = arr[z]; + + if (i != size) { + *out_ptr++ = ','; + } + if (col == 20) { + *out_ptr++ = '\n'; + col = 1; + } else + col++; + } + free(data); + // *out_ptr = 0; not necessary as we're using fwrite() + + // + // Writing output file + // + + FILE * fout = fopen(out_cpp, "wb"); + if (!fout) { + printf("Error opening output file!\n"); + free(text); + return 2; + } + fprintf( + fout, + "\n//File: %s, Size: %ld\n" + "#define %s_len %ld\n" + "const uint8_t %s[] %s = {\n", + in, + (long)size, + usname, + (long)size, + usname, + pr_o); + if (fwrite(text, out_ptr - text, 1, fout) != 1) { + printf("Error writing output file!"); + free(text); + fclose(fout); + return 2; + } + fprintf(fout, "\n};\n"); + fclose(fout); + free(text); + return 0; +} + diff --git a/extras/ehg.exe b/extras/ehg.exe new file mode 100644 index 0000000000000000000000000000000000000000..945f7a3942713850e106da8766db790b5d8a8f40 GIT binary patch literal 4096 zcmeHKYitx%6u#RoIxY)a1s^|*Orcdspnw8`f)-_{%THFXZi}YXl#$$E zgyU*UIFU%2YO}5y8xv|Yp)OgmN{uHYdfm8jz8V>tYm6=TRE$W}%L0{SJ-0FD12Gl` zt>zx+s(@4=tPU}_Np+dCSwdbNXEZM|L|b$qUS=p{YBgh13H`lY1H@f_i;#7u-fn`v zU4ahk!nuxI2At~px=7dzgUXAW1Ol3;i{_RXOGI*O#wBjN{!-gUXnD6gClt znL=gY)jP=!a7AF(7<7Dq1b$m-beLMtxXVR!$Aj7o*w~ss)9JMpD+rYUR1g*%74$i6 zfR1WTyXrs^#%aX!+Hc&gqB#DNOXdcYipR&+3f!5Dsq)$Ycdvq9rU%Rhxl>Eh?7)R$ zk-KMxDW*!ruc$a86i$c|)?uHQKKp+!79ki6(UM}$ph<0!K1*`Av?*L#*regE@T&X>C%iJ_R* zTX3vPrM)2)vmjC~`wdQDHoqJ3+#LnZbF|5fo-z1y6T0CO)+SQ!7hIx z1c3ueE`J0Bfdg4&+j|GVx2xdIWe*QYGrfUa_A?mUR24`H4$8s*33{AFfBHFfovQkmipS4wZ_JWzHiP5iR=yWQCBd zNOlzNWa$vjfrAFS;_Su~DsQQKy@JlYm36?+rhe!qJ_He+y>y^IB|EQ8TgqKm48;jP z2WI%3$cI4QkdY&L4nD?EA_;dtp%AKAY&(yKWZE%1k99O2#P_ceOi{|+*T{6(B`aVc zcM6HiHLWfUF$8ymVkk<)gYQhJ9+rL{so}y4>q#YNkx`M(;Kq)3Ge*A=H8AMNYc6-2 zp*~znR9o65@iMsA%F;@Dj6G1}FCz1rV8QSu@31SR4hnK34?x1fm(;EYW(x6 z21|JcG0%LF2bX~DoL+g22 z7vV@Tn{~Ta0CD#+^;aMiytLi6?z(45auFoZ02iC@t!JBo`c8wO$&S@1`6V@eOJlP; zEzKKw8|^Gjadv}^rTLv4@ha3#%xg;IT{KvS)k3`5hU$9a%O&TMua7gc)FV0XiDs3Ml;h4BWb9~l%9wtHo&)jDN?mh zIH~v);-X_}J1g+_2$iIIdyAejLv7(iB&HkqA^9I~ Fe*mMgq@e%+ literal 0 HcmV?d00001 diff --git a/extras/rehg.c b/extras/rehg.c new file mode 100644 index 0000000..a888610 --- /dev/null +++ b/extras/rehg.c @@ -0,0 +1,101 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2014-2015 Anthony Birkett + * + * 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. + */ + +/* + * rehg.c (rehg.exe): Tool to reverse C-code array to file converted by ehg.exe + * Based on https://github.com/birkett/cbintools/tree/master/c2bin + * and compiled with TynyCC https://bellard.org/tcc/ + */ + +#include +#include +#include + +#define BUFFER_SIZE 500 + +int main(int argc, char *argv[]) +{ + FILE *inputFile = NULL; + FILE *outputFile = NULL; + char sBuffer[BUFFER_SIZE]; + char *pch; + char *newline, *endBracket; + int i; + + if (argc != 3) + { + printf("%s %s %s\n", "Usage:", argv[0], "
"); + return 1; + } + + inputFile = fopen(argv[1], "r"); + + if (inputFile == NULL) + { + printf("%s %s\n", "Unable to open input header:", argv[1]); + return 1; + } + + outputFile = fopen(argv[2], "wb"); + + if (outputFile == NULL) + { + printf("%s %s\n", "Unable to open output file:", argv[2]); + return 1; + } + + // Skip the first 4 lines. + for (i = 0; i < 4; i++) + { + fgets(sBuffer, BUFFER_SIZE, inputFile); + } + + // Get the contents of each line of the array. + while (fgets(sBuffer, BUFFER_SIZE, inputFile)) + { + // Get rid of the new line character. + newline = strchr(sBuffer, '\n'); + if (newline) + { + *newline = 0; + } + + // Skip this line if its the closing "};". + endBracket = strchr(sBuffer, '}'); + if (endBracket) + { + continue; + } + + // Write out each character. + pch = strtok(sBuffer, ","); + while (pch != NULL) + { + fprintf(outputFile, "%c", strtol(pch, NULL, 0)); // autodetect + pch = strtok(NULL, ","); + } + } + + return 0; +} diff --git a/extras/rehg.exe b/extras/rehg.exe new file mode 100644 index 0000000000000000000000000000000000000000..cec482fe7d5c3d892dd43747973ac8bbbd6f5919 GIT binary patch literal 2560 zcmeHJU1%It6uz5mWQ?1i+WO#wIKc#eh{58Elv-Bo_(y^h+kl8Nne0xI#m&q*J4xe1 zrD411Ff0W1*&+(&L9t?mi4>Z$d9aW|!9FMkj1XbgMDU^DBCF$f&dek!wgsUNK6u%4 zzBA{1_d93q%(6T3%A#l&LZo3~D1;BBm1TcxcM9e1`@ilM=kC1R=ck4*_Z^=ul;x6b zP1*X4oYPIya^wj^wr5SbV9G~dJSNXrd1I)ntFu3rRuv(JQ*GBZ+7LbMcctzS0v{2V zvUelyg~>3Qj$+hkZdwV7$8drCALD}Wi;2Xg4U9WLNpVUR;vtT1uUmrdbGMKja*TNg z^>G@U=Gt?w$u=3~p}g+sl%R7!f>8qQSy>@g_FVp}aLoOAVLJoyMSk+G(u%R^DN?1` z-gEj9=y^(Jd7qpWqn2WjwqG!p0Bi&>Y0tsgM2>R-b~wN_346^3eXrHyVjvvu{KrLUqA&2;)l zsQI06I~&h%RdTB>Zcd(=UEG&0ml26~B>&{zZPUrNCT}Cp+d4pM%!gs+V$d-F&K6(x*jzR$JVM&*1IB{;^uIKRxO;78>+ruBIL(c#_=7?T0T`Q|^Yl z=1Jjr+Ecdc!S8r>p72CH_!W^FY_X?z00&+7j3D@)GoK@ag*bd`e^$H)YkY*nm{;tV zYDfDst|AVuxJo+zA@N*A^3Q_fDjEM{#$Ku(s3}sOwu#s3A{b~fFjCw9*MIi}2FfyjI>lI7pE3@K!_$VIH|!(wVQbbY z%{oVfEfR*QPZSN=v1F@c&@Vd5azsBQPE6c{7Rktyg(B1k#Xt^jcl{>s#!vJKLBE?f zT2G@k3_A{c6=uLp*a_GI>|NLy*b?ju*m>9*>|5ARum+6Q?b4Yk&*f}qC|@i>v}6}d zXA;3A9Sq@=;go@8$IeaLQQ%mwCjsr5+}WgQWy8_*Qb}{(EEyixt2kMr3r)AD za!D{pfnm-SY>WD68XC>$1rr?VXUrGqPlfh!uH-yZC^`o9){?9-pEF91Hm#faqG3Od Hk`R9bQN2Zk literal 0 HcmV?d00001 diff --git a/extras/tmp1/placeholder b/extras/tmp1/placeholder new file mode 100644 index 0000000..e69de29 diff --git a/extras/undo.bat b/extras/undo.bat new file mode 100644 index 0000000..3c36e35 --- /dev/null +++ b/extras/undo.bat @@ -0,0 +1,4 @@ +copy ..\src\edit.htm.gz.h edit.htm.gz.h +rehg edit.htm.gz.h edit.htm.gz +"C:\Program Files\7-Zip\7z.exe" e -tgzip edit.htm.gz +pause diff --git a/extras/update_ace.bat b/extras/update_ace.bat new file mode 100644 index 0000000..76e1c7c --- /dev/null +++ b/extras/update_ace.bat @@ -0,0 +1,44 @@ +REM https://www.npmjs.com/package/github-files-fetcher +REM npm install -g github-files-fetcher +REM fetcher --url=resource_url --out=output_directory + +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/ace.js" --out=tmp1 +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/mode-html.js" --out=tmp1 +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/mode-json.js" --out=tmp1 +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/theme-monokai.js" --out=tmp1 +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/ext-searchbox.js" --out=tmp1 + +REM if you don't need worker(s), modify line#446 of edit.htm .setUseWorker(!0) to (!1) (true to false) +REM and do not take and include them below +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/worker-html.js" --out=tmp1 +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/worker-css.js" --out=tmp1 +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/worker-javascript.js" --out=tmp1 +call fetcher --url="https://github.com/ajaxorg/ace-builds/blob/master/src-min-noconflict/worker-json.js" --out=tmp1 + +cd tmp1 +type ace.js mode-html.js mode-json.js theme-monokai.js ext-searchbox.js > acefull.js +"C:\Program Files\7-Zip\7z.exe" a -tgzip -mx9 acefull.js.gz acefull.js +"C:\Program Files\7-Zip\7z.exe" a -tgzip -mx9 worker-html.js.gz worker-html.js +"C:\Program Files\7-Zip\7z.exe" a -tgzip -mx9 worker-javascript.js.gz worker-javascript.js +"C:\Program Files\7-Zip\7z.exe" a -tgzip -mx9 worker-json.js.gz worker-json.js +"C:\Program Files\7-Zip\7z.exe" a -tgzip -mx9 worker-css.js.gz worker-css.js + +REM update SmartSwitch /data: +pause +copy acefull.js.gz ..\..\examples\SmartSwitch\data\acefull.js.gz +copy worker-html.js.gz ..\..\examples\SmartSwitch\data\worker-html.js.gz +copy worker-javascript.js.gz ..\..\examples\SmartSwitch\data\worker-javascript.js.gz +copy worker-json.js.gz ..\..\examples\SmartSwitch\data\worker-json.js.gz +copy worker-css.js.gz ..\..\examples\SmartSwitch\data\worker-css.js.gz + +REM update ESP_AsyncFSBrowser /data: +pause +copy acefull.js.gz ..\..\examples\ESP_AsyncFSBrowser\data\acefull.js.gz +copy worker-html.js.gz ..\..\examples\ESP_AsyncFSBrowser\data\worker-html.js.gz +copy worker-javascript.js.gz ..\..\examples\ESP_AsyncFSBrowser\data\worker-javascript.js.gz +copy worker-json.js.gz ..\..\examples\ESP_AsyncFSBrowser\data\worker-json.js.gz +copy worker-css.js.gz ..\..\examples\ESP_AsyncFSBrowser\data\worker-css.js.gz + +REM delete temporary stuff +pause +del *.js *.gz diff --git a/library.json b/library.json index 8b0e9d0..332c1c3 100644 --- a/library.json +++ b/library.json @@ -1,39 +1,37 @@ { - "name":"ESPAsyncWebServer-esphome", + "name":"ESP Async WebServer", "description":"Asynchronous HTTP and WebSocket Server Library for ESP8266 and ESP32", "keywords":"http,async,websocket,webserver", "authors": { - "name": "ESPHome Team", + "name": "Hristo Gochkov", "maintainer": true }, "repository": { "type": "git", - "url": "https://github.com/esphome/ESPAsyncWebServer.git" + "url": "https://github.com/lorol/ESPAsyncWebServer.git" }, - "version": "3.0.0", + "version": "1.2.3", "license": "LGPL-3.0", "frameworks": "arduino", - "platforms": ["espressif8266", "espressif32", "libretuya"], + "platforms": ["espressif8266", "espressif32"], "dependencies": [ { - "owner": "ottowinter", - "name": "ESPAsyncTCP-esphome", + "owner": "me-no-dev", + "name": "ESPAsyncTCP", + "version": "^1.2.2", "platforms": "espressif8266" }, { - "owner": "esphome", - "name": "AsyncTCP-esphome", - "platforms": ["espressif32", "libretuya"] + "owner": "me-no-dev", + "name": "AsyncTCP", + "version": "^1.1.1", + "platforms": "espressif32" }, { "name": "Hash", "platforms": "espressif8266" - }, - { - "name": "ESP8266WiFi", - "platforms": "espressif8266" } ] } diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..1039ed0 --- /dev/null +++ b/library.properties @@ -0,0 +1,9 @@ +name=ESP Async WebServer +version=1.2.3 +author=Me-No-Dev +maintainer=lorol +sentence=Async Web Server for ESP8266 and ESP31B +paragraph=Async Web Server for ESP8266 and ESP31B +category=Other +url=https://github.com/lorol/ESPAsyncWebServer +architectures=* diff --git a/src/AsyncEventSource.cpp b/src/AsyncEventSource.cpp index 80dac89..b5d72fa 100644 --- a/src/AsyncEventSource.cpp +++ b/src/AsyncEventSource.cpp @@ -21,24 +21,24 @@ #include "AsyncEventSource.h" static String generateEventMessage(const char *message, const char *event, uint32_t id, uint32_t reconnect){ - String ev = ""; + String ev; if(reconnect){ - ev += "retry: "; - ev += String(reconnect); - ev += "\r\n"; + ev += F("retry: "); + ev += reconnect; + ev += F("\r\n"); } if(id){ - ev += "id: "; + ev += F("id: "); ev += String(id); - ev += "\r\n"; + ev += F("\r\n"); } if(event != NULL){ - ev += "event: "; + ev += F("event: "); ev += String(event); - ev += "\r\n"; + ev += F("\r\n"); } if(message != NULL){ @@ -54,9 +54,9 @@ static String generateEventMessage(const char *message, const char *event, uint3 if(ldata != NULL){ memcpy(ldata, lineStart, llen); ldata[llen] = 0; - ev += "data: "; + ev += F("data: "); ev += ldata; - ev += "\r\n\r\n"; + ev += F("\r\n\r\n"); free(ldata); } lineStart = (char *)message + messageLen; @@ -89,14 +89,14 @@ static String generateEventMessage(const char *message, const char *event, uint3 if(ldata != NULL){ memcpy(ldata, lineStart, llen); ldata[llen] = 0; - ev += "data: "; + ev += F("data: "); ev += ldata; - ev += "\r\n"; + ev += F("\r\n"); free(ldata); } lineStart = nextLine; if(lineStart == ((char *)message + messageLen)) - ev += "\r\n"; + ev += F("\r\n"); } } while(lineStart < ((char *)message + messageLen)); } @@ -137,17 +137,17 @@ size_t AsyncEventSourceMessage::ack(size_t len, uint32_t time) { return 0; } +// This could also return void as the return value is not used. +// Leaving as-is for compatibility... size_t AsyncEventSourceMessage::send(AsyncClient *client) { - if (!client->canSend()) - return 0; - const size_t len = _len - _sent; - if(client->space() < len){ - return 0; - } - size_t sent = client->add((const char *)_data, len); - client->send(); - _sent += sent; - return sent; + if (_sent >= _len) { + return 0; + } + const size_t len_to_send = _len - _sent; + auto position = reinterpret_cast(_data + _sent); + const size_t sent_now = client->write(position, len_to_send); + _sent += sent_now; + return sent_now; } // Client @@ -158,8 +158,8 @@ AsyncEventSourceClient::AsyncEventSourceClient(AsyncWebServerRequest *request, A _client = request->client(); _server = server; _lastId = 0; - if(request->hasHeader("Last-Event-ID")) - _lastId = atoi(request->getHeader("Last-Event-ID")->value().c_str()); + if(request->hasHeader(F("Last-Event-ID"))) + _lastId = atoi(request->getHeader(F("Last-Event-ID"))->value().c_str()); _client->setRxTimeout(0); _client->onError(NULL, NULL); @@ -174,7 +174,9 @@ AsyncEventSourceClient::AsyncEventSourceClient(AsyncWebServerRequest *request, A } AsyncEventSourceClient::~AsyncEventSourceClient(){ - _messageQueue.free(); + _lockmq.lock(); + _messageQueue.free(); + _lockmq.unlock(); close(); } @@ -185,33 +187,41 @@ void AsyncEventSourceClient::_queueMessage(AsyncEventSourceMessage *dataMessage) delete dataMessage; return; } + //length() is not thread-safe, thus acquiring the lock before this call.. + _lockmq.lock(); if(_messageQueue.length() >= SSE_MAX_QUEUED_MESSAGES){ - ets_printf("ERROR: Too many messages queued\n"); + ets_printf(String(F("ERROR: Too many messages queued\n")).c_str()); delete dataMessage; } else { - _messageQueue.add(dataMessage); + _messageQueue.add(dataMessage); + // runqueue trigger when new messages added + if(_client->canSend()) { + _runQueue(); + } } - if(_client->canSend()) - _runQueue(); + _lockmq.unlock(); } void AsyncEventSourceClient::_onAck(size_t len, uint32_t time){ + // Same here, acquiring the lock early + _lockmq.lock(); while(len && !_messageQueue.isEmpty()){ len = _messageQueue.front()->ack(len, time); if(_messageQueue.front()->finished()) _messageQueue.remove(_messageQueue.front()); } - _runQueue(); + _lockmq.unlock(); } void AsyncEventSourceClient::_onPoll(){ + _lockmq.lock(); if(!_messageQueue.isEmpty()){ _runQueue(); } + _lockmq.unlock(); } - void AsyncEventSourceClient::_onTimeout(uint32_t time __attribute__((unused))){ _client->close(true); } @@ -226,7 +236,7 @@ void AsyncEventSourceClient::close(){ _client->close(); } -void AsyncEventSourceClient::write(const char * message, size_t len){ +void AsyncEventSourceClient::_write(const char * message, size_t len){ _queueMessage(new AsyncEventSourceMessage(message, len)); } @@ -235,15 +245,23 @@ void AsyncEventSourceClient::send(const char *message, const char *event, uint32 _queueMessage(new AsyncEventSourceMessage(ev.c_str(), ev.length())); } -void AsyncEventSourceClient::_runQueue(){ - while(!_messageQueue.isEmpty() && _messageQueue.front()->finished()){ - _messageQueue.remove(_messageQueue.front()); - } +size_t AsyncEventSourceClient::packetsWaiting() const { + size_t len; + _lockmq.lock(); + len = _messageQueue.length(); + _lockmq.unlock(); + return len; +} - for(auto i = _messageQueue.begin(); i != _messageQueue.end(); ++i) - { - if(!(*i)->sent()) +void AsyncEventSourceClient::_runQueue() { + // Calls to this private method now already protected by _lockmq acquisition + // so no extra call of _lockmq.lock() here.. + for (auto i = _messageQueue.begin(); i != _messageQueue.end(); ++i) { + // If it crashes here, iterator (i) has been invalidated as _messageQueue + // has been changed... (UL 2020-11-15: Not supposed to happen any more ;-) ) + if (!(*i)->sent()) { (*i)->send(_client); + } } } @@ -264,6 +282,10 @@ void AsyncEventSource::onConnect(ArEventHandlerFunction cb){ _connectcb = cb; } +void AsyncEventSource::authorizeConnect(ArAuthorizeConnectHandler cb){ + _authorizeConnectHandler = cb; +} + void AsyncEventSource::_addClient(AsyncEventSourceClient * client){ /*char * temp = (char *)malloc(2054); if(temp != NULL){ @@ -277,17 +299,22 @@ void AsyncEventSource::_addClient(AsyncEventSourceClient * client){ client->write((const char *)temp, 2053); free(temp); }*/ - + AsyncWebLockGuard l(_client_queue_lock); _clients.add(client); if(_connectcb) _connectcb(client); } void AsyncEventSource::_handleDisconnect(AsyncEventSourceClient * client){ + AsyncWebLockGuard l(_client_queue_lock); _clients.remove(client); } void AsyncEventSource::close(){ + // While the whole loop is not done, the linked list is locked and so the + // iterator should remain valid even when AsyncEventSource::_handleDisconnect() + // is called very early + AsyncWebLockGuard l(_client_queue_lock); for(const auto &c: _clients){ if(c->connected()) c->close(); @@ -296,50 +323,59 @@ void AsyncEventSource::close(){ // pmb fix size_t AsyncEventSource::avgPacketsWaiting() const { - if(_clients.isEmpty()) + size_t aql = 0; + uint32_t nConnectedClients = 0; + AsyncWebLockGuard l(_client_queue_lock); + if (_clients.isEmpty()) { return 0; - - size_t aql=0; - uint32_t nConnectedClients=0; - + } for(const auto &c: _clients){ if(c->connected()) { - aql+=c->packetsWaiting(); + aql += c->packetsWaiting(); ++nConnectedClients; } } -// return aql / nConnectedClients; - return ((aql) + (nConnectedClients/2))/(nConnectedClients); // round up + return ((aql) + (nConnectedClients/2)) / (nConnectedClients); // round up } -void AsyncEventSource::send(const char *message, const char *event, uint32_t id, uint32_t reconnect){ - - +void AsyncEventSource::send( + const char *message, const char *event, uint32_t id, uint32_t reconnect){ String ev = generateEventMessage(message, event, id, reconnect); + AsyncWebLockGuard l(_client_queue_lock); for(const auto &c: _clients){ if(c->connected()) { - c->write(ev.c_str(), ev.length()); + c->_write(ev.c_str(), ev.length()); } } } size_t AsyncEventSource::count() const { - return _clients.count_if([](AsyncEventSourceClient *c){ - return c->connected(); - }); + size_t n_clients; + AsyncWebLockGuard l(_client_queue_lock); + n_clients = _clients.count_if([](AsyncEventSourceClient *c){ + return c->connected(); + }); + return n_clients; } bool AsyncEventSource::canHandle(AsyncWebServerRequest *request){ if(request->method() != HTTP_GET || !request->url().equals(_url)) { return false; } - request->addInterestingHeader("Last-Event-ID"); + request->addInterestingHeader(F("Last-Event-ID")); + request->addInterestingHeader("Cookie"); return true; } void AsyncEventSource::handleRequest(AsyncWebServerRequest *request){ - if((_username != "" && _password != "") && !request->authenticate(_username.c_str(), _password.c_str())) + if((_username.length() && _password.length()) && !request->authenticate(_username.c_str(), _password.c_str())) { return request->requestAuthentication(); + } + if(_authorizeConnectHandler != NULL){ + if(!_authorizeConnectHandler(request)){ + return request->send(401); + } + } request->send(new AsyncEventSourceResponse(this)); } @@ -348,10 +384,10 @@ void AsyncEventSource::handleRequest(AsyncWebServerRequest *request){ AsyncEventSourceResponse::AsyncEventSourceResponse(AsyncEventSource *server){ _server = server; _code = 200; - _contentType = "text/event-stream"; + _contentType = F("text/event-stream"); _sendContentLength = false; - addHeader("Cache-Control", "no-cache"); - addHeader("Connection","keep-alive"); + addHeader(F("Cache-Control"), F("no-cache")); + addHeader(F("Connection"), F("keep-alive")); } void AsyncEventSourceResponse::_respond(AsyncWebServerRequest *request){ diff --git a/src/AsyncEventSource.h b/src/AsyncEventSource.h index b0ea6ff..abb1829 100644 --- a/src/AsyncEventSource.h +++ b/src/AsyncEventSource.h @@ -21,17 +21,13 @@ #define ASYNCEVENTSOURCE_H_ #include -#include -#if defined(ESP32) || defined(LIBRETUYA) +#ifdef ESP32 #include +#define SSE_MAX_QUEUED_MESSAGES 32 #else #include +#define SSE_MAX_QUEUED_MESSAGES 8 #endif - -#ifndef SSE_MAX_QUEUED_MESSAGES -#define SSE_MAX_QUEUED_MESSAGES 32 -#endif - #include #include "AsyncWebSynchronization.h" @@ -43,7 +39,7 @@ #endif #endif -#if defined(ESP32) || defined(LIBRETUYA) +#ifdef ESP32 #define DEFAULT_MAX_SSE_CLIENTS 8 #else #define DEFAULT_MAX_SSE_CLIENTS 4 @@ -53,14 +49,15 @@ class AsyncEventSource; class AsyncEventSourceResponse; class AsyncEventSourceClient; typedef std::function ArEventHandlerFunction; +typedef std::function ArAuthorizeConnectHandler; class AsyncEventSourceMessage { private: - uint8_t * _data; + uint8_t * _data; size_t _len; size_t _sent; //size_t _ack; - size_t _acked; + size_t _acked; public: AsyncEventSourceMessage(const char * data, size_t len); ~AsyncEventSourceMessage(); @@ -76,6 +73,8 @@ class AsyncEventSourceClient { AsyncEventSource *_server; uint32_t _lastId; LinkedList _messageQueue; + // ArFi 2020-08-27 for protecting/serializing _messageQueue + AsyncPlainLock _lockmq; void _queueMessage(AsyncEventSourceMessage *dataMessage); void _runQueue(); @@ -86,15 +85,15 @@ class AsyncEventSourceClient { AsyncClient* client(){ return _client; } void close(); - void write(const char * message, size_t len); void send(const char *message, const char *event=NULL, uint32_t id=0, uint32_t reconnect=0); bool connected() const { return (_client != NULL) && _client->connected(); } uint32_t lastId() const { return _lastId; } - size_t packetsWaiting() const { return _messageQueue.length(); } + size_t packetsWaiting() const; + void _write(const char * message, size_t len); //system callbacks (do not call) void _onAck(size_t len, uint32_t time); - void _onPoll(); + void _onPoll(); void _onTimeout(uint32_t time); void _onDisconnect(); }; @@ -103,7 +102,11 @@ class AsyncEventSource: public AsyncWebHandler { private: String _url; LinkedList _clients; + // Same as for individual messages, protect mutations of _clients list + // since simultaneous access from different tasks is possible + AsyncWebLock _client_queue_lock; ArEventHandlerFunction _connectcb; + ArAuthorizeConnectHandler _authorizeConnectHandler; public: AsyncEventSource(const String& url); ~AsyncEventSource(); @@ -111,8 +114,9 @@ class AsyncEventSource: public AsyncWebHandler { const char * url() const { return _url.c_str(); } void close(); void onConnect(ArEventHandlerFunction cb); + void authorizeConnect(ArAuthorizeConnectHandler cb); void send(const char *message, const char *event=NULL, uint32_t id=0, uint32_t reconnect=0); - size_t count() const; //number clinets connected + size_t count() const; //number clients connected size_t avgPacketsWaiting() const; //system callbacks (do not call) diff --git a/src/AsyncWebSocket.cpp b/src/AsyncWebSocket.cpp index ad197eb..bb16514 100644 --- a/src/AsyncWebSocket.cpp +++ b/src/AsyncWebSocket.cpp @@ -21,11 +21,12 @@ #include "Arduino.h" #include "AsyncWebSocket.h" +#include + #include #ifndef ESP8266 #include "mbedtls/sha1.h" -#include "mbedtls/version.h" #else #include #endif @@ -42,11 +43,15 @@ size_t webSocketSendFrameWindow(AsyncClient *client){ } size_t webSocketSendFrame(AsyncClient *client, bool final, uint8_t opcode, bool mask, uint8_t *data, size_t len){ - if(!client->canSend()) + if(!client->canSend()) { + // Serial.println("SF 1"); return 0; + } size_t space = client->space(); - if(space < 2) + if(space < 2) { + // Serial.println("SF 2"); return 0; + } uint8_t mbuf[4] = {0,0,0,0}; uint8_t headLen = 2; if(len && mask){ @@ -58,8 +63,10 @@ size_t webSocketSendFrame(AsyncClient *client, bool final, uint8_t opcode, bool } if(len > 125) headLen += 2; - if(space < headLen) + if(space < headLen) { + // Serial.println("SF 2"); return 0; + } space -= headLen; if(len > space) len = space; @@ -67,6 +74,7 @@ size_t webSocketSendFrame(AsyncClient *client, bool final, uint8_t opcode, bool uint8_t *buf = (uint8_t*)malloc(headLen); if(buf == NULL){ //os_printf("could not malloc %u bytes for frame header\n", headLen); + // Serial.println("SF 3"); return 0; } @@ -87,6 +95,7 @@ size_t webSocketSendFrame(AsyncClient *client, bool final, uint8_t opcode, bool if(client->add((const char *)buf, headLen) != headLen){ //os_printf("error adding %lu header bytes\n", headLen); free(buf); + // Serial.println("SF 4"); return 0; } free(buf); @@ -99,359 +108,143 @@ size_t webSocketSendFrame(AsyncClient *client, bool final, uint8_t opcode, bool } if(client->add((const char *)data, len) != len){ //os_printf("error adding %lu data bytes\n", len); + // Serial.println("SF 5"); return 0; } } - client->send(); + if(!client->send()){ + //os_printf("error sending frame: %lu\n", headLen+len); + // Serial.println("SF 6"); + return 0; + } + // Serial.println("SF"); return len; } -/* - * AsyncWebSocketMessageBuffer - */ - - - -AsyncWebSocketMessageBuffer::AsyncWebSocketMessageBuffer() - :_data(nullptr) - ,_len(0) - ,_lock(false) - ,_count(0) -{ - -} - -AsyncWebSocketMessageBuffer::AsyncWebSocketMessageBuffer(uint8_t * data, size_t size) - :_data(nullptr) - ,_len(size) - ,_lock(false) - ,_count(0) -{ - - if (!data) { - return; - } - - _data = new uint8_t[_len + 1]; - - if (_data) { - memcpy(_data, data, _len); - _data[_len] = 0; - } -} - - -AsyncWebSocketMessageBuffer::AsyncWebSocketMessageBuffer(size_t size) - :_data(nullptr) - ,_len(size) - ,_lock(false) - ,_count(0) -{ - _data = new uint8_t[_len + 1]; - - if (_data) { - _data[_len] = 0; - } - -} - -AsyncWebSocketMessageBuffer::AsyncWebSocketMessageBuffer(const AsyncWebSocketMessageBuffer & copy) - :_data(nullptr) - ,_len(0) - ,_lock(false) - ,_count(0) -{ - _len = copy._len; - _lock = copy._lock; - _count = 0; - - if (_len) { - _data = new uint8_t[_len + 1]; - _data[_len] = 0; - } - - if (_data) { - memcpy(_data, copy._data, _len); - _data[_len] = 0; - } - -} - -AsyncWebSocketMessageBuffer::AsyncWebSocketMessageBuffer(AsyncWebSocketMessageBuffer && copy) - :_data(nullptr) - ,_len(0) - ,_lock(false) - ,_count(0) -{ - _len = copy._len; - _lock = copy._lock; - _count = 0; - - if (copy._data) { - _data = copy._data; - copy._data = nullptr; - } - -} - -AsyncWebSocketMessageBuffer::~AsyncWebSocketMessageBuffer() -{ - if (_data) { - delete[] _data; - } -} - -bool AsyncWebSocketMessageBuffer::reserve(size_t size) -{ - _len = size; - - if (_data) { - delete[] _data; - _data = nullptr; - } - - _data = new uint8_t[_len + 1]; - - if (_data) { - _data[_len] = 0; - return true; - } else { - return false; - } - -} - - /* * Control Frame */ class AsyncWebSocketControl { - private: +private: uint8_t _opcode; uint8_t *_data; size_t _len; bool _mask; bool _finished; - public: - AsyncWebSocketControl(uint8_t opcode, uint8_t *data=NULL, size_t len=0, bool mask=false) + +public: + AsyncWebSocketControl(uint8_t opcode, const uint8_t *data=NULL, size_t len=0, bool mask=false) :_opcode(opcode) ,_len(len) ,_mask(len && mask) ,_finished(false) - { - if(data == NULL) - _len = 0; - if(_len){ - if(_len > 125) - _len = 125; - _data = (uint8_t*)malloc(_len); - if(_data == NULL) - _len = 0; - else memcpy(_data, data, len); - } else _data = NULL; + { + if (data == NULL) + _len = 0; + if (_len) + { + if (_len > 125) + _len = 125; + + _data = (uint8_t*)malloc(_len); + + if(_data == NULL) + _len = 0; + else + memcpy(_data, data, len); + } + else + _data = NULL; } - virtual ~AsyncWebSocketControl(){ - if(_data != NULL) - free(_data); + + virtual ~AsyncWebSocketControl() + { + if (_data != NULL) + free(_data); } + virtual bool finished() const { return _finished; } uint8_t opcode(){ return _opcode; } uint8_t len(){ return _len + 2; } size_t send(AsyncClient *client){ - _finished = true; - return webSocketSendFrame(client, true, _opcode & 0x0F, _mask, _data, _len); + _finished = true; + return webSocketSendFrame(client, true, _opcode & 0x0F, _mask, _data, _len); } }; + /* - * Basic Buffered Message + * AsyncWebSocketMessage Message */ -AsyncWebSocketBasicMessage::AsyncWebSocketBasicMessage(const char * data, size_t len, uint8_t opcode, bool mask) - :_len(len) - ,_sent(0) - ,_ack(0) - ,_acked(0) +AsyncWebSocketMessage::AsyncWebSocketMessage(AsyncWebSocketMessageBuffer buffer, uint8_t opcode, bool mask) : + _WSbuffer{buffer}, + _opcode(opcode & 0x07), + _mask{mask}, + _status{_WSbuffer?WS_MSG_SENDING:WS_MSG_ERROR} { - _opcode = opcode & 0x07; - _mask = mask; - _data = (uint8_t*)malloc(_len+1); - if(_data == NULL){ - _len = 0; - _status = WS_MSG_ERROR; - } else { +} + +void AsyncWebSocketMessage::ack(size_t len, uint32_t time) +{ + (void)time; + _acked += len; + if (_sent >= _WSbuffer->size() && _acked >= _ack) + { + _status = WS_MSG_SENT; + } + //ets_printf("A: %u\n", len); +} + +size_t AsyncWebSocketMessage::send(AsyncClient *client) +{ + if (_status != WS_MSG_SENDING) + return 0; + if (_acked < _ack){ + return 0; + } + if (_sent == _WSbuffer->size()) + { + if(_acked == _ack) + _status = WS_MSG_SENT; + return 0; + } + if (_sent > _WSbuffer->size()) + { + _status = WS_MSG_ERROR; + //ets_printf("E: %u > %u\n", _sent, _WSbuffer->length()); + return 0; + } + + size_t toSend = _WSbuffer->size() - _sent; + size_t window = webSocketSendFrameWindow(client); + + if (window < toSend) { + toSend = window; + } + + _sent += toSend; + _ack += toSend + ((toSend < 126)?2:4) + (_mask * 4); + + //ets_printf("W: %u %u\n", _sent - toSend, toSend); + + bool final = (_sent == _WSbuffer->size()); + uint8_t* dPtr = (uint8_t*)(_WSbuffer->data() + (_sent - toSend)); + uint8_t opCode = (toSend && _sent == toSend)?_opcode:(uint8_t)WS_CONTINUATION; + + size_t sent = webSocketSendFrame(client, final, opCode, _mask, dPtr, toSend); _status = WS_MSG_SENDING; - memcpy(_data, data, _len); - _data[_len] = 0; - } -} -AsyncWebSocketBasicMessage::AsyncWebSocketBasicMessage(uint8_t opcode, bool mask) - :_len(0) - ,_sent(0) - ,_ack(0) - ,_acked(0) - ,_data(NULL) -{ - _opcode = opcode & 0x07; - _mask = mask; - -} - - -AsyncWebSocketBasicMessage::~AsyncWebSocketBasicMessage() { - if(_data != NULL) - free(_data); -} - - void AsyncWebSocketBasicMessage::ack(size_t len, uint32_t time) { - (void)time; - _acked += len; - if(_sent == _len && _acked == _ack){ - _status = WS_MSG_SENT; - } -} - size_t AsyncWebSocketBasicMessage::send(AsyncClient *client) { - if(_status != WS_MSG_SENDING) - return 0; - if(_acked < _ack){ - return 0; - } - if(_sent == _len){ - if(_acked == _ack) - _status = WS_MSG_SENT; - return 0; - } - if(_sent > _len){ - _status = WS_MSG_ERROR; - return 0; - } - - size_t toSend = _len - _sent; - size_t window = webSocketSendFrameWindow(client); - - if(window < toSend) { - toSend = window; - } - - _sent += toSend; - _ack += toSend + ((toSend < 126)?2:4) + (_mask * 4); - - bool final = (_sent == _len); - uint8_t* dPtr = (uint8_t*)(_data + (_sent - toSend)); - uint8_t opCode = (toSend && _sent == toSend)?_opcode:(uint8_t)WS_CONTINUATION; - - size_t sent = webSocketSendFrame(client, final, opCode, _mask, dPtr, toSend); - _status = WS_MSG_SENDING; - if(toSend && sent != toSend){ - _sent -= (toSend - sent); - _ack -= (toSend - sent); - } - return sent; -} - -// bool AsyncWebSocketBasicMessage::reserve(size_t size) { -// if (size) { -// _data = (uint8_t*)malloc(size +1); -// if (_data) { -// memset(_data, 0, size); -// _len = size; -// _status = WS_MSG_SENDING; -// return true; -// } -// } -// return false; -// } - - -/* - * AsyncWebSocketMultiMessage Message - */ - - -AsyncWebSocketMultiMessage::AsyncWebSocketMultiMessage(AsyncWebSocketMessageBuffer * buffer, uint8_t opcode, bool mask) - :_len(0) - ,_sent(0) - ,_ack(0) - ,_acked(0) - ,_WSbuffer(nullptr) -{ - - _opcode = opcode & 0x07; - _mask = mask; - - if (buffer) { - _WSbuffer = buffer; - (*_WSbuffer)++; - _data = buffer->get(); - _len = buffer->length(); - _status = WS_MSG_SENDING; - //ets_printf("M: %u\n", _len); - } else { - _status = WS_MSG_ERROR; - } - -} - - -AsyncWebSocketMultiMessage::~AsyncWebSocketMultiMessage() { - if (_WSbuffer) { - (*_WSbuffer)--; // decreases the counter. - } -} - - void AsyncWebSocketMultiMessage::ack(size_t len, uint32_t time) { - (void)time; - _acked += len; - if(_sent >= _len && _acked >= _ack){ - _status = WS_MSG_SENT; - } - //ets_printf("A: %u\n", len); -} - size_t AsyncWebSocketMultiMessage::send(AsyncClient *client) { - if(_status != WS_MSG_SENDING) - return 0; - if(_acked < _ack){ - return 0; - } - if(_sent == _len){ - _status = WS_MSG_SENT; - return 0; - } - if(_sent > _len){ - _status = WS_MSG_ERROR; - //ets_printf("E: %u > %u\n", _sent, _len); - return 0; - } - - size_t toSend = _len - _sent; - size_t window = webSocketSendFrameWindow(client); - - if(window < toSend) { - toSend = window; - } - - _sent += toSend; - _ack += toSend + ((toSend < 126)?2:4) + (_mask * 4); - - //ets_printf("W: %u %u\n", _sent - toSend, toSend); - - bool final = (_sent == _len); - uint8_t* dPtr = (uint8_t*)(_data + (_sent - toSend)); - uint8_t opCode = (toSend && _sent == toSend)?_opcode:(uint8_t)WS_CONTINUATION; - - size_t sent = webSocketSendFrame(client, final, opCode, _mask, dPtr, toSend); - _status = WS_MSG_SENDING; - if(toSend && sent != toSend){ - //ets_printf("E: %u != %u\n", toSend, sent); - _sent -= (toSend - sent); - _ack -= (toSend - sent); - } - //ets_printf("S: %u %u\n", _sent, sent); - return sent; + if (toSend && sent != toSend){ + //ets_printf("E: %u != %u\n", toSend, sent); + _sent -= (toSend - sent); + _ack -= (toSend - sent); + } + //ets_printf("S: %u %u\n", _sent, sent); + return sent; } @@ -462,150 +255,238 @@ AsyncWebSocketMultiMessage::~AsyncWebSocketMultiMessage() { const size_t AWSC_PING_PAYLOAD_LEN = 22; AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, AsyncWebSocket *server) - : _controlQueue(LinkedList([](AsyncWebSocketControl *c){ delete c; })) - , _messageQueue(LinkedList([](AsyncWebSocketMessage *m){ delete m; })) - , _tempObject(NULL) + : _tempObject(NULL) { - _client = request->client(); - _server = server; - _clientId = _server->_getNextId(); - _status = WS_CONNECTED; - _pstate = 0; - _lastMessageTime = millis(); - _keepAlivePeriod = 0; - _client->setRxTimeout(0); - _client->onError([](void *r, AsyncClient* c, int8_t error){ (void)c; ((AsyncWebSocketClient*)(r))->_onError(error); }, this); - _client->onAck([](void *r, AsyncClient* c, size_t len, uint32_t time){ (void)c; ((AsyncWebSocketClient*)(r))->_onAck(len, time); }, this); - _client->onDisconnect([](void *r, AsyncClient* c){ ((AsyncWebSocketClient*)(r))->_onDisconnect(); delete c; }, this); - _client->onTimeout([](void *r, AsyncClient* c, uint32_t time){ (void)c; ((AsyncWebSocketClient*)(r))->_onTimeout(time); }, this); - _client->onData([](void *r, AsyncClient* c, void *buf, size_t len){ (void)c; ((AsyncWebSocketClient*)(r))->_onData(buf, len); }, this); - _client->onPoll([](void *r, AsyncClient* c){ (void)c; ((AsyncWebSocketClient*)(r))->_onPoll(); }, this); - _server->_addClient(this); - _server->_handleEvent(this, WS_EVT_CONNECT, request, NULL, 0); - delete request; + _client = request->client(); + _server = server; + _clientId = _server->_getNextId(); + _status = WS_CONNECTED; + _pstate = 0; + _lastMessageTime = millis(); + _keepAlivePeriod = 0; + _client->setRxTimeout(0); + _client->onError([](void *r, AsyncClient* c, int8_t error){ (void)c; ((AsyncWebSocketClient*)(r))->_onError(error); }, this); + _client->onAck([](void *r, AsyncClient* c, size_t len, uint32_t time){ (void)c; ((AsyncWebSocketClient*)(r))->_onAck(len, time); }, this); + _client->onDisconnect([](void *r, AsyncClient* c){ ((AsyncWebSocketClient*)(r))->_onDisconnect(); delete c; }, this); + _client->onTimeout([](void *r, AsyncClient* c, uint32_t time){ (void)c; ((AsyncWebSocketClient*)(r))->_onTimeout(time); }, this); + _client->onData([](void *r, AsyncClient* c, void *buf, size_t len){ (void)c; ((AsyncWebSocketClient*)(r))->_onData(buf, len); }, this); + _client->onPoll([](void *r, AsyncClient* c){ (void)c; ((AsyncWebSocketClient*)(r))->_onPoll(); }, this); + _server->_handleEvent(this, WS_EVT_CONNECT, request, NULL, 0); + delete request; + memset(&_pinfo,0,sizeof(_pinfo)); } -AsyncWebSocketClient::~AsyncWebSocketClient(){ - _messageQueue.free(); - _controlQueue.free(); - _server->_handleEvent(this, WS_EVT_DISCONNECT, NULL, NULL, 0); +AsyncWebSocketClient::~AsyncWebSocketClient() +{ + { + AsyncWebLockGuard l(_lock); + + _messageQueue.clear(); + _controlQueue.clear(); + } + _server->_handleEvent(this, WS_EVT_DISCONNECT, NULL, NULL, 0); +} + +void AsyncWebSocketClient::_clearQueue() +{ + while (!_messageQueue.empty() && _messageQueue.front().finished()) + _messageQueue.pop_front(); } void AsyncWebSocketClient::_onAck(size_t len, uint32_t time){ - _lastMessageTime = millis(); - if(!_controlQueue.isEmpty()){ - auto head = _controlQueue.front(); - if(head->finished()){ - len -= head->len(); - if(_status == WS_DISCONNECTING && head->opcode() == WS_DISCONNECT){ - _controlQueue.remove(head); - _status = WS_DISCONNECTED; - _client->close(true); + _lastMessageTime = millis(); + + AsyncWebLockGuard l(_lock); + + if (!_controlQueue.empty()) { + auto &head = _controlQueue.front(); + if (head.finished()){ + len -= head.len(); + if (_status == WS_DISCONNECTING && head.opcode() == WS_DISCONNECT){ + _controlQueue.pop_front(); + _status = WS_DISCONNECTED; + l.unlock(); + if (_client) _client->close(true); + return; + } + _controlQueue.pop_front(); + } + } + + if(len && !_messageQueue.empty()){ + _messageQueue.front().ack(len, time); + } + + _clearQueue(); + + _runQueue(); +} + +void AsyncWebSocketClient::_onPoll() +{ + if (!_client) return; - } - _controlQueue.remove(head); + + AsyncWebLockGuard l(_lock); + if (_client->canSend() && (!_controlQueue.empty() || !_messageQueue.empty())) + { + l.unlock(); + _runQueue(); } - } - if(len && !_messageQueue.isEmpty()){ - _messageQueue.front()->ack(len, time); - } - _server->_cleanBuffers(); - _runQueue(); -} - -void AsyncWebSocketClient::_onPoll(){ - if(_client->canSend() && (!_controlQueue.isEmpty() || !_messageQueue.isEmpty())){ - _runQueue(); - } else if(_keepAlivePeriod > 0 && _controlQueue.isEmpty() && _messageQueue.isEmpty() && (millis() - _lastMessageTime) >= _keepAlivePeriod){ - ping((uint8_t *)AWSC_PING_PAYLOAD, AWSC_PING_PAYLOAD_LEN); - } -} - -void AsyncWebSocketClient::_runQueue(){ - while(!_messageQueue.isEmpty() && _messageQueue.front()->finished()){ - _messageQueue.remove(_messageQueue.front()); - } - - if(!_controlQueue.isEmpty() && (_messageQueue.isEmpty() || _messageQueue.front()->betweenFrames()) && webSocketSendFrameWindow(_client) > (size_t)(_controlQueue.front()->len() - 1)){ - _controlQueue.front()->send(_client); - } else if(!_messageQueue.isEmpty() && _messageQueue.front()->betweenFrames() && webSocketSendFrameWindow(_client)){ - _messageQueue.front()->send(_client); - } -} - -bool AsyncWebSocketClient::queueIsFull(){ - if((_messageQueue.length() >= WS_MAX_QUEUED_MESSAGES) || (_status != WS_CONNECTED) ) return true; - return false; -} - -void AsyncWebSocketClient::_queueMessage(AsyncWebSocketMessage *dataMessage){ - if(dataMessage == NULL) - return; - if(_status != WS_CONNECTED){ - delete dataMessage; - return; - } - if(_messageQueue.length() >= WS_MAX_QUEUED_MESSAGES){ - ets_printf("ERROR: Too many messages queued\n"); - delete dataMessage; - } else { - _messageQueue.add(dataMessage); - } - if(_client->canSend()) - _runQueue(); -} - -void AsyncWebSocketClient::_queueControl(AsyncWebSocketControl *controlMessage){ - if(controlMessage == NULL) - return; - _controlQueue.add(controlMessage); - if(_client->canSend()) - _runQueue(); -} - -void AsyncWebSocketClient::close(uint16_t code, const char * message){ - if(_status != WS_CONNECTED) - return; - if(code){ - uint8_t packetLen = 2; - if(message != NULL){ - size_t mlen = strlen(message); - if(mlen > 123) mlen = 123; - packetLen += mlen; + else if (_keepAlivePeriod > 0 && (millis() - _lastMessageTime) >= _keepAlivePeriod && (_controlQueue.empty() && _messageQueue.empty())) + { + l.unlock(); + ping((uint8_t *)AWSC_PING_PAYLOAD, AWSC_PING_PAYLOAD_LEN); } - char * buf = (char*)malloc(packetLen); - if(buf != NULL){ - buf[0] = (uint8_t)(code >> 8); - buf[1] = (uint8_t)(code & 0xFF); - if(message != NULL){ - memcpy(buf+2, message, packetLen -2); - } - _queueControl(new AsyncWebSocketControl(WS_DISCONNECT,(uint8_t*)buf,packetLen)); - free(buf); - return; +} + +void AsyncWebSocketClient::_runQueue() +{ + if (!_client) + return; + + AsyncWebLockGuard l(_lock); + + _clearQueue(); + + if (!_controlQueue.empty() && (_messageQueue.empty() || _messageQueue.front().betweenFrames()) && webSocketSendFrameWindow(_client) > (size_t)(_controlQueue.front().len() - 1)) + { + //l.unlock(); + _controlQueue.front().send(_client); + } + else if (!_messageQueue.empty() && _messageQueue.front().betweenFrames() && webSocketSendFrameWindow(_client)) + { + //l.unlock(); + _messageQueue.front().send(_client); } - } - _queueControl(new AsyncWebSocketControl(WS_DISCONNECT)); } -void AsyncWebSocketClient::ping(uint8_t *data, size_t len){ - if(_status == WS_CONNECTED) - _queueControl(new AsyncWebSocketControl(WS_PING, data, len)); +bool AsyncWebSocketClient::queueIsFull() const +{ + size_t size; + { + AsyncWebLockGuard l(_lock); + size = _messageQueue.size(); + } + return (size >= WS_MAX_QUEUED_MESSAGES) || (_status != WS_CONNECTED); } -void AsyncWebSocketClient::_onError(int8_t){} +size_t AsyncWebSocketClient::queueLen() const +{ + AsyncWebLockGuard l(_lock); -void AsyncWebSocketClient::_onTimeout(uint32_t time){ - (void)time; - _client->close(true); + return _messageQueue.size() + _controlQueue.size(); } -void AsyncWebSocketClient::_onDisconnect(){ - _client = NULL; - _server->_handleDisconnect(this); +bool AsyncWebSocketClient::canSend() const +{ + size_t size; + { + AsyncWebLockGuard l(_lock); + size = _messageQueue.size(); + } + return size < WS_MAX_QUEUED_MESSAGES; } -void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){ +void AsyncWebSocketClient::_queueControl(uint8_t opcode, const uint8_t *data, size_t len, bool mask) +{ + if (!_client) + return; + + { + AsyncWebLockGuard l(_lock); + _controlQueue.emplace_back(opcode, data, len, mask); + } + + if (_client && _client->canSend()) + _runQueue(); +} + +void AsyncWebSocketClient::_queueMessage(std::shared_ptr> buffer, uint8_t opcode, bool mask) +{ + if(_status != WS_CONNECTED) + return; + + if (!_client) + return; + + { + AsyncWebLockGuard l(_lock); + if (_messageQueue.size() >= WS_MAX_QUEUED_MESSAGES) + { + l.unlock(); + ets_printf("AsyncWebSocketClient::_queueMessage: Too many messages queued, closing connection\n"); + _status = WS_DISCONNECTED; + if (_client) _client->close(true); + return; + } + else + { + _messageQueue.emplace_back(buffer, opcode, mask); + } + } + + if (_client && _client->canSend()) + _runQueue(); +} + +void AsyncWebSocketClient::close(uint16_t code, const char * message) +{ + if(_status != WS_CONNECTED) + return; + + if(code) + { + uint8_t packetLen = 2; + if (message != NULL) + { + size_t mlen = strlen(message); + if(mlen > 123) mlen = 123; + packetLen += mlen; + } + char * buf = (char*)malloc(packetLen); + if (buf != NULL) + { + buf[0] = (uint8_t)(code >> 8); + buf[1] = (uint8_t)(code & 0xFF); + if(message != NULL){ + memcpy(buf+2, message, packetLen -2); + } + _queueControl(WS_DISCONNECT, (uint8_t*)buf, packetLen); + free(buf); + return; + } + } + _queueControl(WS_DISCONNECT); +} + +void AsyncWebSocketClient::ping(const uint8_t *data, size_t len) +{ + if (_status == WS_CONNECTED) + _queueControl(WS_PING, data, len); +} + +void AsyncWebSocketClient::_onError(int8_t) +{ + //Serial.println("onErr"); +} + +void AsyncWebSocketClient::_onTimeout(uint32_t time) +{ + // Serial.println("onTime"); + (void)time; + _client->close(true); +} + +void AsyncWebSocketClient::_onDisconnect() +{ + // Serial.println("onDis"); + _client = NULL; +} + +void AsyncWebSocketClient::_onData(void *pbuf, size_t plen) +{ + // Serial.println("onData"); _lastMessageTime = millis(); uint8_t *data = (uint8_t*)pbuf; while(plen > 0){ @@ -650,9 +531,9 @@ void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){ if(_pinfo.opcode){ _pinfo.message_opcode = _pinfo.opcode; _pinfo.num = 0; - } else _pinfo.num += 1; + } } - _server->_handleEvent(this, WS_EVT_DATA, (void *)&_pinfo, (uint8_t*)data, datalen); + if (datalen > 0) _server->_handleEvent(this, WS_EVT_DATA, (void *)&_pinfo, (uint8_t*)data, datalen); _pinfo.index += datalen; } else if((datalen + _pinfo.index) == _pinfo.len){ @@ -671,15 +552,17 @@ void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){ } else { _status = WS_DISCONNECTING; _client->ackLater(); - _queueControl(new AsyncWebSocketControl(WS_DISCONNECT, data, datalen)); + _queueControl(WS_DISCONNECT, data, datalen); } } else if(_pinfo.opcode == WS_PING){ - _queueControl(new AsyncWebSocketControl(WS_PONG, data, datalen)); + _queueControl(WS_PONG, data, datalen); } else if(_pinfo.opcode == WS_PONG){ if(datalen != AWSC_PING_PAYLOAD_LEN || memcmp(AWSC_PING_PAYLOAD, data, AWSC_PING_PAYLOAD_LEN) != 0) _server->_handleEvent(this, WS_EVT_PONG, NULL, data, datalen); } else if(_pinfo.opcode < 8){//continuation or text/binary frame _server->_handleEvent(this, WS_EVT_DATA, (void *)&_pinfo, data, datalen); + if (_pinfo.final) _pinfo.num = 0; + else _pinfo.num += 1; } } else { //os_printf("frame error: len: %u, index: %llu, total: %llu\n", datalen, _pinfo.index, _pinfo.len); @@ -696,7 +579,8 @@ void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){ } } -size_t AsyncWebSocketClient::printf(const char *format, ...) { +size_t AsyncWebSocketClient::printf(const char *format, ...) +{ va_list arg; va_start(arg, format); char* temp = new char[MAX_PRINTF_LEN]; @@ -727,7 +611,8 @@ size_t AsyncWebSocketClient::printf(const char *format, ...) { } #ifndef ESP32 -size_t AsyncWebSocketClient::printf_P(PGM_P formatP, ...) { +size_t AsyncWebSocketClient::printf_P(PGM_P formatP, ...) +{ va_list arg; va_start(arg, formatP); char* temp = new char[MAX_PRINTF_LEN]; @@ -758,84 +643,58 @@ size_t AsyncWebSocketClient::printf_P(PGM_P formatP, ...) { } #endif -void AsyncWebSocketClient::text(const char * message, size_t len){ - _queueMessage(new AsyncWebSocketBasicMessage(message, len)); -} -void AsyncWebSocketClient::text(const char * message){ - text(message, strlen(message)); -} -void AsyncWebSocketClient::text(uint8_t * message, size_t len){ - text((const char *)message, len); -} -void AsyncWebSocketClient::text(char * message){ - text(message, strlen(message)); -} -void AsyncWebSocketClient::text(const String &message){ - text(message.c_str(), message.length()); -} -void AsyncWebSocketClient::text(const __FlashStringHelper *data){ - PGM_P p = reinterpret_cast(data); - size_t n = 0; - while (1) { - if (pgm_read_byte(p+n) == 0) break; - n += 1; - } - char * message = (char*) malloc(n+1); - if(message){ - for(size_t b=0; b>(len); + std::memcpy(buffer->data(), message, len); + return buffer; } -void AsyncWebSocketClient::binary(const char * message, size_t len){ - _queueMessage(new AsyncWebSocketBasicMessage(message, len, WS_BINARY)); -} -void AsyncWebSocketClient::binary(const char * message){ - binary(message, strlen(message)); -} -void AsyncWebSocketClient::binary(uint8_t * message, size_t len){ - binary((const char *)message, len); -} -void AsyncWebSocketClient::binary(char * message){ - binary(message, strlen(message)); -} -void AsyncWebSocketClient::binary(const String &message){ - binary(message.c_str(), message.length()); -} -void AsyncWebSocketClient::binary(const __FlashStringHelper *data, size_t len){ - PGM_P p = reinterpret_cast(data); - char * message = (char*) malloc(len); - if(message){ - for(size_t b=0; b(data); -IPAddress AsyncWebSocketClient::remoteIP() { - if(!_client) { - return IPAddress((uint32_t)0); + size_t n = 0; + while (1) + { + if (pgm_read_byte(p+n) == 0) break; + n += 1; } + + char * message = (char*) malloc(n+1); + if(message) + { + memcpy_P(message, p, n); + message[n] = 0; + text(message, n); + free(message); + } +} + +void AsyncWebSocketClient::binary(const __FlashStringHelper *data, size_t len) +{ + PGM_P p = reinterpret_cast(data); + char *message = (char*) malloc(len); + if (message) { + memcpy_P(message, p, len); + binary(message, len); + free(message); + } +} + +IPAddress AsyncWebSocketClient::remoteIP() const +{ + if (!_client) + return IPAddress((uint32_t)0); + return _client->remoteIP(); } -uint16_t AsyncWebSocketClient::remotePort() { - if(!_client) { +uint16_t AsyncWebSocketClient::remotePort() const +{ + if(!_client) return 0; - } + return _client->remotePort(); } @@ -847,10 +706,8 @@ uint16_t AsyncWebSocketClient::remotePort() { AsyncWebSocket::AsyncWebSocket(const String& url) :_url(url) - ,_clients(LinkedList([](AsyncWebSocketClient *c){ delete c; })) ,_cNextId(1) ,_enabled(true) - ,_buffers(LinkedList([](AsyncWebSocketMessageBuffer *b){ delete b; })) { _eventHandler = NULL; } @@ -863,175 +720,260 @@ void AsyncWebSocket::_handleEvent(AsyncWebSocketClient * client, AwsEventType ty } } -void AsyncWebSocket::_addClient(AsyncWebSocketClient * client){ - _clients.add(client); +AsyncWebSocketClient *AsyncWebSocket::_newClient(AsyncWebServerRequest *request) +{ + _clients.emplace_back(request, this); + return &_clients.back(); } -void AsyncWebSocket::_handleDisconnect(AsyncWebSocketClient * client){ - - _clients.remove_first([=](AsyncWebSocketClient * c){ - return c->id() == client->id(); - }); +bool AsyncWebSocket::availableForWriteAll() +{ + return std::none_of(std::begin(_clients), std::end(_clients), + [](const AsyncWebSocketClient &c){ return c.queueIsFull(); }); } -bool AsyncWebSocket::availableForWriteAll(){ - for(const auto& c: _clients){ - if(c->queueIsFull()) return false; - } - return true; +bool AsyncWebSocket::availableForWrite(uint32_t id) +{ + const auto iter = std::find_if(std::begin(_clients), std::end(_clients), + [id](const AsyncWebSocketClient &c){ return c.id() == id; }); + if (iter == std::end(_clients)) + return true; + return !iter->queueIsFull(); } -bool AsyncWebSocket::availableForWrite(uint32_t id){ - for(const auto& c: _clients){ - if(c->queueIsFull() && (c->id() == id )) return false; - } - return true; +size_t AsyncWebSocket::count() const +{ + return std::count_if(std::begin(_clients), std::end(_clients), + [](const AsyncWebSocketClient &c){ return c.status() == WS_CONNECTED; }); } -size_t AsyncWebSocket::count() const { - return _clients.count_if([](AsyncWebSocketClient * c){ - return c->status() == WS_CONNECTED; - }); -} +AsyncWebSocketClient * AsyncWebSocket::client(uint32_t id) +{ + const auto iter = std::find_if(std::begin(_clients), std::end(_clients), + [id](const AsyncWebSocketClient &c){ return c.id() == id && c.status() == WS_CONNECTED; }); + if (iter == std::end(_clients)) + return nullptr; -AsyncWebSocketClient * AsyncWebSocket::client(uint32_t id){ - for(const auto &c: _clients){ - if(c->id() == id && c->status() == WS_CONNECTED){ - return c; - } - } - return nullptr; + return &(*iter); } -void AsyncWebSocket::close(uint32_t id, uint16_t code, const char * message){ - AsyncWebSocketClient * c = client(id); - if(c) - c->close(code, message); +void AsyncWebSocket::close(uint32_t id, uint16_t code, const char * message) +{ + if (AsyncWebSocketClient *c = client(id)) + c->close(code, message); } -void AsyncWebSocket::closeAll(uint16_t code, const char * message){ - for(const auto& c: _clients){ - if(c->status() == WS_CONNECTED) - c->close(code, message); - } +void AsyncWebSocket::closeAll(uint16_t code, const char * message) +{ + for (auto &c : _clients) + if (c.status() == WS_CONNECTED) + c.close(code, message); } void AsyncWebSocket::cleanupClients(uint16_t maxClients) { - if (count() > maxClients){ - _clients.front()->close(); - } -} + if (count() > maxClients) + _clients.front().close(); -void AsyncWebSocket::ping(uint32_t id, uint8_t *data, size_t len){ - AsyncWebSocketClient * c = client(id); - if(c) - c->ping(data, len); -} - -void AsyncWebSocket::pingAll(uint8_t *data, size_t len){ - for(const auto& c: _clients){ - if(c->status() == WS_CONNECTED) - c->ping(data, len); - } -} - -void AsyncWebSocket::text(uint32_t id, const char * message, size_t len){ - AsyncWebSocketClient * c = client(id); - if(c) - c->text(message, len); -} - -void AsyncWebSocket::textAll(AsyncWebSocketMessageBuffer * buffer){ - if (!buffer) return; - buffer->lock(); - for(const auto& c: _clients){ - if(c->status() == WS_CONNECTED){ - c->text(buffer); + for (auto iter = std::begin(_clients); iter != std::end(_clients);) + { + if (iter->shouldBeDeleted()) + iter = _clients.erase(iter); + else + iter++; } - } - buffer->unlock(); - _cleanBuffers(); } - -void AsyncWebSocket::textAll(const char * message, size_t len){ - AsyncWebSocketMessageBuffer * WSBuffer = makeBuffer((uint8_t *)message, len); - textAll(WSBuffer); -} - -void AsyncWebSocket::binary(uint32_t id, const char * message, size_t len){ - AsyncWebSocketClient * c = client(id); - if(c) - c->binary(message, len); -} - -void AsyncWebSocket::binaryAll(const char * message, size_t len){ - AsyncWebSocketMessageBuffer * buffer = makeBuffer((uint8_t *)message, len); - binaryAll(buffer); -} - -void AsyncWebSocket::binaryAll(AsyncWebSocketMessageBuffer * buffer) +void AsyncWebSocket::ping(uint32_t id, const uint8_t *data, size_t len) { - if (!buffer) return; - buffer->lock(); - for(const auto& c: _clients){ - if(c->status() == WS_CONNECTED) - c->binary(buffer); - } - buffer->unlock(); - _cleanBuffers(); + if (AsyncWebSocketClient * c = client(id)) + c->ping(data, len); } -void AsyncWebSocket::message(uint32_t id, AsyncWebSocketMessage *message){ - AsyncWebSocketClient * c = client(id); - if(c) - c->message(message); +void AsyncWebSocket::pingAll(const uint8_t *data, size_t len) +{ + for (auto &c : _clients) + if (c.status() == WS_CONNECTED) + c.ping(data, len); } -void AsyncWebSocket::messageAll(AsyncWebSocketMultiMessage *message){ - for(const auto& c: _clients){ - if(c->status() == WS_CONNECTED) - c->message(message); - } - _cleanBuffers(); +void AsyncWebSocket::text(uint32_t id, AsyncWebSocketMessageBuffer message){ + if (AsyncWebSocketClient * c = client(id)) + c->message(message); +}; +void AsyncWebSocket::text(uint32_t id, const uint8_t *message, size_t len) +{ + if (AsyncWebSocketClient * c = client(id)) + c->text(makeBuffer(message, len)); +} +void AsyncWebSocket::text(uint32_t id, const __FlashStringHelper *data) +{ + PGM_P p = reinterpret_cast(data); + + size_t n = 0; + while (true) + { + if (pgm_read_byte(p+n) == 0) + break; + n += 1; + } + + char * message = (char*) malloc(n+1); + if (message) + { + memcpy_P(message, p, n); + message[n] = 0; + text(id, message, n); + free(message); + } +} + +void AsyncWebSocket::textAll(AsyncWebSocketMessageBuffer buffer) +{ + for (auto &c : _clients) + if (c.status() == WS_CONNECTED) + c.text(buffer); +} +void AsyncWebSocket::textAll(const uint8_t *message, size_t len) +{ + textAll(makeBuffer(message, len)); +} +void AsyncWebSocket::textAll(const char * message, size_t len) +{ + textAll((const uint8_t *)message, len); +} +void AsyncWebSocket::textAll(const char *message) +{ + textAll(message, strlen(message)); +} +void AsyncWebSocket::textAll(const String &message) +{ + textAll(message.c_str(), message.length()); +} +void AsyncWebSocket::textAll(const __FlashStringHelper *data) +{ + PGM_P p = reinterpret_cast(data); + + size_t n = 0; + while (1) + { + if (pgm_read_byte(p+n) == 0) break; + n += 1; + } + + char *message = (char*)malloc(n+1); + if(message) + { + memcpy_P(message, p, n); + message[n] = 0; + textAll(message, n); + free(message); + } +} + +void AsyncWebSocket::binary(uint32_t id, AsyncWebSocketMessageBuffer message){ + if (AsyncWebSocketClient * c = client(id)) + c->binary(message); +}; +void AsyncWebSocket::binary(uint32_t id, const uint8_t *message, size_t len) +{ + if (AsyncWebSocketClient *c = client(id)) + c->binary(makeBuffer(message, len)); +} +void AsyncWebSocket::binary(uint32_t id, const char * message, size_t len) +{ + binary(id, (const uint8_t *)message, len); +} +void AsyncWebSocket::binary(uint32_t id, const char * message) +{ + binary(id, message, strlen(message)); +} +void AsyncWebSocket::binary(uint32_t id, const String &message) +{ + binary(id, message.c_str(), message.length()); +} +void AsyncWebSocket::binary(uint32_t id, const __FlashStringHelper *data, size_t len) +{ + PGM_P p = reinterpret_cast(data); + char *message = (char*) malloc(len); + if (message) + { + memcpy_P(message, p, len); + binary(id, message, len); + free(message); + } +} + +void AsyncWebSocket::binaryAll(AsyncWebSocketMessageBuffer buffer) +{ + for (auto &c : _clients) + if (c.status() == WS_CONNECTED) + c.binary(buffer); +} + +void AsyncWebSocket::binaryAll(const uint8_t *message, size_t len) +{ + binaryAll(makeBuffer(message, len)); +} + +void AsyncWebSocket::binaryAll(const char *message, size_t len) +{ + binaryAll((const uint8_t *)message, len); +} +void AsyncWebSocket::binaryAll(const char *message) +{ + binaryAll(message, strlen(message)); +} +void AsyncWebSocket::binaryAll(const String &message) +{ + binaryAll(message.c_str(), message.length()); +} +void AsyncWebSocket::binaryAll(const __FlashStringHelper *data, size_t len) +{ + PGM_P p = reinterpret_cast(data); + char * message = (char*) malloc(len); + if(message) + { + memcpy_P(message, p, len); + binaryAll(message, len); + free(message); + } } size_t AsyncWebSocket::printf(uint32_t id, const char *format, ...){ - AsyncWebSocketClient * c = client(id); - if(c){ - va_list arg; - va_start(arg, format); - size_t len = c->printf(format, arg); - va_end(arg); - return len; - } - return 0; + AsyncWebSocketClient * c = client(id); + if (c) + { + va_list arg; + va_start(arg, format); + size_t len = c->printf(format, arg); + va_end(arg); + return len; + } + return 0; } -size_t AsyncWebSocket::printfAll(const char *format, ...) { - va_list arg; - char* temp = new char[MAX_PRINTF_LEN]; - if(!temp){ - return 0; - } - va_start(arg, format); - size_t len = vsnprintf(temp, MAX_PRINTF_LEN, format, arg); - va_end(arg); - delete[] temp; +size_t AsyncWebSocket::printfAll(const char *format, ...) +{ + va_list arg; + char *temp = new char[MAX_PRINTF_LEN]; + if (!temp) + return 0; - AsyncWebSocketMessageBuffer * buffer = makeBuffer(len); - if (!buffer) { - return 0; - } + va_start(arg, format); + size_t len = vsnprintf(temp, MAX_PRINTF_LEN, format, arg); + va_end(arg); + delete[] temp; - va_start(arg, format); - vsnprintf( (char *)buffer->get(), len + 1, format, arg); - va_end(arg); + AsyncWebSocketMessageBuffer buffer = std::make_shared>(len); - textAll(buffer); - return len; + va_start(arg, format); + vsnprintf( (char *)buffer->data(), len + 1, format, arg); + va_end(arg); + + textAll(buffer); + return len; } #ifndef ESP32 @@ -1048,186 +990,106 @@ size_t AsyncWebSocket::printf_P(uint32_t id, PGM_P formatP, ...){ } #endif -size_t AsyncWebSocket::printfAll_P(PGM_P formatP, ...) { - va_list arg; - char* temp = new char[MAX_PRINTF_LEN]; - if(!temp){ - return 0; - } - va_start(arg, formatP); - size_t len = vsnprintf_P(temp, MAX_PRINTF_LEN, formatP, arg); - va_end(arg); - delete[] temp; +size_t AsyncWebSocket::printfAll_P(PGM_P formatP, ...) +{ + va_list arg; + char *temp = new char[MAX_PRINTF_LEN]; + if (!temp) + return 0; - AsyncWebSocketMessageBuffer * buffer = makeBuffer(len + 1); - if (!buffer) { - return 0; - } + va_start(arg, formatP); + size_t len = vsnprintf_P(temp, MAX_PRINTF_LEN, formatP, arg); + va_end(arg); + delete[] temp; - va_start(arg, formatP); - vsnprintf_P((char *)buffer->get(), len + 1, formatP, arg); - va_end(arg); + AsyncWebSocketMessageBuffer buffer = std::make_shared>(len + 1); - textAll(buffer); - return len; + va_start(arg, formatP); + vsnprintf_P((char *)buffer->data(), len + 1, formatP, arg); + va_end(arg); + + textAll(buffer); + return len; } -void AsyncWebSocket::text(uint32_t id, const char * message){ - text(id, message, strlen(message)); -} -void AsyncWebSocket::text(uint32_t id, uint8_t * message, size_t len){ - text(id, (const char *)message, len); -} -void AsyncWebSocket::text(uint32_t id, char * message){ - text(id, message, strlen(message)); -} -void AsyncWebSocket::text(uint32_t id, const String &message){ - text(id, message.c_str(), message.length()); -} -void AsyncWebSocket::text(uint32_t id, const __FlashStringHelper *message){ - AsyncWebSocketClient * c = client(id); - if(c != NULL) - c->text(message); -} -void AsyncWebSocket::textAll(const char * message){ - textAll(message, strlen(message)); -} -void AsyncWebSocket::textAll(uint8_t * message, size_t len){ - textAll((const char *)message, len); -} -void AsyncWebSocket::textAll(char * message){ - textAll(message, strlen(message)); -} -void AsyncWebSocket::textAll(const String &message){ - textAll(message.c_str(), message.length()); -} -void AsyncWebSocket::textAll(const __FlashStringHelper *message){ - for(const auto& c: _clients){ - if(c->status() == WS_CONNECTED) - c->text(message); - } -} -void AsyncWebSocket::binary(uint32_t id, const char * message){ - binary(id, message, strlen(message)); -} -void AsyncWebSocket::binary(uint32_t id, uint8_t * message, size_t len){ - binary(id, (const char *)message, len); -} -void AsyncWebSocket::binary(uint32_t id, char * message){ - binary(id, message, strlen(message)); -} -void AsyncWebSocket::binary(uint32_t id, const String &message){ - binary(id, message.c_str(), message.length()); -} -void AsyncWebSocket::binary(uint32_t id, const __FlashStringHelper *message, size_t len){ - AsyncWebSocketClient * c = client(id); - if(c != NULL) - c-> binary(message, len); -} -void AsyncWebSocket::binaryAll(const char * message){ - binaryAll(message, strlen(message)); -} -void AsyncWebSocket::binaryAll(uint8_t * message, size_t len){ - binaryAll((const char *)message, len); -} -void AsyncWebSocket::binaryAll(char * message){ - binaryAll(message, strlen(message)); -} -void AsyncWebSocket::binaryAll(const String &message){ - binaryAll(message.c_str(), message.length()); -} -void AsyncWebSocket::binaryAll(const __FlashStringHelper *message, size_t len){ - for(const auto& c: _clients){ - if(c->status() == WS_CONNECTED) - c-> binary(message, len); - } - } +const char __WS_STR_CONNECTION[] PROGMEM = { "Connection" }; +const char __WS_STR_UPGRADE[] PROGMEM = { "Upgrade" }; +const char __WS_STR_ORIGIN[] PROGMEM = { "Origin" }; +const char __WS_STR_COOKIE[] PROGMEM = { "Cookie" }; +const char __WS_STR_VERSION[] PROGMEM = { "Sec-WebSocket-Version" }; +const char __WS_STR_KEY[] PROGMEM = { "Sec-WebSocket-Key" }; +const char __WS_STR_PROTOCOL[] PROGMEM = { "Sec-WebSocket-Protocol" }; +const char __WS_STR_ACCEPT[] PROGMEM = { "Sec-WebSocket-Accept" }; +const char __WS_STR_UUID[] PROGMEM = { "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" }; -const char * WS_STR_CONNECTION = "Connection"; -const char * WS_STR_UPGRADE = "Upgrade"; -const char * WS_STR_ORIGIN = "Origin"; -const char * WS_STR_VERSION = "Sec-WebSocket-Version"; -const char * WS_STR_KEY = "Sec-WebSocket-Key"; -const char * WS_STR_PROTOCOL = "Sec-WebSocket-Protocol"; -const char * WS_STR_ACCEPT = "Sec-WebSocket-Accept"; -const char * WS_STR_UUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; +#define WS_STR_CONNECTION FPSTR(__WS_STR_CONNECTION) +#define WS_STR_UPGRADE FPSTR(__WS_STR_UPGRADE) +#define WS_STR_ORIGIN FPSTR(__WS_STR_ORIGIN) +#define WS_STR_COOKIE FPSTR(__WS_STR_COOKIE) +#define WS_STR_VERSION FPSTR(__WS_STR_VERSION) +#define WS_STR_KEY FPSTR(__WS_STR_KEY) +#define WS_STR_PROTOCOL FPSTR(__WS_STR_PROTOCOL) +#define WS_STR_ACCEPT FPSTR(__WS_STR_ACCEPT) +#define WS_STR_UUID FPSTR(__WS_STR_UUID) bool AsyncWebSocket::canHandle(AsyncWebServerRequest *request){ - if(!_enabled) - return false; + if(!_enabled) + return false; - if(request->method() != HTTP_GET || !request->url().equals(_url) || !request->isExpectedRequestedConnType(RCT_WS)) - return false; + if(request->method() != HTTP_GET || !request->url().equals(_url) || !request->isExpectedRequestedConnType(RCT_WS)) + return false; - request->addInterestingHeader(WS_STR_CONNECTION); - request->addInterestingHeader(WS_STR_UPGRADE); - request->addInterestingHeader(WS_STR_ORIGIN); - request->addInterestingHeader(WS_STR_VERSION); - request->addInterestingHeader(WS_STR_KEY); - request->addInterestingHeader(WS_STR_PROTOCOL); - return true; + request->addInterestingHeader(WS_STR_CONNECTION); + request->addInterestingHeader(WS_STR_UPGRADE); + request->addInterestingHeader(WS_STR_ORIGIN); + request->addInterestingHeader(WS_STR_COOKIE); + request->addInterestingHeader(WS_STR_VERSION); + request->addInterestingHeader(WS_STR_KEY); + request->addInterestingHeader(WS_STR_PROTOCOL); + return true; } -void AsyncWebSocket::handleRequest(AsyncWebServerRequest *request){ - if(!request->hasHeader(WS_STR_VERSION) || !request->hasHeader(WS_STR_KEY)){ - request->send(400); - return; - } - if((_username != "" && _password != "") && !request->authenticate(_username.c_str(), _password.c_str())){ - return request->requestAuthentication(); - } - AsyncWebHeader* version = request->getHeader(WS_STR_VERSION); - if(version->value().toInt() != 13){ - AsyncWebServerResponse *response = request->beginResponse(400); - response->addHeader(WS_STR_VERSION,"13"); - request->send(response); - return; - } - AsyncWebHeader* key = request->getHeader(WS_STR_KEY); - AsyncWebServerResponse *response = new AsyncWebSocketResponse(key->value(), this); - if(request->hasHeader(WS_STR_PROTOCOL)){ - AsyncWebHeader* protocol = request->getHeader(WS_STR_PROTOCOL); - //ToDo: check protocol - response->addHeader(WS_STR_PROTOCOL, protocol->value()); - } - request->send(response); -} - -AsyncWebSocketMessageBuffer * AsyncWebSocket::makeBuffer(size_t size) +void AsyncWebSocket::handleRequest(AsyncWebServerRequest *request) { - AsyncWebSocketMessageBuffer * buffer = new AsyncWebSocketMessageBuffer(size); - if (buffer) { - AsyncWebLockGuard l(_lock); - _buffers.add(buffer); - } - return buffer; -} - -AsyncWebSocketMessageBuffer * AsyncWebSocket::makeBuffer(uint8_t * data, size_t size) -{ - AsyncWebSocketMessageBuffer * buffer = new AsyncWebSocketMessageBuffer(data, size); - - if (buffer) { - AsyncWebLockGuard l(_lock); - _buffers.add(buffer); - } - - return buffer; -} - -void AsyncWebSocket::_cleanBuffers() -{ - AsyncWebLockGuard l(_lock); - - for(AsyncWebSocketMessageBuffer * c: _buffers){ - if(c && c->canDelete()){ - _buffers.remove(c); + if (!request->hasHeader(WS_STR_VERSION) || !request->hasHeader(WS_STR_KEY)) + { + request->send(400); + return; } - } + if ((_username.length() && _password.length()) && !request->authenticate(_username.c_str(), _password.c_str())) + { + return request->requestAuthentication(); + } + if (_handshakeHandler != nullptr){ + if(!_handshakeHandler(request)){ + request->send(401); + return; + } + } + AsyncWebHeader* version = request->getHeader(WS_STR_VERSION); + if (version->value().toInt() != 13) + { + AsyncWebServerResponse *response = request->beginResponse(400); + response->addHeader(WS_STR_VERSION, F("13")); + request->send(response); + return; + } + AsyncWebHeader* key = request->getHeader(WS_STR_KEY); + AsyncWebServerResponse *response = new AsyncWebSocketResponse(key->value(), this); + if (request->hasHeader(WS_STR_PROTOCOL)) + { + AsyncWebHeader* protocol = request->getHeader(WS_STR_PROTOCOL); + //ToDo: check protocol + response->addHeader(WS_STR_PROTOCOL, protocol->value()); + } + request->send(response); } -AsyncWebSocket::AsyncWebSocketClientLinkedList AsyncWebSocket::getClients() const { - return _clients; +AsyncWebSocketMessageBuffer AsyncWebSocket::makeBuffer(const uint8_t *message, size_t len) +{ + auto buffer = std::make_shared>(len); + std::memcpy(buffer->data(), message, len); + return buffer; } /* @@ -1235,64 +1097,66 @@ AsyncWebSocket::AsyncWebSocketClientLinkedList AsyncWebSocket::getClients() cons * Authentication code from https://github.com/Links2004/arduinoWebSockets/blob/master/src/WebSockets.cpp#L480 */ -AsyncWebSocketResponse::AsyncWebSocketResponse(const String& key, AsyncWebSocket *server){ - _server = server; - _code = 101; - _sendContentLength = false; +AsyncWebSocketResponse::AsyncWebSocketResponse(const String& key, AsyncWebSocket *server) +{ + _server = server; + _code = 101; + _sendContentLength = false; - uint8_t * hash = (uint8_t*)malloc(20); - if(hash == NULL){ - _state = RESPONSE_FAILED; - return; - } - char * buffer = (char *) malloc(33); - if(buffer == NULL){ - free(hash); - _state = RESPONSE_FAILED; - return; - } + uint8_t * hash = (uint8_t*)malloc(20); + if(hash == NULL) + { + _state = RESPONSE_FAILED; + return; + } + char * buffer = (char *) malloc(33); + if(buffer == NULL) + { + free(hash); + _state = RESPONSE_FAILED; + return; + } #ifdef ESP8266 - sha1(key + WS_STR_UUID, hash); + sha1(key + WS_STR_UUID, hash); #else - (String&)key += WS_STR_UUID; - mbedtls_sha1_context ctx; - mbedtls_sha1_init(&ctx); -#if MBEDTLS_VERSION_NUMBER >= 0x02070000 && MBEDTLS_VERSION_NUMBER < 0x03000000 - mbedtls_sha1_starts_ret(&ctx); - mbedtls_sha1_update_ret(&ctx, (const unsigned char*)key.c_str(), key.length()); - mbedtls_sha1_finish_ret(&ctx, hash); -#else - mbedtls_sha1_starts(&ctx); - mbedtls_sha1_update(&ctx, (const unsigned char*)key.c_str(), key.length()); - mbedtls_sha1_finish(&ctx, hash); + (String&)key += WS_STR_UUID; + mbedtls_sha1_context ctx; + mbedtls_sha1_init(&ctx); + mbedtls_sha1_starts_ret(&ctx); + mbedtls_sha1_update_ret(&ctx, (const unsigned char*)key.c_str(), key.length()); + mbedtls_sha1_finish_ret(&ctx, hash); + mbedtls_sha1_free(&ctx); #endif - mbedtls_sha1_free(&ctx); -#endif - base64_encodestate _state; - base64_init_encodestate(&_state); - int len = base64_encode_block((const char *) hash, 20, buffer, &_state); - len = base64_encode_blockend((buffer + len), &_state); - addHeader(WS_STR_CONNECTION, WS_STR_UPGRADE); - addHeader(WS_STR_UPGRADE, "websocket"); - addHeader(WS_STR_ACCEPT,buffer); - free(buffer); - free(hash); + base64_encodestate _state; + base64_init_encodestate(&_state); + int len = base64_encode_block((const char *) hash, 20, buffer, &_state); + len = base64_encode_blockend((buffer + len), &_state); + addHeader(WS_STR_CONNECTION, WS_STR_UPGRADE); + addHeader(WS_STR_UPGRADE, F("websocket")); + addHeader(WS_STR_ACCEPT,buffer); + free(buffer); + free(hash); } -void AsyncWebSocketResponse::_respond(AsyncWebServerRequest *request){ - if(_state == RESPONSE_FAILED){ - request->client()->close(true); - return; - } - String out = _assembleHead(request->version()); - request->client()->write(out.c_str(), _headLength); - _state = RESPONSE_WAIT_ACK; +void AsyncWebSocketResponse::_respond(AsyncWebServerRequest *request) +{ + if(_state == RESPONSE_FAILED) + { + request->client()->close(true); + return; + } + String out = _assembleHead(request->version()); + request->client()->write(out.c_str(), _headLength); + _state = RESPONSE_WAIT_ACK; } -size_t AsyncWebSocketResponse::_ack(AsyncWebServerRequest *request, size_t len, uint32_t time){ - (void)time; - if(len){ - new AsyncWebSocketClient(request, _server); - } - return 0; +size_t AsyncWebSocketResponse::_ack(AsyncWebServerRequest *request, size_t len, uint32_t time) +{ + (void)time; + + if(len) + _server->_newClient(request); + + return 0; } + diff --git a/src/AsyncWebSocket.h b/src/AsyncWebSocket.h index fd9eeed..199c2c8 100644 --- a/src/AsyncWebSocket.h +++ b/src/AsyncWebSocket.h @@ -22,9 +22,9 @@ #define ASYNCWEBSOCKET_H_ #include -#if defined(ESP32) || defined(LIBRETUYA) +#ifdef ESP32 #include -#define WS_MAX_QUEUED_MESSAGES 32 +#define WS_MAX_QUEUED_MESSAGES 16 #else #include #define WS_MAX_QUEUED_MESSAGES 8 @@ -33,6 +33,10 @@ #include "AsyncWebSynchronization.h" +#include +#include +#include + #ifdef ESP8266 #include #ifdef CRYPTO_HASH_h // include Hash.h from espressif framework if the first include was from the crypto library @@ -40,12 +44,14 @@ #endif #endif -#if defined(ESP32) || defined(LIBRETUYA) +#ifdef ESP32 #define DEFAULT_MAX_WS_CLIENTS 8 #else #define DEFAULT_MAX_WS_CLIENTS 4 #endif +using AsyncWebSocketMessageBuffer = std::shared_ptr>; + class AsyncWebSocket; class AsyncWebSocketResponse; class AsyncWebSocketClient; @@ -80,78 +86,26 @@ typedef enum { WS_CONTINUATION, WS_TEXT, WS_BINARY, WS_DISCONNECT = 0x08, WS_PIN typedef enum { WS_MSG_SENDING, WS_MSG_SENT, WS_MSG_ERROR } AwsMessageStatus; typedef enum { WS_EVT_CONNECT, WS_EVT_DISCONNECT, WS_EVT_PONG, WS_EVT_ERROR, WS_EVT_DATA } AwsEventType; -class AsyncWebSocketMessageBuffer { - private: - uint8_t * _data; - size_t _len; - bool _lock; - uint32_t _count; - public: - AsyncWebSocketMessageBuffer(); - AsyncWebSocketMessageBuffer(size_t size); - AsyncWebSocketMessageBuffer(uint8_t * data, size_t size); - AsyncWebSocketMessageBuffer(const AsyncWebSocketMessageBuffer &); - AsyncWebSocketMessageBuffer(AsyncWebSocketMessageBuffer &&); - ~AsyncWebSocketMessageBuffer(); - void operator ++(int i) { (void)i; _count++; } - void operator --(int i) { (void)i; if (_count > 0) { _count--; } ; } - bool reserve(size_t size); - void lock() { _lock = true; } - void unlock() { _lock = false; } - uint8_t * get() { return _data; } - size_t length() { return _len; } - uint32_t count() { return _count; } - bool canDelete() { return (!_count && !_lock); } +class AsyncWebSocketMessage +{ +private: + std::shared_ptr> _WSbuffer; + uint8_t _opcode{WS_TEXT}; + bool _mask{false}; + AwsMessageStatus _status{WS_MSG_ERROR}; + size_t _sent{}; + size_t _ack{}; + size_t _acked{}; - friend AsyncWebSocket; - -}; - -class AsyncWebSocketMessage { - protected: - uint8_t _opcode; - bool _mask; - AwsMessageStatus _status; - public: - AsyncWebSocketMessage():_opcode(WS_TEXT),_mask(false),_status(WS_MSG_ERROR){} - virtual ~AsyncWebSocketMessage(){} - virtual void ack(size_t len __attribute__((unused)), uint32_t time __attribute__((unused))){} - virtual size_t send(AsyncClient *client __attribute__((unused))){ return 0; } - virtual bool finished(){ return _status != WS_MSG_SENDING; } - virtual bool betweenFrames() const { return false; } -}; - -class AsyncWebSocketBasicMessage: public AsyncWebSocketMessage { - private: - size_t _len; - size_t _sent; - size_t _ack; - size_t _acked; - uint8_t * _data; public: - AsyncWebSocketBasicMessage(const char * data, size_t len, uint8_t opcode=WS_TEXT, bool mask=false); - AsyncWebSocketBasicMessage(uint8_t opcode=WS_TEXT, bool mask=false); - virtual ~AsyncWebSocketBasicMessage() override; - virtual bool betweenFrames() const override { return _acked == _ack; } - virtual void ack(size_t len, uint32_t time) override ; - virtual size_t send(AsyncClient *client) override ; -}; + AsyncWebSocketMessage(std::shared_ptr> buffer, uint8_t opcode=WS_TEXT, bool mask=false); -class AsyncWebSocketMultiMessage: public AsyncWebSocketMessage { - private: - uint8_t * _data; - size_t _len; - size_t _sent; - size_t _ack; - size_t _acked; - AsyncWebSocketMessageBuffer * _WSbuffer; -public: - AsyncWebSocketMultiMessage(AsyncWebSocketMessageBuffer * buffer, uint8_t opcode=WS_TEXT, bool mask=false); - virtual ~AsyncWebSocketMultiMessage() override; - virtual bool betweenFrames() const override { return _acked == _ack; } - virtual void ack(size_t len, uint32_t time) override ; - virtual size_t send(AsyncClient *client) override ; + bool finished() const { return _status != WS_MSG_SENDING; } + bool betweenFrames() const { return _acked == _ack; } + + void ack(size_t len, uint32_t time); + size_t send(AsyncClient *client); }; class AsyncWebSocketClient { @@ -161,8 +115,10 @@ class AsyncWebSocketClient { uint32_t _clientId; AwsClientStatus _status; - LinkedList _controlQueue; - LinkedList _messageQueue; + AsyncWebLock _lock; + + std::deque _controlQueue; + std::deque _messageQueue; uint8_t _pstate; AwsFrameInfo _pinfo; @@ -170,9 +126,10 @@ class AsyncWebSocketClient { uint32_t _lastMessageTime; uint32_t _keepAlivePeriod; - void _queueMessage(AsyncWebSocketMessage *dataMessage); - void _queueControl(AsyncWebSocketControl *controlMessage); + void _queueControl(uint8_t opcode, const uint8_t *data=NULL, size_t len=0, bool mask=false); + void _queueMessage(std::shared_ptr> buffer, uint8_t opcode=WS_TEXT, bool mask=false); void _runQueue(); + void _clearQueue(); public: void *_tempObject; @@ -181,18 +138,22 @@ class AsyncWebSocketClient { ~AsyncWebSocketClient(); //client id increments for the given server - uint32_t id(){ return _clientId; } - AwsClientStatus status(){ return _status; } - AsyncClient* client(){ return _client; } + uint32_t id() const { return _clientId; } + AwsClientStatus status() const { return _status; } + AsyncClient* client() { return _client; } + const AsyncClient* client() const { return _client; } AsyncWebSocket *server(){ return _server; } + const AsyncWebSocket *server() const { return _server; } AwsFrameInfo const &pinfo() const { return _pinfo; } - IPAddress remoteIP(); - uint16_t remotePort(); + IPAddress remoteIP() const; + uint16_t remotePort() const; + + bool shouldBeDeleted() const { return !_client; } //control frames void close(uint16_t code=0, const char * message=NULL); - void ping(uint8_t *data=NULL, size_t len=0); + void ping(const uint8_t *data=NULL, size_t len=0); //set auto-ping period in seconds. disabled if zero (default) void keepAlivePeriod(uint16_t seconds){ @@ -203,30 +164,49 @@ class AsyncWebSocketClient { } //data packets - void message(AsyncWebSocketMessage *message){ _queueMessage(message); } - bool queueIsFull(); + /** + * @brief allocate memory buffer owned by shared-pointer and copy provided data + * used to keep the data untill websocket send is complete for single/multiple clients + * + * @param message + * @param len + * @return AsyncWebSocketMessageBuffer + */ + AsyncWebSocketMessageBuffer makeBuffer(const uint8_t *message, size_t len); + + /** + * @brief allocate empty memory buffer owned by shared-pointer + * used to keep the data untill websocket send is complete for single/multiple clients + * + * @param len + * @return AsyncWebSocketMessageBuffer + */ + inline AsyncWebSocketMessageBuffer makeBuffer(size_t len){ return std::make_shared>(len); }; + + void message(AsyncWebSocketMessageBuffer buffer, uint8_t opcode=WS_TEXT, bool mask=false) { _queueMessage(buffer, opcode, mask); } + bool queueIsFull() const; + size_t queueLen() const; size_t printf(const char *format, ...) __attribute__ ((format (printf, 2, 3))); #ifndef ESP32 size_t printf_P(PGM_P formatP, ...) __attribute__ ((format (printf, 2, 3))); #endif - void text(const char * message, size_t len); - void text(const char * message); - void text(uint8_t * message, size_t len); - void text(char * message); - void text(const String &message); - void text(const __FlashStringHelper *data); - void text(AsyncWebSocketMessageBuffer *buffer); - void binary(const char * message, size_t len); - void binary(const char * message); - void binary(uint8_t * message, size_t len); - void binary(char * message); - void binary(const String &message); - void binary(const __FlashStringHelper *data, size_t len); - void binary(AsyncWebSocketMessageBuffer *buffer); + inline void text(AsyncWebSocketMessageBuffer buffer){ _queueMessage(buffer); }; + inline void text(const uint8_t *message, size_t len){ text(makeBuffer(message, len)); }; + inline void text(const char *message, size_t len){ text((const uint8_t *)message, len); }; + inline void text(const char *message){ text(message, strlen(message)); }; + inline void text(const String &message){ text(message.c_str(), message.length()); }; + void text(const __FlashStringHelper *message); - bool canSend() { return _messageQueue.length() < WS_MAX_QUEUED_MESSAGES; } + inline void binary(AsyncWebSocketMessageBuffer buffer){ _queueMessage(buffer, WS_BINARY); }; + inline void binary(const uint8_t *message, size_t len){ binary(makeBuffer(message, len)); }; + inline void binary(const char * message, size_t len){ binary((const uint8_t *)message, len); }; + inline void binary(const char * message){ binary(message, strlen(message)); }; + inline void binary(const String &message){ binary(message.c_str(), message.length()); }; + void binary(const __FlashStringHelper *message, size_t len); + + bool canSend() const; //system callbacks (do not call) void _onAck(size_t len, uint32_t time); @@ -237,17 +217,17 @@ class AsyncWebSocketClient { void _onData(void *pbuf, size_t plen); }; +typedef std::function AwsHandshakeHandler; typedef std::function AwsEventHandler; //WebServer Handler implementation that plays the role of a socket server class AsyncWebSocket: public AsyncWebHandler { - public: - typedef LinkedList AsyncWebSocketClientLinkedList; private: String _url; - AsyncWebSocketClientLinkedList _clients; + std::list _clients; uint32_t _cNextId; AwsEventHandler _eventHandler; + AwsHandshakeHandler _handshakeHandler; bool _enabled; AsyncWebLock _lock; @@ -268,41 +248,56 @@ class AsyncWebSocket: public AsyncWebHandler { void closeAll(uint16_t code=0, const char * message=NULL); void cleanupClients(uint16_t maxClients = DEFAULT_MAX_WS_CLIENTS); - void ping(uint32_t id, uint8_t *data=NULL, size_t len=0); - void pingAll(uint8_t *data=NULL, size_t len=0); // done + void ping(uint32_t id, const uint8_t *data=NULL, size_t len=0); + void pingAll(const uint8_t *data=NULL, size_t len=0); // done - void text(uint32_t id, const char * message, size_t len); - void text(uint32_t id, const char * message); - void text(uint32_t id, uint8_t * message, size_t len); - void text(uint32_t id, char * message); - void text(uint32_t id, const String &message); + //data packets + /** + * @brief allocate memory buffer owned by shared-pointer and copy provided data + * used to keep the data untill websocket send is complete for single/multiple clients + * + * @param message + * @param len + * @return AsyncWebSocketMessageBuffer + */ + AsyncWebSocketMessageBuffer makeBuffer(const uint8_t *message, size_t len); + + /** + * @brief allocate empty memory buffer owned by shared-pointer + * used to keep the data untill websocket send is complete for single/multiple clients + * + * @param len + * @return AsyncWebSocketMessageBuffer + */ + inline AsyncWebSocketMessageBuffer makeBuffer(size_t len){ return std::make_shared>(len); }; + + void text(uint32_t id, AsyncWebSocketMessageBuffer message); + void text(uint32_t id, const uint8_t * message, size_t len); + inline void text(uint32_t id, const char *message, size_t len){ text(id, (const uint8_t *)message, len); }; + inline void text(uint32_t id, const char *message){ text(id, message, strlen(message)); }; + inline void text(uint32_t id, const String &message){ text(id, message.c_str(), message.length()); }; void text(uint32_t id, const __FlashStringHelper *message); + void textAll(AsyncWebSocketMessageBuffer buffer); + void textAll(const uint8_t *message, size_t len); void textAll(const char * message, size_t len); void textAll(const char * message); - void textAll(uint8_t * message, size_t len); - void textAll(char * message); void textAll(const String &message); void textAll(const __FlashStringHelper *message); // need to convert - void textAll(AsyncWebSocketMessageBuffer * buffer); - void binary(uint32_t id, const char * message, size_t len); - void binary(uint32_t id, const char * message); - void binary(uint32_t id, uint8_t * message, size_t len); - void binary(uint32_t id, char * message); + void binary(uint32_t id, AsyncWebSocketMessageBuffer message); + void binary(uint32_t id, const uint8_t *message, size_t len); + void binary(uint32_t id, const char *message, size_t len); + void binary(uint32_t id, const char *message); void binary(uint32_t id, const String &message); void binary(uint32_t id, const __FlashStringHelper *message, size_t len); - void binaryAll(const char * message, size_t len); - void binaryAll(const char * message); - void binaryAll(uint8_t * message, size_t len); - void binaryAll(char * message); + void binaryAll(AsyncWebSocketMessageBuffer buffer); + void binaryAll(const uint8_t *message, size_t len); + void binaryAll(const char *message, size_t len); + void binaryAll(const char *message); void binaryAll(const String &message); void binaryAll(const __FlashStringHelper *message, size_t len); - void binaryAll(AsyncWebSocketMessageBuffer * buffer); - - void message(uint32_t id, AsyncWebSocketMessage *message); - void messageAll(AsyncWebSocketMultiMessage *message); size_t printf(uint32_t id, const char *format, ...) __attribute__ ((format (printf, 3, 4))); size_t printfAll(const char *format, ...) __attribute__ ((format (printf, 2, 3))); @@ -316,22 +311,19 @@ class AsyncWebSocket: public AsyncWebHandler { _eventHandler = handler; } + // Handshake Handler + void handleHandshake(AwsHandshakeHandler handler){ + _handshakeHandler = handler; + } + //system callbacks (do not call) uint32_t _getNextId(){ return _cNextId++; } - void _addClient(AsyncWebSocketClient * client); - void _handleDisconnect(AsyncWebSocketClient * client); + AsyncWebSocketClient *_newClient(AsyncWebServerRequest *request); void _handleEvent(AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len); virtual bool canHandle(AsyncWebServerRequest *request) override final; virtual void handleRequest(AsyncWebServerRequest *request) override final; - - // messagebuffer functions/objects. - AsyncWebSocketMessageBuffer * makeBuffer(size_t size = 0); - AsyncWebSocketMessageBuffer * makeBuffer(uint8_t * data, size_t size); - LinkedList _buffers; - void _cleanBuffers(); - - AsyncWebSocketClientLinkedList getClients() const; + const std::list &getClients() const { return _clients; } }; //WebServer response to authenticate the socket and detach the tcp client from the web server request diff --git a/src/AsyncWebSynchronization.h b/src/AsyncWebSynchronization.h index ecfc29e..0ff8ab6 100644 --- a/src/AsyncWebSynchronization.h +++ b/src/AsyncWebSynchronization.h @@ -5,40 +5,76 @@ #include -#if defined(ESP32) || (defined(LIBRETUYA) && LT_HAS_FREERTOS) +#ifdef ESP32 + +// This is the ESP32 version of the Sync Lock, using the FreeRTOS Semaphore +// Modified 'AsyncWebLock' to just only use mutex since pxCurrentTCB is not +// always available. According to example by Arjan Filius, changed name, +// added unimplemented version for ESP8266 +class AsyncPlainLock +{ +private: + SemaphoreHandle_t _lock; + +public: + AsyncPlainLock() { + _lock = xSemaphoreCreateBinary(); + // In this fails, the system is likely that much out of memory that + // we should abort anyways. If assertions are disabled, nothing is lost.. + assert(_lock); + xSemaphoreGive(_lock); + } + + ~AsyncPlainLock() { + vSemaphoreDelete(_lock); + } + + bool lock() const { + xSemaphoreTake(_lock, portMAX_DELAY); + return true; + } + + void unlock() const { + xSemaphoreGive(_lock); + } +}; // This is the ESP32 version of the Sync Lock, using the FreeRTOS Semaphore class AsyncWebLock { private: - SemaphoreHandle_t _lock; - mutable void *_lockedBy; + SemaphoreHandle_t _lock; + mutable TaskHandle_t _lockedBy{}; public: - AsyncWebLock() { - _lock = xSemaphoreCreateBinary(); - _lockedBy = NULL; - xSemaphoreGive(_lock); - } - - ~AsyncWebLock() { - vSemaphoreDelete(_lock); - } - - bool lock() const { - extern void *pxCurrentTCB; - if (_lockedBy != pxCurrentTCB) { - xSemaphoreTake(_lock, portMAX_DELAY); - _lockedBy = pxCurrentTCB; - return true; + AsyncWebLock() + { + _lock = xSemaphoreCreateBinary(); + // In this fails, the system is likely that much out of memory that + // we should abort anyways. If assertions are disabled, nothing is lost.. + assert(_lock); + _lockedBy = NULL; + xSemaphoreGive(_lock); } - return false; - } - void unlock() const { - _lockedBy = NULL; - xSemaphoreGive(_lock); - } + ~AsyncWebLock() { + vSemaphoreDelete(_lock); + } + + bool lock() const { + const auto currentTask = xTaskGetCurrentTaskHandle(); + if (_lockedBy != currentTask) { + xSemaphoreTake(_lock, portMAX_DELAY); + _lockedBy = currentTask; + return true; + } + return false; + } + + void unlock() const { + _lockedBy = NULL; + xSemaphoreGive(_lock); + } }; #else @@ -61,6 +97,10 @@ public: void unlock() const { } }; + +// Same for AsyncPlainLock, for ESP8266 this is just the unimplemented version above. +using AsyncPlainLock = AsyncWebLock; + #endif class AsyncWebLockGuard @@ -82,6 +122,13 @@ public: _lock->unlock(); } } + + void unlock() { + if (_lock) { + _lock->unlock(); + _lock = NULL; + } + } }; -#endif // ASYNCWEBSYNCHRONIZATION_H_ \ No newline at end of file +#endif // ASYNCWEBSYNCHRONIZATION_H_ diff --git a/src/ESPAsyncWebServer.h b/src/ESPAsyncWebServer.h index 1e37d90..1d3c404 100644 --- a/src/ESPAsyncWebServer.h +++ b/src/ESPAsyncWebServer.h @@ -24,11 +24,13 @@ #include "Arduino.h" #include +#include +#include #include "FS.h" #include "StringArray.h" -#if defined(ESP32) || defined(LIBRETUYA) +#ifdef ESP32 #include #include #elif defined(ESP8266) @@ -70,6 +72,19 @@ typedef enum { } WebRequestMethod; #endif +#ifndef HAVE_FS_FILE_OPEN_MODE +namespace fs { + class FileOpenMode { + public: + static const char *read; + static const char *write; + static const char *append; + }; +}; +#else +#include "FileOpenMode.h" +#endif + //if this value is returned when asked for data, packet will not be sent and you will be asked for data again #define RESPONSE_TRY_AGAIN 0xFFFFFFFF @@ -108,6 +123,9 @@ class AsyncWebHeader { String _value; public: + AsyncWebHeader() = default; + AsyncWebHeader(const AsyncWebHeader &) = default; + AsyncWebHeader(const String& name, const String& value): _name(name), _value(value){} AsyncWebHeader(const String& data): _name(), _value(){ if(!data) return; @@ -116,10 +134,12 @@ class AsyncWebHeader { _name = data.substring(0, index); _value = data.substring(index + 2); } - ~AsyncWebHeader(){} + + AsyncWebHeader &operator=(const AsyncWebHeader &) = default; + const String& name() const { return _name; } const String& value() const { return _value; } - String toString() const { return String(_name+": "+_value+"\r\n"); } + String toString() const { return _name + F(": ") + _value + F("\r\n"); } }; /* @@ -141,7 +161,7 @@ class AsyncWebServerRequest { AsyncWebServer* _server; AsyncWebHandler* _handler; AsyncWebServerResponse* _response; - StringArray _interestingHeaders; + std::vector _interestingHeaders; ArDisconnectHandler _onDisconnectfn; String _temp; @@ -163,9 +183,9 @@ class AsyncWebServerRequest { size_t _contentLength; size_t _parsedLength; - LinkedList _headers; + std::list _headers; LinkedList _params; - LinkedList _pathParams; + std::vector _pathParams; uint8_t _multiParseState; uint8_t _boundaryPosition; @@ -215,8 +235,8 @@ class AsyncWebServerRequest { const String& contentType() const { return _contentType; } size_t contentLength() const { return _contentLength; } bool multipart() const { return _isMultipart; } - const char * methodToString() const; - const char * requestedConnTypeToString() const; + const __FlashStringHelper *methodToString() const; + const __FlashStringHelper *requestedConnTypeToString() const; RequestedConnectionType requestedConnType() const { return _reqconntype; } bool isExpectedRequestedConnType(RequestedConnectionType erct1, RequestedConnectionType erct2 = RCT_NOT_USED, RequestedConnectionType erct3 = RCT_NOT_USED); void onDisconnect (ArDisconnectHandler fn); @@ -257,21 +277,24 @@ class AsyncWebServerRequest { bool hasHeader(const String& name) const; // check if header exists bool hasHeader(const __FlashStringHelper * data) const; // check if header exists - AsyncWebHeader* getHeader(const String& name) const; - AsyncWebHeader* getHeader(const __FlashStringHelper * data) const; - AsyncWebHeader* getHeader(size_t num) const; + AsyncWebHeader* getHeader(const String& name); + const AsyncWebHeader* getHeader(const String& name) const; + AsyncWebHeader* getHeader(const __FlashStringHelper * data); + const AsyncWebHeader* getHeader(const __FlashStringHelper * data) const; + AsyncWebHeader* getHeader(size_t num); + const AsyncWebHeader* getHeader(size_t num) const; size_t params() const; // get arguments count bool hasParam(const String& name, bool post=false, bool file=false) const; bool hasParam(const __FlashStringHelper * data, bool post=false, bool file=false) const; AsyncWebParameter* getParam(const String& name, bool post=false, bool file=false) const; - AsyncWebParameter* getParam(const __FlashStringHelper * data, bool post, bool file) const; + AsyncWebParameter* getParam(const __FlashStringHelper * data, bool post, bool file) const; AsyncWebParameter* getParam(size_t num) const; size_t args() const { return params(); } // get arguments count const String& arg(const String& name) const; // get request argument value by name - const String& arg(const __FlashStringHelper * data) const; // get request argument value by F(name) + const String& arg(const __FlashStringHelper * data) const; // get request argument value by F(name) const String& arg(size_t i) const; // get request argument value by number const String& argName(size_t i) const; // get request argument name by number bool hasArg(const char* name) const; // check if argument exists @@ -280,7 +303,7 @@ class AsyncWebServerRequest { const String& ASYNCWEBSERVER_REGEX_ATTRIBUTE pathArg(size_t i) const; const String& header(const char* name) const;// get request header value by name - const String& header(const __FlashStringHelper * data) const;// get request header value by F(name) + const String& header(const __FlashStringHelper * data) const;// get request header value by F(name) const String& header(size_t i) const; // get request header value by number const String& headerName(size_t i) const; // get request header name by number String urlDecode(const String& text) const; @@ -358,7 +381,7 @@ typedef enum { class AsyncWebServerResponse { protected: int _code; - LinkedList _headers; + std::list _headers; String _contentType; size_t _contentLength; bool _sendContentLength; @@ -369,6 +392,8 @@ class AsyncWebServerResponse { size_t _writtenLength; WebResponseState _state; const char* _responseCodeToString(int code); +public: + static const __FlashStringHelper *responseCodeToString(int code); public: AsyncWebServerResponse(); @@ -419,7 +444,7 @@ class AsyncWebServer { AsyncWebHandler& addHandler(AsyncWebHandler* handler); bool removeHandler(AsyncWebHandler* handler); - + AsyncCallbackWebHandler& on(const char* uri, ArRequestHandlerFunction onRequest); AsyncCallbackWebHandler& on(const char* uri, WebRequestMethodComposite method, ArRequestHandlerFunction onRequest); AsyncCallbackWebHandler& on(const char* uri, WebRequestMethodComposite method, ArRequestHandlerFunction onRequest, ArUploadHandlerFunction onUpload); @@ -431,32 +456,32 @@ class AsyncWebServer { void onFileUpload(ArUploadHandlerFunction fn); //handle file uploads void onRequestBody(ArBodyHandlerFunction fn); //handle posts with plain body content (JSON often transmitted this way as a request) - void reset(); //remove all writers and handlers, with onNotFound/onFileUpload/onRequestBody - + void reset(); //remove all writers and handlers, with onNotFound/onFileUpload/onRequestBody + void _handleDisconnect(AsyncWebServerRequest *request); void _attachHandler(AsyncWebServerRequest *request); void _rewriteRequest(AsyncWebServerRequest *request); }; class DefaultHeaders { - using headers_t = LinkedList; + using headers_t = std::list; headers_t _headers; - - DefaultHeaders() - :_headers(headers_t([](AsyncWebHeader *h){ delete h; })) - {} + public: - using ConstIterator = headers_t::ConstIterator; + DefaultHeaders() = default; + + using ConstIterator = headers_t::const_iterator; void addHeader(const String& name, const String& value){ - _headers.add(new AsyncWebHeader(name, value)); - } - + _headers.emplace_back(name, value); + } + ConstIterator begin() const { return _headers.begin(); } ConstIterator end() const { return _headers.end(); } DefaultHeaders(DefaultHeaders const &) = delete; DefaultHeaders &operator=(DefaultHeaders const &) = delete; + static DefaultHeaders &Instance() { static DefaultHeaders instance; return instance; diff --git a/src/SPIFFSEditor.cpp b/src/SPIFFSEditor.cpp new file mode 100644 index 0000000..343ed79 --- /dev/null +++ b/src/SPIFFSEditor.cpp @@ -0,0 +1,342 @@ +#include "SPIFFSEditor.h" +#include + +#define EDFS + +#ifndef EDFS + #include "edit.htm.gz.h" +#endif + +#ifdef ESP32 + #define fullName(x) name(x) +#endif + +#define SPIFFS_MAXLENGTH_FILEPATH 32 +static const char excludeListFile[] PROGMEM = "/.exclude.files"; + +typedef struct ExcludeListS { + char *item; + ExcludeListS *next; +} ExcludeList; + +static ExcludeList *excludes = NULL; + +static bool matchWild(const char *pattern, const char *testee) { + const char *nxPat = NULL, *nxTst = NULL; + + while (*testee) { + if (( *pattern == '?' ) || (*pattern == *testee)){ + pattern++;testee++; + continue; + } + if (*pattern=='*'){ + nxPat=pattern++; nxTst=testee; + continue; + } + if (nxPat){ + pattern = nxPat+1; testee=++nxTst; + continue; + } + return false; + } + while (*pattern=='*'){pattern++;} + return (*pattern == 0); +} + +static bool addExclude(const char *item){ + size_t len = strlen(item); + if(!len){ + return false; + } + ExcludeList *e = (ExcludeList *)malloc(sizeof(ExcludeList)); + if(!e){ + return false; + } + e->item = (char *)malloc(len+1); + if(!e->item){ + free(e); + return false; + } + memcpy(e->item, item, len+1); + e->next = excludes; + excludes = e; + return true; +} + +static void loadExcludeList(fs::FS &_fs, const char *filename){ + static char linebuf[SPIFFS_MAXLENGTH_FILEPATH]; + fs::File excludeFile=_fs.open(filename, "r"); + if(!excludeFile){ + //addExclude("/*.js.gz"); + return; + } +#ifdef ESP32 + if(excludeFile.isDirectory()){ + excludeFile.close(); + return; + } +#endif + if (excludeFile.size() > 0){ + uint8_t idx; + bool isOverflowed = false; + while (excludeFile.available()){ + linebuf[0] = '\0'; + idx = 0; + int lastChar; + do { + lastChar = excludeFile.read(); + if(lastChar != '\r'){ + linebuf[idx++] = (char) lastChar; + } + } while ((lastChar >= 0) && (lastChar != '\n') && (idx < SPIFFS_MAXLENGTH_FILEPATH)); + + if(isOverflowed){ + isOverflowed = (lastChar != '\n'); + continue; + } + isOverflowed = (idx >= SPIFFS_MAXLENGTH_FILEPATH); + linebuf[idx-1] = '\0'; + if(!addExclude(linebuf)){ + excludeFile.close(); + return; + } + } + } + excludeFile.close(); +} + +static bool isExcluded(fs::FS &_fs, const char *filename) { + if(excludes == NULL){ + loadExcludeList(_fs, String(FPSTR(excludeListFile)).c_str()); + } + ExcludeList *e = excludes; + while(e){ + if (matchWild(e->item, filename)){ + return true; + } + e = e->next; + } + return false; +} + +// WEB HANDLER IMPLEMENTATION + +#ifdef ESP32 +SPIFFSEditor::SPIFFSEditor(const fs::FS& fs, const String& username, const String& password) +#else +SPIFFSEditor::SPIFFSEditor(const String& username, const String& password, const fs::FS& fs) +#endif +:_fs(fs) +,_username(username) +,_password(password) +,_authenticated(false) +,_startTime(0) +{} + +bool SPIFFSEditor::canHandle(AsyncWebServerRequest *request){ + if(request->url().equalsIgnoreCase(F("/edit"))){ + if(request->method() == HTTP_GET){ + if(request->hasParam(F("list"))) + return true; + if(request->hasParam(F("edit"))){ + request->_tempFile = _fs.open(request->arg(F("edit")), "r"); + if(!request->_tempFile){ + return false; + } +#ifdef ESP32 + if(request->_tempFile.isDirectory()){ + request->_tempFile.close(); + return false; + } +#endif + } + if(request->hasParam("download")){ + request->_tempFile = _fs.open(request->arg(F("download")), "r"); + if(!request->_tempFile){ + return false; + } +#ifdef ESP32 + if(request->_tempFile.isDirectory()){ + request->_tempFile.close(); + return false; + } +#endif + } + request->addInterestingHeader(F("If-Modified-Since")); + return true; + } + else if(request->method() == HTTP_POST) + return true; + else if(request->method() == HTTP_DELETE) + return true; + else if(request->method() == HTTP_PUT) + return true; + + } + return false; +} + + +void SPIFFSEditor::handleRequest(AsyncWebServerRequest *request){ + if(_username.length() && _password.length() && !request->authenticate(_username.c_str(), _password.c_str())) + return request->requestAuthentication(); + + if(request->method() == HTTP_GET){ + if(request->hasParam(F("list"))){ + String path = request->getParam(F("list"))->value(); +#ifdef ESP32 + File dir = _fs.open(path); +#else + fs::Dir dir = _fs.openDir(path); +#endif + path = String(); + String output = "["; +#ifdef ESP32 + File entry = dir.openNextFile(); + while(entry){ +#else + while(dir.next()){ + fs::File entry = dir.openFile("r"); +#endif + String fname = entry.fullName(); + if (fname.charAt(0) != '/') fname = "/" + fname; + + if (isExcluded(_fs, fname.c_str())) { +#ifdef ESP32 + entry = dir.openNextFile(); +#endif + continue; + } + if (output != "[") output += ','; + output += F("{\"type\":\""); + output += F("file"); + output += F("\",\"name\":\""); + output += String(fname); + output += F("\",\"size\":"); + output += String(entry.size()); + output += "}"; +#ifdef ESP32 + entry = dir.openNextFile(); +#else + entry.close(); +#endif + } +#ifdef ESP32 + dir.close(); +#endif + output += "]"; + request->send(200, F("application/json"), output); + output = String(); + } + else if(request->hasParam(F("edit")) || request->hasParam(F("download"))){ + request->send(request->_tempFile, request->_tempFile.fullName(), String(), request->hasParam(F("download"))); + } + else { + const char * buildTime = __DATE__ " " __TIME__ " GMT"; + if (request->header(F("If-Modified-Since")).equals(buildTime)) { + request->send(304); + } else { +#ifdef EDFS + AsyncWebServerResponse *response = request->beginResponse(_fs, F("/edit_gz"), F("text/html"), false); +#else + AsyncWebServerResponse *response = request->beginResponse_P(200, F("text/html"), edit_htm_gz, edit_htm_gz_len); +#endif + response->addHeader(F("Content-Encoding"), F("gzip")); + response->addHeader(F("Last-Modified"), buildTime); + request->send(response); + } + } + } else if(request->method() == HTTP_DELETE){ + if(request->hasParam(F("path"), true)){ + if(!(_fs.remove(request->getParam(F("path"), true)->value()))){ +#ifdef ESP32 + _fs.rmdir(request->getParam(F("path"), true)->value()); // try rmdir for littlefs +#endif + } + + request->send(200, "", String(F("DELETE: "))+request->getParam(F("path"), true)->value()); + } else + request->send(404); + } else if(request->method() == HTTP_POST){ + if(request->hasParam(F("data"), true, true) && _fs.exists(request->getParam(F("data"), true, true)->value())) + request->send(200, "", String(F("UPLOADED: "))+request->getParam(F("data"), true, true)->value()); + + else if(request->hasParam(F("rawname"), true) && request->hasParam(F("raw0"), true)){ + String rawnam = request->getParam(F("rawname"), true)->value(); + + if (_fs.exists(rawnam)) _fs.remove(rawnam); // delete it to allow a mode + + int k = 0; + uint16_t i = 0; + fs::File f = _fs.open(rawnam, "a"); + + while (request->hasParam(String(F("raw")) + String(k), true)) { //raw0 .. raw1 + if(f){ + i += f.print(request->getParam(String(F("raw")) + String(k), true)->value()); + } + k++; + } + f.close(); + request->send(200, "", String(F("IPADWRITE: ")) + rawnam + ":" + String(i)); + + } else { + request->send(500); + } + + } else if(request->method() == HTTP_PUT){ + if(request->hasParam(F("path"), true)){ + String filename = request->getParam(F("path"), true)->value(); + if(_fs.exists(filename)){ + request->send(200); + } else { +/*******************************************************/ +#ifdef ESP32 + if (strchr(filename.c_str(), '/')) { + // For file creation, silently make subdirs as needed. If any fail, + // it will be caught by the real file open later on + char *pathStr = strdup(filename.c_str()); + if (pathStr) { + // Make dirs up to the final fnamepart + char *ptr = strchr(pathStr, '/'); + while (ptr) { + *ptr = 0; + _fs.mkdir(pathStr); + *ptr = '/'; + ptr = strchr(ptr+1, '/'); + } + } + free(pathStr); + } +#endif +/*******************************************************/ + fs::File f = _fs.open(filename, "w"); + if(f){ + f.write((uint8_t)0x00); + f.close(); + request->send(200, "", String(F("CREATE: "))+filename); + } else { + request->send(500); + } + } + } else + request->send(400); + } +} + +void SPIFFSEditor::handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){ + if(!index){ + if(!_username.length() || request->authenticate(_username.c_str(),_password.c_str())){ + _authenticated = true; + request->_tempFile = _fs.open(filename, "w"); + _startTime = millis(); + } + } + if(_authenticated && request->_tempFile){ + if(len){ + request->_tempFile.write(data,len); + } + if(final){ + request->_tempFile.close(); + } + } +} diff --git a/src/SPIFFSEditor.h b/src/SPIFFSEditor.h new file mode 100644 index 0000000..d3b959f --- /dev/null +++ b/src/SPIFFSEditor.h @@ -0,0 +1,25 @@ +#ifndef SPIFFSEditor_H_ +#define SPIFFSEditor_H_ +#include + +class SPIFFSEditor: public AsyncWebHandler { + private: + fs::FS _fs; + String _username; + String _password; + bool _authenticated; + uint32_t _startTime; + public: +#ifdef ESP32 + SPIFFSEditor(const fs::FS& fs, const String& username=String(), const String& password=String()); +#else + //SPIFFSEditor(const String& username=String(), const String& password=String(), const fs::FS& fs=SPIFFS); + SPIFFSEditor(const String& username, const String& password, const fs::FS& fs); // do not show warning that SPIFFS has been deprecated +#endif + virtual bool canHandle(AsyncWebServerRequest *request) override final; + virtual void handleRequest(AsyncWebServerRequest *request) override final; + virtual void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) override final; + virtual bool isRequestHandlerTrivial() override final {return false;} +}; + +#endif diff --git a/src/StringArray.h b/src/StringArray.h index 266bd9d..d5096e6 100644 --- a/src/StringArray.h +++ b/src/StringArray.h @@ -47,19 +47,10 @@ class LinkedList { class Iterator { ItemType* _node; - ItemType* _nextNode = nullptr; public: - Iterator(ItemType* current = nullptr) : _node(current) { - if (_node != nullptr) { - _nextNode = current->next; - } - } + Iterator(ItemType* current = nullptr) : _node(current) {} Iterator(const Iterator& i) : _node(i._node) {} - Iterator& operator ++() { - _node = _nextNode; - _nextNode = _node != nullptr ? _node->next : nullptr; - return *this; - } + Iterator& operator ++() { _node = _node->next; return *this; } bool operator != (const Iterator& i) const { return _node != i._node; } const T& operator * () const { return _node->value(); } const T* operator -> () const { return &_node->value(); } @@ -180,23 +171,4 @@ class LinkedList { } }; - -class StringArray : public LinkedList { -public: - - StringArray() : LinkedList(nullptr) {} - - bool containsIgnoreCase(const String& str){ - for (const auto& s : *this) { - if (str.equalsIgnoreCase(s)) { - return true; - } - } - return false; - } -}; - - - - #endif /* STRINGARRAY_H_ */ diff --git a/src/WebAuthentication.cpp b/src/WebAuthentication.cpp index 45246a1..1a22afd 100644 --- a/src/WebAuthentication.cpp +++ b/src/WebAuthentication.cpp @@ -36,6 +36,12 @@ bool checkBasicAuthentication(const char * hash, const char * username, const ch size_t toencodeLen = strlen(username)+strlen(password)+1; size_t encodedLen = base64_encode_expected_len(toencodeLen); if(strlen(hash) != encodedLen) +// Fix from https://github.com/me-no-dev/ESPAsyncWebServer/issues/667 +#ifdef ARDUINO_ARCH_ESP32 + if(strlen(hash) != encodedLen) +#else + if (strlen(hash) != encodedLen - 1) +#endif return false; char *toencode = new char[toencodeLen+1]; @@ -47,7 +53,7 @@ bool checkBasicAuthentication(const char * hash, const char * username, const ch delete[] toencode; return false; } - sprintf(toencode, "%s:%s", username, password); + sprintf_P(toencode, PSTR("%s:%s"), username, password); if(base64_encode_chars(toencode, toencodeLen, encoded) > 0 && memcmp(hash, encoded, encodedLen) == 0){ delete[] toencode; delete[] encoded; @@ -80,7 +86,7 @@ static bool getMD5(uint8_t * data, uint16_t len, char * output){//33 bytes or mo MD5Final(_buf, &_ctx); #endif for(i = 0; i < 16; i++) { - sprintf(output + (i * 2), "%02x", _buf[i]); + sprintf_P(output + (i * 2), PSTR("%02x"), _buf[i]); } free(_buf); return true; @@ -94,7 +100,7 @@ static String genRandomMD5(){ #endif char * out = (char*)malloc(33); if(out == NULL || !getMD5((uint8_t*)(&r), 4, out)) - return ""; + return emptyString; String res = String(out); free(out); return res; @@ -103,7 +109,7 @@ static String genRandomMD5(){ static String stringMD5(const String& in){ char * out = (char*)malloc(33); if(out == NULL || !getMD5((uint8_t*)(in.c_str()), in.length(), out)) - return ""; + return emptyString; String res = String(out); free(out); return res; @@ -111,44 +117,44 @@ static String stringMD5(const String& in){ String generateDigestHash(const char * username, const char * password, const char * realm){ if(username == NULL || password == NULL || realm == NULL){ - return ""; + return emptyString; } char * out = (char*)malloc(33); String res = String(username); - res.concat(":"); + res += ':'; res.concat(realm); - res.concat(":"); + res += ':'; String in = res; in.concat(password); if(out == NULL || !getMD5((uint8_t*)(in.c_str()), in.length(), out)) - return ""; + return emptyString; res.concat(out); free(out); return res; } String requestDigestAuthentication(const char * realm){ - String header = "realm=\""; + String header = F("realm=\""); if(realm == NULL) - header.concat("asyncesp"); + header.concat(F("asyncesp")); else header.concat(realm); - header.concat( "\", qop=\"auth\", nonce=\""); + header.concat(F("\", qop=\"auth\", nonce=\"")); header.concat(genRandomMD5()); - header.concat("\", opaque=\""); + header.concat(F("\", opaque=\"")); header.concat(genRandomMD5()); - header.concat("\""); + header += '"'; return header; } -bool checkDigestAuthentication(const char * header, const char * method, const char * username, const char * password, const char * realm, bool passwordIsHash, const char * nonce, const char * opaque, const char * uri){ +bool checkDigestAuthentication(const char * header, const __FlashStringHelper *method, const char * username, const char * password, const char * realm, bool passwordIsHash, const char * nonce, const char * opaque, const char * uri){ if(username == NULL || password == NULL || header == NULL || method == NULL){ //os_printf("AUTH FAIL: missing requred fields\n"); return false; } String myHeader = String(header); - int nextBreak = myHeader.indexOf(","); + int nextBreak = myHeader.indexOf(','); if(nextBreak < 0){ //os_printf("AUTH FAIL: no variables\n"); return false; @@ -163,67 +169,67 @@ bool checkDigestAuthentication(const char * header, const char * method, const c String myNc = String(); String myCnonce = String(); - myHeader += ", "; + myHeader += F(", "); do { String avLine = myHeader.substring(0, nextBreak); avLine.trim(); myHeader = myHeader.substring(nextBreak+1); - nextBreak = myHeader.indexOf(","); + nextBreak = myHeader.indexOf(','); - int eqSign = avLine.indexOf("="); + int eqSign = avLine.indexOf('='); if(eqSign < 0){ //os_printf("AUTH FAIL: no = sign\n"); return false; } String varName = avLine.substring(0, eqSign); avLine = avLine.substring(eqSign + 1); - if(avLine.startsWith("\"")){ + if(avLine.startsWith(String('"'))){ avLine = avLine.substring(1, avLine.length() - 1); } - if(varName.equals("username")){ + if(varName.equals(F("username"))){ if(!avLine.equals(username)){ //os_printf("AUTH FAIL: username\n"); return false; } myUsername = avLine; - } else if(varName.equals("realm")){ + } else if(varName.equals(F("realm"))){ if(realm != NULL && !avLine.equals(realm)){ //os_printf("AUTH FAIL: realm\n"); return false; } myRealm = avLine; - } else if(varName.equals("nonce")){ + } else if(varName.equals(F("nonce"))){ if(nonce != NULL && !avLine.equals(nonce)){ //os_printf("AUTH FAIL: nonce\n"); return false; } myNonce = avLine; - } else if(varName.equals("opaque")){ + } else if(varName.equals(F("opaque"))){ if(opaque != NULL && !avLine.equals(opaque)){ //os_printf("AUTH FAIL: opaque\n"); return false; } - } else if(varName.equals("uri")){ + } else if(varName.equals(F("uri"))){ if(uri != NULL && !avLine.equals(uri)){ //os_printf("AUTH FAIL: uri\n"); return false; } myUri = avLine; - } else if(varName.equals("response")){ + } else if(varName.equals(F("response"))){ myResponse = avLine; - } else if(varName.equals("qop")){ + } else if(varName.equals(F("qop"))){ myQop = avLine; - } else if(varName.equals("nc")){ + } else if(varName.equals(F("nc"))){ myNc = avLine; - } else if(varName.equals("cnonce")){ + } else if(varName.equals(F("cnonce"))){ myCnonce = avLine; } } while(nextBreak > 0); - String ha1 = (passwordIsHash) ? String(password) : stringMD5(myUsername + ":" + myRealm + ":" + String(password)); - String ha2 = String(method) + ":" + myUri; - String response = ha1 + ":" + myNonce + ":" + myNc + ":" + myCnonce + ":" + myQop + ":" + stringMD5(ha2); + String ha1 = (passwordIsHash) ? String(password) : stringMD5(myUsername + ':' + myRealm + ':' + String(password)); + String ha2 = String(method) + ':' + myUri; + String response = ha1 + ':' + myNonce + ':' + myNc + ':' + myCnonce + ':' + myQop + ':' + stringMD5(ha2); if(myResponse.equals(stringMD5(response))){ //os_printf("AUTH SUCCESS\n"); diff --git a/src/WebAuthentication.h b/src/WebAuthentication.h index ff68265..a6f1966 100644 --- a/src/WebAuthentication.h +++ b/src/WebAuthentication.h @@ -26,7 +26,7 @@ bool checkBasicAuthentication(const char * header, const char * username, const char * password); String requestDigestAuthentication(const char * realm); -bool checkDigestAuthentication(const char * header, const char * method, const char * username, const char * password, const char * realm, bool passwordIsHash, const char * nonce, const char * opaque, const char * uri); +bool checkDigestAuthentication(const char * header, const __FlashStringHelper *method, const char * username, const char * password, const char * realm, bool passwordIsHash, const char * nonce, const char * opaque, const char * uri); //for storing hashed versions on the device that can be authenticated against String generateDigestHash(const char * username, const char * password, const char * realm); diff --git a/src/WebHandlers.cpp b/src/WebHandlers.cpp index 1f435e6..8e87ff1 100644 --- a/src/WebHandlers.cpp +++ b/src/WebHandlers.cpp @@ -22,11 +22,11 @@ #include "WebHandlerImpl.h" AsyncStaticWebHandler::AsyncStaticWebHandler(const char* uri, FS& fs, const char* path, const char* cache_control) - : _fs(fs), _uri(uri), _path(path), _default_file("index.htm"), _cache_control(cache_control), _last_modified(""), _callback(nullptr) + : _fs(fs), _uri(uri), _path(path), _default_file(F("index.htm")), _cache_control(cache_control), _last_modified(), _callback(nullptr) { // Ensure leading '/' - if (_uri.length() == 0 || _uri[0] != '/') _uri = "/" + _uri; - if (_path.length() == 0 || _path[0] != '/') _path = "/" + _path; + if (_uri.length() == 0 || _uri[0] != '/') _uri = String('/') + _uri; + if (_path.length() == 0 || _path[0] != '/') _path = String('/') + _path; // If path ends with '/' we assume a hint that this is a directory to improve performance. // However - if it does not end with '/' we, can't assume a file, path can still be a directory. @@ -63,8 +63,12 @@ AsyncStaticWebHandler& AsyncStaticWebHandler::setLastModified(const char* last_m } AsyncStaticWebHandler& AsyncStaticWebHandler::setLastModified(struct tm* last_modified){ + auto formatP = PSTR("%a, %d %b %Y %H:%M:%S %Z"); + char format[strlen_P(formatP) + 1]; + strcpy_P(format, formatP); + char result[30]; - strftime (result,30,"%a, %d %b %Y %H:%M:%S %Z", last_modified); + strftime(result, sizeof(result), format, last_modified); return setLastModified((const char *)result); } @@ -81,8 +85,8 @@ AsyncStaticWebHandler& AsyncStaticWebHandler::setLastModified(){ } #endif bool AsyncStaticWebHandler::canHandle(AsyncWebServerRequest *request){ - if(request->method() != HTTP_GET - || !request->url().startsWith(_uri) + if(request->method() != HTTP_GET + || !request->url().startsWith(_uri) || !request->isExpectedRequestedConnType(RCT_DEFAULT, RCT_HTTP) ){ return false; @@ -90,10 +94,10 @@ bool AsyncStaticWebHandler::canHandle(AsyncWebServerRequest *request){ if (_getFile(request)) { // We interested in "If-Modified-Since" header to check if file was modified if (_last_modified.length()) - request->addInterestingHeader("If-Modified-Since"); + request->addInterestingHeader(F("If-Modified-Since")); if(_cache_control.length()) - request->addInterestingHeader("If-None-Match"); + request->addInterestingHeader(F("If-None-Match")); DEBUGF("[AsyncStaticWebHandler::canHandle] TRUE\n"); return true; @@ -122,7 +126,7 @@ bool AsyncStaticWebHandler::_getFile(AsyncWebServerRequest *request) // Try to add default file, ensure there is a trailing '/' ot the path. if (path.length() == 0 || path[path.length()-1] != '/') - path += "/"; + path += String('/'); path += _default_file; return _fileExists(request, path); @@ -139,21 +143,29 @@ bool AsyncStaticWebHandler::_fileExists(AsyncWebServerRequest *request, const St bool fileFound = false; bool gzipFound = false; - String gzip = path + ".gz"; + String gzip = path + F(".gz"); if (_gzipFirst) { - request->_tempFile = _fs.open(gzip, "r"); - gzipFound = FILE_IS_REAL(request->_tempFile); + if (_fs.exists(gzip)) { + request->_tempFile = _fs.open(gzip, fs::FileOpenMode::read); + gzipFound = FILE_IS_REAL(request->_tempFile); + } if (!gzipFound){ - request->_tempFile = _fs.open(path, "r"); + if (_fs.exists(path)) { + request->_tempFile = _fs.open(path, fs::FileOpenMode::read); fileFound = FILE_IS_REAL(request->_tempFile); + } } } else { - request->_tempFile = _fs.open(path, "r"); - fileFound = FILE_IS_REAL(request->_tempFile); + if (_fs.exists(path)) { + request->_tempFile = _fs.open(path, fs::FileOpenMode::read); + fileFound = FILE_IS_REAL(request->_tempFile); + } if (!fileFound){ - request->_tempFile = _fs.open(gzip, "r"); + if (_fs.exists(gzip)) { + request->_tempFile = _fs.open(gzip, fs::FileOpenMode::read); gzipFound = FILE_IS_REAL(request->_tempFile); + } } } @@ -163,7 +175,7 @@ bool AsyncStaticWebHandler::_fileExists(AsyncWebServerRequest *request, const St // Extract the file name from the path and keep it in _tempObject size_t pathLen = path.length(); char * _tempPath = (char*)malloc(pathLen+1); - snprintf(_tempPath, pathLen+1, "%s", path.c_str()); + snprintf_P(_tempPath, pathLen+1, PSTR("%s"), path.c_str()); request->_tempObject = (void*)_tempPath; // Calculate gzip statistic @@ -190,27 +202,27 @@ void AsyncStaticWebHandler::handleRequest(AsyncWebServerRequest *request) String filename = String((char*)request->_tempObject); free(request->_tempObject); request->_tempObject = NULL; - if((_username != "" && _password != "") && !request->authenticate(_username.c_str(), _password.c_str())) + if((_username.length() && _password.length()) && !request->authenticate(_username.c_str(), _password.c_str())) return request->requestAuthentication(); if (request->_tempFile == true) { String etag = String(request->_tempFile.size()); - if (_last_modified.length() && _last_modified == request->header("If-Modified-Since")) { + if (_last_modified.length() && _last_modified == request->header(F("If-Modified-Since"))) { request->_tempFile.close(); request->send(304); // Not modified - } else if (_cache_control.length() && request->hasHeader("If-None-Match") && request->header("If-None-Match").equals(etag)) { + } else if (_cache_control.length() && request->hasHeader(F("If-None-Match")) && request->header(F("If-None-Match")).equals(etag)) { request->_tempFile.close(); AsyncWebServerResponse * response = new AsyncBasicResponse(304); // Not modified - response->addHeader("Cache-Control", _cache_control); - response->addHeader("ETag", etag); + response->addHeader(F("Cache-Control"), _cache_control); + response->addHeader(F("ETag"), etag); request->send(response); } else { AsyncWebServerResponse * response = new AsyncFileResponse(request->_tempFile, filename, String(), false, _callback); if (_last_modified.length()) - response->addHeader("Last-Modified", _last_modified); + response->addHeader(F("Last-Modified"), _last_modified); if (_cache_control.length()){ - response->addHeader("Cache-Control", _cache_control); - response->addHeader("ETag", etag); + response->addHeader(F("Cache-Control"), _cache_control); + response->addHeader(F("ETag"), etag); } request->send(response); } diff --git a/src/WebRequest.cpp b/src/WebRequest.cpp index bbce5ca..31613df 100644 --- a/src/WebRequest.cpp +++ b/src/WebRequest.cpp @@ -26,8 +26,6 @@ #define os_strlen strlen #endif -static const String SharedEmptyString = String(); - #define __is_param_char(c) ((c) && ((c) != '{') && ((c) != '[') && ((c) != '&') && ((c) != '=')) enum { PARSE_REQ_START, PARSE_REQ_HEADERS, PARSE_REQ_BODY, PARSE_REQ_END, PARSE_REQ_FAIL }; @@ -53,9 +51,7 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c) , _expectingContinue(false) , _contentLength(0) , _parsedLength(0) - , _headers(LinkedList([](AsyncWebHeader *h){ delete h; })) , _params(LinkedList([](AsyncWebParameter *p){ delete p; })) - , _pathParams(LinkedList([](String *p){ delete p; })) , _multiParseState(0) , _boundaryPosition(0) , _itemStartIndex(0) @@ -78,12 +74,12 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c) } AsyncWebServerRequest::~AsyncWebServerRequest(){ - _headers.free(); + _headers.clear(); _params.free(); - _pathParams.free(); + _pathParams.clear(); - _interestingHeaders.free(); + _interestingHeaders.clear(); if(_response != NULL){ delete _response; @@ -96,6 +92,11 @@ AsyncWebServerRequest::~AsyncWebServerRequest(){ if(_tempFile){ _tempFile.close(); } + + if(_itemBuffer){ + free(_itemBuffer); + } + } void AsyncWebServerRequest::_onData(void *buf, size_t len){ @@ -143,9 +144,9 @@ void AsyncWebServerRequest::_onData(void *buf, size_t len){ _parsedLength += len; } else { if(_parsedLength == 0){ - if(_contentType.startsWith("application/x-www-form-urlencoded")){ + if(_contentType.startsWith(F("application/x-www-form-urlencoded"))){ _isPlainPost = true; - } else if(_contentType == "text/plain" && __is_param_char(((char*)buf)[0])){ + } else if(_contentType == F("text/plain") && __is_param_char(((char*)buf)[0])){ size_t i = 0; while (i 0){ g = u.substring(index +1); @@ -284,14 +303,14 @@ bool AsyncWebServerRequest::_parseReqHead(){ _url = urlDecode(u); _addGetParams(g); - if(!_temp.startsWith("HTTP/1.0")) + if(!_temp.startsWith(F("HTTP/1.0"))) _version = 1; _temp = String(); return true; } -bool strContains(String src, String find, bool mindcase = true) { +bool strContains(const String &src, const String &find, bool mindcase = true) { int pos=0, i=0; const int slen = src.length(); const int flen = find.length(); @@ -301,7 +320,10 @@ bool strContains(String src, String find, bool mindcase = true) { for (i=0; i < flen; i++) { if (mindcase) { if (src[pos+i] != find[i]) i = flen + 1; // no match - } else if (tolower(src[pos+i]) != tolower(find[i])) i = flen + 1; // no match + } + else if (tolower(src[pos+i]) != tolower(find[i])) { + i = flen + 1; // no match + } } if (i == flen) return true; pos++; @@ -316,36 +338,36 @@ bool AsyncWebServerRequest::_parseReqHeader(){ String value = _temp.substring(index + 2); if(name.equalsIgnoreCase("Host")){ _host = value; - } else if(name.equalsIgnoreCase("Content-Type")){ - _contentType = value.substring(0, value.indexOf(';')); - if (value.startsWith("multipart/")){ + } else if(name.equalsIgnoreCase(F("Content-Type"))){ + _contentType = value.substring(0, value.indexOf(';')); + if (value.startsWith(F("multipart/"))){ _boundary = value.substring(value.indexOf('=')+1); - _boundary.replace("\"",""); + _boundary.replace(String('"'), String()); _isMultipart = true; } - } else if(name.equalsIgnoreCase("Content-Length")){ + } else if(name.equalsIgnoreCase(F("Content-Length"))){ _contentLength = atoi(value.c_str()); - } else if(name.equalsIgnoreCase("Expect") && value == "100-continue"){ + } else if(name.equalsIgnoreCase(F("Expect")) && value == F("100-continue")){ _expectingContinue = true; - } else if(name.equalsIgnoreCase("Authorization")){ - if(value.length() > 5 && value.substring(0,5).equalsIgnoreCase("Basic")){ + } else if(name.equalsIgnoreCase(F("Authorization"))){ + if(value.length() > 5 && value.substring(0,5).equalsIgnoreCase(F("Basic"))){ _authorization = value.substring(6); - } else if(value.length() > 6 && value.substring(0,6).equalsIgnoreCase("Digest")){ + } else if(value.length() > 6 && value.substring(0,6).equalsIgnoreCase(F("Digest"))){ _isDigest = true; _authorization = value.substring(7); } } else { - if(name.equalsIgnoreCase("Upgrade") && value.equalsIgnoreCase("websocket")){ + if(name.equalsIgnoreCase(F("Upgrade")) && value.equalsIgnoreCase(F("websocket"))){ // WebSocket request can be uniquely identified by header: [Upgrade: websocket] _reqconntype = RCT_WS; } else { - if(name.equalsIgnoreCase("Accept") && strContains(value, "text/event-stream", false)){ + if(name.equalsIgnoreCase(F("Accept")) && strContains(value, F("text/event-stream"), false)){ // WebEvent request can be uniquely identified by header: [Accept: text/event-stream] _reqconntype = RCT_EVENT; } } } - _headers.add(new AsyncWebHeader(name, value)); + _headers.emplace_back(name, value); } _temp = String(); return true; @@ -355,9 +377,9 @@ void AsyncWebServerRequest::_parsePlainPostChar(uint8_t data){ if(data && (char)data != '&') _temp += (char)data; if(!data || (char)data == '&' || _parsedLength == _contentLength){ - String name = "body"; + String name = F("body"); String value = _temp; - if(!_temp.startsWith("{") && !_temp.startsWith("[") && _temp.indexOf('=') > 0){ + if(!_temp.startsWith(String('{')) && !_temp.startsWith(String('[')) && _temp.indexOf('=') > 0){ name = _temp.substring(0, _temp.indexOf('=')); value = _temp.substring(_temp.indexOf('=') + 1); } @@ -431,17 +453,17 @@ void AsyncWebServerRequest::_parseMultipartPostByte(uint8_t data, bool last){ _temp += (char)data; if((char)data == '\n'){ if(_temp.length()){ - if(_temp.length() > 12 && _temp.substring(0, 12).equalsIgnoreCase("Content-Type")){ + if(_temp.length() > 12 && _temp.substring(0, 12).equalsIgnoreCase(F("Content-Type"))){ _itemType = _temp.substring(14); _itemIsFile = true; - } else if(_temp.length() > 19 && _temp.substring(0, 19).equalsIgnoreCase("Content-Disposition")){ + } else if(_temp.length() > 19 && _temp.substring(0, 19).equalsIgnoreCase(F("Content-Disposition"))){ _temp = _temp.substring(_temp.indexOf(';') + 2); while(_temp.indexOf(';') > 0){ String name = _temp.substring(0, _temp.indexOf('=')); String nameVal = _temp.substring(_temp.indexOf('=') + 2, _temp.indexOf(';') - 1); - if(name == "name"){ + if(name == F("name")){ _itemName = nameVal; - } else if(name == "filename"){ + } else if(name == F("filename")){ _itemFilename = nameVal; _itemIsFile = true; } @@ -449,9 +471,9 @@ void AsyncWebServerRequest::_parseMultipartPostByte(uint8_t data, bool last){ } String name = _temp.substring(0, _temp.indexOf('=')); String nameVal = _temp.substring(_temp.indexOf('=') + 2, _temp.length() - 1); - if(name == "name"){ + if(name == F("name")){ _itemName = nameVal; - } else if(name == "filename"){ + } else if(name == F("filename")){ _itemFilename = nameVal; _itemIsFile = true; } @@ -570,8 +592,8 @@ void AsyncWebServerRequest::_parseLine(){ _server->_attachHandler(this); _removeNotInterestingHeaders(); if(_expectingContinue){ - const char * response = "HTTP/1.1 100 Continue\r\n\r\n"; - _client->write(response, os_strlen(response)); + String response = F("HTTP/1.1 100 Continue\r\n\r\n"); + _client->write(response.c_str(), response.length()); } //check handler for authentication if(_contentLength){ @@ -586,12 +608,12 @@ void AsyncWebServerRequest::_parseLine(){ } size_t AsyncWebServerRequest::headers() const{ - return _headers.length(); + return _headers.size(); } bool AsyncWebServerRequest::hasHeader(const String& name) const { for(const auto& h: _headers){ - if(h->name().equalsIgnoreCase(name)){ + if(h.name().equalsIgnoreCase(name)){ return true; } } @@ -599,51 +621,67 @@ bool AsyncWebServerRequest::hasHeader(const String& name) const { } bool AsyncWebServerRequest::hasHeader(const __FlashStringHelper * data) const { - PGM_P p = reinterpret_cast(data); - size_t n = 0; - while (1) { - if (pgm_read_byte(p+n) == 0) break; - n += 1; - } - char * name = (char*) malloc(n+1); - name[n] = 0; - if (name) { - for(size_t b=0; bname().equalsIgnoreCase(name)){ - return h; - } - } - return nullptr; +AsyncWebHeader* AsyncWebServerRequest::getHeader(const String& name) { + auto iter = std::find_if(std::begin(_headers), std::end(_headers), + [&name](const AsyncWebHeader &header){ return header.name().equalsIgnoreCase(name); }); + + if (iter == std::end(_headers)) + return nullptr; + + return &(*iter); } -AsyncWebHeader* AsyncWebServerRequest::getHeader(const __FlashStringHelper * data) const { +const AsyncWebHeader* AsyncWebServerRequest::getHeader(const String& name) const { + auto iter = std::find_if(std::begin(_headers), std::end(_headers), + [&name](const AsyncWebHeader &header){ return header.name().equalsIgnoreCase(name); }); + + if (iter == std::end(_headers)) + return nullptr; + + return &(*iter); +} + +AsyncWebHeader* AsyncWebServerRequest::getHeader(const __FlashStringHelper * data) { PGM_P p = reinterpret_cast(data); - size_t n = strlen_P(p); + size_t n = strlen_P(p); char * name = (char*) malloc(n+1); if (name) { - strcpy_P(name, p); - AsyncWebHeader* result = getHeader( String(name)); - free(name); - return result; + strcpy_P(name, p); + AsyncWebHeader* result = getHeader( String(name)); + free(name); + return result; } else { - return nullptr; + return nullptr; } } -AsyncWebHeader* AsyncWebServerRequest::getHeader(size_t num) const { - auto header = _headers.nth(num); - return header ? *header : nullptr; +const AsyncWebHeader* AsyncWebServerRequest::getHeader(const __FlashStringHelper * data) const { + PGM_P p = reinterpret_cast(data); + size_t n = strlen_P(p); + char * name = (char*) malloc(n+1); + if (name) { + strcpy_P(name, p); + const AsyncWebHeader* result = getHeader( String(name)); + free(name); + return result; + } else { + return nullptr; + } +} + +AsyncWebHeader* AsyncWebServerRequest::getHeader(size_t num) { + if (num >= _headers.size()) + return nullptr; + return &(*std::next(std::begin(_headers), num)); +} + +const AsyncWebHeader* AsyncWebServerRequest::getHeader(size_t num) const { + if (num >= _headers.size()) + return nullptr; + return &(*std::next(std::begin(_headers), num)); } size_t AsyncWebServerRequest::params() const { @@ -660,19 +698,7 @@ bool AsyncWebServerRequest::hasParam(const String& name, bool post, bool file) c } bool AsyncWebServerRequest::hasParam(const __FlashStringHelper * data, bool post, bool file) const { - PGM_P p = reinterpret_cast(data); - size_t n = strlen_P(p); - - char * name = (char*) malloc(n+1); - name[n] = 0; - if (name) { - strcpy_P(name,p); - bool result = hasParam( name, post, file); - free(name); - return result; - } else { - return false; - } + return hasParam(String(data).c_str(), post, file); } AsyncWebParameter* AsyncWebServerRequest::getParam(const String& name, bool post, bool file) const { @@ -685,17 +711,7 @@ AsyncWebParameter* AsyncWebServerRequest::getParam(const String& name, bool post } AsyncWebParameter* AsyncWebServerRequest::getParam(const __FlashStringHelper * data, bool post, bool file) const { - PGM_P p = reinterpret_cast(data); - size_t n = strlen_P(p); - char * name = (char*) malloc(n+1); - if (name) { - strcpy_P(name, p); - AsyncWebParameter* result = getParam(name, post, file); - free(name); - return result; - } else { - return nullptr; - } + return getParam(String(data).c_str(), post, file); } AsyncWebParameter* AsyncWebServerRequest::getParam(size_t num) const { @@ -704,8 +720,9 @@ AsyncWebParameter* AsyncWebServerRequest::getParam(size_t num) const { } void AsyncWebServerRequest::addInterestingHeader(const String& name){ - if(!_interestingHeaders.containsIgnoreCase(name)) - _interestingHeaders.add(name); + if(std::none_of(std::begin(_interestingHeaders), std::end(_interestingHeaders), + [&name](const String &str){ return str.equalsIgnoreCase(name); })) + _interestingHeaders.push_back(name); } void AsyncWebServerRequest::send(AsyncWebServerResponse *response){ @@ -731,7 +748,7 @@ AsyncWebServerResponse * AsyncWebServerRequest::beginResponse(int code, const St } AsyncWebServerResponse * AsyncWebServerRequest::beginResponse(FS &fs, const String& path, const String& contentType, bool download, AwsTemplateProcessor callback){ - if(fs.exists(path) || (!download && fs.exists(path+".gz"))) + if(fs.exists(path) || (!download && fs.exists(path+F(".gz")))) return new AsyncFileResponse(fs, path, contentType, download, callback); return NULL; } @@ -773,7 +790,7 @@ void AsyncWebServerRequest::send(int code, const String& contentType, const Stri } void AsyncWebServerRequest::send(FS &fs, const String& path, const String& contentType, bool download, AwsTemplateProcessor callback){ - if(fs.exists(path) || (!download && fs.exists(path+".gz"))){ + if(fs.exists(path) || (!download && fs.exists(path+F(".gz")))){ send(beginResponse(fs, path, contentType, download, callback)); } else send(404); } @@ -806,7 +823,7 @@ void AsyncWebServerRequest::send_P(int code, const String& contentType, PGM_P co void AsyncWebServerRequest::redirect(const String& url){ AsyncWebServerResponse * response = beginResponse(302); - response->addHeader("Location",url); + response->addHeader(F("Location"), url); send(response); } @@ -828,12 +845,12 @@ bool AsyncWebServerRequest::authenticate(const char * hash){ if(_isDigest){ String hStr = String(hash); - int separator = hStr.indexOf(":"); + int separator = hStr.indexOf(':'); if(separator <= 0) return false; String username = hStr.substring(0, separator); hStr = hStr.substring(separator + 1); - separator = hStr.indexOf(":"); + separator = hStr.indexOf(':'); if(separator <= 0) return false; String realm = hStr.substring(0, separator); @@ -847,16 +864,16 @@ bool AsyncWebServerRequest::authenticate(const char * hash){ void AsyncWebServerRequest::requestAuthentication(const char * realm, bool isDigest){ AsyncWebServerResponse * r = beginResponse(401); if(!isDigest && realm == NULL){ - r->addHeader("WWW-Authenticate", "Basic realm=\"Login Required\""); + r->addHeader(F("WWW-Authenticate"), F("Basic realm=\"Login Required\"")); } else if(!isDigest){ - String header = "Basic realm=\""; + String header = F("Basic realm=\""); header.concat(realm); - header.concat("\""); - r->addHeader("WWW-Authenticate", header); + header += '"'; + r->addHeader(F("WWW-Authenticate"), header); } else { - String header = "Digest "; + String header = F("Digest "); header.concat(requestDigestAuthentication(realm)); - r->addHeader("WWW-Authenticate", header); + r->addHeader(F("WWW-Authenticate"), header); } send(r); } @@ -871,17 +888,7 @@ bool AsyncWebServerRequest::hasArg(const char* name) const { } bool AsyncWebServerRequest::hasArg(const __FlashStringHelper * data) const { - PGM_P p = reinterpret_cast(data); - size_t n = strlen_P(p); - char * name = (char*) malloc(n+1); - if (name) { - strcpy_P(name, p); - bool result = hasArg( name ); - free(name); - return result; - } else { - return false; - } + return hasArg(String(data).c_str()); } @@ -891,22 +898,11 @@ const String& AsyncWebServerRequest::arg(const String& name) const { return arg->value(); } } - return SharedEmptyString; + return emptyString; } const String& AsyncWebServerRequest::arg(const __FlashStringHelper * data) const { - PGM_P p = reinterpret_cast(data); - size_t n = strlen_P(p); - char * name = (char*) malloc(n+1); - if (name) { - strcpy_P(name, p); - const String & result = arg( String(name) ); - free(name); - return result; - } else { - return SharedEmptyString; - } - + return arg(String(data).c_str()); } const String& AsyncWebServerRequest::arg(size_t i) const { @@ -918,38 +914,27 @@ const String& AsyncWebServerRequest::argName(size_t i) const { } const String& AsyncWebServerRequest::pathArg(size_t i) const { - auto param = _pathParams.nth(i); - return param ? **param : SharedEmptyString; + return i < _pathParams.size() ? _pathParams[i] : emptyString; } const String& AsyncWebServerRequest::header(const char* name) const { - AsyncWebHeader* h = getHeader(String(name)); - return h ? h->value() : SharedEmptyString; + const AsyncWebHeader* h = getHeader(String(name)); + return h ? h->value() : emptyString; } const String& AsyncWebServerRequest::header(const __FlashStringHelper * data) const { - PGM_P p = reinterpret_cast(data); - size_t n = strlen_P(p); - char * name = (char*) malloc(n+1); - if (name) { - strcpy_P(name, p); - const String & result = header( (const char *)name ); - free(name); - return result; - } else { - return SharedEmptyString; - } -}; + return header(String(data).c_str()); +}; const String& AsyncWebServerRequest::header(size_t i) const { - AsyncWebHeader* h = getHeader(i); - return h ? h->value() : SharedEmptyString; + const AsyncWebHeader* h = getHeader(i); + return h ? h->value() : emptyString; } const String& AsyncWebServerRequest::headerName(size_t i) const { - AsyncWebHeader* h = getHeader(i); - return h ? h->name() : SharedEmptyString; + const AsyncWebHeader* h = getHeader(i); + return h ? h->name() : emptyString; } String AsyncWebServerRequest::urlDecode(const String& text) const { @@ -976,26 +961,26 @@ String AsyncWebServerRequest::urlDecode(const String& text) const { } -const char * AsyncWebServerRequest::methodToString() const { - if(_method == HTTP_ANY) return "ANY"; - else if(_method & HTTP_GET) return "GET"; - else if(_method & HTTP_POST) return "POST"; - else if(_method & HTTP_DELETE) return "DELETE"; - else if(_method & HTTP_PUT) return "PUT"; - else if(_method & HTTP_PATCH) return "PATCH"; - else if(_method & HTTP_HEAD) return "HEAD"; - else if(_method & HTTP_OPTIONS) return "OPTIONS"; - return "UNKNOWN"; +const __FlashStringHelper *AsyncWebServerRequest::methodToString() const { + if(_method == HTTP_ANY) return F("ANY"); + else if(_method & HTTP_GET) return F("GET"); + else if(_method & HTTP_POST) return F("POST"); + else if(_method & HTTP_DELETE) return F("DELETE"); + else if(_method & HTTP_PUT) return F("PUT"); + else if(_method & HTTP_PATCH) return F("PATCH"); + else if(_method & HTTP_HEAD) return F("HEAD"); + else if(_method & HTTP_OPTIONS) return F("OPTIONS"); + return F("UNKNOWN"); } -const char *AsyncWebServerRequest::requestedConnTypeToString() const { +const __FlashStringHelper *AsyncWebServerRequest::requestedConnTypeToString() const { switch (_reqconntype) { - case RCT_NOT_USED: return "RCT_NOT_USED"; - case RCT_DEFAULT: return "RCT_DEFAULT"; - case RCT_HTTP: return "RCT_HTTP"; - case RCT_WS: return "RCT_WS"; - case RCT_EVENT: return "RCT_EVENT"; - default: return "ERROR"; + case RCT_NOT_USED: return F("RCT_NOT_USED"); + case RCT_DEFAULT: return F("RCT_DEFAULT"); + case RCT_HTTP: return F("RCT_HTTP"); + case RCT_WS: return F("RCT_WS"); + case RCT_EVENT: return F("RCT_EVENT"); + default: return F("ERROR"); } } diff --git a/src/WebResponseImpl.h b/src/WebResponseImpl.h index 9a64e3a..4a47225 100644 --- a/src/WebResponseImpl.h +++ b/src/WebResponseImpl.h @@ -27,6 +27,8 @@ #undef max #endif #include +#include + // It is possible to restore these defines, but one can use _min and _max instead. Or std::min, std::max. class AsyncBasicResponse: public AsyncWebServerResponse { @@ -122,7 +124,7 @@ class cbuf; class AsyncResponseStream: public AsyncAbstractResponse, public Print { private: - cbuf *_content; + std::unique_ptr _content; public: AsyncResponseStream(const String& contentType, size_t bufferSize); ~AsyncResponseStream(); diff --git a/src/WebResponses.cpp b/src/WebResponses.cpp index a22e991..22a549f 100644 --- a/src/WebResponses.cpp +++ b/src/WebResponses.cpp @@ -37,54 +37,57 @@ void* memchr(void* ptr, int ch, size_t count) * Abstract Response * */ const char* AsyncWebServerResponse::_responseCodeToString(int code) { + return reinterpret_cast(responseCodeToString(code)); +} + +const __FlashStringHelper *AsyncWebServerResponse::responseCodeToString(int code) { switch (code) { - case 100: return "Continue"; - case 101: return "Switching Protocols"; - case 200: return "OK"; - case 201: return "Created"; - case 202: return "Accepted"; - case 203: return "Non-Authoritative Information"; - case 204: return "No Content"; - case 205: return "Reset Content"; - case 206: return "Partial Content"; - case 300: return "Multiple Choices"; - case 301: return "Moved Permanently"; - case 302: return "Found"; - case 303: return "See Other"; - case 304: return "Not Modified"; - case 305: return "Use Proxy"; - case 307: return "Temporary Redirect"; - case 400: return "Bad Request"; - case 401: return "Unauthorized"; - case 402: return "Payment Required"; - case 403: return "Forbidden"; - case 404: return "Not Found"; - case 405: return "Method Not Allowed"; - case 406: return "Not Acceptable"; - case 407: return "Proxy Authentication Required"; - case 408: return "Request Time-out"; - case 409: return "Conflict"; - case 410: return "Gone"; - case 411: return "Length Required"; - case 412: return "Precondition Failed"; - case 413: return "Request Entity Too Large"; - case 414: return "Request-URI Too Large"; - case 415: return "Unsupported Media Type"; - case 416: return "Requested range not satisfiable"; - case 417: return "Expectation Failed"; - case 500: return "Internal Server Error"; - case 501: return "Not Implemented"; - case 502: return "Bad Gateway"; - case 503: return "Service Unavailable"; - case 504: return "Gateway Time-out"; - case 505: return "HTTP Version not supported"; - default: return ""; + case 100: return F("Continue"); + case 101: return F("Switching Protocols"); + case 200: return F("OK"); + case 201: return F("Created"); + case 202: return F("Accepted"); + case 203: return F("Non-Authoritative Information"); + case 204: return F("No Content"); + case 205: return F("Reset Content"); + case 206: return F("Partial Content"); + case 300: return F("Multiple Choices"); + case 301: return F("Moved Permanently"); + case 302: return F("Found"); + case 303: return F("See Other"); + case 304: return F("Not Modified"); + case 305: return F("Use Proxy"); + case 307: return F("Temporary Redirect"); + case 400: return F("Bad Request"); + case 401: return F("Unauthorized"); + case 402: return F("Payment Required"); + case 403: return F("Forbidden"); + case 404: return F("Not Found"); + case 405: return F("Method Not Allowed"); + case 406: return F("Not Acceptable"); + case 407: return F("Proxy Authentication Required"); + case 408: return F("Request Time-out"); + case 409: return F("Conflict"); + case 410: return F("Gone"); + case 411: return F("Length Required"); + case 412: return F("Precondition Failed"); + case 413: return F("Request Entity Too Large"); + case 414: return F("Request-URI Too Large"); + case 415: return F("Unsupported Media Type"); + case 416: return F("Requested range not satisfiable"); + case 417: return F("Expectation Failed"); + case 500: return F("Internal Server Error"); + case 501: return F("Not Implemented"); + case 502: return F("Bad Gateway"); + case 503: return F("Service Unavailable"); + case 504: return F("Gateway Time-out"); + case 505: return F("HTTP Version not supported"); + default: return F(""); } } AsyncWebServerResponse::AsyncWebServerResponse() : _code(0) - , _headers(LinkedList([](AsyncWebHeader *h){ delete h; })) , _contentType() , _contentLength(0) , _sendContentLength(true) @@ -95,14 +98,12 @@ AsyncWebServerResponse::AsyncWebServerResponse() , _writtenLength(0) , _state(RESPONSE_SETUP) { - for(auto header: DefaultHeaders::Instance()) { - _headers.add(new AsyncWebHeader(header->name(), header->value())); + for(const auto &header: DefaultHeaders::Instance()) { + _headers.emplace_back(header); } } -AsyncWebServerResponse::~AsyncWebServerResponse(){ - _headers.free(); -} +AsyncWebServerResponse::~AsyncWebServerResponse() = default; void AsyncWebServerResponse::setCode(int code){ if(_state == RESPONSE_SETUP) @@ -120,38 +121,38 @@ void AsyncWebServerResponse::setContentType(const String& type){ } void AsyncWebServerResponse::addHeader(const String& name, const String& value){ - _headers.add(new AsyncWebHeader(name, value)); + _headers.emplace_back(name, value); } String AsyncWebServerResponse::_assembleHead(uint8_t version){ if(version){ - addHeader("Accept-Ranges","none"); + addHeader(F("Accept-Ranges"), F("none")); if(_chunked) - addHeader("Transfer-Encoding","chunked"); + addHeader(F("Transfer-Encoding"), F("chunked")); } String out = String(); int bufSize = 300; char buf[bufSize]; - snprintf(buf, bufSize, "HTTP/1.%d %d %s\r\n", version, _code, _responseCodeToString(_code)); + snprintf_P(buf, bufSize, PSTR("HTTP/1.%d %d %s\r\n"), version, _code, _responseCodeToString(_code)); out.concat(buf); if(_sendContentLength) { - snprintf(buf, bufSize, "Content-Length: %d\r\n", _contentLength); + snprintf_P(buf, bufSize, PSTR("Content-Length: %d\r\n"), _contentLength); out.concat(buf); } if(_contentType.length()) { - snprintf(buf, bufSize, "Content-Type: %s\r\n", _contentType.c_str()); + snprintf_P(buf, bufSize, PSTR("Content-Type: %s\r\n"), _contentType.c_str()); out.concat(buf); } for(const auto& header: _headers){ - snprintf(buf, bufSize, "%s: %s\r\n", header->name().c_str(), header->value().c_str()); + snprintf_P(buf, bufSize, PSTR("%s: %s\r\n"), header.name().c_str(), header.value().c_str()); out.concat(buf); } - _headers.free(); + _headers.clear(); - out.concat("\r\n"); + out.concat(F("\r\n")); _headLength = out.length(); return out; } @@ -173,9 +174,9 @@ AsyncBasicResponse::AsyncBasicResponse(int code, const String& contentType, cons if(_content.length()){ _contentLength = _content.length(); if(!_contentType.length()) - _contentType = "text/plain"; + _contentType = F("text/plain"); } - addHeader("Connection","close"); + addHeader(F("Connection"), F("close")); } void AsyncBasicResponse::_respond(AsyncWebServerRequest *request){ @@ -255,7 +256,7 @@ AsyncAbstractResponse::AsyncAbstractResponse(AwsTemplateProcessor callback): _ca } void AsyncAbstractResponse::_respond(AsyncWebServerRequest *request){ - addHeader("Connection","close"); + addHeader(F("Connection"), F("close")); _head = _assembleHead(request->version()); _state = RESPONSE_HEADERS; _ack(request, 0, 0); @@ -317,7 +318,7 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u free(buf); return 0; } - outLen = sprintf((char*)buf+headLen, "%x", readLen) + headLen; + outLen = sprintf_P((char*)buf+headLen, PSTR("%x"), readLen) + headLen; while(outLen < headLen + 4) buf[outLen++] = ' '; buf[outLen++] = '\r'; buf[outLen++] = '\n'; @@ -396,7 +397,7 @@ size_t AsyncAbstractResponse::_fillBufferAndProcessTemplates(uint8_t* data, size // If closing placeholder is found: if(pTemplateEnd) { // prepare argument to callback - const size_t paramNameLength = std::min(sizeof(buf) - 1, (unsigned int)(pTemplateEnd - pTemplateStart - 1)); + const size_t paramNameLength = std::min((size_t)sizeof(buf) - 1, (size_t)(pTemplateEnd - pTemplateStart - 1)); if(paramNameLength) { memcpy(buf, pTemplateStart + 1, paramNameLength); buf[paramNameLength] = 0; @@ -483,43 +484,48 @@ AsyncFileResponse::~AsyncFileResponse(){ } void AsyncFileResponse::_setContentType(const String& path){ - if (path.endsWith(".html")) _contentType = "text/html"; - else if (path.endsWith(".htm")) _contentType = "text/html"; - else if (path.endsWith(".css")) _contentType = "text/css"; - else if (path.endsWith(".json")) _contentType = "application/json"; - else if (path.endsWith(".js")) _contentType = "application/javascript"; - else if (path.endsWith(".png")) _contentType = "image/png"; - else if (path.endsWith(".gif")) _contentType = "image/gif"; - else if (path.endsWith(".jpg")) _contentType = "image/jpeg"; - else if (path.endsWith(".ico")) _contentType = "image/x-icon"; - else if (path.endsWith(".svg")) _contentType = "image/svg+xml"; - else if (path.endsWith(".eot")) _contentType = "font/eot"; - else if (path.endsWith(".woff")) _contentType = "font/woff"; - else if (path.endsWith(".woff2")) _contentType = "font/woff2"; - else if (path.endsWith(".ttf")) _contentType = "font/ttf"; - else if (path.endsWith(".xml")) _contentType = "text/xml"; - else if (path.endsWith(".pdf")) _contentType = "application/pdf"; - else if (path.endsWith(".zip")) _contentType = "application/zip"; - else if(path.endsWith(".gz")) _contentType = "application/x-gzip"; - else _contentType = "text/plain"; +#if HAVE_EXTERN_GET_CONTENT_TYPE_FUNCTION + extern const __FlashStringHelper *getContentType(const String &path); + _contentType = getContentType(path); +#else + if (path.endsWith(F(".html"))) _contentType = F("text/html"); + else if (path.endsWith(F(".htm"))) _contentType = F("text/html"); + else if (path.endsWith(F(".css"))) _contentType = F("text/css"); + else if (path.endsWith(F(".json"))) _contentType = F("application/json"); + else if (path.endsWith(F(".js"))) _contentType = F("application/javascript"); + else if (path.endsWith(F(".png"))) _contentType = F("image/png"); + else if (path.endsWith(F(".gif"))) _contentType = F("image/gif"); + else if (path.endsWith(F(".jpg"))) _contentType = F("image/jpeg"); + else if (path.endsWith(F(".ico"))) _contentType = F("image/x-icon"); + else if (path.endsWith(F(".svg"))) _contentType = F("image/svg+xml"); + else if (path.endsWith(F(".eot"))) _contentType = F("font/eot"); + else if (path.endsWith(F(".woff"))) _contentType = F("font/woff"); + else if (path.endsWith(F(".woff2"))) _contentType = F("font/woff2"); + else if (path.endsWith(F(".ttf"))) _contentType = F("font/ttf"); + else if (path.endsWith(F(".xml"))) _contentType = F("text/xml"); + else if (path.endsWith(F(".pdf"))) _contentType = F("application/pdf"); + else if (path.endsWith(F(".zip"))) _contentType = F("application/zip"); + else if(path.endsWith(F(".gz"))) _contentType = F("application/x-gzip"); + else _contentType = F("text/plain"); +#endif } AsyncFileResponse::AsyncFileResponse(FS &fs, const String& path, const String& contentType, bool download, AwsTemplateProcessor callback): AsyncAbstractResponse(callback){ _code = 200; _path = path; - if(!download && !fs.exists(_path) && fs.exists(_path+".gz")){ - _path = _path+".gz"; - addHeader("Content-Encoding", "gzip"); + if(!download && !fs.exists(_path) && fs.exists(_path + F(".gz"))){ + _path = _path + F(".gz"); + addHeader(F("Content-Encoding"), F("gzip")); _callback = nullptr; // Unable to process zipped templates _sendContentLength = true; _chunked = false; } - _content = fs.open(_path, "r"); + _content = fs.open(_path, fs::FileOpenMode::read); _contentLength = _content.size(); - if(contentType == "") + if(contentType.length() == 0) _setContentType(path); else _contentType = contentType; @@ -530,20 +536,20 @@ AsyncFileResponse::AsyncFileResponse(FS &fs, const String& path, const String& c if(download) { // set filename and force download - snprintf(buf, sizeof (buf), "attachment; filename=\"%s\"", filename); + snprintf_P(buf, sizeof (buf), PSTR("attachment; filename=\"%s\""), filename); } else { // set filename and force rendering - snprintf(buf, sizeof (buf), "inline; filename=\"%s\"", filename); + snprintf_P(buf, sizeof (buf), PSTR("inline; filename=\"%s\""), filename); } - addHeader("Content-Disposition", buf); + addHeader(F("Content-Disposition"), buf); } AsyncFileResponse::AsyncFileResponse(File content, const String& path, const String& contentType, bool download, AwsTemplateProcessor callback): AsyncAbstractResponse(callback){ _code = 200; _path = path; - if(!download && String(content.name()).endsWith(".gz") && !path.endsWith(".gz")){ - addHeader("Content-Encoding", "gzip"); + if(!download && String(content.name()).endsWith(F(".gz")) && !path.endsWith(F(".gz"))){ + addHeader(F("Content-Encoding"), F("gzip")); _callback = nullptr; // Unable to process gzipped templates _sendContentLength = true; _chunked = false; @@ -552,7 +558,7 @@ AsyncFileResponse::AsyncFileResponse(File content, const String& path, const Str _content = content; _contentLength = _content.size(); - if(contentType == "") + if(contentType.length() == 0) _setContentType(path); else _contentType = contentType; @@ -562,11 +568,11 @@ AsyncFileResponse::AsyncFileResponse(File content, const String& path, const Str char* filename = (char*)path.c_str() + filenameStart; if(download) { - snprintf(buf, sizeof (buf), "attachment; filename=\"%s\"", filename); + snprintf_P(buf, sizeof (buf), PSTR("attachment; filename=\"%s\""), filename); } else { - snprintf(buf, sizeof (buf), "inline; filename=\"%s\"", filename); + snprintf_P(buf, sizeof (buf), PSTR("inline; filename=\"%s\""), filename); } - addHeader("Content-Disposition", buf); + addHeader(F("Content-Disposition"), buf); } size_t AsyncFileResponse::_fillBuffer(uint8_t *data, size_t len){ @@ -666,16 +672,15 @@ size_t AsyncProgmemResponse::_fillBuffer(uint8_t *data, size_t len){ * Response Stream (You can print/write/printf to it, up to the contentLen bytes) * */ -AsyncResponseStream::AsyncResponseStream(const String& contentType, size_t bufferSize){ +AsyncResponseStream::AsyncResponseStream(const String& contentType, size_t bufferSize) +{ _code = 200; _contentLength = 0; _contentType = contentType; - _content = new cbuf(bufferSize); + _content = std::unique_ptr(new cbuf(bufferSize)); //std::make_unique(bufferSize); } -AsyncResponseStream::~AsyncResponseStream(){ - delete _content; -} +AsyncResponseStream::~AsyncResponseStream() = default; size_t AsyncResponseStream::_fillBuffer(uint8_t *buf, size_t maxLen){ return _content->read((char*)buf, maxLen); diff --git a/src/WebServer.cpp b/src/WebServer.cpp index e72e55e..62e85b2 100644 --- a/src/WebServer.cpp +++ b/src/WebServer.cpp @@ -29,11 +29,16 @@ bool ON_AP_FILTER(AsyncWebServerRequest *request) { return WiFi.localIP() != request->client()->localIP(); } +#ifndef HAVE_FS_FILE_OPEN_MODE +const char *fs::FileOpenMode::read = "r"; +const char *fs::FileOpenMode::write = "w"; +const char *fs::FileOpenMode::append = "a"; +#endif AsyncWebServer::AsyncWebServer(uint16_t port) : _server(port) - , _rewrites(LinkedList(nullptr)) - , _handlers(LinkedList(nullptr)) + , _rewrites(LinkedList([](AsyncWebRewrite* r){ delete r; })) + , _handlers(LinkedList([](AsyncWebHandler* h){ delete h; })) { _catchAllHandler = new AsyncCallbackWebHandler(); if(_catchAllHandler == NULL) @@ -52,7 +57,7 @@ AsyncWebServer::AsyncWebServer(uint16_t port) } AsyncWebServer::~AsyncWebServer(){ - reset(); + reset(); end(); if(_catchAllHandler) delete _catchAllHandler; } @@ -118,8 +123,8 @@ void AsyncWebServer::_attachHandler(AsyncWebServerRequest *request){ return; } } - - request->addInterestingHeader("ANY"); + + request->addInterestingHeader(F("ANY")); request->setHandler(_catchAllHandler); } @@ -183,7 +188,7 @@ void AsyncWebServer::onRequestBody(ArBodyHandlerFunction fn){ void AsyncWebServer::reset(){ _rewrites.free(); _handlers.free(); - + if (_catchAllHandler != NULL){ _catchAllHandler->onRequest(NULL); _catchAllHandler->onUpload(NULL); diff --git a/src/edit.htm b/src/edit.htm new file mode 100644 index 0000000..5d497ea --- /dev/null +++ b/src/edit.htm @@ -0,0 +1,581 @@ + + + + + ESP Editor + + + + + + + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/src/edit.htm.gz.h b/src/edit.htm.gz.h new file mode 100644 index 0000000..aa77e28 --- /dev/null +++ b/src/edit.htm.gz.h @@ -0,0 +1,231 @@ + +//File: edit.htm.gz, Size: 4503 +#define edit_htm_gz_len 4503 +const uint8_t edit_htm_gz[] PROGMEM = { +0x1F,0x8B,0x08,0x08,0x5A,0xE6,0xAE,0x5F,0x02,0x00,0x65,0x64,0x69,0x74,0x2E,0x68,0x74,0x6D,0x00,0xB5, +0x1A,0x0B,0x5B,0xDB,0x36,0xF0,0xAF,0x18,0x6F,0x63,0xF6,0xE2,0x38,0x0E,0x50,0xD6,0x3A,0x18,0x16,0x1E, +0xEB,0xBB,0x50,0x12,0xDA,0xD1,0x8E,0xED,0x53,0x6C,0x25,0x56,0xB1,0x25,0xCF,0x96,0x09,0x34,0xCD,0x7F, +0xDF,0x49,0xF2,0x93,0x84,0xEE,0xF1,0x6D,0xA5,0x60,0x49,0xA7,0x3B,0xDD,0x9D,0xEE,0x25,0xD9,0x7B,0x1B, +0xC7,0xA7,0x47,0xE3,0xCB,0xB3,0x13,0x2D,0xE4,0x71,0xB4,0xBF,0x27,0xFE,0x6A,0x11,0xA2,0x33,0x4F,0xC7, +0x54,0xDF,0xDF,0x8B,0x31,0x47,0x00,0xE2,0x49,0x17,0xFF,0x91,0x93,0x1B,0x4F,0x3F,0x62,0x94,0x63,0xCA, +0xBB,0xFC,0x2E,0xC1,0xBA,0xE6,0xAB,0x9E,0xA7,0x73,0x7C,0xCB,0x7B,0x02,0x79,0xA0,0xF9,0x21,0x4A,0x33, +0xCC,0xBD,0x9C,0x4F,0xBB,0x8F,0x81,0x04,0x27,0x3C,0xC2,0xFB,0x27,0xA3,0x33,0xED,0x24,0x20,0x9C,0xA5, +0x7B,0x3D,0x35,0xB2,0x17,0x11,0x7A,0xAD,0xA5,0x38,0xF2,0x74,0x94,0x24,0x11,0xEE,0x72,0x96,0xFB,0x61, +0x97,0x00,0x4D,0x5D,0x0B,0x53,0x3C,0xF5,0xF4,0x1E,0xF2,0xB1,0x0D,0x03,0xBA,0x26,0x96,0xF3,0x74,0x12, +0xA3,0x19,0xEE,0xDD,0xAA,0x39,0x4D,0x02,0x59,0xC8,0x52,0xEE,0xE7,0x5C,0xFB,0x57,0xD8,0xFF,0x00,0x29, +0xE3,0x77,0x11,0x56,0x20,0x25,0xB3,0x9F,0x65,0xBA,0x16,0xE3,0x80,0x20,0xE0,0xC2,0x4F,0xB1,0xD0,0x5A, +0x84,0x26,0x38,0x5A,0x4C,0x19,0xA8,0x29,0x23,0x9F,0xB1,0xDB,0xDF,0x4A,0x6E,0x07,0xB2,0x3B,0x45,0x31, +0x89,0xEE,0xDC,0x0C,0xD1,0xAC,0x9B,0xE1,0x94,0x4C,0x97,0xB6,0x1F,0x2F,0x3E,0x77,0x09,0x0D,0xF0,0xAD, +0xBB,0xED,0x38,0x83,0x84,0x65,0x84,0x13,0x46,0x5D,0x34,0xC9,0x58,0x94,0x73,0x3C,0x88,0xF0,0x94,0xBB, +0x8F,0x80,0xC2,0x84,0xA5,0x01,0x4E,0xDD,0x7E,0x72,0xAB,0x01,0x88,0x04,0xDA,0x37,0x3B,0x3B,0x3B,0x83, +0x09,0xF2,0xAF,0x67,0x29,0xCB,0x69,0xD0,0xF5,0x59,0xC4,0x52,0xF7,0x9B,0xE9,0x23,0xF1,0x33,0x08,0x48, +0x96,0x44,0xE8,0xCE,0xA5,0x8C,0x62,0xC0,0xBD,0xED,0x66,0x21,0x0A,0xD8,0xDC,0x75,0x34,0x47,0xEB,0x3B, +0x40,0x24,0x9D,0x4D,0x90,0xE1,0x58,0xE2,0xC7,0xDE,0x31,0x07,0x7F,0x8B,0x5F,0x35,0x3C,0xC7,0x64,0x16, +0x72,0xF7,0x47,0xC7,0x11,0xFC,0x6B,0x79,0xB4,0x88,0x48,0xC6,0xBB,0x52,0x39,0x6A,0x3D,0xCE,0x12,0xD7, +0x91,0xAC,0xC3,0x23,0x46,0xE9,0x8C,0x50,0x68,0x24,0x28,0x08,0x08,0x9D,0xB9,0x0A,0x2D,0x22,0x8B,0x4A, +0x5A,0xD8,0x07,0xC4,0xC9,0x0D,0x1E,0xC4,0x84,0x76,0xE7,0x24,0xE0,0xA1,0xBB,0xEB,0x00,0x17,0x7E,0x9E, +0x66,0x20,0x53,0xC2,0x08,0xE5,0x38,0x95,0x68,0x59,0x82,0xE8,0x42,0x89,0x2A,0x14,0x50,0xC9,0x49,0x28, +0xEC,0x28,0xEE,0x4E,0x22,0xE6,0x5F,0x57,0x2B,0xED,0x26,0xB7,0xC5,0x5A,0x6E,0xC8,0x6E,0x70,0xBA,0xA8, +0xD5,0x25,0xB1,0x5B,0xC0,0x16,0x69,0x8C,0xF1,0xD2,0xE6,0x37,0x39,0x40,0x2D,0xF9,0x04,0x29,0x0B,0xAA, +0x4D,0x91,0xDA,0x82,0x17,0x28,0x84,0x26,0x39,0x5F,0xAC,0x6E,0x25,0x4B,0x90,0x4F,0xF8,0x9D,0xEB,0xC8, +0x69,0xD2,0x42,0xDC,0x1D,0xC7,0xD1,0x84,0xC2,0xB5,0x77,0x38,0x0D,0x10,0x45,0xD6,0x30,0x25,0x28,0xB2, +0x46,0xB5,0xCA,0xBB,0x31,0xFB,0xDC,0xCD,0xA1,0x0D,0xFD,0x08,0xFB,0x5C,0x69,0x18,0x36,0x61,0x72,0x4D, +0xF8,0x2A,0x60,0x65,0xA0,0xA1,0x2B,0xA9,0xA1,0x50,0xED,0x5E,0x1F,0x74,0x23,0xF9,0x50,0x62,0x2B,0x89, +0xBA,0x13,0xC6,0x39,0x8B,0xA5,0xBD,0x55,0xD2,0x6A,0xD2,0x64,0x1E,0xAF,0x6C,0xC7,0x7A,0xD5,0x37,0xC8, +0x0F,0x40,0xA9,0x9C,0xF8,0x28,0xEA,0xA2,0x88,0xCC,0xA8,0x1B,0x93,0x20,0x88,0x70,0xC3,0x64,0xDD,0x3C, +0x8D,0x8C,0x00,0x71,0xE4,0x2A,0x3F,0x4B,0xE8,0x0C,0xA0,0x19,0xDE,0xDD,0xB1,0xC8,0xBB,0xC3,0xD3,0xF3, +0xB9,0xF3,0xF2,0xE9,0x8C,0x0D,0xE1,0xDF,0x9B,0xD1,0x45,0x78,0x72,0x31,0x83,0xD6,0xA1,0xE8,0x0E,0xDF, +0x1E,0x0D,0xDF,0xC2,0xE3,0xA8,0xDF,0xF9,0x34,0xFD,0x63,0x28,0x86,0x9F,0x06,0x87,0xE3,0x8B,0x93,0xE1, +0xF0,0x65,0xEF,0xF9,0x9B,0xF9,0xFB,0x97,0xBB,0x02,0x7C,0x18,0x39,0xE7,0xEF,0x42,0xE7,0x62,0xEB,0x49, +0x1C,0x3C,0x0B,0x42,0x3F,0xBE,0x18,0xBE,0x7D,0x7F,0x7E,0x73,0x19,0x5F,0xCC,0x46,0xEF,0xFB,0xE1,0x87, +0xAD,0x77,0xA3,0x0F,0xEF,0x7F,0xBE,0xC6,0xBF,0x3C,0x7B,0xF1,0x61,0x3C,0x07,0x84,0x63,0x36,0xBA,0x38, +0x3F,0x7C,0x77,0x38,0xFB,0x70,0xE8,0x9F,0xDC,0x4E,0xA2,0x37,0x87,0x4F,0x87,0x93,0xE1,0x96,0x8F,0xF1, +0x6C,0x7C,0x7E,0x98,0x3F,0x7F,0x79,0x3A,0x23,0x24,0x1C,0x7D,0x78,0x33,0xF6,0x8F,0x1E,0xBD,0xBA,0x78, +0x36,0x24,0xE1,0x9B,0x17,0xE7,0xCE,0xF5,0xD3,0x97,0x47,0xC7,0xFE,0xE5,0x8B,0xCB,0xDD,0xE3,0xED,0xDE, +0x8F,0x3F,0xBE,0x0E,0x4E,0x09,0x1D,0xDF,0x7C,0x1E,0xCE,0x8E,0xE6,0x8F,0xEF,0xB2,0x71,0xF8,0xFC,0x86, +0xF6,0xDE,0xB1,0x4F,0xCF,0xEF,0x5E,0xC3,0xEF,0xD9,0x59,0x67,0x32,0xEA,0x67,0x17,0x6F,0x9F,0xBF,0xDB, +0xCA,0x9E,0x3C,0x4A,0x0E,0x8F,0x8F,0x6F,0xE2,0xC9,0x59,0x2F,0x0E,0xAE,0xA7,0xFC,0xF1,0x36,0x4F,0x2E, +0x67,0xF9,0x87,0x3F,0x1E,0xBD,0x08,0x7B,0xA7,0x18,0x5D,0x86,0x9D,0xBB,0xCF,0x77,0x8F,0xC3,0xF1,0xB3, +0x9B,0x37,0x11,0xBA,0x7D,0xF3,0xC6,0xFF,0x1C,0x77,0x22,0xF4,0xE4,0x74,0x1C,0xA1,0xB4,0x7F,0x11,0x0C, +0x7B,0x9D,0xA3,0xAD,0xE1,0x0E,0x4F,0xCF,0x8F,0xE8,0xF1,0xF6,0xA7,0xD1,0xE3,0xC3,0xC3,0x3E,0x9B,0xFC, +0xB1,0xF5,0xF4,0x7A,0xF7,0xE9,0xC5,0xEE,0xDB,0xC9,0xDB,0xE1,0x68,0xE7,0xF0,0x02,0x5D,0x8E,0xDE,0x0E, +0xA7,0x3B,0x93,0x30,0x7C,0xF9,0x72,0xFC,0x73,0x30,0xFC,0x9C,0x0E,0x4F,0xE7,0xC3,0xDB,0x93,0x8B,0xE1, +0xB3,0xCE,0xCB,0x93,0xD7,0x4E,0x7F,0x74,0xB9,0x3D,0x7B,0xBD,0x3B,0x3F,0xCC,0x4E,0x86,0x6F,0x0F,0x9D, +0xD9,0x8B,0x4E,0x8C,0x3E,0xB0,0xA3,0xED,0xD9,0xF3,0x5D,0x72,0x76,0x89,0x86,0xCF,0x0F,0x5F,0x64,0xE4, +0x3C,0x7E,0x76,0xE1,0x0C,0x87,0xAF,0x4E,0xF1,0xCF,0x47,0xDB,0xE8,0xE5,0x96,0xFF,0x1E,0xF4,0x7F,0xF1, +0x0B,0xFE,0xB1,0x33,0x9C,0x9F,0x3A,0x91,0xFF,0x04,0x8F,0x9F,0x5D,0x8E,0xE5,0xEE,0x9C,0x44,0x3F,0x8F, +0xAF,0x47,0xF9,0xDB,0xF8,0xE8,0xC8,0xD4,0x28,0xEB,0xA6,0x38,0xC1,0x88,0x37,0x63,0x55,0xE5,0x1C,0x60, +0x5B,0xB5,0x15,0x16,0x4E,0x2A,0x22,0x6B,0x37,0xC0,0x3E,0x4B,0x91,0x9C,0x03,0x08,0x38,0x15,0x26,0xB6, +0xFC,0x49,0x86,0x5A,0x4D,0x45,0x5A,0x0D,0xD1,0x40,0x33,0x4A,0x47,0x88,0x09,0x05,0x9C,0x1B,0xE2,0xE3, +0x6E,0x42,0x6E,0x71,0xD4,0x95,0xC8,0xAE,0x63,0x2E,0xA4,0xB3,0x95,0xD3,0x10,0x25,0xB1,0xA2,0x5A,0x0E, +0x04,0x9F,0x90,0x2F,0x52,0x1A,0xB8,0x4C,0x0C,0xCF,0xC2,0x77,0x58,0xDA,0x9D,0xE4,0xB3,0x29,0xB9,0x05, +0x6F,0x9E,0x12,0x4A,0x38,0xD6,0xFA,0xD9,0xF2,0xA7,0x92,0xCC,0x35,0xBE,0x9B,0xA6,0x28,0xC6,0x99,0xF6, +0x37,0xC9,0x2C,0xA6,0x29,0x8B,0x17,0x75,0x04,0xE4,0xAC,0xD1,0x59,0x2E,0xBF,0xC9,0x93,0x88,0x21,0x10, +0x73,0x25,0x6C,0x94,0xC1,0x34,0x15,0x6E,0x55,0x05,0xD5,0xD2,0xCD,0xB6,0xC0,0x2D,0x5B,0x6E,0xBD,0xB5, +0x53,0xBB,0x6E,0x57,0xCE,0x15,0xC1,0xBE,0xA9,0xFA,0x46,0x3C,0x68,0xC4,0xBA,0x6F,0x38,0xA8,0x74,0xFD, +0xE2,0x6A,0x11,0x15,0x19,0x6A,0x06,0x54,0x94,0xEE,0xEF,0x3A,0x8D,0x50,0x01,0xF3,0x96,0xDF,0x60,0x99, +0xE6,0xAD,0x6F,0x92,0x14,0x76,0x03,0xCF,0xBF,0x42,0xB3,0x92,0xA9,0x4D,0x1B,0x68,0x56,0xE9,0x4E,0x89, +0x50,0xE7,0x3C,0xC9,0x6B,0x45,0x7A,0x55,0x2A,0x00,0x57,0xDC,0x3C,0x12,0xDC,0x7C,0x55,0xAB,0xDB,0xBB, +0xDF,0x15,0x3C,0xEC,0x38,0xDF,0x2D,0x6D,0x35,0xB7,0xCA,0xC7,0x7D,0x07,0xFE,0x95,0x69,0xF7,0x71,0xCD, +0xC2,0xE4,0x91,0xF8,0x29,0x19,0x04,0x3A,0x4D,0xE0,0xF6,0xCE,0x93,0xC7,0xC1,0xA4,0x04,0x2A,0xC1,0x1E, +0x86,0xA7,0x28,0x20,0x79,0xE6,0x3E,0x72,0xBE,0x53,0xFA,0x84,0xED,0x03,0xD9,0xCB,0xCD,0x55,0x9D,0xDA, +0x62,0xB3,0x84,0x50,0x6D,0x2B,0xD3,0xC4,0x7E,0xA3,0xB4,0x32,0xCC,0x66,0xAA,0x07,0x17,0xA9,0x4D,0x53, +0xCC,0x5F,0x38,0xDF,0x2D,0x78,0x8A,0x68,0x36,0x65,0x69,0xEC,0xA6,0x8C,0x23,0x8E,0x0D,0xC7,0x5C,0xF6, +0x9D,0x75,0x80,0xED,0x5D,0x27,0xC0,0x33,0x73,0xB9,0xDC,0xEB,0xC9,0xA4,0x06,0x15,0x8F,0x9F,0x92,0x84, +0xEF,0x4F,0x73,0xEA,0x0B,0x1E,0xB4,0x19,0x36,0xB0,0xB9,0x48,0x31,0xCF,0x53,0xAA,0x05,0xCC,0xCF,0x85, +0xB1,0xDB,0x33,0xCC,0x4F,0x94,0xDD,0x1F,0xDE,0x3D,0x0F,0x60,0xC6,0xB2,0x42,0xF0,0xD7,0x22,0x80,0x03, +0xC3,0x7A,0x05,0x4E,0x6B,0x3E,0x24,0x18,0x20,0xF2,0x12,0xDF,0x19,0xD8,0xE2,0x15,0x22,0xB6,0xC5,0xB8, +0x61,0x94,0xD3,0x00,0x48,0xCD,0xC5,0x0D,0x68,0x01,0x79,0xF8,0x23,0xBF,0xB2,0x88,0x47,0xE1,0x31,0x28, +0xA6,0x93,0x7D,0x74,0xD0,0xED,0xBB,0x68,0x9F,0x1C,0xF4,0xC1,0xBF,0xCC,0x06,0x7D,0xB5,0xF2,0xCF,0x24, +0xC2,0x17,0x85,0xCB,0x89,0x85,0x6A,0x6A,0x3D,0x83,0x9C,0x85,0xA0,0x48,0xF3,0x07,0xE3,0x74,0xA4,0x19, +0x1F,0x7F,0xEC,0x3E,0xB9,0xFA,0xD2,0xFF,0xE8,0x74,0xFB,0x57,0xE6,0xEF,0x66,0x8F,0xD8,0x1C,0x67,0xDC, +0xA0,0xE8,0x86,0xCC,0x10,0xD8,0xB9,0x2D,0xF2,0xED,0x70,0x06,0x52,0x98,0x83,0x6A,0x0D,0xA2,0xD8,0xDB, +0x72,0x9C,0x0D,0x0F,0x1F,0xA0,0x08,0x03,0xEB,0xFA,0xC9,0xF9,0xF9,0xE9,0xF9,0x47,0xBD,0x83,0x3B,0xFA, +0x95,0xAB,0xE9,0x1D,0x6A,0xBA,0xDC,0x86,0xA2,0x33,0xC5,0x59,0x78,0x86,0x78,0x68,0x04,0xF6,0x0D,0x8A, +0x72,0xD0,0x85,0x60,0x84,0x79,0xA0,0x38,0x7D,0x92,0x73,0xCE,0xA8,0x6E,0x0E,0x98,0x4D,0x28,0xC5,0xE9, +0xB3,0xF1,0xEB,0x57,0x9E,0x7E,0xCE,0x18,0xD7,0x8E,0x49,0xAA,0x5B,0x72,0x37,0x6C,0x94,0x24,0x98,0x06, +0x47,0x21,0x89,0x02,0x83,0x99,0x03,0x81,0xEE,0x4B,0x74,0x59,0x88,0x00,0xB6,0x6F,0xAB,0x92,0x75,0x0A, +0x52,0xEB,0x96,0x6F,0xC7,0x79,0xC4,0x49,0x12,0x61,0x6F,0xA3,0x0F,0x3D,0x8A,0x62,0x80,0x89,0x34,0x2C, +0x60,0x24,0xF0,0x74,0x15,0x8C,0x8A,0x10,0xB6,0x6E,0x15,0x5F,0xAD,0x12,0xB4,0x56,0x09,0x9A,0xB8,0x09, +0x48,0xA4,0x5B,0x81,0x5D,0xD7,0xCA,0xD0,0x2B,0x96,0x2A,0x61,0x01,0x9E,0x22,0xE0,0xE4,0x9D,0x90,0x1A, +0x4A,0xEF,0x75,0x0B,0x05,0x6A,0xA1,0xAC,0xAD,0x8D,0xAC,0xA9,0x0D,0xB5,0x8D,0xEB,0x90,0x33,0x85,0x9C, +0xB6,0x91,0xD3,0x26,0xF2,0x91,0xB4,0x86,0x75,0xC8,0xA9,0x42,0x8E,0x5A,0x22,0x46,0x52,0x44,0x15,0xE1, +0xBA,0x42,0x9B,0x20,0x10,0x60,0x47,0x4D,0x31,0xA1,0x07,0x0E,0x89,0x26,0x11,0x0E,0xBC,0x0D,0x07,0x7A, +0xA2,0xA8,0xF6,0xB6,0x9C,0x35,0x6B,0x44,0x6A,0x8D,0xBC,0xB5,0x46,0x2E,0xD7,0x20,0x09,0x28,0x11,0xF2, +0x86,0x6E,0xE5,0x52,0x6B,0xED,0x11,0xB5,0x9C,0x1F,0x62,0xFF,0x7A,0xC2,0xE4,0x88,0x6C,0x8B,0x15,0x37, +0x90,0xA4,0x99,0x48,0x9A,0xF2,0x28,0x02,0x34,0x13,0x1B,0xBC,0xDC,0x13,0x94,0xAD,0xA4,0x29,0xBE,0x36, +0x8C,0xB8,0xAD,0x4B,0x84,0xB8,0xAD,0xA5,0xB8,0x35,0x6D,0x84,0x6E,0xB0,0xB6,0x4E,0x4B,0xB1,0xB9,0x66, +0x30,0x59,0x37,0x98,0x9B,0x56,0x6A,0x33,0xEA,0x47,0xC4,0xBF,0xF6,0x6A,0x37,0x36,0x17,0x46,0xB3,0x23, +0x38,0xE1,0x1E,0xC5,0x73,0xED,0x67,0x08,0x4B,0xC7,0x88,0xA3,0x01,0x2F,0xC8,0x18,0x85,0xDD,0x60,0x20, +0x04,0xA7,0x51,0xF0,0xC2,0xCC,0x46,0x01,0x0C,0x9F,0x5D,0x8C,0x75,0x4B,0xEF,0x89,0x5D,0xD1,0xC1,0x93, +0x89,0xB9,0x34,0x2B,0x5F,0xB2,0xA8,0x8C,0xEA,0x17,0x69,0x54,0x0F,0x41,0xA3,0xB4,0xB8,0xA5,0x15,0xAF, +0xE5,0x89,0x4C,0x8D,0x4A,0xA5,0x25,0x53,0xE2,0x64,0x28,0xD6,0x30,0x8A,0xFD,0xD7,0x4D,0x08,0x7B,0xCA, +0x78,0x0D,0xD3,0x42,0x6D,0xA6,0x51,0xC5,0x74,0x8A,0xE6,0xA5,0x91,0xA8,0xF5,0x07,0xCA,0xBD,0x1D,0xC8, +0xBE,0x34,0xE3,0x1A,0xF6,0x76,0x9C,0x27,0xBB,0x03,0xD8,0x1F,0x43,0x39,0x2E,0x00,0xF6,0xB8,0x0D,0xA6, +0x35,0xE3,0xE1,0xC0,0xEF,0x78,0x85,0x56,0x02,0x8F,0xDB,0x59,0x3E,0xC9,0x78,0x0A,0xB9,0xCD,0xF0,0x2D, +0xBF,0x83,0xCD,0xF6,0x32,0x7A,0x87,0x59,0x81,0x69,0xB1,0x4E,0x67,0x79,0x4F,0x41,0xA7,0xA3,0x86,0x86, +0x90,0xD0,0x10,0x8E,0x32,0xAC,0x51,0x1B,0xDF,0x62,0xFF,0x88,0xC5,0x31,0x12,0x24,0x32,0xD8,0xE4,0xA2, +0xA3,0x9B,0x4B,0x8B,0xAD,0xD5,0xCC,0x03,0x21,0xCB,0xCA,0x1E,0xD2,0x23,0x84,0x40,0xCF,0xB7,0x85,0xAF, +0x64,0x85,0x50,0x5F,0xDF,0xE5,0x32,0x10,0x29,0x94,0x8F,0xCE,0x95,0x55,0x6D,0xDC,0x8A,0x54,0xED,0x7D, +0x97,0x56,0xD7,0x8A,0x3F,0x66,0xBD,0xD3,0x02,0xD6,0x8E,0x6B,0x35,0x54,0x5F,0x2E,0x2D,0x5F,0xF0,0x1F, +0x22,0x3A,0xC3,0x7F,0x5F,0x80,0x9A,0x47,0xE9,0xA2,0x16,0x85,0xE4,0x71,0xE0,0xFE,0x6A,0x1B,0x1F,0x7F, +0xB3,0xAF,0x3A,0xA6,0x79,0xF0,0x6D,0x4F,0x6A,0xD8,0xE0,0xE6,0xC7,0xFE,0x95,0x85,0x00,0x6C,0xFF,0x60, +0xFE,0x6A,0x4B,0x70,0x0B,0x36,0xB8,0x61,0x24,0xD0,0xC4,0x4A,0xC2,0xB3,0xD9,0x54,0x43,0x9B,0x9B,0x06, +0x98,0x5C,0xCB,0x58,0x3B,0xBC,0xA3,0xDB,0x90,0x37,0x96,0xCB,0xFB,0xD9,0x6C,0x9C,0x62,0xAC,0xD2,0x65, +0x05,0x90,0xDC,0x83,0xCC,0x2B,0xC1,0xAA,0x94,0x1A,0x5B,0x35,0x14,0x06,0x65,0xBA,0xB7,0x8B,0x4A,0xC2, +0xD3,0x29,0xA3,0x60,0xB2,0xC9,0xFD,0x61,0x79,0xC4,0xD3,0x5B,0x31,0xE4,0xFB,0x3D,0x12,0xCF,0xB4,0x2C, +0xF5,0x3D,0xB5,0x15,0x07,0xE2,0x8F,0xF7,0xBD,0x48,0x73,0x9B,0xBF,0xFB,0x13,0x4F,0xEF,0xC0,0xFE,0x62, +0x9B,0xB2,0xB9,0x61,0x76,0xBE,0xD7,0x35,0x49,0xD1,0xD3,0x63,0x74,0x5B,0x1C,0xF4,0x45,0x25,0x32,0xD0, +0xA0,0x5F,0x96,0xB0,0x6A,0xA0,0x38,0x62,0xA3,0x9C,0xB3,0x81,0x56,0x56,0x38,0xEA,0x88,0xA9,0x6B,0xBD, +0xFD,0xEF,0x6B,0x1D,0x20,0x10,0x1D,0xA9,0x3D,0x21,0x32,0x88,0xE5,0x22,0xE4,0xE1,0x56,0xF4,0x21,0x85, +0xDB,0xA9,0xA8,0x48,0x00,0x4E,0xEE,0xA5,0x4D,0x2B,0x33,0x90,0x79,0x60,0xB4,0x12,0xED,0x9E,0x38,0x94, +0xEC,0x9F,0xA9,0x6A,0x73,0xAF,0x27,0x7B,0xFA,0x3A,0xC7,0x00,0xCD,0x53,0x40,0xB7,0xAA,0xFA,0x66,0xC2, +0x82,0xBB,0x46,0x55,0x94,0x1D,0xDE,0x1D,0x45,0x28,0xCB,0xDE,0xA0,0x18,0xD6,0xF7,0x63,0xDD,0x2C,0x4C, +0x69,0xDF,0xD9,0xDC,0x6C,0x23,0xA5,0x38,0x66,0x37,0x58,0x71,0x85,0x21,0x94,0xB9,0x01,0x10,0xDE,0xDC, +0x5C,0xC7,0x98,0xB8,0x50,0xFB,0x1A,0x57,0x14,0xDC,0xB5,0x0C,0x7F,0xFF,0x13,0x77,0x2A,0x47,0x3E,0xA4, +0xD5,0xC8,0xB4,0x04,0xF7,0x5F,0xBE,0x64,0xF2,0xEF,0x4A,0xA0,0x97,0xFE,0xB2,0xEA,0x2E,0x58,0xBA,0x04, +0xB8,0xDE,0x7D,0xAF,0xE0,0x66,0x36,0x27,0xDC,0x0F,0x85,0xBE,0x7D,0x94,0x61,0x5D,0xDC,0xD4,0xB9,0xB2, +0x35,0xFB,0x5C,0x34,0x3E,0x93,0xA4,0x68,0xCD,0xD1,0x4D,0xD1,0x8A,0x93,0xED,0xA2,0x95,0x04,0x53,0xDD, +0x55,0x45,0xE2,0x86,0xB3,0x2C,0x1A,0xFD,0xA5,0xDC,0xFA,0x68,0x55,0xC3,0xC7,0x6C,0x4E,0x85,0x02,0x2B, +0x2D,0x47,0x6B,0xF6,0xBE,0x4E,0x61,0x95,0xD3,0x05,0x05,0x5E,0x77,0x9A,0x2A,0x9F,0x6B,0xF8,0x47,0x09, +0x03,0xCF,0xC0,0x4B,0xF3,0xFF,0xB2,0x1A,0x5F,0x59,0xCD,0xCA,0x7E,0xAC,0x11,0xF2,0x28,0x84,0x5A,0xF2, +0x2F,0x24,0x8C,0x5B,0x2B,0xC4,0xB6,0x2F,0x9E,0x6F,0x58,0x20,0xA3,0x9F,0x69,0xE5,0x46,0x6C,0xFD,0x8F, +0x06,0x96,0xB4,0x0C,0xAC,0x5D,0x69,0x24,0x6B,0x76,0x0D,0x47,0x98,0xE3,0x4A,0xA2,0x64,0xAD,0x44,0xE9, +0xFF,0xA3,0xF9,0x3A,0x2C,0x11,0x75,0xAE,0x68,0x06,0xA6,0x80,0xDC,0xE8,0x90,0xA0,0xBD,0x36,0x85,0xCC, +0x4F,0x59,0x14,0x8D,0x59,0x72,0xF0,0xC0,0xB8,0x5B,0x8D,0x17,0x8D,0x92,0xCD,0x7A,0x8A,0xE5,0xAF,0x25, +0xFA,0x0A,0x4F,0xF9,0xC1,0x43,0x80,0x87,0xC9,0xD6,0x73,0xAC,0xC0,0xC3,0x36,0x28,0x0F,0x46,0x7F,0xE9, +0xF8,0x56,0x56,0xF5,0x2E,0x3B,0x0C,0xF6,0xC2,0x2F,0x95,0xE4,0x09,0x25,0x59,0x64,0x6D,0xBE,0xA8,0xC7, +0x23,0xA0,0xE8,0x05,0x1D,0x3D,0xB9,0xAD,0xC7,0x38,0x4B,0xBC,0x4C,0x0D,0x21,0x83,0x58,0xFC,0xDE,0xA6, +0xAC,0x8B,0xE2,0xA9,0x47,0x6C,0x36,0x9D,0x66,0x98,0xBF,0x17,0x19,0xC4,0x8A,0xAA,0xFE,0x33,0x99,0x41, +0x06,0xD0,0xA5,0x31,0xCB,0x33,0xCC,0x72,0xDE,0xAE,0x35,0x2B,0x61,0xF6,0x82,0x2F,0x5F,0xAA,0xCE,0x7E, +0xD0,0x49,0xEB,0xEE,0xE5,0x5E,0xD6,0xE8,0xEC,0x67,0x9D,0x08,0x3C,0xE9,0x3F,0xB6,0x14,0xD2,0xB4,0x14, +0x26,0x12,0x98,0xC5,0x94,0xA5,0xA4,0xB5,0xAD,0xA7,0xE2,0x24,0x80,0x1A,0x21,0x56,0x18,0xB4,0x6E,0x96, +0x87,0xDC,0xA6,0x2B,0x23,0x2B,0x6D,0x7B,0xFA,0x43,0xD5,0x76,0x60,0x08,0xAA,0xA0,0xF5,0x57,0x6C,0x8E, +0xD3,0x23,0x94,0x61,0x03,0x22,0x6F,0x95,0x26,0x24,0xD4,0x74,0xB3,0xB5,0xB3,0x68,0x01,0xF5,0xD5,0x13, +0xC2,0xCB,0x57,0xC3,0x02,0x4C,0x10,0x71,0x61,0x0D,0x25,0x73,0xA9,0xB8,0x63,0x54,0x9C,0x98,0x40,0x43, +0x79,0x8B,0x47,0x6C,0x8B,0x0B,0x1E,0xD0,0xDB,0xB1,0x3A,0x20,0x42,0x79,0x8D,0xC1,0x5A,0x58,0x72,0x96, +0xB2,0x04,0xCD,0x90,0x98,0x07,0x63,0xE0,0x60,0x92,0xB8,0xA0,0xD6,0xA8,0x88,0xEA,0xEB,0x86,0x6E,0xDF, +0x03,0x7B,0x95,0x97,0x39,0xA7,0x53,0x03,0x6A,0x27,0xB3,0x9E,0x16,0xFC,0x77,0x49,0x88,0xDF,0xF2,0x22, +0xBB,0x84,0x3C,0xAE,0x5B,0x51,0xD1,0xFC,0x94,0x15,0x0D,0x3F,0x2B,0x5B,0xB7,0x0D,0x20,0xA3,0x25,0x98, +0xD1,0x69,0xD1,0x24,0x94,0x94,0x74,0x4A,0x60,0xF9,0x4C,0x92,0x32,0x93,0x85,0x65,0x2B,0xC4,0xB7,0x15, +0x1E,0xAB,0xF2,0x1C,0x5E,0x97,0xE7,0xEA,0x5B,0x96,0xFF,0x4E,0xFC,0x84,0xCE,0x4A,0x61,0x92,0xB2,0x35, +0x23,0xA5,0x28,0x93,0x38,0xF9,0x2A,0x23,0xE9,0xBF,0x3D,0xF5,0x1D,0x9F,0xBC,0x3A,0x19,0x9F,0x34,0x0F, +0x00,0xCD,0xCB,0x21,0xFE,0x57,0xB7,0x2F,0xDC,0x74,0x8D,0xBF,0x91,0xD4,0xA0,0xEC,0x36,0xCD,0xD6,0xFD, +0x51,0xD4,0xBA,0x97,0xAA,0x33,0x4A,0x71,0xE1,0x03,0x7A,0xDA,0xDC,0x6C,0x30,0x22,0xC7,0xEB,0x3B,0x2D, +0x6A,0xE9,0xAA,0x0A,0x97,0x5E,0x8D,0x1E,0x2A,0x57,0x91,0x59,0x1D,0x08,0x89,0x47,0x8B,0x88,0x62,0x89, +0xB3,0x21,0xD9,0xF7,0xE1,0x50,0xD8,0x31,0xD5,0x5D,0x8E,0xE7,0xC1,0xB5,0x97,0x7F,0x25,0xEF,0x03,0x36, +0x37,0x51,0xBB,0xA4,0x35,0x1C,0x4B,0x02,0xC5,0x82,0xB2,0x25,0x6F,0x22,0x40,0x16,0x60,0xCB,0xB1,0x5E, +0x8C,0x4E,0xDF,0xD8,0x09,0x4A,0xC1,0x21,0xA9,0xD9,0x8C,0x46,0xB9,0x12,0xB0,0xAD,0xED,0xA7,0x27,0x8D, +0xB3,0x96,0x7C,0xDD,0xE7,0xF2,0xA5,0x15,0x19,0x82,0x9C,0xCA,0xD0,0xA2,0xEC,0x29,0xEE,0x65,0x21,0xC7, +0xC5,0x65,0xBE,0xAB,0xC3,0x55,0xDC,0xCC,0x16,0xFC,0x26,0x7F,0xE0,0x3A,0x81,0x87,0x24,0x6B,0x9E,0x31, +0x5B,0x91,0xE1,0x6F,0xEE,0xD8,0xB2,0x6C,0x29,0x72,0xF7,0x8F,0x4B,0xEA,0x45,0xB4,0xDA,0x1C,0x79,0x1C, +0x5E,0xD4,0xA1,0xB8,0x36,0x47,0x1D,0x52,0x18,0xA1,0xBA,0x45,0xFF,0xA9,0x87,0xD0,0xD2,0x43,0xE8,0x6A, +0x80,0xC0,0xB7,0x2D,0x6F,0xAF,0x56,0x19,0x4C,0x80,0xB3,0xEB,0x41,0x1D,0x45,0x00,0x02,0xCF,0xA8,0x05, +0xF8,0x94,0xC9,0xF1,0x4F,0xE8,0x06,0xA9,0x6B,0xD9,0x1A,0xBA,0x3E,0x54,0xC8,0xE9,0xFE,0xEF,0xD0,0xAA, +0x66,0xB6,0x03,0x51,0x06,0xCD,0xD5,0x78,0xC2,0x5B,0xE1,0xA9,0x8E,0x59,0xCD,0xE8,0x04,0xEE,0x5A,0x78, +0xB3,0xC6,0x1B,0xFA,0x6D,0xB8,0x1E,0x18,0xE4,0x43,0xBE,0xD7,0x8C,0xC3,0x0A,0xA3,0x69,0x3D,0xEB,0x0F, +0xA3,0xED,0xE3,0xEA,0xFA,0x3A,0x43,0xFA,0x1F,0x3E,0xC8,0xEC,0xAC,0xBC,0x98,0x01,0x37,0x6F,0xF4,0x74, +0x30,0x88,0x0C,0xCC,0x10,0xA3,0x74,0x24,0xEE,0x00,0x54,0x22,0x59,0xAA,0x0D,0xF4,0xA4,0xEB,0x1A,0xA0, +0xB1,0x9E,0x4C,0x19,0x36,0xE8,0x01,0xE6,0x57,0x40,0x0A,0x40,0xEA,0x31,0x20,0xD9,0x18,0x44,0x30,0x88, +0x3C,0x3D,0x66,0x94,0x5D,0x23,0xD2,0x9C,0x4E,0x00,0x42,0x8A,0xAF,0x04,0xF4,0x0E,0xB5,0x8A,0x7D,0x90, +0x84,0x6A,0x88,0xDA,0x7D,0xB3,0xB8,0xE5,0xAC,0xEF,0x98,0x70,0xE9,0x36,0x85,0x7D,0x6C,0x48,0xB4,0x4C, +0x14,0x1E,0x23,0x9C,0x65,0x92,0x6F,0x21,0xD7,0x6B,0x16,0x80,0x58,0x80,0xD6,0x8B,0xA1,0x25,0x16,0x02, +0x09,0x05,0x60,0x1C,0xE2,0xB8,0x80,0x70,0x68,0x0A,0x10,0x12,0xA0,0x6F,0xA5,0xAA,0x46,0xB2,0xC0,0x23, +0x74,0xE6,0xF5,0x7B,0x8E,0xB5,0x4A,0xF6,0x22,0xC3,0x23,0x36,0xE5,0x63,0x34,0xC9,0x8C,0x0D,0xC7,0x5C, +0x9D,0x21,0x40,0x23,0x88,0x26,0xC6,0x96,0xB9,0x1E,0xFD,0x3D,0x4B,0xAF,0x71,0x5A,0x20,0x8B,0xCA,0x0C, +0x0A,0xB3,0x08,0x7E,0xF9,0xD0,0x17,0x2F,0xFA,0x5F,0x11,0x8A,0x6B,0xE0,0x28,0x64,0xF3,0xB3,0x94,0x50, +0xFE,0x5A,0x1E,0xFA,0x8D,0x8D,0xBE,0xDC,0x27,0x75,0x17,0x25,0x23,0x50,0x79,0x49,0xB5,0x10,0xC1,0xCC, +0x6D,0x5D,0x55,0x59,0x13,0xD8,0x2E,0x88,0xAD,0xEE,0x62,0x4E,0xA8,0xAB,0x1F,0xF1,0x34,0xEA,0x8E,0x74, +0x2B,0x46,0x3E,0x74,0xD4,0x1C,0xE8,0x2F,0x2D,0xE1,0xB4,0x6E,0x33,0x98,0x6C,0xD4,0x9D,0xBA,0x50,0x5F, +0xB9,0xC7,0x6B,0x5F,0x4B,0x09,0xE0,0x61,0xC4,0x26,0x86,0x78,0xE7,0xB0,0x10,0x0E,0xEF,0xD2,0xA5,0x29, +0xB2,0xD3,0xD7,0xAF,0xDC,0x7C,0x88,0xBA,0xDC,0xC2,0x8D,0x1B,0xC3,0x8E,0xAE,0x8B,0x8B,0x38,0xC0,0x43, +0xC1,0x29,0x8D,0xEE,0x5C,0xC8,0x8A,0x7F,0x21,0x75,0x4E,0x03,0xF6,0x35,0xA9,0x3F,0xDC,0x93,0xFA,0xC3, +0x3A,0xA9,0x71,0x7B,0xB7,0xA0,0x73,0x01,0x64,0x5F,0x23,0x8A,0x66,0x38,0x85,0x01,0xB1,0x08,0x6C,0xC0, +0x3F,0xE3,0x2C,0xC5,0x5F,0xE7,0x6C,0x14,0x92,0x29,0x5F,0xE1,0x4F,0x8E,0xFE,0x3B,0x2E,0x53,0xFC,0x00, +0x97,0x65,0x21,0x5B,0xA5,0x8D,0xBF,0xBE,0x07,0x93,0x4E,0xED,0xC1,0x16,0x36,0xDD,0xF5,0x5F,0xF8,0x5D, +0xBD,0xE2,0xD7,0xB3,0xA7,0x78,0xB8,0x78,0x69,0x05,0xC2,0x26,0x40,0x82,0x46,0x7E,0x62,0xF4,0x10,0x4E, +0x0A,0xAF,0x40,0x04,0x43,0x99,0x23,0xF6,0x16,0x4B,0x8B,0x7B,0xC6,0x9C,0x80,0xF8,0x73,0x10,0xCE,0x97, +0xD5,0xAF,0x2D,0xBE,0x56,0x02,0x25,0x00,0x93,0x90,0x67,0x7B,0x1F,0x0F,0x36,0xAF,0x3A,0x90,0xA0,0x3C, +0x78,0x98,0x1E,0x34,0x36,0xAF,0x7E,0x30,0x7B,0x33,0xD2,0x28,0x89,0x64,0xAA,0x03,0xBD,0x7E,0xA4,0x57, +0x1E,0x5A,0x42,0x08,0x6B,0xA6,0xC2,0x2A,0xB0,0x5A,0x58,0x5E,0x69,0xC2,0x43,0x7C,0x04,0x06,0x0F,0x19, +0x3B,0x60,0x36,0xF5,0x1A,0x37,0x8D,0x3A,0x87,0xBF,0x3A,0x84,0xED,0x41,0xC1,0x56,0x80,0xA7,0x84,0x62, +0x19,0xBD,0x54,0xD3,0x2A,0x00,0x42,0x0D,0x24,0x95,0x90,0xB2,0x6D,0x89,0xB6,0xC8,0x7E,0x64,0x26,0x14, +0x69,0xE8,0xE2,0x83,0x0F,0x91,0xE8,0x75,0x99,0xB0,0x57,0xC0,0x73,0x19,0x48,0x1A,0x13,0xD6,0xBC,0xC0, +0xD3,0xF3,0xA2,0xA5,0x83,0x94,0xBC,0x11,0x84,0x95,0x38,0x10,0x6F,0x55,0xE3,0x5E,0x68,0xAF,0x4F,0x3D, +0x0A,0x6C,0x2E,0xC1,0xC5,0x94,0x00,0x81,0x5E,0xA5,0xF3,0x5F,0x5E,0xBF,0x7A,0xC6,0x79,0x72,0xAE,0x76, +0x14,0x68,0xB5,0x07,0x6A,0x43,0x33,0x17,0x3C,0xBD,0x2B,0x0B,0x43,0x11,0x28,0x54,0xA8,0xFB,0xE5,0x74, +0xF2,0x09,0xFB,0x20,0xC9,0xEB,0x0C,0x72,0xE8,0x96,0x2D,0xD0,0xC7,0xE3,0x33,0x7B,0xD7,0x76,0xA0,0x52, +0x81,0xFD,0xF4,0x43,0x61,0x31,0xCB,0x7F,0x84,0xBC,0xFD,0xCF,0x90,0x09,0xC4,0xFB,0x0C,0x02,0x7A,0x89, +0xDF,0xC6,0x0D,0x53,0x36,0x97,0x68,0x27,0x69,0x2A,0x8C,0x61,0x1C,0x92,0x4C,0x9B,0xC0,0x60,0x86,0x53, +0x2D,0x60,0x38,0xD3,0x28,0xE3,0x5A,0x96,0x27,0x09,0x4B,0xF9,0x3D,0x7D,0xD8,0x7A,0x79,0x49,0xF3,0x36, +0xC7,0x39,0x0E,0x8A,0x61,0x9C,0x36,0xF5,0x22,0x6B,0x3A,0x18,0x07,0x77,0xFB,0x78,0x55,0x54,0x78,0x39, +0xA5,0x22,0xFF,0x6C,0xF4,0x55,0x1F,0xA4,0x0B,0x81,0xAA,0x47,0xF3,0x28,0x5A,0x0E,0xEE,0xD1,0xB2,0x93, +0x94,0x71,0x26,0x5F,0x7A,0x2D,0x7E,0x2F,0x5C,0xCB,0xBD,0x77,0x4D,0xDF,0xA6,0xEA,0x58,0x1B,0xC6,0x06, +0xD6,0x08,0xCD,0x38,0xA2,0xBE,0xD8,0x46,0xA5,0x0B,0xB3,0xAC,0xEE,0xC4,0xF4,0x81,0x88,0x0B,0xD2,0x70, +0x1E,0x2C,0x29,0xA4,0x64,0xD4,0xD3,0x75,0x51,0xE8,0x61,0x51,0x2F,0xA3,0x38,0x6B,0x90,0xAD,0x32,0x85, +0x49,0xBD,0x12,0x3C,0x90,0x2F,0x57,0x9A,0xF3,0x57,0xD9,0x28,0xAB,0x7B,0x04,0x30,0xAD,0x9C,0x67,0xD2, +0x8E,0xA7,0xCB,0x0A,0xE1,0x40,0x86,0x0C,0x69,0xC0,0x31,0xE6,0x21,0x0B,0x0E,0xF4,0x03,0xDD,0xD5,0xE1, +0xFF,0xA6,0x6E,0xC1,0x2C,0x4C,0x7D,0x16,0xE0,0x8B,0xF3,0xE7,0x10,0x4A,0x13,0x46,0x31,0xE5,0x06,0x82, +0x8C,0xE2,0xE9,0x9D,0x55,0x48,0xC5,0xC6,0x47,0x74,0x65,0x0E,0xDA,0xCA,0xC6,0xF3,0x7B,0xDB,0xD9,0xDA, +0x0C,0x9B,0x51,0x11,0x5D,0xEF,0x80,0x79,0x8E,0x57,0x5E,0x8E,0x58,0x74,0xF5,0x14,0x64,0x2E,0x76,0x04, +0xCF,0x12,0x6B,0x04,0x58,0xC2,0xF5,0x6A,0x25,0x3F,0x54,0xD9,0x51,0xDB,0x47,0x51,0x24,0x3E,0xE6,0x00, +0x5E,0xC5,0x62,0x79,0x66,0x09,0x22,0x19,0x08,0x90,0xE1,0x31,0xBE,0x05,0x97,0x96,0xE5,0x99,0xB2,0xA1, +0xE2,0x38,0x04,0xA4,0x79,0xC3,0x8C,0x4C,0xAB,0xEA,0x6D,0x6E,0x72,0xBB,0x34,0x13,0xA3,0x44,0xCA,0x44, +0xB2,0x91,0x77,0x0F,0x4B,0xA3,0x29,0xA4,0xC8,0xDD,0x2B,0xDA,0x36,0xDA,0x6A,0x48,0x30,0x35,0x4A,0x18, +0x70,0x96,0xA7,0x11,0x64,0x08,0x51,0xBD,0xB4,0xA6,0x65,0x98,0x06,0xB0,0x80,0xFB,0x97,0xC8,0x12,0x95, +0x36,0xAD,0x62,0xC4,0x53,0xC5,0x77,0x9B,0x1E,0x2F,0x76,0xE5,0x19,0x96,0x61,0xAE,0xFD,0xF5,0xAD,0x25, +0xBF,0x9B,0x25,0x2A,0x21,0xF4,0xE0,0x6D,0xCA,0x7C,0xDE,0x05,0xB3,0x8A,0xBB,0xB0,0x82,0xB2,0x82,0x40, +0x5F,0xC3,0xA1,0x3A,0xED,0x59,0xE2,0x3A,0xC5,0xBD,0xE7,0xA2,0xB5,0xFE,0x8C,0x7B,0x3E,0xDA,0xA6,0xD3, +0xE6,0xB3,0xB1,0xDB,0x7B,0x3B,0xF7,0x40,0x68,0xC2,0x52,0x6E,0x40,0x8E,0x83,0x34,0x58,0xAD,0x56,0x1E, +0xBC,0x9A,0x71,0xC1,0x4E,0xF2,0x2C,0x34,0x16,0xC0,0xBA,0xCB,0x2D,0xA5,0x2B,0x17,0x5B,0xCA,0x6E,0x5D, +0x6A,0x95,0xF6,0xE1,0x42,0xEA,0x6A,0xC5,0x8F,0x2F,0x5F,0x64,0xAF,0xDE,0x6D,0xE8,0xB5,0x37,0x1C,0x84, +0x95,0x4E,0x5C,0x66,0x64,0x61,0xF4,0xF7,0x63,0xD5,0x5E,0x4F,0x9D,0xA7,0xCA,0xCF,0x5D,0x34,0x12,0x78, +0x22,0xB9,0xEB,0xC5,0x7B,0x2D,0x68,0x4E,0x21,0x2E,0xD9,0x70,0x00,0xAB,0xBE,0x6F,0xD6,0x8B,0x0F,0x9C, +0xEF,0xE3,0xEE,0x57,0x27,0x42,0xCF,0xAB,0xEA,0x79,0x15,0x75,0xD4,0x04,0xEF,0x81,0x8F,0x60,0x74,0x05, +0x86,0x03,0xB3,0x6A,0xD8,0xD5,0xDA,0x62,0x5D,0xAB,0x18,0x44,0xD9,0x1D,0xF5,0x45,0xD4,0xAC,0xA8,0x84, +0xA0,0xFE,0xD6,0x21,0x5A,0xCD,0x34,0x97,0x35,0x67,0xE2,0xFA,0x51,0x63,0xC5,0x5B,0x87,0x66,0x8D,0x01, +0xEC,0xC3,0x19,0x5D,0x88,0x5B,0xBA,0xA8,0x26,0x0F,0xE9,0x55,0x17,0xC4,0x83,0x09,0xF5,0xAC,0x3C,0x59, +0x0F,0x90,0x25,0xC1,0xCA,0xA0,0xAA,0x2A,0x56,0x86,0x8B,0x83,0x5E,0xF5,0x2E,0xB0,0xF1,0xFD,0x52,0x4D, +0x83,0xC8,0x57,0x27,0x72,0x7E,0xFB,0x6D,0xCA,0x83,0x68,0x0A,0x63,0xFF,0x4F,0x51,0x09,0xC4,0x79,0xD4, +0x2E,0x00,0x00 +};
+

+

Login - Logout

+
+

+

+ +
+
Back +